自动跟随机器人教程(三)软件部分 (Arduino固件)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/shukebeta008/article/details/79335259

接下来讲软件部分,软件主要分为三大块。一个是Arduino上跑的单片机程序,另一个是树莓派上跑的程序,最后是电脑上跑的程序(如果是用电脑远程遥控就需要这些程序,如果是树莓派自主运行就不需要,但是调试阶段建议这段程序也用一下,调得差不多了再完全自主运行)。


首先讲最简单的Arduino程序。

由于Arduino Uno本身是一个比较简单的单片机,跑不了太复杂的程序,所以上面运行的代码也比较简单。就是两部分功能,一个是通过串口指令对电机控制的代码,另一个是获得超声波传感器的距离信息的代码。

第一部分的主要实现方式是在loop函数中不断读串口,根据串口数据的要求去控制4个引脚信号的高低,这样可以控制电机转动方向或者停止不动。

第二部分的超声波模块可以参照 http://www.alsrobot.cn/wiki/index.php/(SKU:RB-02S001A)RB_URF02超声波传感器


本人的建议是初期手动控制小车时,可以参照电机控制代码去读取超声波数据,不要在loop里不停读取,自动运行时才在loop里不停调用超声波读取代码。


int led = 13;
float duration;                
float distance;              
int srfPin = 8;

void setup() 
{
    Serial.begin(9600);
    pinMode(led, OUTPUT); 
    pinMode(9,OUTPUT);
    pinMode(10,OUTPUT);
    pinMode(5,OUTPUT); 
    pinMode(6,OUTPUT);
    
    
}
void loop()
{
    delay(100);               // wait for a second
    
    if (Serial.available()>0)
    {
      char cmd = Serial.read();
      //Serial.print(cmd);
      switch (cmd)
      {
        case '1':
            Forward();
            break;
        case '2':
            Back();
            break;
        case '3':
            Turn_left();
            break;
        case '4':
            Turn_right();
            break;
        case '6':
            Measure();
        default:
            Stop();
      }
    }
}
void Forward()
{
    digitalWrite(9,HIGH);
    digitalWrite(10,LOW);
    digitalWrite(5,HIGH);
    digitalWrite(6,LOW);
}
void Back()
{
    digitalWrite(9,LOW);
    digitalWrite(10,HIGH);
    digitalWrite(5,LOW);
    digitalWrite(6,HIGH);
}
void Turn_right()
{
    digitalWrite(9,LOW);
    digitalWrite(10,HIGH);
    digitalWrite(5,HIGH);
    digitalWrite(6,LOW);
}
void Turn_left()
{
    digitalWrite(9,HIGH);
    digitalWrite(10,LOW);
    digitalWrite(5,LOW);
    digitalWrite(6,HIGH);
}

void Stop()
{
    digitalWrite(9,LOW);
    digitalWrite(10,LOW);
    digitalWrite(5,LOW);
    digitalWrite(6,LOW);
}

void Measure()
{
      pinMode(srfPin, OUTPUT); 
      digitalWrite(srfPin, LOW);            
      delayMicroseconds(2); 
      digitalWrite(srfPin, HIGH);           
      delayMicroseconds(10); 
      digitalWrite(srfPin, LOW);            
      pinMode(srfPin, INPUT); 
      duration = pulseIn(srfPin, HIGH);         
      distance = duration/58;       
      Serial.println(distance);     
      delay(50);  
}

猜你喜欢

转载自blog.csdn.net/shukebeta008/article/details/79335259