夏季休暇の間、ラジコンを製作していました。
以前からArduinoに興味があり、コントローラはできればスマホにしてアプリ製作もやってみたい、などと考えながら、こちらのサイトを参考にさせてもらいました↓
ソフトウェアの部分に関しては、初心者の自分では理解が難しかったので、Arduinoの基礎に近い方法で変更してみました。
ハードウェア
ハードウェアの方はほぼ同じ仕様ですが、参考サイトの方法から下記変更を加えました・TA7291Pの4番ポートをArduinoの3番ポートに接続
⇒PWM信号をつかって、DCモーターの速度を調整できるようにするため
※※注意点※※
・サーボのPWM信号をArduinoのライブラリ(PWMServoライブラリやServoライブラリなど)経由で出力する場合、Arduinoの9番と10番は使用できないです。よって、今回は3番ポートからの出力に変更しています。
・サーボとシャフトをつなぐ、針金の半田付けですが、あとでソフトウェア上で中立位置を調整できるので、多少まっすぐでなくてもOKです。
・モーター駆動用の単三乾電池4本は両面テープでベニヤに固定しています。
・サーボとシャフトをつなぐ、針金の半田付けですが、あとでソフトウェア上で中立位置を調整できるので、多少まっすぐでなくてもOKです。
・モーター駆動用の単三乾電池4本は両面テープでベニヤに固定しています。
ソフトウェア
プログラミングに関して、私のスキルでは、参考サイトのやり方がよく理解できなかったので、もう少し簡単な方法にしてみました。以下が今回作成したArduinoのスケッチです。
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <PWMServo.h> | |
#include <SoftwareSerial.h> | |
#define SERVO_PWM 9 | |
#define MOTOR_IN1 11 | |
#define MOTOR_IN2 5 | |
#define RX | |
#define TX 7 | |
#define MOTOR_PWM 3 | |
PWMServo myservo; | |
SoftwareSerial btSerial(RX,TX); | |
int val = 85;//サーボの中立位置 | |
int motor_speed = 0; | |
void setup() { | |
pinMode(MOTOR_IN1, OUTPUT); //DCモーターの出力 | |
pinMode(MOTOR_IN2, OUTPUT); //↑ | |
digitalWrite(MOTOR_IN1,LOW); //DCモーターは最初はストップ状態にする | |
digitalWrite(MOTOR_IN2,LOW); //↑ | |
analogWrite(MOTOR_PWM,motor_speed); //DCモーターの速度は0にする | |
myservo.attach(SERVO_PWM); //サーボのPWM設定 | |
myservo.write(val); //サーボの初期位置(85度) | |
btSerial.begin(9600); //bluetooth通信開始 | |
} | |
void loop() { | |
char c; | |
//delay(100); | |
if(btSerial.available()){ | |
c = btSerial.read(); | |
} | |
switch(c){ | |
case '1': //DCモーター正転 | |
digitalWrite(MOTOR_IN1,HIGH); | |
digitalWrite(MOTOR_IN2,LOW); | |
break; | |
case '2': //DCモーター反転 | |
digitalWrite(MOTOR_IN1,LOW); | |
digitalWrite(MOTOR_IN2,HIGH); | |
break; | |
case '3': //左(サーボ左回転) | |
if(val < 120){ | |
val = val + 10; | |
myservo.write(val); | |
} | |
break; | |
case '4': //右(サーボ右回転) | |
if(val>50){ | |
val = val - 10; | |
myservo.write(val); | |
} | |
break; | |
case '5': //×ボタン(ブレーキ) | |
digitalWrite(MOTOR_IN1,HIGH); | |
digitalWrite(MOTOR_IN2,HIGH); | |
break; | |
case '6': //○ボタン(加速) | |
motor_speed += 10; | |
analogWrite(MOTOR_PWM,motor_speed); | |
break; | |
case '7': //□ボタン(減速) | |
motor_speed -= 10; | |
analogWrite(MOTOR_PWM,motor_speed); | |
break; | |
} | |
} |
スマホアプリの十字キーの左と右がサーボの左右回転、上と下がDCモーターの正転と反転指示で、○が速度UP、□が速度DOWN、×がブレーキです。
サーボの中立位置(変数val)は、正面から見てタイヤがまっすぐになるよう、値を調整しました。操舵角度は左右それぞれ35度ぐらいが限界かなと思います。
Google Play StoreでArduino, Bluetoothで検索すると似たようなものがいくつか出てきます。基本的にどれを使ってもOKだとおもいます。Set Commands画面でキーアサインを1から順に、Arduinoのスケッチと整合が取れるように割り振ります。
ただし、Pushボタン形式だとやはり操縦がしずらいので、スライダー調整ができるよう、今後はアプリ開発に取り組んでいく予定です。
ただし、Pushボタン形式だとやはり操縦がしずらいので、スライダー調整ができるよう、今後はアプリ開発に取り組んでいく予定です。
生徒と一緒にこのラジコンカーを取り組んでいます。
返信削除もともとのサイトの情報がよく理解できなくて迷走していました。
おかげさまで、動くようになりました。
ありがとうございました。
こんばんは。お役に立てることができて良かったです。
返信削除