
Wio BG770Aの研究7:デジタル入出力を理解する
Wio BG770Aの研究シリーズでは、Seeed社のLTE-M対応IoT開発ボードWio BG770Aについて、調査・検証した内容を共有しています。前回の記事ではピン番号の定義を確認しました。今回は、デジタル入出力の使い方を、実際のサンプルコードをもとに検証し、その使い方を理解することを目指します。
なお、本記事は、SORACOM Advent Calendar 2024シーズン2にもエントリーしています。
■ デジタル出力を理解する
デジタル出力を理解すれば、センサーをON/OFF制御することができます。デジタル出力のサンプルコードを探すと、ブザーをON/OFFするgrove-buzzer.inoが該当しています。ここでは、このコードを通してデジタル出力を理解していきます。
◎ サンプルコード
下記は、grove-buzzer.inoにコメントを追加したものです。
/*
* grove-buzzer.ino
* Copyright (C) Seeed K.K.
* MIT License
*/
#include <Adafruit_TinyUSB.h>
#include <WioCellular.h>
#define BUZZER_PIN (D30) // BUZZER_PIN = D30 = 30
#define BUZZER_ON_TIME (100)
#define BUZZER_OFF_TIME (3000)
void setup(void) {
Serial.begin(115200);
{
const auto start = millis();
while (!Serial && millis() - start < 5000) {
delay(2);
}
}
Serial.println();
Serial.println();
WioCellular.begin(); // セルラーモジュールを初期化
WioCellular.enableGrovePower(); // Groveの電源を投入
digitalWrite(BUZZER_PIN, LOW); // BUZZER_PIN=D30=30
pinMode(BUZZER_PIN, OUTPUT); // BUZZER_PINをデジタル出力に設定
}
void loop(void) {
digitalWrite(BUZZER_PIN, HIGH); // BUZZER_PINの電圧を3.3Vに
delay(BUZZER_ON_TIME);
digitalWrite(BUZZER_PIN, LOW); // BUZZER_PINの電圧を0Vに
delay(BUZZER_OFF_TIME);
}
◎ 解説
ポイントを見ていきます。
まず、ブザーを取り付けるピン番号を指定します。D30と指定されていますが、前回の記事で述べたピン番号の定義ファイルを見ると、D30は30と定義されています。
#define BUZZER_PIN (D30) // BUZZER_PIN = D30 = 30
セルラーモジュールを初期化し、Groveの電源を投入します。Wio BG770Aの特徴の一つは、Grove電源をON/OFFできることであり、Grove端子を用いるときは忘れずに電源ONする必要があります。他のマイコンにはあまり見られない考え方なので、ここは注意です。
WioCellular.begin(); // セルラーモジュールを初期化
WioCellular.enableGrovePower(); // Groveの電源を投入
マイコンに対し、ピンを「出力」として使うのか「入力」として使うのかを定義する必要があります。今回はデジタル出力なので、OUTPUTと定義します。
pinMode(BUZZER_PIN, OUTPUT); // BUZZER_PINをデジタル出力に設定
digitalWrite()で、ピンを3.3Vにしたり、0Vにしたりすることができます。
digitalWrite(BUZZER_PIN, HIGH); // BUZZER_PINの電圧を3.3Vに
digitalWrite(BUZZER_PIN, LOW); // BUZZER_PINの電圧を0Vに
■ デジタル入力を理解する
次はデジタル入力です。デジタル入力を使用することで、スイッチの状態やセンサーからの信号を検知することができます。デジタル入力のサンプルコードを探すと、ボタンのON/OFF状態を検出するgrove-button.inoが該当します。ここでは、このコードを例に、デジタル入力を理解していきます。
◎ サンプルコード
下記はコメントを追加しています。
/*
* grove-button.ino
* Copyright (C) Seeed K.K.
* MIT License
*/
#include <Adafruit_TinyUSB.h>
#include <WioCellular.h>
#define BUTTON_PIN (D30) // BUTTON_PIN = D30 = 30
#define INTERVAL (100)
void setup(void) {
Serial.begin(115200);
{
const auto start = millis();
while (!Serial && millis() - start < 5000) {
delay(2);
}
}
Serial.println();
Serial.println();
WioCellular.begin(); // セルラーモジュールを初期化
WioCellular.enableGrovePower(); // Groveの電源を投入
pinMode(BUTTON_PIN, INPUT); // BUTTON_PINをデジタル入力に設定
}
void loop(void) {
static int count = 0;
int buttonState = digitalRead(BUTTON_PIN); // 電圧状態から1or0を取得
Serial.print(buttonState ? '*' : '.'); //もしbuttonState=1であれば'*'、0であれば'.'
if (++count >= 10) {
Serial.println();
count = 0;
}
delay(INTERVAL);
}
◎ 解説
ポイントを見ていきます。
pinMode()で、BUTTON_PINを「入力」に指定します。
pinMode(BUTTON_PIN, INPUT); // BUTTON_PINをデジタル入力に設定
次に、digitalRead()で、ピンの電圧状態を計測し、1or0を取得します。
int buttonState = digitalRead(BUTTON_PIN); // 電圧状態から1or0を取得
こういう書き方があるんですねー。if文で書くと複数行になりますが、これなら1行で書けます。
Serial.print(buttonState ? '*' : '.'); //もしbuttonState=1であれば'*'、0であれば'.'
■ プルアップ/プルダウンにも対応している
デジタル入力を扱う際、ピンが未接続(フローティング)の状態になると、信号が安定せず誤動作の原因になることがあります。この問題を解決する仕組みが「プルアップ」と「プルダウン」です。これらは入力ピンの電圧レベルを確定させ、安定した動作を実現します。
Wio BG770Aがプルアップとプルダウンに対応しているか確認したところ、wiring_digital.cにその記述を発見しました。このファイルによれば、INPUT_PULLUPやINPUT_PULLDOWNを指定することで、外部抵抗を省略してプルアップやプルダウンを実現できます。
具体的には、次のように設定します。
pinMode(PIN, INPUT_PULLUP); // プルアップ付き入力
pinMode(PIN, INPUT_PULLDOWN); // プルダウン付き入力
テスターをあててみると、プルアップ時は3.3V〜D30間が13kΩ強になり、プルダウン時はGND〜D30間が13kΩ強になることが確認できました。
プルアップやプルダウンを使うことで、内部の抵抗が使われるため、外部抵抗が不要になります。例えば、私は機械設備の稼働状態をリレー経由で取得する際、INPUT_PULLUPを活用しています。
参考までに、wiring_digital.cのファイルパスを以下に記載しておきます。プルアップやプルダウンの記述を確認したい方は、参考にしてください。
## mac
~/Library/Arduino15/packages/SeeedJP/hardware/nrf52/1.4.0/cores/nRF5/wiring_digital.c
## Windows
C:\Users\<ユーザー名>\AppData\Local\Arduino15\packages\SeeedJP\hardware\nrf52\1.4.0\cores\nRF5\wiring_digital.c
■ まとめ
今回の記事では、Wio BG770Aのサンプルコードを通して、デジタル入出力を深堀りしました。以下がポイントです。
デジタル出力:grove-buzzer.inoが参考になる!
デジタル入力:grove-button.inoが参考になる!
プルアップ・プルダウン:プルアップやプルアップに対応している!
次回は、アナログ入出力について調べてみたいと思います。
ここまでお読み頂き、ありがとうございます。この記事が参考になった方は、スキ、コメント、フォロー、チップ頂けると励みになります!
《 参考》
・Wio 770Aの研究シリーズの各記事を、マガジンにまとめています。
・grove-buzzer.inoの公式解説ページです。
・grove-button.inoの公式解説ページです。