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点までのドライ接点の遠隔監視ができます。