
【実録】Bluetoothモジュール「HC-05」がマスターモードにならない!!Ver2.0と3.0の挙動の違いとArduino通信不具合の解決策
手元のBluetoothモジュール「HC-05」がなぜかマスターモードに切り替わらない、ArduinoでATコマンドが通らない…とお悩みの方へ。本記事では、Ver2.0と3.0の挙動の違いを徹底検証し、原因の解析と正常動作する改良版プログラムをまとめました。
電子工作でおなじみのBluetoothモジュール「HC-05」は、仕様上マスターモード(親機)とスレーブモード(子機)を切り替えられるはずですが、実は「マスターモードに切り替えることができないバージョン」の基板が存在することをご存知でしょうか?
手元に3種類の基板があったため、それぞれの挙動と、古いバージョン(Ver 2.0)で発生する特有の罠、そしてArduinoと組み合わせた際の不具合の解決策を検証報告としてまとめました。
1. 検証に使用した3種類の基板(外観の違い)
外観の違いから、それぞれ「基板A」「基板B」「基板C」と分類して検証を行います。
《正面の外観》
正面から見ただけでは、搭載されているICが異なっているくらいの差異しかありません。基板Aの上部のICは、基板B/Cの上部のICより小さいです。
基板Bと基板Cは似ていますが、右下スイッチの左横のチップ部品回路が、
基板Cと基板Aとで同じで、基板Cは、基板Aと基板Bをミックスしたような印象です。



《背面の外観》
背面に大きな判別のヒントがありました。



基板A: 背面に「ZS-040」の文字印刷があり、これが重要な判別基準となります。
基板B: 背面に「2092」という印刷がありますが、詳細な意味は不明です。
基板C: 基板Aと酷似していますが、「ZS-040」の文字印刷がありません。
2. ATコマンドによる設定動作確認
2-1. 接続構成
まずはUSB-UART変換アダプタ(3.3V信号仕様)を使用し、PC上のArduino IDEのシリアルモニターからATコマンドを送信して確認します。

⚠️ 注: HC-05に供給する電源は5Vですが、RXD/TXD端子は3.3V入出力仕様です。そのため、必ず3.3V仕様の変換アダプタを使用するか、適切に分圧する必要があります。
HC-05基板上のボタンを押しながら5V電源を投入し、基板上のLEDが「2秒間隔」でゆっくり点滅すれば、無事にATモードに入ったサインです。
【ピン接続】
ピン②:RXD(HC-05) ─── TXD(アダプタ)
ピン③:TXD(HC-05) ─── RXD(アダプタ)
ピン④:GND
ピン⑤:5V
2-2. 使用した確認コマンド
`AT` :ATモードに入ったかどうかの確認(OKが返れば成功)
`AT+VERSION?` :バージョン番号の確認
`AT+ROLE?` :モードの確認(`+ROLE:0`=スレーブ、`+ROLE:1`=マスター)
2-3. コマンド送信結果
各基板のバージョンは以下の通りでした。ここまでは、どの基板も正常にコマンド送受信が行えます。
基板A: `Ver 2.0-20100601`(デフォルト:スレーブモード)
基板B: `Ver 3.0-20170601`(デフォルト:スレーブモード)
基板C: `Ver 3.0-20170601`(デフォルト:スレーブモード)


3. 【不可解点】マスターモード変更の動作検証
モード変更コマンド `AT+ROLE=1` を送信し、マスターモードへ切り替わるか検証したところ、明確な違いが出ました。
🔴 基板A(Ver 2.0-20100601)の場合
`AT+ROLE=1` を送信すると画面上には `OK` と返答が返ってきます。しかし、その直後に `AT+ROLE?` で確認すると、表示は `+ROLE:0` のまま。つまりスレーブモードから切り替わっていません。
電源の再投入や `AT+RESET` コマンドを挟んでも状態は変わらず、さらにスレーブ機のアドレスを記憶させる `AT+BIND` コマンドを試したところ、設定直後は `OK` となるものの、再起動するとアドレスが消去されてしまいました。このことから、「基板Aはマスター機として使用することは不可能(スレーブ専用)」と判断せざるを得ませんでした。
💡 古いバージョン(Ver 2.0)のネット情報と検証
「内部チップの34番ピンを完全にHigh(3.3V)に引き上げないと、OKと返事しながらもメモリに保存しないバグ挙動がある」という情報を元に、34番ピンに直接3.3Vを供給して検証を行いましたが、結果は変わらずマスターモードへの変更は不可能でした。
🟢 基板B & 基板C(Ver 3.0-20170601)の場合
`AT+ROLE=1` を送信すると `OK` と返り、自動的に通信モードに移行します。基板Aは、送信後に自動的で通信モードには移行せず、ATモードのままでした。この動作(自動で切り替わるか否か)にも、Verによる差異が見られました。基板B/Cで、再度ATモードに入り直して `AT+ROLE?` を送信すると、正しく `+ROLE:1`(マスターモード)に切り替わっていることが確認できました。電源を再投入してもスレーブ機のアドレス(BIND設定)をしっかり記憶しています。
実際に、基板B(またはC)をマスター、基板AをスレーブにしてArduino UNOに接続したところ、双方向でのLED点灯制御(データ通信)が正常に行えることを確認しました。
4. 【追加情報】Arduino UNOとのUART通信で起きる別の怪しい挙動
USB-UART変換アダプタではなく、Arduino UNOのソフトウェアシリアル経由でATコマンドを制御しようとした際、バージョンの違いによる決定的な処理能力の差が見つかりました。
現象:基板AだけがArduinoからのコマンドに「応答なし」になる
ネット上でよく紹介されている、シリアルモニターから入力された文字を1文字ずつHC-05へ転送するシンプルなリレープログラムを実行してみます。
📌 参考にさせていただいたプログラムの出典元:
ぶらりWebウォーカー:ArduinoでBluetoothモジュールHC-05・HC-06を使う方法(ATコマンド設定・スマホ通信)
※こちらのサイトで紹介されているプログラムは非常に分かりやすく、基本動作の確認に最適です。
この標準的なプログラムを実行したところ、基板B・Cは正常に動くのに対し、基板A(Ver 2.0)だけが一切応答しない状態になりました。
いろいろ調査して、原因をつきとめ、対策も講じることができました。