Dabble Appを使って４WDカーにヘッドライトとブザーを追加した

#１．始めに
　DabbleAppを使って、ESP３２開発ボードを利用した４WDカーを作ろうとしましたが、スケッチのサンプルプログラムはモータ制御とGamePadの事例が分かれており、統合する必要がありました。そこで、スマートホンを使用して、４WDカーを動かし、他のボタンでヘッドライトやブザーを鳴らせるように追加変更した方法を順を追って説明したいと思います。

#２．目次
　３．Arduino IDEの開発環境の構築
　４．開発ボードとの接続
　５．スマートホンへのDabble Appのインストール
　６．プログラムの作成
　７．GamePadキーの操作説明
　８．配線
　９．駆動系の電装部品
　　
#３．Arduino IDEの開発環境の構築
##１）Arduino IDEのインストール　　
　　https://www.arduino.cc/en/software
からダウンロードしてください。
　　私が使っているバージョンは、Arduino IDE 2.3.2です。
　　下記ホームページが参考になると思います。
　　https://burariweb.info/electronic-work/arduino-development-environment-install.html
##２）WEMOS D1 R32開発ボード用のESP32ボードサポートのインストール
　　下記ホームページからESP32用のサポートソフトをインストールしてください。
　　https://ai.thestempedia.com/docs/getting-started-with-esp32-on-arduino-ide/
　　開発ボードは、事例ではESP32DevModuleを選択していますが、私の場合はWEMOS D1 R32開発ボードを使用していますので、WEMOS D1 R32を選択しています。
##３）Arduino IDE–ESP32用Dabbleライブラリのインストール
　　ライブラリーには、DabbleライブラリとDabble-ESP32ライブラリの2種類が有りますので、Dabble-ESP32ライブラリをインストールします。
　　ダウンロード先は、下記ホームページの最後の方のArduino IDE – ESP32用と記述されている所からダウンロードできます。
　　ダウンローしましたら、中間ぐらいの場所のハードウェア用のDabbleライブラリを入手するというDabbleライブラリの入手方法を参考にしてダウンロードしたライブラリーを取り込んでください。
　　https://ai.thestempedia.com/docs/dabble-app/getting-started-with-dabble/

#４．開発ボードとの接続
　　Arduino IDEとESP32開発ボードと接続した時に、エラーが出ましたので、参考までに記述しておきます。
##１）開発ボードへコンパイルデータを転送するときに、
　　　A fatal error occurred: Failed to connect to ESP32: No serial data received.
　　　のアラームが出て、転送できない。現象として、デバイスマネージャーのポートに、CH430用のポートが表示さなかった。
　　　⇒原因としは、ケーブルを変えることにより、CH430comポートが表示されるようになった。
　　
##２）開発ボードへコンパイルデータを転送するときに、
　　　　This error originates from pySerial. It is likely not a problem with esptool, but with the hardware connection or drivers
　　　　のアラームが出て、転送できない。
　　　⇒原因としては、2年前の古いWEMOS D1 R32ボードで接続した時のエラーで、新しく購入したボードでは、WEMOS D1 R32ボードでも書き込みが可能でした。

##３）開発ボードへコンパイルデータを転送するときに、下記エラーメッセージがでる。
　　　Compilation error: 'ledcSetup' was not declared in this scope
　　　⇒原因は分かりませんが、一度Arduino IDEをアンインストールして再インストールした所、正常にコンパイルすることが出来ました。

#５．スマートホンへのDabble Appのインストール
##１）アイホンへのインストール
　　①App Storeを開いて検索欄にDabble入力すると、インストール候補欄にDabble-bluetooth controller表示されるので選択する。
　　②Dabble-Bluetooth Controllerを選択してインストールする。
　　詳細は、下記ホームページを参照してください。
　　https://apps.apple.com/jp/app/dabble-bluetooth-controller/id1472734455
##２）アンドロイドのインストール
　　①Playストアを開いて検索欄にDabble Appと入力すると、インストール候補欄にDabbleAppが表示されるので選択する。
　　②Arduino ESP Bluetooth-Dabbleを選択してインストールする。
　　　詳細は下記ホームページを参照してください。
　　　https://play.google.com/store/apps/details?id=io.dabbleapp&hl=en_US

#６．プログラムの作成
##１）DabbleAppの説明
      Dabble Appは、スマートフォンを仮想I / Oデバイスに変換し、Bluetoothを使用してハードウェアを制御し、
　　　それと通信し、加速度計、GPS、近接、およびスマートフォンの他の機能などのセンサーにアクセスできるようにします。
      詳細な説明は、下記ホームページで確認ください
　　　https://ai.thestempedia.com/docs/dabble-app/getting-started-with-dabble/
##２）ESP32 BLUETOOH CAR (DABBLE)ソフトの利用
　　　ソフトウェアーは、オープンソフトのESP32-DABBLE-BLUETOOTH-CONTROLLED-CARをベースに作られています。
　　　サンプルプログラムでは、Switch ModeはJoystick Mode用で書かれていますので、動かすときにはJoystick Modeで動かす必要があります。
　　　下記ホームページからダウンロードして使用しています。
　　　https://github.com/THEIOTGUY/ESP32-DABBLE-BLUETOOTH-CONTROLLED-CAR
##３）プログラムの紹介

