ESP32 Bluetooth 制御で作るスマホ操作のLEDと小型ロボット入門

0
41
ESP32 Bluetooth 制御で作るスマホ操作のLEDと小型ロボット入門

スマホのボタンを押した瞬間、机の上のLEDが点灯する。次のボタンで小さな車輪が回り、レーザーカッターで切り出した車体が動き出す。この「画面の操作が現実の動きになる」感覚を、比較的少ない部品で体験できるのが ESP32 Bluetooth 制御 です。

ESP32にはWi-FiだけでなくBluetooth機能もあり、家庭内のルーター設定をせずにスマホと直接通信できます。まずはLEDを操作するところから始め、信号をモーターやサーボへ置き換えれば、作品の動きは大きく広がります。電子工作を楽しもう!

ESP32 Bluetooth 制御で何を作れる?

Bluetooth制御は、近くにいる人がスマホをコントローラーとして使う作品に向いています。たとえば、LED看板の色を変える、3Dプリンターで作ったケースの中に温湿度計を入れて表示を切り替える、サーボで動くからくりを操作する、といった用途です。Wi-FiのIDやパスワードを作品へ登録しなくてよいため、イベント展示や授業でも準備を簡単にできます。

一方、Bluetoothの通信距離や安定性は、壁、人体、周囲の無線機器の影響を受けます。離れた場所から長時間監視するIoT機器ならWi-Fi、手元で即座に動かす工作ならBluetooth、という使い分けが基本です。モーターを使う場合はノイズの影響もあるため、通信の問題と電源の問題を分けて確認できる構成にしておくと作業が進めやすくなります。

BluetoothはBLEとClassicのどちらを選ぶ?

ESP32で使うBluetoothには、BLEとClassic Bluetoothがあります。ここを最初に選ぶと、スマホ側のアプリとプログラムの作り方が決まります。

Classic Bluetoothのシリアル通信は、文字列を送受信する感覚がArduinoのシリアルモニターに近く、Androidスマホで試すには分かりやすい方法です。`BluetoothSerial`ライブラリを使い、「L1」のような短い命令を受け取れます。ただし、iPhoneは一般的なBluetoothシリアルプロファイルへの対応が限定的です。また、ESP32-C3やESP32-S3など、BLE専用のチップではClassic Bluetoothを使えません。

BLEは消費電力を抑えやすく、iPhoneを含む幅広いスマホと接続しやすい方式です。その代わり、サービス、キャラクタリスティック、通知といったBLE固有の仕組みを理解する必要があります。初回はAndroidと従来型ESP32-WROOM-32を使ってClassic Bluetoothの文字列制御を試し、次の作品でBLEへ進むと、通信の役割を整理しながら学べます。

用意するものと配線

最初の実験には、ESP32開発ボード、ブレッドボード、USBケーブル、LED、220Ωから1kΩ程度の抵抗、ジャンパーワイヤーを用意します。ESP32のGPIO25から抵抗を通してLEDのアノードへつなぎ、LEDのカソードをGNDへ接続します。LEDは極性があるため、足が長い側をアノードとして確認しましょう。

小型ロボットへ発展させるなら、DCモーター、NチャネルMOSFET、フライバックダイオード、モーター用電池も追加します。GPIO26をMOSFETのゲートへつなぎ、モーターは別電源で駆動します。このとき、ESP32のGNDとモーター用電池のマイナス側は必ず共通にしてください。共通GNDがないとGPIOの信号の基準がなくなり、意図した通りに動きません。

モーターをESP32の3.3V端子やGPIOから直接回してはいけません。電流不足だけでなく、起動時の大電流や逆起電力でボードが再起動したり、部品が壊れたりします。モーター端子と並列にダイオードを入れ、電源容量に余裕を持たせることが、動く作品を安定して仕上げるコツです。

Arduino IDEでスマホ命令を受け取る

Arduino IDEでESP32用ボードパッケージを導入し、ボードとして使用中のESP32を選びます。次の例はClassic Bluetooth対応の従来型ESP32向けです。スマホから`L1`、`L0`、`M1`、`M0`を送ると、LEDとモーター用出力を切り替えます。

