pusuke0418’s diary

異常にマルチタスクな社内SEのブログ

Arduinoで逃げるプラレール

Arduino nano 3.0互換ボードATMEGA 328 Pを介して、IR赤外線障害物回避センサLM393で物体を検知していなければモータを回し、検知するとモータを止める(モータードライバはTA7291Pを利用)。上記の他に準備したものは、電池ボックス(単三×2)とタミヤのギヤボックスセット。という前回の記事のものを利用して、衝突回避プラレールのプロトタイプをする

と思いきやほとんど同じことをより高いレベルで実現している方がいらしたので、普通は下記参照したほうが良いでしょう。

www.mita.nu


今回作ったものは、床で走らせたら前方の物体から逃げてるように見えた
www.youtube.com

スケッチや接続は下記のとおり。

/*モータドライバ接続
 *https://fabkura.gitbooks.io/arduino-docs/content/chapter17.html 
 * モータドライバ#10 OUT2      --- モータ(+)
 * モータドライバ#9  使用無し   --- 無し
 * モータドライバ#8  出力側電源 --- 電源(+)
 * モータドライバ#7  電源+    --- 電源5V=PIN5V
 * モータドライバ#6  IN2(信号2) --- digital#2=PIN2
 * モータドライバ#5  IN1(信号1) --- digital#4=PIN4
 * モータドライバ#4  制御電源(速度) --- digital$3(PWM)=PIN3
 * モータドライバ#3  使用無し   --- 無し
 * モータドライバ#2  OUT1       --- モータ(-)
 * モータドライバ#1  GND        --- GND
 * 
 * *電源(-) --- GND
 */

/*モータの動作参考
 * https://www.petitmonte.com/robot/motor_driver_ta7291p.html
 */

/*赤外線センサ接続
 * OUT --- digital#12=PIN12
 * GND --- GND
 * VCC --- 電源5V=PIN5V
 * センサはデジタルで通常"1"を返し、検知時に0を返す
 */

//for Infrared sensor
int val = 0;

void setup() {
  pinMode(2,OUTPUT); //IN2
  pinMode(4,OUTPUT); //IN1
  pinMode(12,INPUT); //infrared sensor 
  Serial.begin(9600);
}

void loop() {
  //モーターの回転速度を設定
  analogWrite(3,255);
  
  val = digitalRead(12); //センサの読み取り
  if (val==1) {  //センサが何も検出していない
     //回転
  // Serial.println(val);  //シリアルモニタにセンサの状態を出す用
  digitalWrite(4,HIGH);
  digitalWrite(2,LOW);
  delay(100);
  } else {       //センサが検出した
  //ブレーキ
  // Serial.println(val);  //シリアルモニタにセンサの状態を出す用
  digitalWrite(4,HIGH);
  digitalWrite(2,HIGH);
  delay(100);
  
  // 逆回転
  analogWrite(3,255);
  digitalWrite(4,LOW);
  digitalWrite(2,HIGH);    
  delay(2000);

//ブレーキとストップの違い
//ブレーキはモータの軸を回すと抵抗力を感じます
//ストップは軸をまわすと抵抗無く回ります とのこと

  }
}