2台のNano 33 BLE SenseボードをUART経由で接続する
i
このチュートリアルは、すでに製品ライフサイクルの終了(EOL)を迎えた製品を対象としています。

UART経由で、Nano 33 BLE Senseから、もう1台のNano 33 BLE Senseに、データを送信する方法を学びます。


Author:Fabricio TroyaLast revision:2024/07/17

2台のボードをUART経由で接続する

このチュートリアルでは、Arduino Nano 33 BLE Senseの内蔵LEDを、もう1台のArduino Nano 33 BLE Senseから制御します。このために、両方のボードをUARTと呼ばれる有線通信プロトコルで接続します。

注意: この例では、Arduino BLE Senseボードと他のどんなArduinoボードを接続しても動作するはずです。ただし、両方のボードが同じ電圧で動作する必要があることに注意してください。接続したボードの動作電圧が異なる場合は、低電圧で動作するほうのボードが壊れるかもしれません。

この例では、両方のArduinoボードにPCから給電します。UART経由で接続した33 BLE Senseボードから、33 BLE Senseボードにコマンドを送るのに、シリアルモニタを使います。Nano 33 BLE Senseボードが受信したコマンドに従い、内蔵LEDをオン・オフします。

目的

このプロジェクトの目的は以下の通りです。

  • UARTとは何かを理解する
  • 2つのArduinoボード間でUART通信を使う

必要なハードウェアとソフトウェア

UART通信

UART(Universal Asynchronous Receiver-Transmitter)は、最もよく使われるデバイス間の通信プロトコルの一つです。これは、非同期シリアル通信で、データフォーマットや送信スピードを設定できます。UART通信では、スターとビットとストップビットで囲まれtデータビットを、最下位ビットから最上位ビットの順で1ビットずつ送信されるので、通信チャネルで正確なタイミングをとることができます。

組込みシステムやマイクロコントローラー、コンピューターでは、デバイス間のハードウェアプロトコル形式として、多くの場合UARTを使います。利用可能な通信プロトコルの中で、UARTは、送信側と受信側、すなわちTX(Transmitter)とRX(Receiver)を、たった2本の電線で接続します。

非同期は、送信デバイスから受信デバイスに送信されるビットを同期させるクロック信号がないことを意味します。しかし、送受信デバイスで、ボーレートが同じである必要があります。ボーレートは、通信チャネルで情報が送信される速度です。シリアルプロトコルの文脈では、設定したボーレートは、1秒間に送信される最大のビット数です。

UARTは、PCとボード間をUSBケーブルを通じて通信するのに利用する通信プロトコルです。いくつかの古いボードでは、TXとRXはピンがPCとの通信に使われます。これらのピンに何かを接続すれば、ボードへのアップロードの失敗するなど、通信を妨害することができることを意味します。NanoやMKRファミリーはその限りではありません。こえらは2つの独立したチャネルを持っていて、PCとの通信にはSerialを使い、UART経由での他のデバイスとの通信にはSerial1を使うからです。

UARTプロトコルやその動作原理について、さらに学びたければ、このリンクを参照してください。

回路

Arduinoボード間で通信するには、以下の図のように接続します。

接続する際には、このプロトコルは、TXとRXという2つの専用線があるので、一方のボードのTXピンを、もう一方のボードのRXピンに接続する必要があります。2つ目についても同様で、TXピンを最初のボードのRXピンに接続する必要があります。

最後に、両方のボードのGNDを互いに接続することもとても重要です。これをしないと、各ボードの参照電圧が異なってしまい、通信が意図通りに動作しません。

注意: シリアル通信を有効にするには、両方のArduinoボードをUSB経由でPCに接続する必要があります。

プログラム作成

  1. 受信ボードの設定

Arduino Nano 33 BLE SenseボードをPCに接続し、Arduino Cloudエディタを開きます。ボードは受信機として動作します。つまり、他のボードからデータを受信だけし、受信した値に従って、内蔵LEDをオン・オフします。プログラム作成を開始するには、新しいスケッチを開始し、Nano_UART_receiverと名付けます。

1.1 受信側コードのウォークスルー

setup()関数の内容から始めましょう。内蔵LEDをOUTPUTで初期化し、消灯します。そして、Serial1.begin()関数で他のボードとのUART通信を初期化する必要があります。

1
2
3
4
5
6
void setup() {
  pinMode(LED_BUILTIN, OUTPUT);      // set LED pin as output
  digitalWrite(LED_BUILTIN, LOW);    // switch off LED pin

  Serial1.begin(9600);            // initialize UART with baud rate of 9600
}

注意: 別のArduinoボードのUART通信を初期化する場合は、利用する必要のあるシリアルポートとピンについて、こちらを参照してください。

loop()内では、while文の内部で、Serial1.available()を使い、バッファ内に利用可能なデータがあるかを確認する必要があります。このプログラムでは、UART1のバッファに読み取り可能なデータがあるときにだけ、while()の中括弧内のコードが実行されます。その場合、別のArduinoボードから来るデータを読みたいので、利用可能なデータを、Serial1.read()関数を使い、receivedData変数に格納します。

