部品 · 読了まで7分

HC-05 Bluetoothモジュール:スマートフォンからArduinoを操作する

HC-05 Bluetoothモジュールの配線方法は?ピンと分圧回路、スマートフォンとのペアリング、LEDとリレーの操作、ATコマンド、HC-05とHC-06とHM-10の違い、iPhoneとの互換性、ESP32とPicoを解説します。

HC-05は、Arduinoのプロジェクトに無線のシリアル通信を加える、安価でとても普及しているBluetoothモジュールです。これを使えば、スマートフォンからLEDを点けたり、リレーでランプをオン・オフしたり、リモコンカーを走らせたり、センサーのデータをスマートフォンに送ったりできます。この記事では、HC-05を正しく安全に配線し、スマートフォンとペアリングし、最初のコードを書き、モジュールの設定を変えるATコマンドを使う方法をステップごとに見ていきます。

HC-05 Bluetoothモジュールとジャンパーワイヤー
HC-05 Bluetoothモジュール:上部のジグザグのパターンがアンテナで、左側にEN、VCC、GND、TXD、RXD、STATEの6本のピンがあります。

HC-05のしくみ

HC-05はクラシックBluetoothのSPP(シリアルポートプロファイル)を使い、「無線のシリアルケーブル」のように動きます。スマートフォンとペアリングして接続すれば、スマートフォンから送った文字はすべてモジュールのTXDピンを通ってArduinoに届き、ArduinoがRXDピンに書いたものはすべてスマートフォンに送られます。Arduino側ではBluetoothについて何も知る必要はなく、シリアルモニタと話すときと同じようにSerial.print()とread()を使います。

項目値
Bluetoothのバージョン2.0 + EDR(クラシック、SPP)
通信距離見通しのよい場所で約10 m
電源電圧3.6〜6 V(モジュール基板にレギュレーターあり)
ロジックレベル3.3 V
初期ボーレート9600 baud(ATモードでは38400)
初期PIN1234または0000
役割マスターとスレーブ

HC-05、HC-06、HM-10の比較

モジュールBluetooth役割ピンiPhone
HC-052.0クラシックマスターとスレーブ6使えない
HC-062.0クラシックスレーブのみ4使えない
HM-104.0 BLEマスターとスレーブ6使える
HC-06 Bluetoothモジュール
HC-06 Bluetoothモジュール:HC-05とよく似ていますがピンは4本で、スレーブとしてしか動きません。スマートフォンとの通信にはそれで十分です。
HC-05とHC-06はiPhoneでは使えません。iOSは、ふつうのアプリがクラシックBluetoothのシリアル接続を開くことを許可していないからです。iPhoneと通信したいなら、HM-10のようなBLE(Bluetooth Low Energy)モジュールか、BLE対応のESP32を使ってください。AndroidのスマートフォンやパソコンはHC-05に問題なく接続できます。

HC-05のピンと配線

基板にレギュレーターがあるのでモジュールは5Vから給電できますが、データピンは3.3 Vで動作します。ArduinoはHC-05のTXDピンからの3.3 Vの信号を問題なく読めます。逆方向では、Arduinoの5 VのTX信号をモジュールのRXDピンに直結せず、分圧回路を使ってください:Arduino TX → 1 kΩ → RXD、RXD → 2 kΩ → GND。こうすればRXDには約3.3 Vが届きます。

HC-05のピン機能Arduino Uno
EN(KEY)ATモードに入る接続しない(ATモードでは3.3 V)
VCC電源5V
GNDグランドGND
TXDモジュールのデータ出力D10(SoftwareSerial RX)
RXDモジュールのデータ入力(3.3 V)D11、1 kΩ / 2 kΩの分圧回路を通して
STATE接続中はHIGH接続しない、または必要なら入力ピンへ
HC-05はUnoの0番ピンと1番ピンにもつなげますが、これらのピンはUSBでのコードの書き込みにも使われるため、モジュールをつないだままでは書き込みに失敗します。SoftwareSerialで10番ピンと11番ピンを使えば、書き込みもシリアルモニタも自由に使えます。

LEDの状態とスマートフォンとのペアリング

モジュールに電源を入れると、LEDが速く点滅します。これは接続を待っている状態です。AndroidのスマートフォンのBluetooth設定で「HC-05」というデバイスを探し、PINに1234(だめなら0000)を入力してペアリングします。ペアリングしただけでは接続は開かれず、接続するのはBluetoothシリアルターミナルのアプリです。接続されると、LEDは2秒ごとに短く2回点滅します。LEDが2秒点いて2秒消えるなら、モジュールはATコマンドモードです。

