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

本文介绍了使用Arduino Uno单片机控制小车的基础程序。主要包括通过串口指令控制电机及获取超声波传感器距离信息的代码。串口指令用于控制小车前进、后退、左转、右转和停止等动作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

接下来讲软件部分,软件主要分为三大块。一个是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);  
}

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值