前回の記事でATTiny85の周波数を校正したことで、アプリから受信した値をBLEモジュールのAE-TYBLE16とのシリアル通信によって正しく取得できるようになりました。
今回はその受信した値を使って、モータードライバのTC78H653FTGを制御し、実際にDCモーターを動かしてみようと思います。
開発環境
- Mac Book (10.13.6)
- Arduino IDE (1.8.13)
機材一覧
- ATTiny85
- 太陽誘電 小型BLEモジュール基板 (AE-TYBLE16)
- TC78H653FTGモータドライバモジュール
- DCモーター
- ESP-WROOM-32D開発ボード ※3.3V電源として
その他 ブレッドボード、ジャンパワイヤ、電池ボックスなど
テストコード
ATTiny85は0PINと1PINからPWM制御ができるようです。
入力された文字列を数値か判定して、数値の場合は入力値で速度制御を、文字列の場合には停止をするようにしてみました。
モータードライバのTC78H653FTGはデューティ比が25%以上でないといけませんが、今回は弾くような制御を入れていないので、64未満の数値は0以外は使わないようにします。
/* * ATtiny85 PIN * 5/A0 U VCC * 3/A3 | 2/A1 * 4/A2 | 1/PWM * GND | 0/PWM */ #include <SoftwareSerial.h> SoftwareSerial bleSerial(3, 4); // RX, TX #define ENABLE 2 // モータードライバON 兼ラージモード. #define FRONT 1 // 正転. #define BACK 0 // 逆転. void setup() { bleSerial.begin(9600); pinMode(FRONT, OUTPUT); pinMode(BACK, OUTPUT); pinMode(ENABLE, OUTPUT); digitalWrite(ENABLE, HIGH); digitalWrite(BACK, LOW); analogWrite(FRONT, 0); // 周波数調整(個体差あるので要調整) OSCCAL = 155; // Default 159 } String str = ""; // 数値判定 bool isNumber(const char* ascii) { int i; for (i=0; i<strlen(ascii); i++) { if(!isdigit(ascii[i])) { return false; } } return true; } void loop() { while(bleSerial.available()) { char inChar = bleSerial.read(); if (inChar == '\n' || inChar == '\r') { if(0 < str.length()) { if(isNumber(str.c_str())) { // 数値 0-255の範囲に丸め込み. int power = atoi(str.c_str()); power = min(max(power, 0), 255); analogWrite(FRONT, power); } else { analogWrite(FRONT, 0); } str = ""; } break; } str += inChar; } }
回路作成
モータードライバのTC78H653FTGは、今回も4Aまで対応のLARGEモードを使うので、電源を2本接続するようにしています。
動作テスト
BLEモジュールの接続は太陽誘電のアプリを使っています。 youtu.be
さいごに
無事にATTiny85のPWM制御でDCモーターを動かすことができました。
次は3.3V昇圧コンバータを使って、乾電池だけ駆動するように修正してみたいと思います。