スマホを傾けてコントロール! Blynk で BLE 制御ラジコン
以前BlynkのBLE通信でコントロールするラジコンを作りました。
Blynkにアップデート(v0.4.4)がありBLE通信がβ版ではなく正式に導入され、さらにはスマートフォンの加速度センサ情報が取得できるようになってましたのでスマホを傾けてコントロールするラジコンに改造してみました。
ハードは全くいじっておりません(^o^)。
目次
Blynk Arduino用ライブラリ
最新ライブラリは以下にあります。
https://github.com/blynkkk/blynk-library
マイコンはAdafruit Feather 32u4 Bluefruit LEを使うので
[スケッチの例] -> [Blynk] -> [Boards_Bluetooth]-> [Adafruit_Feather_32u4_BLE]を参考にコード生成しました。
Blynk設定
新規プロジェクトを作成します。HARDWRE MODELはAdafruit製品がまだないのでとりあえずArduino UNOを選択。
CONNECTION TYPEはBLEを選択。
AUTH TOKENはArduinoコード生成時に使用しますので控えときます(もしくはメール送信します)。
ウィジェットとしてBLEとAccelerometer(加速度センサ)を配置します。
AccelerometerウィジットはBlynkアプリを入れたスマホの加速度センサの値を検出し、ここではヴァーチャルピンV0に出力するようにしました。
Arduino IDE
[スケッチの例] -> [Blynk] -> [Boards_Bluetooth]-> [Adafruit_Feather_32u4_BLE]を参考にコード生成しました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 |
/************************************************************** * Blynk is a platform with iOS and Android apps to control * Arduino, Raspberry Pi and the likes over the Internet. * You can easily build graphic interfaces for all your * projects by simply dragging and dropping widgets. * * Downloads, docs, tutorials: http://www.blynk.cc * Blynk community: http://community.blynk.cc * Social networks: http://www.fb.com/blynkapp * http://twitter.com/blynk_app * * Blynk library is licensed under MIT license * This example code is in public domain. * ************************************************************** * * This example shows how to use Adafruit Feather 32u4 BLE * to connect your project to Blynk. * * For this example you need Adafruit BluefruitLE nRF51 library * from http://librarymanager * or https://github.com/adafruit/Adafruit_BluefruitLE_nRF51 * * NOTE: BLE support is in beta! * **************************************************************/ //#define BLYNK_DEBUG #define BLYNK_PRINT Serial #define BLYNK_USE_DIRECT_CONNECT #include <BlynkSimpleSerialBLE.h> #include <SPI.h> #include <Adafruit_BLE.h> #include <Adafruit_BluefruitLE_SPI.h> // You should get Auth Token in the Blynk App. // Go to the Project Settings (nut icon). char auth[] = "BlynkアプリのYourAuthTokenを入力"; // 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); //pin name const int forwardL = 11; const int rearL = 10; const int forwardR = 5; const int rearR = 6; long Speed; long SpeedL, SpeedR; BLYNK_WRITE(V0) { int x = param[0].asFloat(); int y = param[1].asFloat(); x = map(x, -10, 10, 255, -255); y = map(y, -10, 10, 255, -255); 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 = 0; SpeedR = abs(x); }else{ SpeedL = abs(x); SpeedR = 0; } analogWrite(forwardL, Speed - SpeedL); analogWrite(rearL, 0); analogWrite(forwardR, Speed - SpeedR); analogWrite(rearR, 0); }else{ if(x >= 0){ SpeedL = 0; SpeedR = abs(x); }else{ SpeedL = abs(x); SpeedR = 0; } analogWrite(forwardL, 0); analogWrite(rearL, Speed - SpeedL); analogWrite(forwardR, 0); analogWrite(rearR, Speed - SpeedR); } } void setup() { Serial.begin(9600); ble.begin(BLUEFRUIT_VERBOSE_MODE); ble.factoryReset(); // Optional ble.setMode(BLUEFRUIT_MODE_DATA); Blynk.begin(auth, ble); } void loop() { Blynk.run(); } |
スマホの画面水平方向の(重力)加速度値[x, y]でラジコンを操作します。
Blynk BLE接続
BlynkプロジェクトのBLEウェジットをクリックして設定します。
“Connect BLE device”をクリックして “Adafruit Bluefruit LE”が表示されたらOKをクリックして接続する。
動作
Blynkのおかげでスマホとデバイスの連携がめちゃくちゃ簡単にできるので色々なことが直感的にサクサクできそうです♪
いつも参考にさせていただいています。下記の事項ご教授ください。
使用機器 raspi 原語c++です。
int x = param[0].asFloat();
int y = param[1].asFloat();
floatで取り出しながらintで代入している点
x = map(x, -10, 10, 255, -255);
y = map(y, -10, 10, 255, -255);
c++のmapの使い方とは違いエラーとなる。ここでは何をしているのでしょうか。
以上よろしくお願いいたします。
コメントいただきありがとうございます!
Arduinoのmap関数は以下の通りです。
http://www.musashinodenpa.com/arduino/ref/index.php?f=0&pos=2743
つまり
x = map(x, -10, 10, 255, -255); は
変数xの変化幅-10 ~ 10を255 ~ -255に拡張しています。
c++では使用できない関数ですので以下のように式で変換するのが良いかと思います。
x = x * (255 – (-255))/(-10 – 10);
ご確認よろしくお願い致します。
返事遅れて申し訳ありません。事情により病院生活を送っていました。もうすぐ退院できそうです。貴兄の記事をいつもたのしみにしています、またご教授ください。
有り難うございました。