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