2018年5月13日日曜日

Bluetooth Module HC-05でAndroidからRGB LED Controll

ポチっておいたこれ、Bluetooth 2.0のボードが届きました。
Bluetoothの元祖CSR社のです。

透明のスミチューブが被せてあり、更に金色のチェックで見えないのです。
どこで見つけたか忘れましたが、スミチューブを剥いだ写真。
これだとなんとか読めます。
これでチップの品番が読めます。
メインチップは、CSR社のBC417:Bluetooth v2.0+EDR
右:cFeon社のES29LV800:8Mbit Flash Memory
出所:electrodragon.com
前回のHM-10 fakeのCC41-Aの時と同じく
Arduinoのスケッチをここから拝借m(_ _)m
*****
#include <SoftwareSerial.h>
SoftwareSerial mySerial(8,9);
void setup()
{
   mySerial.begin(9600);
   Serial.begin(9600);
   delay(100);
}
void loop()
{
   if (Serial.available()>0)
      mySerial.write(Serial.read());
   if (mySerial.available()>0)
      Serial.write(mySerial.read());
}
*****

ブレッドボード図
BluetoothのRX入力は、抵抗で分圧(5V⇒3.3V)しています。
Arduino IDE v.1.8.3を起動して、スケッチを書き込みます。
Arduino IDE v1.8.3のシリアルモニタで
「AT」送信します。
何も返ってきません(-_-;)
COM6 9600にしているのですがね~
「Cafe Cappuccino」さんのここに、
HC-05は、電源投入時にBreakout BoardのタクトSWを押しっぱなしにすれば
LEDがゆっくり点滅してATコマンドモードになるということでやってみます。
が、LEDはゆっくり点滅にはなったのですが、
ATコマンドで応答がないのです。

ここにPDFのHC-05のManualがありました。
英語ですが詳しい説明があります。

電源投入時のスイッチ押しっぱなしに加えて
34pinをHIGH(3.3V)にするかどうかで
mini ATモード と Full ATモードに切り替わるということなのです。

Full ATモードにするには、
電源投入時に34pinをHIGH(3.3V)にしておく、とあります。
EN-Z pinが34pinと繋がっていると思ったのですが繋がってないです。

更にATモードでは、
Baudrate:38400bpsに固定されている。ということなのです。

スケッチを変更してBaudrateを変えます。
*****
#include <SoftwareSerial.h>
SoftwareSerial mySerial(8,9);
void setup()
{
   mySerial.begin(38400);   
   Serial.begin(38400);   
   delay(100);
}
void loop()
{
   if (Serial.available()>0)
   mySerial.write(Serial.read());
   if (mySerial.available()>0)
   Serial.write(mySerial.read());
}
*****
スケッチを書き込み、COMの設定も38400にします。
HC-05のスイッチを押したまま電源を入れると
HC-05のLEDがゆっくり点滅になりました。数回点滅したらスイッチを離します。
シリアルモニターを起動して、これも38400bpsにして
「AT」送信します。
お~っ! OKが返ってきました!
「AT+VERSION」では、
「VERSION:3.0-20170601」と応答が
前のCC41-Aでは、「Firmware V3.0.6 Bluetooth V4.0 LE」でてたのだが...
何のVersionだろう?Firmware?Bluetooth?たぶんFirmでしょう。
所が「AT+PIN」や「AT+HELP」など
ほとんどのコマンドで「ERROR:(0)」がでます。
これが、mini ATモード ってやつなんですね。
34pinをHIGHにするには、透明のスミチューブを剥がさないといけないので
ATコマンドの確認は、ここまでにしておきます。

