ESP32 と Blynk と 円形ロボットシャーシキット と
かわいい円形ロボットシャーシキットをAdafruitで購入したので、ESP32載っけて Blynk でWiFiラジコンつくりました♪
目次
構成
部品
- BLE、WiFi内蔵マイコンボード ESP32-DevKitC
- モータドライバDRV8835
-
リチウムイオンポリマー電池400mAh
- モバイルバッテリー
- 円形ロボットシャーシキット
円形ロボットシャーシキット
Adafruitで輸入購入しました。本体価格 $19.95、送料は一番グレードの低いトラッキングのないコースで$25.40の合計 $45.35でした。17/6/26購入で17/7/7着でした。
組み立ても簡単でした!
国内購入ですとモータ別売りだけど、スイッチサイエンスでも購入できます。
blynk設定
ここではスマホアプリのblynkでBLE32とWiFi通信でし車を動かします。
新規プロジェクトを作成します。ハードウェアはESP32 Dev Boardを選択。Conection TypeにはWiFiを指定します。
AUTH TOKENはArduinoコード生成時に使用しますのでメール送信しメモします。
ウィジェットとしてジョイスティックを配置します。
ジョイスティックの設定はヴァーチャルピンV0に2軸の数値を出力します。x, yの値はそれぞれ最小-255 最大255としました。モータを制御して車を動かします。
Arduinoプログラム
ESP32をArduinor IDEでプログラミングを行います。Arduino IDEでの開発用ソースがインストール方法と共に以下にアップされています。参照ください。
https://github.com/espressif/arduino-esp32
BlynkのArduino用 最新ライブラリは以下にあります。
https://github.com/blynkkk/blynk-library
[スケッチの例] -> [Blynk] -> [Boards_WiFi]-> [ESP32_WiFi] を参考にコード生成しました。
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 |
#define BLYNK_PRINT Serial #include <WiFi.h> #include <WiFiClient.h> #include <BlynkSimpleEsp32.h> // You should get Auth Token in the Blynk App. // Go to the Project Settings (nut icon). char auth[] = "Blynkアプリで取得したAUTH TOKEN"; // Your WiFi credentials. // Set password to "" for open networks. char ssid[] = "WiFiのSSID"; char pass[] = "パスワード"; //channel name const int forwardL = 0; const int rearL = 1; const int forwardR = 2; const int rearR = 3; long Speed; long SpeedL, SpeedR; //ヴァーチャルピンV0(ジョイスティック)の値取得 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 = 0; SpeedR = abs(x); }else{ SpeedL = abs(x); SpeedR = 0; } ledcWrite(forwardL, Speed - SpeedL); //channel, duty ledcWrite(rearL, 0); ledcWrite(forwardR, Speed - SpeedR); ledcWrite(rearR, 0); }else{ //後進 if(x >= 0){ SpeedL = 0; SpeedR = abs(x); }else{ SpeedL = abs(x); SpeedR = 0; } ledcWrite(forwardL, 0); ledcWrite(rearL, Speed - SpeedL); ledcWrite(forwardR, 0); ledcWrite(rearR, Speed - SpeedR); } } void setup() { // Debug console Serial.begin(9600); //channel 0-15 resolution 1-16bits freq limits depend on resolution ledcSetup(forwardL, 5000, 8); //channel, freq, resolution_bits ledcSetup(rearL, 5000, 8); ledcSetup(forwardR, 5000, 8); ledcSetup(rearR, 5000, 8); ledcAttachPin(32, forwardL); //pin, channel ledcAttachPin(33, rearL); ledcAttachPin(26, forwardR); ledcAttachPin(25, rearR); Blynk.begin(auth, ssid, pass); } void loop() { Blynk.run(); } |
ESP32はanalogWriteが使用できない!
モータドライバの各入力にアナログ電圧(PWM出力)を印加することでモータのスピードを制御するのですが、なんとESP32はanalogWriteが使えなかった。。。
かわりにledcWriteというのが使えるようです。
[スケッチの例] -> [ESP32] -> [examples]-> [AnalogOut] -> [LEDCSoftwareFade]
によると、
- ledcSetup(channel, freq, resolution_bits)
channel ;0~15の16個の出力を指定できる
freq:PWMの周波数
resolution_bits:出力電圧(デューティー比)の分解能(1~16bit) 8bitなら分解能256 - ledcAttachPin(pin, channel)
pin:マイコンピンの指定
channel:ledcSetupで設定したチャンネル指定 - ledcWrite(fchannel, duty)
channel:ledcSetupで設定したチャンネル指定
duty:ledcSetupで設定した分解能でデューティー比を指定
でアナログ電圧(PWM)出力できます。周波数が指定できるのは非常に便利ですねぇ(^o^)
動作
この車かわいい 😮 。BB-8つくれそう。。。
dcモータ二つ、ドライバ二つとesp32を用いてこちらと同じようにスマホからラジコンのようにモータを動かしたくてこちらのサイトを参考にしてblynkで製作を進めているのですが、このサイトに記載されているblynkのアプリは新しいバージョンになってしまい使えなくなってしまっていたためweb版 blynkで製作を行っているのですが、こちらと同じようなものを作りたい場合、web版のvirtual pin datastreamの設定はどのようにすればよいでしょうか?