“`cpp #include “BluetoothSerial.h”

BluetoothSerial SerialBT;

const int ledPin = 25; const int motorPin = 26;

void setup() { pinMode(ledPin, OUTPUT); pinMode(motorPin, OUTPUT); digitalWrite(ledPin, LOW); digitalWrite(motorPin, LOW);

Serial.begin(115200); SerialBT.begin(“FabESP32_Controller”); Serial.println(“Bluetoothを開始しました”); }

void loop() { if (SerialBT.available()) { String cmd = SerialBT.readStringUntil(‘n’); cmd.trim();

if (cmd == “L1”) digitalWrite(ledPin, HIGH); if (cmd == “L0”) digitalWrite(ledPin, LOW); if (cmd == “M1”) digitalWrite(motorPin, HIGH); if (cmd == “M0”) digitalWrite(motorPin, LOW);

Serial.println(“受信: ” + cmd); } } “`

書き込み後、スマホのBluetooth設定またはシリアル通信対応アプリで`FabESP32_Controller`を探してペアリングします。接続したら、末尾に改行を付けて`L1`を送信してください。LEDが点灯すれば、無線でGPIOを制御できています。アプリによっては送信時に改行を自動で付ける設定があるため、反応しないときは確認します。

このプログラムでは命令を文字列として扱っています。最初から複雑な画面を作らなくても、4種類の命令を送るだけで制御の流れを学べます。LEDが確実に動いてからMOSFET回路を接続する順番にすれば、配線不良と通信不良を混同せずに済みます。

ボタン操作を作品の動きへ変える

LEDのON/OFFができたら、命令を増やしてみましょう。サーボモーターなら`S90`のように角度を送る方式、LEDテープなら`R255,G80,B0`のように色を送る方式が扱いやすいでしょう。受信した文字列を分解し、数値をPWM出力やサーボ角度へ渡します。

ただし、Bluetoothで受け取った命令をそのまま強い力の機構へ反映させるのは危険です。車輪付きロボットなら、通信が切れたときに停止するタイムアウト処理を入れます。たとえば最後の命令から1秒以上届かなければモーター出力をLOWにする設計です。指や髪を巻き込みやすい機構、高温になる部品、刃物の近くでは、ソフトウェアだけでなく物理的な安全カバーも用意してください。

作品の外装は、機構と配線を見直す良い機会になります。CADでESP32、電池、スイッチ、モーターの寸法を測り、配線の逃げ道とUSB端子の穴を設計します。アクリルなら内部を見せる展示向きのケースに、3Dプリントなら曲面を持つ持ち手や車体にできます。先にブレッドボードで動作を確認し、その後に外装を作ると、加工後に端子位置が合わない失敗を減らせます。

つながらない、勝手に再起動する時の確認

Bluetooth機器名が見つからない場合は、ESP32が書き込みモードのままになっていないか、電源LEDが点灯しているか、スマホ側に古いペアリング情報が残っていないかを確認します。一度ペアリングを削除してから再検索すると直ることがあります。シリアルモニターを115200bpsで開き、起動時にBluetooth開始のメッセージが出ているかを見るのも有効です。

命令を送ってもLEDが変化しないなら、GPIO番号と実際の配線、LEDの向き、送信文字列の大文字小文字を見直します。`readStringUntil(‘n’)`を使う例では、改行なしの送信は受信待ち時間を発生させます。アプリ側で改行を付けるか、1文字ずつ受け取る方式へ変更しましょう。

モーターを回した瞬間にESP32が切断または再起動するなら、原因はBluetoothより電源であることが多いです。モーター用電源を分ける、配線を短く太くする、ダイオードを追加する、電池を新品にする、といった順で試してください。原因を一つずつ切り分けることも、電子工作の大切な技術です。

スマホの一操作が光、回転、移動へ変わると、コードは画面の中だけのものではなくなります。まずはLED一個を確実に動かし、その命令を自分で設計したケースや機構へ渡してみてください。小さな成功を積み重ねた先に、あなたらしい操作感を持つ道具や作品が生まれます。