1
2
3
void loop() {
  while (Serial1.available() >= 0) {
    char receivedData = Serial1.read();   // read one byte from serial buffer and save to receivedData

次に、受信したデータが10かを確認し、その値に応じて内蔵LEDをオン・オフするために、if...else文を追加します。

注意: UART通信を使うときは、全てのデータは文字形式です。つまり、互換性のためには、数値ロジックではなく、文字ロジックを使う必要があります。例えば、受信したデータが"5"かどうか知るために、数値の5(5)ではなく、ASCII文字の5(‘5’)と比較します。このため、receivedData ==5 ではなく、receivedData == ‘5’を使います。

1
2
3
4
5
6
7
8
if (receivedData == '1') {
      digitalWrite(LED_BUILTIN, HIGH); // switch LED On
    }
    else if (receivedData == '0') {
      digitalWrite(LED_BUILTIN, LOW);  // switch LED Off
    }
  }
}

1.2 コードを受信側にアップロードする

コードが完成したら、Arduino Nano 33 BLE Senseボードにアップロードしましょう。このシナリオで、このボードは受信側として動作するようにプログラムされています。コードをアップロードしたら、もう一方のボードをPCに接続しましょう。

注意: 受信側のボードにコードをアップロード後、動作させるには、PCに接続したままにする必要はありません。しかし、動作するには給電する必要があります。

  1. 送信ボードの設定

次に、新しいスケッチを開き、Nano_UART_transmitterと名付けます。前回のコードで行ったように、内蔵LEDとシリアル通信を初期化します。ただし今回は、シリアルモニタからのデータも読む必要があるので、Serial.begin()を追加し、PCとのシリアル通信も初期化する必要があります。

1
2
3
4
5
6
7
void setup() {
  pinMode(LED_BUILTIN, OUTPUT);      // set LED pin as output
  digitalWrite(LED_BUILTIN, LOW);    // switch off LED pin

  Serial.begin(9600);               // initialize serial communication at 9600 bits per second:
  Serial1.begin(9600);            // initialize UART with baud rate of 9600
}

loop()では、シリアルモニタから読んだデータが1に等しいかを確認するために、if文を使います。このとき、別のボードに同じデータを送信するのに、Serial1.println()関数を使います。同時に、このボードの内蔵LEDを点灯し、LEDの状態をシリアルモニタに表示するのに、digitalWrite()Serial.println()関数をそれぞれ使います。

1
2
3
4
5
6
else if (Serial.read() == '0'){
    Serial1.println('0');
    digitalWrite(LED_BUILTIN, LOW);
    Serial.print("LEDS OFF");
  }
}

次に、else if文を使い、同じこと、ただし、今回は、シリアルモニタから読んだデータが0の場合、LEDを消灯します。

1
2
3
4
5
6
else if (Serial.read() == '0'){
    Serial1.println('0');
    digitalWrite(LED_BUILTIN, LOW);
    Serial.print("LEDS OFF");
  }
}

2.1 コードを受信側にアップロードする

コードが完成したら、別のArduino Nano 33 BLE Senseボードにアップロードしましょう。このボードは送信側として動作するようにプログラムされています。

  1. 完全なコード

コード作成セクションをスキップした場合のために、受信側と送信側の完全なコードを以下に示します。

受信側:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
void setup() {
  pinMode(LED_BUILTIN, OUTPUT);      // set LED pin as output
  digitalWrite(LED_BUILTIN, LOW);    // switch off LED pin

  Serial1.begin(9600);            // initialize UART with baud rate of 9600
}
void loop() {
  while (Serial1.available() >= 0) {
    char receivedData = Serial1.read();   // read one byte from serial buffer and save to receivedData
    if (receivedData == '1') {
      digitalWrite(LED_BUILTIN, HIGH); // switch LED On
    }
    else if (receivedData == '0') {
      digitalWrite(LED_BUILTIN, LOW);  // switch LED Off
    }
  }
}

送信側と受信側

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
void setup() {
  pinMode(LED_BUILTIN, OUTPUT);      // set LED pin as output
  digitalWrite(LED_BUILTIN, LOW);    // switch off LED pin

  Serial.begin(9600);               // initialize serial communication at 9600 bits per second:
  Serial1.begin(9600);            // initialize UART with baud rate of 9600
}
void loop() {
  if (Serial.read() == '1'){
    Serial1.println('1');
    digitalWrite(LED_BUILTIN, HIGH);
    Serial.println("LEDS ON");
  }
  else if (Serial.read() == '0'){
    Serial1.println('0');
    digitalWrite(LED_BUILTIN, LOW);
    Serial.print("LEDS OFF");
  }
}

テスト

スケッチの検証と2台のボードへのアップロードが成功したら、送信側ボードが接続されて、シリアルモニタを開いていください。LEDを点灯させるには1を、消灯させるには0を入力します。

トラブルシュート

エラーが起きることもあります。コードが動作しないときはいくつかの共通の問題があり、解決できます。

  • 括弧やセミコロンが抜けている。
  • Arduinoボードが、間違ったポートに接続されている。
  • Arduinoボード間の接続が正しくない。
  • ケーブル接続の予期しない切断。

おわりに

この簡単なチュートリアルでは、2台のArduinoボードを接続し、UART通信経由で通信dきるようになりました。

オリジナルのページ

https://docs.arduino.cc/tutorials/nano-33-ble-sense/uart/

最終更新日

August 1, 2026

inserted by FC2 system