Bluetooth®でRGB LEDを制御する
i
このチュートリアルは、すでに製品ライフサイクルの終了(EOL)を迎えた製品を対象としています。

Nano 33 BLE Senseボードの内蔵RGB LEDを、スマートフォンアプリを使い、Bluetooth®経由で制御する方法を学びます。


Author:Fabricio TroyaLast revision:2024/07/17

このチュートリアルでは、Arduino Nano 33 BLE Senseを使い、ボードに組み込まれた通信用チップセットにより実現されるBluetooth®経由で、RGB LEDを点灯させます。

目的

  • Bluetooth® Low EnergyとBluetooth®がどういうものかを学びます。
  • ArduinoBLEライブラリ"を使います。
  • 新しいサービスの作り方を学びます。
  • 外部デバイス(スマートフォン)から、RGB LEDを点灯させる方法を学びます。

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

  • このプロジェクトでは、外部のセンサーや機器を利用しません。
  • このチュートリアルでは、ボードのプログラムを記述するのに、Arduino Cloudエディタを利用します。

Bluetooth® Low EnergyとBluetooth®

Bluetooth® Low Energyは、低電力・低速に最適化されており、Bluetooth®クラシックとして知られるものとは異なります。Bluetooth®デバイスには、セントラルとペリフェラルという、2つの異なるタイプがあります。セントラルBluetooth®デバイスは、ペリフェラルデバイスからのデータを読むように設計されています。ペリフェラルデバイスは、その逆です。ペリフェラルデバイスは、他のデバイスが読むデータを継続的に送信し続けます。このチュートリアルでは、この点を取り上げます。

サービスとキャラクタリスティック

サービスは、異なる測定データから構成されます。例えば、風速と気温、湿度を測定するデバイスがあるとき、「気象データ」というサービスを構成することができます。そのデバイスがバッテリーレベルとエネルギー消費を測定できるしたら、「エネルギー情報」というサービスを構成できます。これらのサービスは、セントラルBluetooth®デバイスで登録することができます。

キャラクタリスティックは、上記で述べたサービスの構成要素です。例えば、気温とバッテリーレベルは、両方ともデータを記録し継続的に更新するキャラクタリスティックです。

Unique Universal Identifier (UUID)

サービスからデータを取得するとき、取得しようとするデータの型を知ることが重要です。このために、UUIDを使います。これは、キャラクタリスティックに名前を付与します。例えば、気温を記録しているとき、そのキャラクタリスティックに、気温というラベルをつけたくなるでしょう。これを行うには、UUIDを発見する必要があり、この場合は、「2A6E」です。デバイスに接続しているとき、このサービスは、「気温」として現れます。複数の値を追跡する際とても有用です。

UUIDやサービス、キャラクタリスティックについてさらに知りたい場合は、以下のリンクを参照してください。

プログラム作成

  1. 設定

Arduino Cloudエディタを開くところから始めます。Librariesタブをクリックし、Arduino BLEライブラリを探してください。その後、> Examples > Perihperalで、LEDスケッチを開いたら、好きな名前に変更します。

  1. ボードを接続する

Arduino Nano 33 BLE SenseをPCに接続し、Cloudエディタにより認識されるか確認します。認識されていれば、以下の図のように、ポートとボードが現れます。現れないときは、エディタがボードを認識するようにするプラグインをインストールするための指示に従ってください。

  1. LEDを点灯する

スマートフォンから送信する情報に応じて異なる色でRGB LEDを点灯するには、例のコードを修正する必要があります。

ArduinoBLE.hライブラリをインクルードして、ledService()関数の引数を"180A"に変更します。これは、「デバイス情報」に変換されます。次にswitchCharacteristic()関数の引数を"2A57"に変更します。これは、「デジタル出力」に変換されます。

1
2
3
4
BLEService ledService("180A"); // BLE LED Service

// BLE LED Switch Characteristic - custom 128-bit UUID, read and writable by central
BLEByteCharacteristic switchCharacteristic("2A57", BLERead | BLEWrite);

setup()でシリアル通信を初期化したら、LEDのピンをOUTPUTに設定します。その後、ボードに接続しているかを示すのに使うLED_BUILTINも含め、LEDを消灯します。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
// set LED pin to output mode
pinMode(LEDR, OUTPUT);
pinMode(LEDG, OUTPUT);
pinMode(LEDB, OUTPUT);
pinMode(LED_BUILTIN, OUTPUT);

