見出し画像

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の公式解説ページです。


いいなと思ったら応援しよう!