```// Code for joystick mode.

#define l1 16 //←①27left motor 1
#define l2 27 //←②26left motor 2
#define r1 25 //←③33right motor 1
#define r2 17 //←④32right motor 2
#define e1 26 //←⑤14right enable pin for left motor
#define e2 14 //←⑥25left enable pin for right motor
#define buzzerPin 5 //←⑦追加　the buzzer pin
#define led_l 18 //←⑧追加　right light
#define led_r 19 //←⑨追加　left ligth

int lm = 0; //speed of left motor
int rm = 0; //speed of right motor

#define CUSTOM_SETTINGS
#define INCLUDE_GAMEPAD_MODULE
#include <DabbleESP32.h>

const int freq = 1000; //←⑩変更30000
const int pwmChannel = 0;
const int pwmChannel2 = 1;
const int resolution = 8;
int dutyCycle = 200;

void setup() {
Dabble.begin("MyESP32"); //←⑪小文字に変更”ESP32”

pinMode(l1, OUTPUT);
pinMode(l2, OUTPUT);
pinMode(r1, OUTPUT);
pinMode(r2, OUTPUT);
pinMode(e1, OUTPUT);
pinMode(e2, OUTPUT);
pinMode(buzzerPin, OUTPUT);digitalWrite(buzzerPin, HIGH);  // ←⑫追加　Set as output
pinMode(led_l, OUTPUT);digitalWrite(led_l, LOW);  // ←⑬追加　Set as output
pinMode(led_r, OUTPUT);digitalWrite(led_r, LOW);  // ←⑭追加　Set as output


ledcSetup(pwmChannel, freq, resolution);
ledcAttachPin(e1, pwmChannel);
ledcAttachPin(e2, pwmChannel2);
}

void loop() {
Dabble.processInput();
ledcWrite(pwmChannel, lm);
ledcWrite(pwmChannel2, rm);

float xval = GamePad.getXaxisData();
float yval = GamePad.getYaxisData();

if (GamePad.isCirclePressed()) // ←⑮追加　〇ボタン確認
  {
    digitalWrite(buzzerPin, LOW); // ←⑯Set to HIGH to make the buzzer sound
  } 
else digitalWrite(buzzerPin, HIGH); //←⑰LOW to turn off the buzzer

if (GamePad.isTrianglePressed())  // ←⑱追加　△ボタン確認
 {digitalWrite(led_l, HIGH);
  digitalWrite(led_r, HIGH);
 }

if (GamePad.isCrossPressed()) // ←⑲追加　✖ボタン確認
  {digitalWrite(led_l, LOW);
   digitalWrite(led_r, LOW);
  }




if(yval < 0){
digitalWrite(l1, HIGH);
digitalWrite(l2, LOW);
digitalWrite(r1, HIGH);
digitalWrite(r2, LOW);
lm = map(yval, 0, -7, 0, 200);
rm = map(yval, 0, -7, 0, 200);
}
else if(yval > 0) {
digitalWrite(l1, LOW);
digitalWrite(l2, HIGH);
digitalWrite(r1, LOW);
digitalWrite(r2, HIGH);

lm = map(yval, 0, 7, 0, 200);
rm = map(yval, 0, 7, 0, 200);
}
else {
lm = 0;
rm = 0;
}
if(xval < 0) {
int xMapped = map(xval, 0, -7, 0, 200);
lm = lm - xMapped;
rm = rm + xMapped;
if(lm < 0) {
lm = 0;
}
if(rm > 200) {
rm = 200;
}


}
if(xval > 0) {
int xMapped = map(xval, 0, 7, 0, 200);

lm = lm + xMapped;
rm = rm - xMapped;

if(lm > 200) {
lm = 200;
}

if(rm < 0) {
rm = 0;
}
}
  
 

}


```

##４）ベースプログラムからの修正箇所の説明
　　ブザーとヘッドライト用のプログラムは、Arduino IDEソフトのスケッチ例のDabble-ESP32ライブラリのGamePadプログラムを参考にしています。
　　GamePadプログラムでは、ボタンが押されると、押されたボタンの名称が表示されるプログラムですので、一度動かしてみると理解できると思います。
　　変更プロブラムでは、△が押された時にヘッドライトON、✖が押された時にヘッドライトOFF、〇が押された時にブザーON,離したときにブザーOFFになっています。
　　変更箇所には①から⑲まで番号を振っておきました。
　　●①から⑥は、ドライバーとの配線をし易くするためにピン番号を変更しています。
　　●⑦から⑨は、ヘッドライトのON,OFFとブザーのピン番号を決めています。
　　●⑩はPWM 1サイクルの周期[sec]の逆数ですが、値を下げています。この数値の方が滑らかに動いています。（他の事例に従っています）
　　●⑪はコンパイル時に”ESP32”のダブルコーテーションが大文字で記載されていたためにエラーが出ていました。半角に修正した所、正常にコンパイルされました。
　　●⑫から⑭は、ヘッドライトのON,OFFとブザーのピン番号を出力ピンに定義しています。
　　●⑮から⑲は、ヘッドライトのON,OFFとブザーのピン番号をGamePadから取り込まれたボタンにより、ON,OFFをコントロールしています。
　　