digitalWrite(LED_BUILTIN, LOW);         // when the central disconnects, turn off the LED
digitalWrite(LEDR, HIGH);          // will turn the LED off
digitalWrite(LEDG, HIGH);        // will turn the LED off
digitalWrite(LEDB, HIGH);         // will turn the LED off

BLE.setLocalName()では、利用しているボードを識別するのに、名前を"Nano 33 BLE Sense"に変更する必要があります。

1
2
3
// set advertised local name and service UUID:
  BLE.setLocalName("Nano 33 BLE Sense");
  BLE.setAdvertisedService(ledService);

loop()Serial.println(central.address());の後で、LED_BUILTINHIGHにし、スマートフォンとボードが接続しているときにLEDを点灯させます。

1
2
3
// print the central's MAC address:
Serial.println(central.address());
digitalWrite(LED_BUILTIN, HIGH);       // turn on the LED to indicate the connection

whileループ内の2番目のif()を、swicth caseに置き換え、それぞれの場合に応じた色のLEDを点灯させます。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
// while the central is still connected to peripheral:
while (central.connected()) {

// if the remote device wrote to the characteristic,
// use the value to control the LED:

if (switchCharacteristic.written()) {
switch (switchCharacteristic.value()) {   // any value other than 0
  case 01:
    Serial.println("Red LED on");
    digitalWrite(LEDR, LOW);            // will turn the LED on
    digitalWrite(LEDG, HIGH);         // will turn the LED off
    digitalWrite(LEDB, HIGH);         // will turn the LED off
    break;
  case 02:
    Serial.println("Green LED on");
    digitalWrite(LEDR, HIGH);         // will turn the LED off
    digitalWrite(LEDG, LOW);        // will turn the LED on
    digitalWrite(LEDB, HIGH);        // will turn the LED off
    break;
  case 03:
    Serial.println("Blue LED on");
    digitalWrite(LEDR, HIGH);         // will turn the LED off
    digitalWrite(LEDG, HIGH);       // will turn the LED off
    digitalWrite(LEDB, LOW);         // will turn the LED on
    break;
  default:
    Serial.println(F("LEDs off"));
    digitalWrite(LEDR, HIGH);          // will turn the LED off
    digitalWrite(LEDG, HIGH);        // will turn the LED off
    digitalWrite(LEDB, HIGH);         // will turn the LED off
    break;
    }
  } 
}

最後のSerial.println()の後で、digitalWrite()を使い、スマートフォンがボードと切断されたら、LEDを消灯します。

1
2
3
4
5
6
7
8
9
// when the central disconnects, print it out:
Serial.print(F("Disconnected from central: "));
Serial.println(central.address());
digitalWrite(LED_BUILTIN, LOW);         // when the central disconnects, turn off the LED
digitalWrite(LEDR, HIGH);          // will turn the LED off
digitalWrite(LEDG, HIGH);        // will turn the LED off
digitalWrite(LEDB, HIGH);         // will turn the LED off
}
}
  1. 完全なコード

プログラム作成部分をとばした場合のために、完全なコードを以下に示します。

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
#include <ArduinoBLE.h>

BLEService ledService("180A"); // BLE LED Service

// BLE LED Switch Characteristic - custom 128-bit UUID, read and writable by central
BLEByteCharacteristic switchCharacteristic("2A57", BLERead | BLEWrite);

void setup() {
  Serial.begin(9600);
  while (!Serial);

  // set LED's pin to output mode
  pinMode(LEDR, OUTPUT);
  pinMode(LEDG, OUTPUT);
  pinMode(LEDB, OUTPUT);
  pinMode(LED_BUILTIN, OUTPUT);
  
  digitalWrite(LED_BUILTIN, LOW);         // when the central disconnects, turn off the LED
  digitalWrite(LEDR, HIGH);               // will turn the LED off
  digitalWrite(LEDG, HIGH);               // will turn the LED off
  digitalWrite(LEDB, HIGH);                // will turn the LED off

  // begin initialization
  if (!BLE.begin()) {
    Serial.println("starting Bluetooth® Low Energy failed!");

    while (1);
  }

  // set advertised local name and service UUID:
  BLE.setLocalName("Nano 33 BLE Sense");
  BLE.setAdvertisedService(ledService);

  // add the characteristic to the service
  ledService.addCharacteristic(switchCharacteristic);

  // add service
  BLE.addService(ledService);

  // set the initial value for the characteristic:
  switchCharacteristic.writeValue(0);

  // start advertising
  BLE.advertise();

  Serial.println("BLE LED Peripheral");
}