次にPCのBluetoothに接続してみます。
最初は、「不明なデバイス」とでますが
しばらくすると「HC-05」になるので、そこをクリックすると
接続が開始され
PIN入力のボックスがでてくるので
「1234」と入力して[接続]をクリック
「接続済み」に変わり
HC-05「ペアリング済み」になって
デスクトップ右下に「デバイスのセットアップ」がでてきて
右下が「デバイスの準備ができました」となって
[完了]ボタンを押すと
デバイスマネージャーに[Bluetoothリンク経由の標準シリアル(COMx)]が
なぜか2つ! COM8、COM9が出現しています。
どうやらMaster(発信側)とSlave(着信側)としてのようです。
ちょっと好奇心で
COM8でシリアルモニタを立ち上げて「AT」しても何も返答なし。
更にCOM9でシリアルモニタを立ち上げたら
シリアルモニタもArduino IDEもフリーズして終了もできなくなりました(´-﹏-`;)
タスクマネージャーから強制終了します。
やらない方がいいようですね~(-_-;)

さて、やりたかった実験に移ります。
前回、CC41-AというHM-10フェイクのBluetooth Moduleで
動かなかったやつを早くやってみたいのです。
前回、調べている途中で見つけた、これ
「Androidスマホから、このBluetooth経由で
 Arduino UNOに配線されたRGB LEDをコントロールする」ってやつです。

このHC-05は、Windows10で認識され、COMも開いたので、動きそうな気がします。

スケッチはこの「HC-05 RGB LED by luk.pe」を参考にさせていただきますm(_ _)m
*****
#include <SoftwareSerial.h>

SoftwareSerial BLU(8, 9);

#define redPin 10
#define greenPin 11
#define bluePin 12

void setup()
{
   //Serial setup
   Serial.begin(9600);
   Serial.println("-= HC-05 Bluetooth RGB LED =-");

   //BT serial setup
   BLU.begin(9600);
   BLU.println("-= HC-05 Bluetooth RGB LED =-");

   //RGB setup
   pinMode(redPin, OUTPUT);
   pinMode(greenPin, OUTPUT);
   pinMode(bluePin, OUTPUT);

   //RGB test
   setColor(255, 0, 0);
   delay(500);
   setColor(0, 255, 0);
   delay(500);
   setColor(0, 0, 255);
   delay(500);
   setColor(255, 255, 255);
}

void loop()
{
   while (BLU.available() > 0)
   {
      int redInt = BLU.parseInt();
      int greenInt = BLU.parseInt();
      int blueInt = BLU.parseInt();

      redInt = constrain(redInt, 0, 255);
      greenInt = constrain(greenInt, 0, 255);
      blueInt = constrain(blueInt, 0, 255);

      if (BLU.available() > 0)
      {
         setColor(redInt, greenInt, blueInt);

         Serial.print("Red: ");
         Serial.print(redInt);
         Serial.print(" Green: ");
         Serial.print(greenInt);
         Serial.print(" Blue: ");
         Serial.print(blueInt);
         Serial.println();

         BLU.flush();
      }
   }
}

void setColor(int red, int green, int blue)
{
   analogWrite(redPin, red);
   analogWrite(greenPin, green);
   analogWrite(bluePin, blue);
}
*****
スケッチを見てブレッドボード図を作ります。
配線したので、Arduino IDE v1.8.3でスケッチを書き込んで
まずは、スマホのBluetooth設定でペアリングします。
検索すると「HC-05」がでてきて、それをタップするとPIN入力がでてきました。
「1234」を入力してみると
ペアリング成功です!
 で、「Color LED Controller」アプリを起動します。
一番下には、まだ「No BT connection!」とでています。
左上の[BT List]をタップすると
ペアリングしているデバイスがでてきます。
HC-05をタップします。
数秒後にこの画面に切り替わって
一番下が「BT Connected!」に変わりました。
接続成功です!
スマホのアプリをいじってみますが
LEDが、何も光らず、反応しません(-_-;)
スケッチでは、起動時にRed⇒Green⇒Blue⇒Whiteと光るハズなんですが
うんともすんとも?

あはは、何も考えずに買っていた手持ちのRGB LEDは、アノードコモンでした^^;
LED Common端子をGND ⇒ 5Vに変更すると、
無事点灯しました!
スマホから色も制御できます。
当然ですが、論理が逆なので、コントロールアプリの表示色の補色です。
スケッチを変更して論理を反転させます。
setColorの所だけでいけるハズです。

*****
 void setColor(int red, int green, int blue)
 {
    int red_Inv = 255 - red;
    int green_Inv = 255 - green;
    int blue_Inv = 255 -blue;
    analogWrite(redPin, red_Inv);
    analogWrite(greenPin, green_Inv);
    analogWrite(bluePin, blue_Inv);
 }
*****

無事、色は、正しい色になりました!
が、ちょっといじっているとスマホアプリとLEDとで色が狂います。
Arduinoのシリアルモニタの数値とLEDは、合致しています。
受信した時点で狂っているのです。
通信エラーなのだろうか?、にしては、結構な頻度です。
こんな風に赤をタップしているのに緑に発光。
青をタップしているのに赤に発光。
受信側でRGBの順番を誤認している感じがします。
ひょっとして送られてくるデータ・フォーマットが違うのかも?
でもYouTubeみると同じスケッチで皆さんうまく動いているんです。

C言語もArduinoも初心者なマーティーなのでよくわかりませんが
まずは、型を色々変えてみます。

intの2Byte(16bit)ではなくbyteの1Byte(8bit)かなあ?
 byte redInt = BLU.parseInt(); ーーー ダメ

或いは、unsigned int にした方がいいのかなあ?
 unsigned int redInt = BLU.parseInt(); ーーー ダメ

「parseInt()は、シリアルバッファから最初の有効なlong型の整数値を返却する。」
らしい。
BLU.parseInt(); は、int 2Byteでなくlong 4Byteなのだろうか?
 long redInt = BLU.parseInt(); ーーー ダメ

受信データをHEXで表示してみます。
*****
 int redInt = BLU.parseInt();
 Serial.print(redInt, HEX);
 int greenInt = BLU.parseInt();
 Serial.print(greenInt, HEX);
 int blueInt = BLU.parseInt();
 Serial.print(blueInt, HEX);
*****
で動作させると
これは、赤をタップして青になっている所。
スマホ側のデータ表示欄は、赤を示しているのです。
受信側のシリアルモニタは、Blue:252
受信側で狂っています。
受信データは、2Byteか、2Byte+4bit(HEXで5桁)の時が多く
ばらばらで3byteの所はありません。
全点灯の白にします。 
全点灯の白だとFFFFFFの3byte(下の方)になっています。
色々格闘した結果
この「Arduinoのシリアル通信でint型のデータをやりとりする」
「sizeof」ってのがあることがわかり
Buffaに3Byte以上溜まったら読み込みっを開始するようにしてみます。

*****
 //while (BLU.available() > 0)
 while (BLU.available() >= sizeof(3) )
*****

にすると、色の誤認識がなくなりました!
完全ではないが、90%と言う感じ
ゆっくりタップすると問題ないけど、ガ~~っと連続変化させると誤認識します。

動画で
途中で色が狂っている所があり、一旦、全白(FFFFFF)にすると正常になっています。
色が異常になった時の受信データは、この様にFF以上になっています。
まあ実験なのでこの辺にしておきます。

最終スケッチはこれです。
*****
#include <SoftwareSerial.h>

SoftwareSerial BLU(8, 9);

#define redPin 10
#define greenPin 11
#define bluePin 12

void setup()
{
   //Serial setup
   Serial.begin(9600);
   Serial.println("-= HC-05 Bluetooth RGB LED =-");

   //BT serial setup
   BLU.begin(9600);
   BLU.println("-= HC-05 Bluetooth RGB LED =-");

   //RGB setup
   pinMode(redPin, OUTPUT);
   pinMode(greenPin, OUTPUT);
   pinMode(bluePin, OUTPUT);

   //RGB test
   setColor(255, 0, 0);
   delay(500);
   setColor(0, 255, 0);
   delay(500);
   setColor(0, 0, 255);
   delay(500);
   setColor(255, 255, 255);
}

void loop()
{
   while (BLU.available() >= sizeof(3) ) 
   {
      int redInt = BLU.parseInt();
      Serial.println(redInt, HEX);
      int greenInt = BLU.parseInt();
      Serial.println(greenInt, HEX);
      int blueInt = BLU.parseInt();
      Serial.println(blueInt, HEX);

      redInt = constrain(redInt, 0, 255);
      greenInt = constrain(greenInt, 0, 255);
      blueInt = constrain(blueInt, 0, 255);

      if (BLU.available() > 0)   / ここは"sizeof(3)" ない方がよかった
      {
         setColor(redInt, greenInt, blueInt);

         Serial.print("Red: ");
         Serial.print(redInt);
         Serial.print(" Green: ");
         Serial.print(greenInt);
         Serial.print(" Blue: ");
         Serial.print(blueInt);
         Serial.println();

         BLU.flush();
      }
   }
}

void setColor(int red, int green, int blue)
{
   int red_Inv = 255 - red;
   int green_Inv = 255 - green;
   int blue_Inv = 255 - blue;
   analogWrite(redPin, red_Inv);
   analogWrite(greenPin, green_Inv);
   analogWrite(bluePin, blue_Inv);
}
*****

その後、もう一粘りして探していると
スマホアプリの開発者のブログを見つけました。
その「Stonez56: Family, Life, Kids, Work, Arduino」さんのここにArduinoのスケッチは、その前進バージョンのこのブログにありました。
マーティーが参考にしたスケッチとかなり違って複雑です。
このスケッチだと完璧に動きそうです。
しかもAnode Common LED仕様になっています。
早速、pin番号だけ変更して
*****
 SoftwareSerial BT(8,9); //Define PIN8 & PIN9 as RX and TX pins
 //RGB LED Pins
 int PIN_RED = 10;
 int PIN_GREEN = 11;
 int PIN_BLUE = 12;

*****

Arduino IDE v.1.8.3でコンパイルするとエラーが!
しかも、スケッチのどの行がエラーなのか表示されないのです。
スケッチをざっと見てみますがわかりませんね~
この方は、Arduino mini Proってのを使われているので
[Arduino Pro or Pro Mini]でコンパイルしてみますが同じエラー(´-﹏-`;)
[Arduino Mini]やプロセッサを328や168に変えてみても同じエラーなのです。
どうやらArduino IDEのバージョン違いによるものだと思われます。
ということで、今回はJUST実験なのでこの辺で終了っと。

0 件のコメント: