Wio 3G で8点のデジタル入力を行う

Wio 3Gボードには標準でデジタルIOのGroveコネクタが2個あるのですが、アナログIOコネクタ2個を合わせてすべてデジタル入力に使用すると8点の入力できることを確認したのでメモです。

Wio 3G / Wio LTE M1/NB1(BG96)

Seed社製の通信ボードでSORACOMから販売されています。

Seeed JP – Wio 3G Wikiページ
https://seeedjp.github.io/Wiki/Wio_cell_lib_for_Arduino/home-ja.html


WIoボードにはGroveコネクタが6個あり、I2C、UART、アナログIO x2、デジタルIO x2となっています。

そのため、デジタル入力は2点と思い込んでいたのですが、上記のWikiページからIOの仕様を確認したところ、

– Analog コネクタはデジタルIOにも使える。
– Groveコネクタは、3.3V、GND、信号ピンx2 なので信号は2個使える。

つまり Analog(Digital) 2×2 + Digital 2×2 = 8点の入力が可能でした。

プログラム

Wio 3Gのライブラリサンプル soracom-unified ほぼそのままに
8点をdigitalReadする処理を追加して、8点の状態をSORACOMへ送信するプログラムを作成してみました。

各Digital入力をプルアップで使用して、OpenでHigh、GNDとCloseでLowとなります。
各入力を1ビットに割り当て、8bitの0~-255で8入力の各状態を表します。

0: 00000000 全てOff(Open)
1: 00000001 D19がOn
2: 00000010 D20がOn

128: 10000000 A5がOn

255: 11111111 全てOn (Close)

#include <WioCellLibforArduino.h>

#define DIO_PIN_0  (WIO_D19)
#define DIO_PIN_1  (WIO_D20)
#define DIO_PIN_2  (WIO_D38)
#define DIO_PIN_3  (WIO_D39)
#define DIO_PIN_4  (WIO_A6)
#define DIO_PIN_5  (WIO_A7)
#define DIO_PIN_6  (WIO_A4)
#define DIO_PIN_7  (WIO_A5)
#define DIO_SIZE   (8)

#define INTERVAL        (60000)
#define RECEIVE_TIMEOUT (10000)

static int dio[DIO_SIZE] = {DIO_PIN_0, DIO_PIN_1, DIO_PIN_2, DIO_PIN_3, DIO_PIN_4, DIO_PIN_5, DIO_PIN_6, DIO_PIN_7};

WioCellular Wio;

void setup() {
  delay(200);

  SerialUSB.begin(115200);
  SerialUSB.println("");
  SerialUSB.println("--- START ---------------------------------------------------");

  SerialUSB.println("### I/O Initialize.");
  Wio.Init();

  SerialUSB.println("### Power supply ON.");
  Wio.PowerSupplyCellular(true);
  delay(500);

  SerialUSB.println("### Turn on or reset.");
#ifdef ARDUINO_WIO_LTE_M1NB1_BG96
  Wio.SetAccessTechnology(WioCellular::ACCESS_TECHNOLOGY_LTE_M1);
  Wio.SetSelectNetwork(WioCellular::SELECT_NETWORK_MODE_MANUAL_IMSI);
#endif
  if (!Wio.TurnOnOrReset()) {
    SerialUSB.println("### ERROR! ###");
    return;
  }

  SerialUSB.println("### Connecting to \"soracom.io\".");
  if (!Wio.Activate("soracom.io", "sora", "sora")) {
    SerialUSB.println("### ERROR! ###");
    return;
  }

  // Set DIO as input with pullup
  for(int i=0; i<DIO_SIZE; i++) {
    pinMode(dio[i], INPUT_PULLUP);
  }
  SerialUSB.println("### Grove ON.");
  Wio.PowerSupplyGrove(true);

  SerialUSB.println("### Setup completed.");
}

void loop() {
  char data[100];
  int state = 0;
  // Read all DI
  for(int i=0; i<DIO_SIZE; i++) {
    state += !digitalRead(dio[i]) << i;
  }
  sprintf(data, "{\"dio\":%d}", state);

  SerialUSB.println("### Open.");
  int connectId;
  connectId = Wio.SocketOpen("uni.soracom.io", 23080, WIO_UDP);
  if (connectId < 0) {
    SerialUSB.println("### ERROR! ###");
    goto err;
  }

  SerialUSB.println("### Send.");
  SerialUSB.print("Send:");
  SerialUSB.print(data);
  SerialUSB.println("");
  if (!Wio.SocketSend(connectId, data)) {
    SerialUSB.println("### ERROR! ###");
    goto err_close;
  }

  SerialUSB.println("### Receive.");
  int length;
  length = Wio.SocketReceive(connectId, data, sizeof (data), RECEIVE_TIMEOUT);
  if (length < 0) {
    SerialUSB.println("### ERROR! ###");
    goto err_close;
  }
  if (length == 0) {
    SerialUSB.println("### RECEIVE TIMEOUT! ###");
    goto err_close;
  }
  SerialUSB.print("Receive:");
  SerialUSB.print(data);
  SerialUSB.println("");
err_close:
  SerialUSB.println("### Close.");
  if (!Wio.SocketClose(connectId)) {
    SerialUSB.println("### ERROR! ###");
    goto err;
  }
err:
  delay(INTERVAL);
}

要はdigitalReadして各bitを加算しているここだけですね。

// Read all DI
  for(int i=0; i<DIO_SIZE; i++) {
    state += !digitalRead(dio[i]) << i;
  }
  sprintf(data, "{\"dio\":%d}", state);

結果

SORACOM Unified Endpoint から SORACOM Harvest に送ってデータを確認しました。


デジタル入力がCloeのピンに応じて 0~255の値を受信しています。

これで8点までのドライ接点の遠隔監視ができます。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です