#７．GamePadキーの操作説明
##１）スマートフォンにインストールしたDabbleのアイコンをダブルクリックします。
##２）Dabbleの機能選択画面が表示されますので、GamePadを選択します。
![Dabble選択画面-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2729018/1796c5cc-d951-5c42-e3bd-82e3a00bb40e.png)
##３）GamePadの操作画面が表示れますので、モード選択アイコンを押します。
![Dabbleモード選択画面-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2729018/b9f8a1a7-5d77-f5b2-5b0d-b81714b1067a.png)
##４）SwitchModeの選択画面が表示れますので、Joystickを選択します。
![Dabble_Joystickモード選択-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2729018/cabeaa39-049f-4946-1b65-ef9afdcc0df1.png)
##５）GamePadの操作画面に戻りますので、BLUETOOH選択アイコンを押します。
![Dabble_Bluetooth接続-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2729018/0dc4d328-6334-b16f-3fa6-92563a323c39.png)
##６）BLUETOOH選択画面が表示されますので、”MyESP32"を選択します。もし、表示さない場合は、D1 R32 ESP32ボード側を一度電源を切って、再入力してください。
![Dabble-Bluetooth選択画面-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2729018/d779f0f6-5800-a35c-dc2f-8547dddb4f61.png)
##７）JoystickモードのGamePadの操作画面が表示れます。BLUETOOH選択アイコンが接続表示されています。
![Dabble_Bluetooth接続済-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2729018/630bfeba-b6c1-d454-ce30-8c1df7d4a88e.png)
##８）Joystickボタンの操作説明
![Dabble_Bluetooth接続済-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2729018/51ef03b7-b9a3-6425-33bf-6329338fb713.png)

　　・△を押すとヘッドライトがONします。
　　・✖を押すとヘッドライトがOFFします。
　　・〇を押したときにブザーがONになり、離すとブザーがOFFになります。
　　・JOGボールを上にスライドさせると前進します。
　　・JOGボールを下にスライドさせると後退します。
　　・JOGボールを左にスライドさせると左旋回します。
　　・JOGボールを右にスライドさせると右旋回します。

#８．配線
　配線図の部品間の接続関係を説明します。
 ![ジープ回路図v2_ブレッドボード.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2729018/41d68c81-4b9d-04bf-a43a-86a27eb118d2.png)


##１）L298nハイパワードライバーボードモジュール↔モーター間接続
	OUT1↔モータA１
	OUT2↔モータA２
	OUT3↔モータB１
	OUT4↔モータB２
##２）L298nドライバーボードモジュール↔ESP32開発ボード間接続
　　①回転指令接続
	ENA↔14ピン
	IN1↔27ピン	
	IN2↔16ピン
	IN3↔17ピン
	IN4↔25ピン
	ENB↔26ピン
　　②電源供給接続
	＋５V端子↔５Vピン
	GND端子↔GNDピン
	
##３）ESP32開発ボード↔led警告灯間接続
	12ピン↔＋側LED端子1
	13ピン↔＋側LED端子2
	GNDピン↔-側LED端子1と２
##４）ESP32開発ボード↔ブザー間接続
	5ピン↔I/Oピン
	GNDピン↔GNDピン
	３Vピン↔VCCピン
##５）L298nドライバーボードモジュール↔バッテリーホルダーケース間接続
	+12V↔＋バッテリー
	GND↔-バッテリー
　L298nハイパワードライバーボードモジュールの配線情報は下記ホームページが参考になります。
　https://aisumegane.com/l298n/
　
#９．駆動系の電装部品
##１）D1 R32 ESP32 wifiワイヤレスbluetooth開発ボード
##２）L298nハイパワードライバーボードモジュール
##３）インテリジェントカーロボット用モーターモジュール　4個
##４）金属製led警告灯6mm　２個　
##５）アクティブブザーモジュール　１個
##６）ミニ押しボタンスイッチ　１個
##７）抵抗　２２０Ω　2個
##８）18650 用電池バッテリーホルダーケース
##９）ケーブル類
##１０）18650バッテリー　2個　

#１０．おわりに
　私の趣味は、工作機械を使って木工製品を作ることです。
　若いころはZ80等のマイコンを使ってソフト開発していましたが、Arduinoのソフトを最初から勉強して自作することは気が進みませんでした。
　DabbleAppを見つけて、このソフトを使えば、私でもソフト開発ができると思い、挑戦しました。　
　おかげさまで、木工製品に動きを加えることが出来ました。
![全体.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2729018/1b61b8fb-36cc-c014-0ebe-e93b8a6d828b.jpeg)