前回のやり方で、Arduinoとブレッドボードのマウントを作成したので、今回から駆動系を作っていく。
初めに最低限の動きを実現させよう。
DROID INOVENTOR KID のメインの動力はDCモータ、前輪の制御にサーボモーターを使用しているので、今回は無線で動かすことができるように赤外線センサをつけて、適当なリモコンで一通りの動きができるところまでやってみたい。
前回作成したマウントにArduino、ブレッドボードを載せてベースに装着。
ArduinoにはLCDシールドを装着。
以前、購入した東芝のモータドライバーTA7291Pを使って付属のDVモータを接続。
赤外線センサも以前購入したものを使用。
サーボモータは付属の線輪用のものと、頭と腕の動作で3つ必要だが、手持ちが1つしかないので、とりあえず、前輪と頭の制御用として2つを接続。
配線図はこんな感じ。
頭用の手持ちのサーボは大きいものなのでバッテリーから給電するようにした。
腕用のものと一緒にマイクロサーボを買ったら変更する予定。
こんな感じでスケッチした。
#include
#include
// 赤外線センサ
int RECV_PIN = 11;
IRrecv irrecv(RECV_PIN);
decode_results results;
// モーター制御 出力ピンの定義
const int motor1A = 7;
const int motor1B = 8;
const int motor1P = 6;
// サーボモーター
Servo servo;
Servo servoH;
const int PIN_SERVO = 16;
const int PIN_SERVOH = 9;
String getIR(){
if (!irrecv.decode(&results)) {
return "";
}
//Serial.println(results.value, HEX);
String ret;
String val = String(results.value, HEX);
// ↑
if(val.equals("2fd7c83") || val.equals("4324a3bf"))
{
ret = "Fw";
}
// →
else if(val.equals("2fdda25") || val.equals("d85e479f"))
{
ret = "Rt";
}
// ↓
else if(val.equals("2fdfc03") || val.equals("3409de43"))
{
ret = "Dw";
}
// ←
else if(val.equals("2fdfa05") || val.equals("76707863"))
{
ret = "Lf";
}
// ↑↑
else if(val.equals("27d04fb") || val.equals("29a08847"))
{
ret = "UU";
}
// ↓↓
else if(val.equals("27d847b") || val.equals("834de04b"))
{
ret = "DD";
}
// <<
else if(val.equals("27d44bb") || val.equals("226fd0eb"))
{
ret = "LL";
}
// >>
else if(val.equals("27dc43b") || val.equals("72b68ae7"))
{
ret = "RR";
}
// 決定
else if(val.equals("2fdbc43") || val.equals("ef24b227"))
{
ret = "Ct";
}
else {
ret = "";
}
// Receive the next value
irrecv.resume();
return ret;
}
void motorAction(String act){
static int level;
static String beforeAct;
if(level < 100){
level = 100;
}
if(level > 225){
level = 225;
}
if(act.equals(beforeAct)){
level += 25;
}
beforeAct = act;
if(act.equals("Fw")){
Serial.println("select Fw");
digitalWrite(motor1A,HIGH);
digitalWrite(motor1B,LOW);
analogWrite(motor1P,level);
Serial.println("Moter : " + String(level, DEC));
}else if(act.equals("Dw")){
Serial.println("select Dw");
digitalWrite(motor1A,LOW);
digitalWrite(motor1B,HIGH);
analogWrite(motor1P,level);
Serial.println("Moter : " + String(level, DEC));
}else if(act.equals("Ct")){
Serial.println("select Ct");
digitalWrite(motor1A,LOW);
digitalWrite(motor1B,LOW);
level = 0;
}
}
void servoAction(String act){
static int level;
if(act.equals("Lf")){
Serial.println("select Lf");
level -= 1;
}else if(act.equals("Rt")){
Serial.println("select Rt");
level += 1;
}else if(act.equals("Ct")){
Serial.println("select Ct");
level = 0;
} else {
return;
}
if(level < -2){
level = -2;
}
if(level > 2){
level = 2;
}
int vl = 67 + level * 10;
Serial.println("Servo : " + String(vl, DEC));
servo.write( vl );
}
void servoActionH(String act){
static int level;
if(act.equals("LL")){
Serial.println("select LL");
level -= 1;
}else if(act.equals("RR")){
Serial.println("select RR");
level += 1;
} else {
return;
}
if(level < -2){
level = -2;
}
if(level > 2){
level = 2;
}
int vl = 90 + level * 16;
Serial.println("ServoH : " + String(vl, DEC));
servoH.write( vl );
}
void setup() {
// シリアル初期化
Serial.begin(9600);
Serial.println("setup");
// 赤外線センサ
irrecv.enableIRIn();
// モーター初期化
pinMode(motor1A,OUTPUT); // 信号用ピン
pinMode(motor1B,OUTPUT); // 信号用ピン
// サーボモーター
servo.attach( PIN_SERVO );
servo.write( 67 );
// サーボモーター
servoH.attach( PIN_SERVOH );
servoH.write( 90 );
}
void loop() {
String ir = getIR();
if(ir.equals("")){
return;
}
motorAction(ir);
servoAction(ir);
servoActionH(ir);
}
赤外線センサー制御は東芝製のテレビリモコン用にスケッチした。
左右ボタンで前輪サーボモータ、頭のサーボモータ。
前後ボタンでモータドライバーの制御を行っている。
サーボモータの制御はライブラリを使用したが、なぜかライブラリを読み込んだ時点で赤外線センサーが読み込まなくなってしまった。
ライブラリの説明をよくよく読んだら「Mega以外のボードでは、ピン9と10のPWM機能が無効になります。」だそうだ。
別のピンで使用するようにしたら正常に動作した。
9番10番ピンをサーボ用としたとしても最終的にもう一つ必要となるので、前輪の制御はアナログピンを使用して制御した。
とりあえず、前輪、後輪、頭の制御が赤外線センサーで制御できるまでできたので、筐体に取り付けた。
サーボモータなどをちゃんと取り付けたいが、仮組なのでマスキングテープで貼り付け。
配線が邪魔でカバーを付けるまではできないが、ちゃんと動いたのでOK。
ブレッドボードを使用している部分は、いずれ自作シールドにするつもりなので、問題ないだろう。
次はラズパイと連携に挑戦する予定。