SSブログ

Arduinoで自動運転に挑戦してみる! その2 試運転 [Arduinoで自動運転(DCC)]

こんにちは。都内は今日も気持ちのイイ五月晴れです。
窓を開けていると風が心地いいです♪

このところ車輌の購入意欲はほとんどなかったのですが、KATOの秋の製品予定にEF70がリニューアルするようなので、久々にワクワク!
ただ、最近の動力ユニットにはサウンド搭載が厳しいので、ちょっと悩みます。
あと品番に枝番が付いていないのがちょっと気がかり。
1000番台の製品化ですが、1次型や2次型といった展開は???

秋までにはいろいろと仕掛なのを片付けたいところ。

で、aruduinoを使っての自動運転の企みですが、なんとなく先が見えてきたかも!?

今回はロクハンの線路にフォトリフレクタを組み込んで、実際に車輌を動かしてみました。

P1110254.JPG

まずは、こんな感じにフォトリフレクタを線路に取り付けました。

P1110252.JPG

トリミングしてみました。

P1110252-1.jpg

赤の文字が読みにくいかと思いますが・・・
ちなみに、以前の記事で、フォトトランジスタ側には1GΩを使うとしていましたが、1MΩの誤記でした。

これを今までテストしてきた回路と組み合わせました。

P1110253.JPG

で、動画です。



Arduinoを使って自動運転を試してみました。

今回は、リモコンを押すと確認用のLEDが点灯して3秒ほど加速。
その後、10秒ほど力行してからフォトリフレクタで車輌を検知したら、減速して停車します。

再度、リモコンを押すと確認用のLEDが点灯して進行方向を逆にして3秒ほど加速。
その後、10秒ほど力行してからフォトリフレクタで車輌を検知したら、減速して停車します。

これで、発車⇒加速⇒力行⇒減速⇒停車ができるようになりました。
次はポイントと組み合わせてみようと思っています。

今回のプログラムはこんな感じです。

#include <IRremote.h>

// 自動往復運転

void analogWrite3(int op1)
{
TCCR2A=0b00100011;
TCCR2B=0b00001010;
OCR2A=150;
OCR2B=op1;
}
void analogWrite10(int op2)
{
TCCR1A=0b00100011;
TCCR1B=0b00011010;
OCR1A=150;
OCR1B=op2;
}

int RECV_PIN = 8;
IRrecv irrecv(RECV_PIN);
decode_results results;

void setup()
{
Serial.begin(9600);
irrecv.enableIRIn(); // Start the receiver

pinMode(13, OUTPUT); // 確認用LED

pinMode(3,OUTPUT); // 赤
pinMode(10,OUTPUT); // 白
pinMode(11,OUTPUT); // 緑
pinMode(12,OUTPUT); // 黄
}

int fw=1; // 前後進用変数

void loop() {
int val ; // フォトリフレクタ用変数

// decode_results results;

if (irrecv.decode(&results)) {
Serial.println("Step000");
Serial.println(results.value, HEX);
irrecv.resume(); // Receive the next value

if((results.value == 0xFF30CF) ||
(results.value == 0x9716BE3F)){ // リモコンが1か?
digitalWrite(13, HIGH); // turn the LED on (HIGH is the voltage level)
delay(1000); // wait for a second
digitalWrite(13, LOW); // turn the LED off by making the voltage LOW
delay(1000); // wait for a second

digitalWrite(3,LOW);
digitalWrite(11,LOW);
digitalWrite(12,LOW);

delay(500);
if (fw==1){
Serial.println("Step001");
digitalWrite(11,HIGH);
}
else {
Serial.println("Step002");
digitalWrite(12,HIGH);
}
for (int i=1 ;i<10 ;i++ ){
if (fw==1){
Serial.println("Step003");
analogWrite3(i);
digitalWrite(10,LOW);
}
else {analogWrite10(i);
Serial.println("Step004");
digitalWrite(3,LOW);
}
delay(300);
}

delay(10000); // 10秒力行

// フォトリフレクタから読み込み
// val = SENSOR_read(0) ; // センサーから読み込む
// if (val < 950) { // 車輌通過か?

digitalWrite(13, HIGH); // turn the LED on (HIGH is the voltage level)
delay(1000); // wait for a second

do{
val = SENSOR_read(0) ; // センサーから読み込む
delay(100);

} while (val > 950) ;

digitalWrite(13, LOW); // turn the LED off by making the voltage LOW
delay(1000); // wait for a second

for (int i=10;i>1;i--){
if (fw==1){
Serial.println("Step005");
analogWrite3(i);
digitalWrite(10,LOW);
}
else {
Serial.println("Step006");
analogWrite10(i);
digitalWrite(3,LOW);
}
delay(100);
}
Serial.println("Step007");
delay(3000);
digitalWrite(3,LOW);
digitalWrite(11,LOW);
digitalWrite(12,LOW);
fw=fw*-1;
// }
}
}
}

// フォトリフレクターからの読み込み処理(30回読込み平均をとる)
int SENSOR_read(int PinNo) {
long ans ;
int i ;

ans = 0 ;
for (i=0 ; i < 30 ; i++) {
ans = ans + analogRead(PinNo) ; // 指定のアナログピン(0番端子)から読取り
}
return ans/30 ; // 30回の平均値を返す
}

nice!(4)  コメント(0)  トラックバック(0) 
共通テーマ:趣味・カルチャー

nice! 4

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

トラックバック 0