スマートフォンとの最初の通信

次のコードは、Arduinoをスマートフォンとパソコンの間の橋渡し役にします。スマートフォンからの文字はすべてシリアルモニタに送られ、シリアルモニタに入力したものはすべてスマートフォンに送られます。接続をテストするのに最適な出発点です。

C++ (Arduino IDE)
1#include <SoftwareSerial.h>
2
3SoftwareSerial bt(10, 11);   // RX, TX → HC-05 TXD, RXD
4
5void setup() {
6  Serial.begin(9600);
7  bt.begin(9600);            // veri modu hızı / data mode baud rate
8}
9
10void loop() {
11  if (bt.available()) {
12    Serial.write(bt.read());   // telefondan bilgisayara / phone to PC
13  }
14  if (Serial.available()) {
15    bt.write(Serial.read());   // bilgisayardan telefona / PC to phone
16  }
17}

コードを書き込み、シリアルモニタを9600 baudで開きます。スマートフォンでGoogle PlayのSerial Bluetooth Terminalのようなアプリを使ってHC-05に接続し、何か入力してみてください。入力した内容がシリアルモニタに表示されます。シリアルモニタで入力した文字もスマートフォンに表示されます。これが動けば、接続、配線、ボーレートはすべて正しくなっています。

スマートフォンからLEDとリレーを操作する

次に、スマートフォンから届く文字に応じて動作させてみましょう。1が届くとLEDが点き、0が届くと消えます。Arduinoは命令のたびにスマートフォンへ返事も送ります。

C++ (Arduino IDE)
1#include <SoftwareSerial.h>
2
3SoftwareSerial bt(10, 11);   // RX, TX
4const int LED = 13;
5
6void setup() {
7  pinMode(LED, OUTPUT);
8  bt.begin(9600);
9  bt.println("Ready");
10}
11
12void loop() {
13  if (bt.available()) {
14    char c = bt.read();
15    if (c == '1') {
16      digitalWrite(LED, HIGH);   // LED'i yak / turn the LED on
17      bt.println("LED ON");
18    } else if (c == '0') {
19      digitalWrite(LED, LOW);    // LED'i söndür / turn the LED off
20      bt.println("LED OFF");
21    }
22  }
23}

多くのBluetoothアプリでは、ボタンに好きな文字を割り当てられるので、スマートフォンに「On」と「Off」のボタンがある小さなリモコンを作れます。LEDの代わりにリレーモジュールをつなげば、同じコードでスマートフォンからランプや扇風機を操作できます。前進、後退、左、右を表すF、B、L、Rの文字をL298Nモータードライバに振り分ければ、Bluetoothで操作する車の基本にもなります。

ATコマンドでモジュールの設定を変える

HC-05の名前、PIN、ボーレートはATコマンドで変えられます。ATモードに入るには、モジュール上の小さなボタンを押したまま(またはENピンを3.3 Vにつないだ状態で)電源を入れます。LEDが2秒に1回のゆっくりした点滅になります。橋渡しのコードでbt.begin(38400)と書き、シリアルモニタの改行コードをCRおよびLF(Both NL & CR)に設定してコマンドを送ります。

コマンド機能
AT接続テスト。OKを返す
AT+NAME=BlueGraysモジュールの表示名を変える
AT+PSWD="4321"PINを変える(古いバージョンでは引用符なし)
AT+UART=9600,0,0データモードのボーレートを設定する
AT+ROLE=0スレーブにする(1でマスター)
AT+VERSION?ファームウェアのバージョンを表示する
AT+ORGL工場出荷時の設定に戻す
HC-05のバージョンによっては、一部のATコマンド(たとえばAT+NAME)は、コマンドを送る間ボタンを押し続けないと返事をしません。ATにはOKが返るのに一部のコマンドに返事がないなら、ボタンを押したままもう一度試してください。

ESP32とRaspberry Pi PicoでBluetoothを使う

従来のESP32はクラシックBluetoothとBLEの両方を内蔵しており、BluetoothSerialライブラリを使えばHC-05なしでスマートフォンと接続できます。ただし、ESP32-S3とESP32-C3が対応しているのはBLEだけです。Raspberry Pi Pico WもBluetoothを内蔵しています。Bluetoothのない標準のRaspberry Pi Picoでは、HC-05をUARTのピンにつなぎます。Picoは3.3 Vで動作するので、今回は分圧回路は不要です。モジュールはVBUS(5V)ピンから給電します。

MicroPython
1from machine import UART, Pin
2
3bt = UART(0, baudrate=9600, tx=Pin(0), rx=Pin(1))   # GP0 → RXD, GP1 ← TXD
4led = Pin("LED", Pin.OUT)                           # kart üstü LED / onboard LED
5
6while True:
7    if bt.any():
8        c = bt.read(1)
9        if c == b'1':
10            led.on()
11            bt.write(b'LED ON\n')
12        elif c == b'0':
13            led.off()
14            bt.write(b'LED OFF\n')

HC-05のプロジェクトアイデア

  • Bluetoothで操作する車:L298Nモータードライバと2つのDCモーターで、スマートフォンから操作するロボットです。
  • スマートホームのスイッチ:リレーモジュールで、スマートフォンからランプやコンセントをオン・オフします。
  • 色を選べるランプ:スマートフォンから送った値でRGB LEDの色を設定します。
  • ワイヤレスのセンサー表示:DHT11で読んだ温度と湿度を、スマートフォンのターミナルに送ります。
  • ロボットアーム:スマートフォンのスライダーでサーボモーターを制御します。
  • 2台のArduinoの通信:片方のHC-05をマスター、もう片方をスレーブにして、データを無線で送ります。

よくある間違いと対処法

  • スマートフォンがモジュールを見つけられない:iPhoneを使っている、モジュールがほかの機器に接続されている、またはATモードのままになっています。
  • 文字化けした文字が届く:ボーレートが合っていません。データモードはふつう9600、ATモードは38400です。
  • ATコマンドに返事がない:モジュールがATモードになっていない、ボーレートが38400でない、または改行コードにCRおよびLF(Both NL & CR)が選ばれていません。
  • コードを書き込めない:モジュールが0番ピンと1番ピンにつながっています。書き込み中は外すか、SoftwareSerialを使ってください。
  • モーターが動き出すと接続が切れる:モーターが電源を乱しています。モーターは別の電源から給電し、モジュールの電源にコンデンサを加えてください。
  • しばらくしてモジュールが壊れた:分圧回路なしでRXDピンに5 Vが入っていたのかもしれません。必ず1 kΩ / 2 kΩの分圧回路を使ってください。

HC-05は、有線のプロジェクトをワイヤレスにするいちばん簡単な方法です。モーター制御と組み合わせれば、はじめてのリモコンロボットを作る準備が整います。BlueGraysアプリには、L298Nを使ったBluetooth操作の車と障害物を避けるロボットが、回路図とコード付きでそろっています。

よくある質問

HC-05はiPhoneで使えますか?

使えません。iOSは、HC-05やHC-06が使うクラシックBluetoothのシリアル接続を、ふつうのアプリが開くことを許可していません。iPhoneには、HM-10のようなBLEモジュールか、BLE対応のESP32を使ってください。

HC-05の通信距離は?

見通しのよい場所で約10メートルです。壁、金属の面、ほかの無線機器があると距離は短くなります。屋内なら、同じ部屋や隣の部屋で安定して動きます。

HC-05とHC-06の違いは?

どちらもクラシックBluetoothを使います。HC-05はマスターにもスレーブにもなれ、ピンは6本です。HC-06はスレーブ専用で、ピンはふつう4本です。スマートフォンとの通信ならどちらでも十分ですが、2台のArduinoをつなぐには少なくとも1つのHC-05が必要です。

HC-05の初期PINは?

ほとんどのモジュールでは1234、一部では0000です。ATモードでAT+PSWDコマンドを使えば変更できます。ほかの人にプロジェクトを操作されたくないなら、初期PINを変えておくのがおすすめです。

HC-05で2台のArduinoを通信させられますか?

できます。片方のHC-05をAT+ROLE=1でマスターにし、AT+BINDコマンドでもう片方のモジュールのアドレスを設定します。2つ目のモジュールはスレーブのままです。電源を入れるとマスターが自動的にスレーブに接続し、2台のArduinoがシリアルポートで通信します。

RXDピンの分圧回路は本当に必要ですか?

おすすめします。HC-05のデータピンは3.3 Vで動作します。多くのモジュールはしばらく5 Vに耐えますが、時間がたつと壊れることがあります。1 kΩと2 kΩの抵抗でできる簡単な分圧回路で、そのリスクをなくせます。TXDピンには分圧回路は不要です。

全プロジェクトを見る