« Arduino UNO で周囲が暗くなったらLEDを点灯する回路 | Main | Arduino UNO 超音波センサーロボットカーに後方センサーを追加 »

06/04/2019

Arduino UNO で Robot Car 製作

超音波センサーで周囲のスペースを検知し動き回るタンクロボットを作った。
Img_20190602_085716 Img_20190602_085732 Img_20190602_085744 Img_20190602_085755      
    
使用した部品は、下記の通り
 ①ロボットシャシー:P Prettyia アルミ合金のタンクシャシーをAmazonから購入
 ②Arduino UNO x 1個
 ③超音波距離センサーモジュール:HC-SR04 x 1個
 ④デジタル・マイクロサーボ:SG90 x 1個
 ⑤モータドライバシールド:WINGONEER L298Pモータドライバモジュール
             Arduino用高出力DCステッパモータコントローラ x 1
  https://www.instructables.com/id/Tutorial-for-L298-2Amp-Motor-Driver-Shield-for-Ard/ 
 ⑥Miniブレッドボード:Arduino用170タイポイント Miniブレッドボード x 1個
 ⑦トグルスイッチ x 1
 ⑧18650バッテリー2個用ホルダー x 2個
 ⑨18650バッテリー  x 4個
 ⑩その他、バッテリーを載せるトレイ(100均で調達)、シールド電線少々

・ロボットシャシー:P Prettyia アルミ合金のタンクシャシー は、組立て説明書が添付されず、構成部品だけが送られてくるので、組み上がった写真を見て組立て方法を考える必要がある。送られてきたパーツの数が間違えているのではないかと組立てながら疑った事もあった。キーポイントは、モーター軸に組み付けるハブの組立て状況を写真をよく見て調べることだ。

・モーターを制御するために、僕はWINGONEER のL298Pモーターシールドを使った。
・将来構想として、WiFi あるいは Bluetooth でのラジコンを考えているので、周囲の明るさに応じて、自動的にヘッドライトを点灯する回路を追加した。


《Sketch》