void loop() {
  // listen for Bluetooth® Low Energy peripherals to connect:
  BLEDevice central = BLE.central();

  // if a central is connected to peripheral:
  if (central) {
    Serial.print("Connected to central: ");
    // print the central's MAC address:
    Serial.println(central.address());
    digitalWrite(LED_BUILTIN, HIGH);            // turn on the LED to indicate the connection

    // while the central is still connected to peripheral:
    while (central.connected()) {
      // if the remote device wrote to the characteristic,
      // use the value to control the LED:
      if (switchCharacteristic.written()) {
        switch (switchCharacteristic.value()) {   // any value other than 0
          case 01:
            Serial.println("Red LED on");
            digitalWrite(LEDR, LOW);            // will turn the LED on
            digitalWrite(LEDG, HIGH);         // will turn the LED off
            digitalWrite(LEDB, HIGH);         // will turn the LED off
            break;
          case 02:
            Serial.println("Green LED on");
            digitalWrite(LEDR, HIGH);         // will turn the LED off
            digitalWrite(LEDG, LOW);        // will turn the LED on
            digitalWrite(LEDB, HIGH);        // will turn the LED off
            break;
          case 03:
            Serial.println("Blue LED on");
            digitalWrite(LEDR, HIGH);         // will turn the LED off
            digitalWrite(LEDG, HIGH);       // will turn the LED off
            digitalWrite(LEDB, LOW);         // will turn the LED on
            break;
          default:
            Serial.println(F("LEDs off"));
            digitalWrite(LEDR, HIGH);          // will turn the LED off
            digitalWrite(LEDG, HIGH);        // will turn the LED off
            digitalWrite(LEDB, HIGH);         // will turn the LED off
            break;
        }
      }
    }

    // when the central disconnects, print it out:
    Serial.print(F("Disconnected from central: "));
    Serial.println(central.address());
    digitalWrite(LED_BUILTIN, LOW);         // when the central disconnects, turn off the LED
    digitalWrite(LEDR, HIGH);          // will turn the LED off
    digitalWrite(LEDG, HIGH);        // will turn the LED off
    digitalWrite(LEDB, HIGH);         // will turn the LED off
  }
}

テスト

コーディングが完了したら、スケッチをボードにアップロードします。アップロードが成功したら、シリアルモニタを開きます。シリアルモニタに、“BLE LED Perihperal"という文字が以下のように現れます。

利用可能なBluetooth®デバイスのリストに、Nano 33 BLE Senseボードが表示されます。サービスとキャラクタリスティックにアクセスするのに、LightBlueアプリケーションの利用を勧めます。iPhone用リンクか、Android用リンクを参照してください。

アプリケーションを開いて、以下の図の指示に従ってください。

RGB LEDを制御するには、“WRITTEN VALUES"フィールドに、1か2、3を入力します。それぞれ、赤・青・緑のLEDが点灯します。その他の値は消灯します。これは、“Device Information"配下の"Digital Output"キャラクタリスティック内にあります。

トラブルシュート

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

  • 括弧やセミコロンが抜けている。
  • Arduinoボードが、間違ったポートに接続されている。
  • プログラムを初期化するためにシリアルモニタを開いていない。
  • 接続しようとするデバイスのBluetooth®がオフになっている。

おわりに

このチュートリアルでは、基本的なBluetooth®デバイスを作成しました。サービスとキャラクタリスティックの作成方法と、公式のBluetooth®ドキュメントからUUIDの使い方を学びました。最後に、スマートフォンから送信する情報に応じて異なる色でRGB LEDを点灯させました。

ArduinoBLEライブラリの使い方を少し学んだので、Nano 33 BLE Sense向けの他のチュートリアルのいくつかも試してください。より多くの例を見つけたり、Bluetooth ®アプリケーションを作成する発想を得るのに、ArduinoBLEライブラリを参照してください。

オリジナルのページ

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

最終更新日

August 1, 2026

inserted by FC2 system