Atmega328Pで自立走行ロボットを作ろう(その1)

・目的 

最終的な目標は距離センサとATmega328Pを使って

自立走行できるロボットを作る。

 

超音波センサで距離を測り障害物に

近づいたらそれを避けて直進するように

する。

 

今回はブレッドボード上に回路を組む

ところまで。

 

・使用したもの

Arduino uno

ATmega328P

TA7291P

HC-SRO4

ブレッドボード

XHコネクタ

ユニバーサル基板

16Mhz振動子

タミヤモーター

レギュレータ5V1A

 

 

・方法

 

1)Arduino unoで回路を組み立てる

 

ブレッドボードにArduino を使って回路を組み立てる

回路図は図1に示した。

 

 

f:id:shangtian:20170918100013p:plain

図1:プロトタイプ

 


TA7291p を使ってみた

 

超音波センサとモータードライバの詳しい使い方は

以下から。

 

shangtian.hatenablog.com

  shangtian.hatenablog.com

 

 

2)コード

 

コードを図に示した。

const int で接続するピンを

宣言しておく

 

また前進、後退、右、左、停止、距離測定

を行う関数を作成

 

 

 

const int Pin1 = 6;
const int Pin2 = 7;
const int Pin3 = 9;
const int Pin4 = 10;
const int pwm1 = 5;
const int pwm2 = 11;

const int Trig = 3;
const int Echo = 4; 

void setup() {
  pinMode(Pin1,OUTPUT);
  pinMode(Pin2,OUTPUT);
  pinMode(Pin3,OUTPUT);
  pinMode(Pin4,OUTPUT);
  pinMode(pwm1,OUTPUT);
  pinMode(pwm2,OUTPUT);
  pinMode(Trig,OUTPUT);
  pinMode(Echo,INPUT);
  //Serial.begin(9600);
}


void forward(int val){
  digitalWrite(Pin1,LOW);
  digitalWrite(Pin2,HIGH);
  analogWrite(pwm1,val);
  digitalWrite(Pin3,HIGH);
  digitalWrite(Pin4,LOW);
  analogWrite(pwm2,val);
}

void reverse(int val){
  digitalWrite(Pin1,HIGH);
  digitalWrite(Pin2,LOW);
  analogWrite(pwm1,val);
  digitalWrite(Pin3,LOW);
  digitalWrite(Pin4,HIGH);
  analogWrite(pwm2,val);
}

void right(int val){
  digitalWrite(Pin1,LOW);
  digitalWrite(Pin2,HIGH);
  analogWrite(pwm1,val);
  digitalWrite(Pin3,LOW);
  digitalWrite(Pin4,HIGH);
  analogWrite(pwm2,val);
}

void left(int val){
  digitalWrite(Pin1,HIGH);
  digitalWrite(Pin2,LOW);
  analogWrite(pwm1,val);
  digitalWrite(Pin3,HIGH);
  digitalWrite(Pin4,LOW);
  analogWrite(pwm2,val);
}

void despin() {
  digitalWrite(Pin1,LOW);
  digitalWrite(Pin2,LOW);
  digitalWrite(Pin3,LOW);
  digitalWrite(Pin4,LOW);
}

float echo() {

  int dur;
  float distance;
  digitalWrite(Trig,HIGH);
  delayMicroseconds(10);
  digitalWrite(Trig,LOW);
  dur = pulseIn(Echo,HIGH);
  distance = (float)dur*0.017;
  return distance;
}

void loop() {
  float a,b;
  float dis;
  float Distance;
  dis = echo();
  if(dis >= 0.5){
    Distance = dis;
  }
  if(Distance <= 5.0){
    //Serial.println(Distance);
    reverse(50);
    delay(5000);
    right(50);
    delay(5000);
    despin();
    a = echo();
    left(50);
    delay(10000);
    despin();
    b = echo();
    delay(5000);

    if(a >= b){
      right(50);
      delay(10000);
    }
  }else{
    //Serial.println(Distance);
    forward(200);
    delay(1000);
  }
} 

3)ATmega328Pで動かしてみる

 今度はArduinoからATmega328P

に置き換えてみる

 

図のコードをATmega328Pに書き込んで

ブレッドボード上に繋いでみた

 

書き込みは以下の記事のように

行った。

shangtian.hatenablog.com

 

f:id:shangtian:20170918111932p:plain