今回は、Arduino互換ボード(Adafruit Feather 32u4 Bluefruit LE)とBlynkアプリを使用して、スマートフォンからBLE( Bluetooth Low Energy )通信で車をコントロールする方法を紹介します。
使用する部品一覧
使用する車は、前回の記事(ArduinoでSTEM教育 実践編:ライントレースカー)で作成したものを使用します。 電子部品の説明、回路図、ブレッドボード図はこちらを参照してください。 今回はライントレースではないので、フォトリフレクタは不要です。
Blynkとは
Blynkは、スマートフォンやタブレットのアプリから、様々な通信規格(Ethernet, Wi-Fi, USB, GSM, Bluetooth, BLE)を使用して、ArduinoやRasberry Pieを制御することができます。アプリの画面上に、ボタンやスライダー、ジョイスティックなどのウィジェットを自由に配置することができます。基本的に無料で利用できますが、ウィジェットを多く使用すると「Energy」残量がなくなってしまうため、他のウィジェットを削除するか、課金(数百円~)する必要があります。スマホのアプリをゼロベースで作成するのは大変なので、プロトタイプを早く完成させるには大変便利です。
Blynkのアプリ側の設定
まずは、アプリ側の設定について説明します。Blynkのサイト( http://www.blynk.cc/)にアクセスして、Android用やiOS用のリンクをクリックして、各々のストアからインスールします。アプリを開くとアカウント作成画面が表示されるので、メールアドレスを登録するか、FacebookのIDを使用します。
プロジェクトを新規作成します。「DEVICES」の「HARDWARE MODEL」は、「Arduino Uno」( Adafruitが無いので代用 )を選択し、 「CONNECTION TYPE]は「BLE」を選択します。プロジェクトを新規作成すると、「AUTH TOKEN」(認証トークン)が発行されます。これは、Arduinoのプログラムコード内で使用します。
ウィジェットは「Joystick」と「BLE」を使用します。Joystickの出力は「MERGE」とし、「Select pin」は「Virtual」のV0に設定します。ジョイスティックを動かすと、X座標/Y座標が-255~255の値を取るように設定します。Arduinoのプログラムを作成して、アプリと接続する場合は、BLEのウィジェットをクリックして、「Connect BLE Device」をタッチします。
BlynkのArduino側の設定
Blynkを使用するために、ライブラリをインストールする必要があります。[ツール]->[ライブラリを管理]をクリックし、Blynkを検索してインストールします。もしくは、github( https://github.com/blynkkk/blynk-library )のページからダウンロードしてインストールしてください。インストールが完了したら、コンパイルできるかどうか、スケッチ例([ファイル]->[スケッチ例]->[Blynk]->[Boards_Bluetooth]->[Adafruit_Feather_32u4_BLE]) で試してみてください 。
以下のコンパイルエラーが発生した場合は、Adafruitのライブラリ「 Adafruit_BluefruitLE_nRF51 」をインストールしてください。この説明は、 Adafruit Feather 32u4 Bluefruit LE の製品ページに記載がありますので、参考にしてください。
プログラム
プログラムは、Blynkのスケッチ例([ファイル]->[スケッチ例]->[Blynk]->[Boards_Bluetooth]->[Adafruit_Feather_32u4_BLE])をベースとして、前回作成した記事(ArduinoでSTEM教育 実践編:ライントレースカー)のプログラムを移植します。
今回は VirtualPin(V0)を使用するので、プログラム内でBLYNK_WRITE(V0)を使用して、その中に処理内容を記述します。ジョイスティックのx軸/y軸座標を param[0].asInt() と param[1].asInt()で取得します。このパラメータ記述は、Blynkアプリのジョイスティック設定画面に表示されています。そして、その値をもとに、Speed、SpeedL、SpeedRの変数を設定し、左右のモータ回転数を決定します。
//www.stemship.com //2019.11.17 #include "Motor.h" #define BLYNK_USE_DIRECT_CONNECT #define BLYNK_PRINT Serial #include <BlynkSimpleSerialBLE.h> #include <Adafruit_BLE.h> #include <Adafruit_BluefruitLE_SPI.h> #include <SPI.h> // You should get Auth Token in the Blynk App. // Go to the Project Settings (nut icon). char auth[] = "ご自身の認証キーを入力してください"; // SHARED SPI SETTINGS (see adafruit webpages for details) #define BLUEFRUIT_SPI_CS 8 #define BLUEFRUIT_SPI_IRQ 7 #define BLUEFRUIT_SPI_RST 4 // Optional but recommended, set to -1 if unused #define BLUEFRUIT_VERBOSE_MODE true // Create ble instance, see pinouts above Adafruit_BluefruitLE_SPI ble(BLUEFRUIT_SPI_CS, BLUEFRUIT_SPI_IRQ, BLUEFRUIT_SPI_RST); //右と左のモータ Motor motorR = Motor(11, 10); Motor motorL = Motor(6, 5); //車の動作関数 void runForward(); void runRight(); void runLeft(); void runBack(); long Speed; long SpeedL, SpeedR; BLYNK_WRITE(V0) { long x = param[0].asInt(); long y = param[1].asInt(); Serial.print("x: "); Serial.print(x); Serial.print(" y: "); Serial.print(y); Speed = sqrt(x*x+y*y); if(Speed > 255){ Speed = 255; } Serial.print(" Speed: "); Serial.println(Speed); if(y >= 0){ if(x >= 0){ SpeedL = abs(x); SpeedR = 0; }else{ SpeedL = 0; SpeedR = abs(x); } motorR.forward(Speed - SpeedR); motorL.forward(Speed - SpeedL); }else{ if(x >= 0){ SpeedL = abs(x); SpeedR = 0; }else{ SpeedL = 0; SpeedR = abs(x); } motorR.reverse(Speed - SpeedR); motorL.reverse(Speed - SpeedL); } } void setup() { Serial.begin(9600); ble.begin(BLUEFRUIT_VERBOSE_MODE); ble.factoryReset(); // Optional ble.setMode(BLUEFRUIT_MODE_DATA); Serial.println("Waiting for connections..."); Blynk.begin(auth, ble); } void loop() { Blynk.run(); } //前進 void runForward(int val) { motorR.forward(val); motorL.forward(val); } //後退 void runBack(int val) { motorR.reverse(val); motorL.reverse(val); } //右旋回 void runRight(int val) { motorR.stop(false); motorL.forward(val); } //左旋回 void runLeft(int val) { motorR.forward(val); motorL.stop(false); }
参考にしたサイト: https://homemadegarbage.com/blynk_car01
コメントを残す