// Obstacle avoidance Tank Robot program 2019/06/04
// My Spice Cabinet http://spice-cabinet.cocolog-nifty.com/blog/
double Fdistance = 0;
double Rdistance1= 0;
double Ldistance1= 0;
double Rdistance2= 0;
double Ldistance2= 0;
#include  <Servo.h>
int pinLB = 12; // direction control function
int pinLF = 10; // motors' control chip with speed control function
int pinRB = 13; // direction control function
int pinRF = 11; // motors' control chip with speed control function
int echoPin = 5; // define pin for sensor echo
int trigPin = 6; // define pin for sensor trig
int motorOnTime1; // motor on time back
int motorOnTime2; // turning motor on time
int directionn = 0; // forward=8 backward=2 left=4 right=6
Servo myServo; // set myservo
int delay_time = 250; // settling time 250 after steering servo motor moving B
int Fgo = 8; // Move Forward
int Rgo = 6; // move to the R
int Lgo = 4; // move to the L
int Bgo = 2; // move Backward
int angle;
void setup()
{
Serial.begin(9600);
pinMode(3, OUTPUT); // Head light
// Define motor output pin
pinMode(pinLB,OUTPUT); // pin 12 direction control function
pinMode(pinLF,OUTPUT); // pin 10 (PWM)
pinMode(pinRB,OUTPUT); // pin 13 direction control function
pinMode(pinRF,OUTPUT); // pin 11 (PWM)
// Define sensor pin
pinMode(echoPin, INPUT); // define input pin from sensor
pinMode(trigPin,OUTPUT); // define output pin for sensor
myServo.attach(9); // Define servo motor output pin to D9 (PWM)
}
void advance()                   // move to forward
{
digitalWrite(pinLB,LOW); // left wheel moves forward
digitalWrite(pinRB,LOW); // right wheel moves forward
analogWrite(pinLF,255);
analogWrite(pinRF,255);
}
void stopp()                       // all wheel stop
{
digitalWrite(pinLB,HIGH); // left wheel stop
digitalWrite(pinRB,HIGH); // right wheel stop
analogWrite(pinLF,0);
analogWrite(pinRF,0);
}
void right()                       // turn right (single wheel)
{
digitalWrite(pinLB,HIGH); // wheel on the left stop
digitalWrite(pinRB, LOW); // wheel on the right moves backward
analogWrite(pinLF,255);
analogWrite(pinRF,255);
}
void left()                         // turn left (single wheel)
{
digitalWrite(pinLB, LOW); // wheel on the left moves backward
digitalWrite(pinRB,HIGH); // wheel on the right stop
analogWrite(pinLF,255);
analogWrite(pinRF,255);
}
void back()                        // move backward
{
digitalWrite(pinLB,HIGH); // motor moves to left rear
digitalWrite(pinRB,HIGH); // motor moves to right rear
analogWrite(pinLF,255);
analogWrite(pinRF,255);
}
void detection()            // measure multi directions
{
angle = 90; // measure front direction
ask_pin_F(); // read the distance ahead
motorOnTime1 = 100;
motorOnTime2 = 200;
// ==========================================================
if(Fdistance < 30) // if distance ahead is <30cm
{
stopp(); // all wheel stop
delay(motorOnTime1);
back(); // move backward for 0.2S
delay(motorOnTime2);
}
// ----------------------------------------------------------
if(Fdistance < 50) // if distance ahead is <50cm
{
stopp(); // all wheel stop
delay(motorOnTime1);
// ==========================================================
angle = 5; // measure left direction
ask_pin_F(); // read distance on the left
Ldistance1 = Fdistance;
motorOnTime1 = 300;
motorOnTime2 = 300; // turn about 100deg, if 120deg --> 600
delay(delay_time); // stabilizing time for servo motor
// ==========================================================
angle = 30; // measure left direction
ask_pin_F(); // read distance on the left
Ldistance2 = Fdistance;
motorOnTime1 = 100;
motorOnTime2 = 200;
delay(delay_time); // stabilizing time for servo motor
// ==========================================================
angle = 120; // measure right direction
ask_pin_F(); // read distance on the right
Rdistance2 = Fdistance;
motorOnTime1 = 100;
motorOnTime2 = 200;
delay(delay_time); // stabilizing time for servo motor
// ==========================================================
angle = 175; // measure right direction
ask_pin_F(); // read distance on the right
Rdistance1 = Fdistance;
motorOnTime1 = 300;
motorOnTime2 = 300; // turn about 100deg, if 120deg --> 600
delay(delay_time); // stabilizing time for servo motor
// ==========================================================
if(Ldistance2 > Rdistance2) // if LH distance is >distance on the right
{
directionn = Lgo; // move to the L
}
// ----------------------------------------------------------
if(Ldistance2 <= Rdistance2) // if LH distance is <= distance on the right
{
directionn = Rgo; // move to the right
}
// ----------------------------------------------------------
if (Ldistance1 < 30 && Rdistance1 < 30) // if distance on LH and RH are both <30cm
{
directionn = Bgo; // move to backward
}
}
// ----------------------------------------------------------
else // if distance ahead is >50cm
{
angle = 90;
ask_pin_F(); // read the distance ahead
directionn = Fgo; // move forward
}
}
void ask_pin_F()            // measure the distance ahead on the angle
{
myServo.write(angle);
delay(delay_time);
digitalWrite(trigPin, LOW); // ultrasonic sensor transmit low level signal 2μs
delayMicroseconds(2);
digitalWrite(trigPin,HIGH); // ultrasonic sensor transmit high level signal 10μs, at least 10μs
delayMicroseconds(10);
digitalWrite(trigPin, LOW); // keep transmitting low level signal
double Duration = pulseIn(echoPin, HIGH); // read the time in between
Fdistance = Duration/2*340*100/1000000; // convert time into distance (unit: cm)

// debugging the angle and its distance
Serial.print(angle);
Serial.print("- Distance ahead ");
Serial.print(Fdistance);
Serial.println(" [cm]");
}
void loop()
{
// Head light
Serial.print("CDS Value = ");
Serial.println(analogRead(0));
digitalWrite(3, LOW);
if(analogRead(0)<400) digitalWrite(3, HIGH);
// driving forward ----------------------------
angle=90;
myServo.write(angle); // home set the servo motor, ready for next measurement from 90
detection(); // measure the angle and determine which direction to move
if(directionn == 2) // if direction => backward
{
back(); // go backward
delay(motorOnTime1);
left(); // Move slightly to the left (to prevent stuck in dead end)
delay(motorOnTime2);
}
// ---------------------------------------------
if(directionn == 6) // if direction => right
{
back(); // go backward
delay(motorOnTime1);
left(); // turn left because reverse run
delay(motorOnTime2);
}
// ---------------------------------------------
if(directionn == 4) // if direction => left
{
back(); // go backward
delay(motorOnTime1);
right(); // turn right because reverse run
delay(motorOnTime2);
}
// ---------------------------------------------
if(directionn == 8) // if direction => forward
{
advance(); // move forward
delay(motorOnTime1);
}
}



《参考資料》
参考にしたSketch
https://s.siteapi.org/b2a66604b1dde25.ru/docs/1a8777f11b3ec42b322a4659688401e914be7efd.pdf
これを使ったロボットは私のものより少し小さい?ので、モーターを制御するタイミング時間で、動き方がかなり変わっているように思ったので、自分が納得する動きをさせるために、スケッチは大きく変更した。

PWMで明るさを調整できるanalogWrite関数
https://voltechno.com/blog/aruled/

LEDライトのコントロール
https://www.denshi.club/pc/kits/led2arduinol.html
2N7000 x1、75Ω、47KΩ

24 暗くなったらLEDを点滅させる
https://n.mtng.org/ele/arduino/samples/sample24.html
CDS x1、10KΩ

« Arduino UNO で周囲が暗くなったらLEDを点灯する回路 | Main | Arduino UNO 超音波センサーロボットカーに後方センサーを追加 »

Arduino」カテゴリの記事

Comments

Post a comment

Comments are moderated, and will not appear on this weblog until the author has approved them.

(Not displayed with comment.)

« Arduino UNO で周囲が暗くなったらLEDを点灯する回路 | Main | Arduino UNO 超音波センサーロボットカーに後方センサーを追加 »

September 2019
Sun Mon Tue Wed Thu Fri Sat
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30          

Recent Trackbacks

無料ブログはココログ