Arduinoで自動運転に挑戦してみる! その2 試運転 [Arduinoで自動運転(DCC)]
こんにちは。都内は今日も気持ちのイイ五月晴れです。
窓を開けていると風が心地いいです♪
このところ車輌の購入意欲はほとんどなかったのですが、KATOの秋の製品予定にEF70がリニューアルするようなので、久々にワクワク!
ただ、最近の動力ユニットにはサウンド搭載が厳しいので、ちょっと悩みます。
あと品番に枝番が付いていないのがちょっと気がかり。
1000番台の製品化ですが、1次型や2次型といった展開は???
秋までにはいろいろと仕掛なのを片付けたいところ。
で、aruduinoを使っての自動運転の企みですが、なんとなく先が見えてきたかも!?
今回はロクハンの線路にフォトリフレクタを組み込んで、実際に車輌を動かしてみました。
まずは、こんな感じにフォトリフレクタを線路に取り付けました。
トリミングしてみました。
赤の文字が読みにくいかと思いますが・・・
ちなみに、以前の記事で、フォトトランジスタ側には1GΩを使うとしていましたが、1MΩの誤記でした。
これを今までテストしてきた回路と組み合わせました。
で、動画です。
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回の平均値を返す
}
窓を開けていると風が心地いいです♪
このところ車輌の購入意欲はほとんどなかったのですが、KATOの秋の製品予定にEF70がリニューアルするようなので、久々にワクワク!
ただ、最近の動力ユニットにはサウンド搭載が厳しいので、ちょっと悩みます。
あと品番に枝番が付いていないのがちょっと気がかり。
1000番台の製品化ですが、1次型や2次型といった展開は???
秋までにはいろいろと仕掛なのを片付けたいところ。
で、aruduinoを使っての自動運転の企みですが、なんとなく先が見えてきたかも!?
今回はロクハンの線路にフォトリフレクタを組み込んで、実際に車輌を動かしてみました。
まずは、こんな感じにフォトリフレクタを線路に取り付けました。
トリミングしてみました。
赤の文字が読みにくいかと思いますが・・・
ちなみに、以前の記事で、フォトトランジスタ側には1GΩを使うとしていましたが、1MΩの誤記でした。
これを今までテストしてきた回路と組み合わせました。
で、動画です。
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回の平均値を返す
}
コメント 0