《2022年机器人源程序 .pdf》由会员分享,可在线阅读,更多相关《2022年机器人源程序 .pdf(13页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、智能小车前后左右综合实验void left(int time) / 左转 ( 左轮不动,右轮前进) digitalWrite(Right_motor_go,HIGH); / 右电机前进digitalWrite(Right_motor_back,LOW); analogWrite(Right_motor_go,200); analogWrite(Right_motor_back,0);/PWM比例 0255调速digitalWrite(Left_motor_go,LOW); / 左轮不动digitalWrite(Left_motor_back,LOW); analogWrite(Left_mot
2、or_go,0); analogWrite(Left_motor_back,0);/PWM比例 0255调速delay(time * 100); / 执行时间,可以调整 void spin_left(int time) / 左转 (左轮后退,右轮前进) digitalWrite(Right_motor_go,HIGH); / 右电机前进digitalWrite(Right_motor_back,LOW); analogWrite(Right_motor_go,200); analogWrite(Right_motor_back,0);/PWM比例 0255调速digitalWrite(Left
3、_motor_go,LOW); / 左轮后退digitalWrite(Left_motor_back,HIGH); analogWrite(Left_motor_go,0); analogWrite(Left_motor_back,200);/PWM比例 0255调速delay(time * 100); / 执行时间,可以调整 void right(int time) / 右转( 右轮不动,左轮前进) 精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 1 页,共 13 页 digitalWrite(Right_motor_go,LOW); / 右电机
4、不动digitalWrite(Right_motor_back,LOW); analogWrite(Right_motor_go,0); analogWrite(Right_motor_back,0);/PWM比例 0255调速digitalWrite(Left_motor_go,HIGH);/左电机前进digitalWrite(Left_motor_back,LOW); analogWrite(Left_motor_go,200); analogWrite(Left_motor_back,0);/PWM比例 0255调速delay(time * 100); / 执行时间,可以调整 void
5、spin_right(int time) / 右转 ( 右轮后退,左轮前进) digitalWrite(Right_motor_go,LOW); / 右电机后退digitalWrite(Right_motor_back,HIGH); analogWrite(Right_motor_go,0); analogWrite(Right_motor_back,200);/PWM比例 0255调速digitalWrite(Left_motor_go,HIGH);/左电机前进digitalWrite(Left_motor_back,LOW); analogWrite(Left_motor_go,200);
6、 analogWrite(Left_motor_back,0);/PWM比例 0255调速delay(time * 100); / 执行时间,可以调整 void back(int time) / 后退 digitalWrite(Right_motor_go,LOW); / 右轮后退digitalWrite(Right_motor_back,HIGH); 精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 2 页,共 13 页analogWrite(Right_motor_go,0); analogWrite(Right_motor_back,150);
7、/PWM比例 0255调速digitalWrite(Left_motor_go,LOW); / 左轮后退digitalWrite(Left_motor_back,HIGH); analogWrite(Left_motor_go,0); analogWrite(Left_motor_back,150);/PWM比例 0255调速delay(time * 100); / 执行时间,可以调整 增加了向左转和向右转,向左转主要是控制左轮不动,邮轮前进,而向右转则是右轮不动左轮前进,后退则是给两个轮子后退高电平,注意不能同时给前进和后退高电平,这样会烧坏电机,同样烧录例程时要断开vcc ,以免小车乱跑影
8、响实验。精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 3 页,共 13 页按键启动蜂鸣报警安装开关是为了在烧录过程中及时不断开vcc ,小车也不会乱跑,以后每次烧录都不必断开vcc 。int key=7;/定义按键数字 12 接口int beep=12;/定义蜂鸣器数字 7 接口void keysacn() int val; val=digitalRead(key);/读取数字 7 口电平值赋给val while(!digitalRead(key)/当按键没被按下时,一直循环 val=digitalRead(key);/此句可省略,可让循环跑空
9、while(digitalRead(key)/当按键被按下时 delay(10); / 延时 10ms val=digitalRead(key);/读取数字 7 口电平值赋给val 精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 4 页,共 13 页if(val=HIGH) / 第二次判断按键是否被按下 digitalWrite(beep,HIGH); / 蜂鸣器响while(!digitalRead(key) /判断按键是否被松开digitalWrite(beep,LOW); / 蜂鸣器停止 else digitalWrite(beep,LOW)
10、;/蜂鸣器停止 I/O 口的意思即为INPUT 接口和 OUTPUT 接口,到目前为止我们设计的小灯实验都还只是应用到Arduino 的 I/O 口的输出功能,这个实验我们来尝试一下使用Arduino的 I/O 口的输入功能即为读取外接设备的输出值,智能小车寻黑线利用小车下端两个探头对光的不同反应来确定小车行驶路线,主要是当探测到白时小车行驶电机转动,当左侧压到黑线及探测到黑时小车向左行驶,当右侧探头探测到黑时则向行驶,只需在之前的程序上加一个判定的过程,十分简单const int SensorRight = 3; / 右循迹红外传感器(P3.2 OUT1) const int SensorL
11、eft = 4; / 左循迹红外传感器(P3.3 OUT2) SR = digitalRead(SensorRight);/有信号说明在白色区域,车子底板上L3 亮; 没信号说明压在黑线上,车子底板上 L3 灭SL = digitalRead(SensorLeft);/有信号说明在白色区域,车子底板上L2 亮; 没信号说明压在黑线上,车子底板上 L2 灭if (SL = LOW&SR=LOW) run(); / 调用前进函数else if (SL = HIGH & SR = LOW)/ 左循迹红外传感器,检测到信号,车子向右偏离轨道,向左转left(); else if (SR = HIGH
12、& SL = LOW) / 右循迹红外传感器,检测到信号,车子向左偏离轨道,向右转right(); 精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 5 页,共 13 页else / 都是白色 , 停止brake(); 这里使用了与的语句,当左边高电平右边低电频时想左,当左边低电平右边高电平时向右,假设都是高电平则停车这里的 if else语句也满足了小车在行驶时的各种情况. 智能小车红外避障与黑线实验类似,只是将判定写到了红外探头中,当红外探头探测到障碍时小车停止或者转向或者跟随障碍物行驶指向哪里走到哪里。遇到障碍物后退else / 都是有障碍物
13、, 后退back(3);这里是与其他两个程序不同的一点,遇到了障碍则后退SR_2 = digitalRead(SensorRight_2); SL_2 = digitalRead(SensorLeft_2); if (SL_2 = HIGH&SR_2=HIGH) 精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 6 页,共 13 页run(); / 调用前进函数else if (SL_2 = HIGH & SR_2 = LOW)/ 右边探测到有障碍物,有信号返回,向左转left(); else if (SR_2 = HIGH & SL_2 = LOW
14、) /左边探测到有障碍物,有信号返回,向右转right(); else / 都是有障碍物 , 后退back(3); 遇到障碍物跟随else if (SL_2 = HIGH & SR_2 = LOW) left(); 这里与上一个程序不同,是跟随障碍物哪里有障碍物就向哪里走,这是与上一个程序不同的地方,假设前方没有障碍物则停车可以在这句话中表达else / 没有障碍物,停brake(); SR_2 = digitalRead(SensorRight_2); SL_2 = digitalRead(SensorLeft_2); if (SL_2 = LOW&SR_2=LOW) run(); / 调用
15、前进函数else if (SR_2 = HIGH & SL_2 = LOW) /左边探测到有障碍物,有信号返回,向左转left(); else / 没有障碍物,停brake(); 精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 7 页,共 13 页遇到障碍物转向这里遇上两个程序不同的是增加了一个自动寻路功能,遇到障碍物后可以自己调节方向可以在下面这句话中表达else / 都是有障碍物 , 后退 back(4.5);/后退spin_right(4.5);/有旋转,调整方向先停车,停车之后转向,使得小车十分灵活,躲避障碍物SR_2 = digitalR
16、ead(SensorRight_2); SL_2 = digitalRead(SensorLeft_2); if (SL_2 = HIGH&SR_2=HIGH) run(); / 调用前进函数else if (SL_2 = HIGH & SR_2 = LOW)/ 右边探测到有障碍物,有信号返回,向左转left(); else if (SR_2 = HIGH & SL_2 = LOW) /左边探测到有障碍物,有信号返回,向右转right(); else / 都是有障碍物 , 后退 back(4.5);/后退spin_right(4.5);/有旋转,调整方向智能小车超声波测距实验这里程序中大家可以
17、看到Fdistance= Fdistance/58; 这里选择除以58 后再输出是因为为什么除以58 等于厘米,Y 米= X 秒*344 /2 ,X 秒= 2*Y米 /344 =X 秒=0.0058*Y米 = 厘米 = 微秒 /58 void Distance_test() / 量出前方距离 digitalWrite(Trig, LOW); / 给触发脚低电平2sdelayMicroseconds(2); 精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 8 页,共 13 页digitalWrite(Trig, HIGH); / 给触发脚高电平10s
18、 ,这里至少是10sdelayMicroseconds(10); digitalWrite(Trig, LOW); / 持续给触发脚低电float Fdistance = pulseIn(Echo, HIGH); / 读取高电平时间(单位:微秒 ) Fdistance= Fdistance/58; / 为什么除以58 等于厘米,Y 米= X 秒*344 /2 / X秒= 2*Y 米 /344 =X 秒=0.0058*Y米 = 厘米 = 微秒 /58 Serial.print(Distance:); / 输出距离单位:厘米Serial.println(Fdistance); / 显示距离Dist
19、ance = Fdistance; 智能小车超声波避障实验( 无舵机 ) ?这里只是比之前多了一个转向遇到障碍物可以转向躲避,并测出距离这时的小车已经十分的灵活,可以根据距离选择行驶的模式精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 9 页,共 13 页可以在下面这句话表达 while(Distance 60)/再次判断是否有障碍物,假设有则转动方向后,继续判断 right(1);/右转brake(1);/停车Distance_test();/测量前方距离Distance_display();/液晶屏显示距离 遇到障碍物先停车后向右转向Dista
20、nce_test();/测量前方距离Distance_display();/液晶屏显示距离if(Distance 60)/数值为碰到障碍物的距离,可以按实际情况设置while(Distance 60)/再次判断是否有障碍物,假设有则转动方向后,继续判断 right(1);/右转brake(1);/停车Distance_test();/测量前方距离Distance_display();/液晶屏显示距离 else run();/无障碍物,直行智能小车超声波避障实验( 有舵机 ) ?while(1) 精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 10
21、页,共 13 页 front_detection();/测量前方距离if(Front_Distance 32)/当遇到障碍物时 back(2);/后退减速brake(2);/停下来做测距left_detection();/测量左边距障碍物距离Distance_display(Left_Distance);/液晶屏显示距离right_detection();/测量右边距障碍物距离Distance_display(Right_Distance);/液晶屏显示距离if(Left_Distance 35 ) &( Right_Distance Right_Distance)/左边比右边空旷 left(
22、3);/左转brake(1);/刹车,稳定方向 else/ 右边比左边空旷 right(3);/右转brake(1);/刹车,稳定方向 else run(); /无障碍物,直行智能小车红外遥控实验NEC 协议的特点:1 8 位地址位, 8 位命令位精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 11 页,共 13 页2 为了可靠性地址位和命令位被传输两次3 脉冲位置调制4 载波频率38khz 5 VOUT 接到模拟口, GND 接到实验板上的GND,VCC接到实验板上的+5v 。将红外接收头按照上述方法接好,将VOUT 接到数字 11 口引脚,将
23、LED 灯通过电阻接到数字引脚2,3,4,5,6,7。unsigned long last = millis();/*应用 millis函数可获取机器运行的时间长度,单位ms 。系统最长的记录时间为9 小时 22 分,如果超出时间将从0 开始。函数返回值为unsigned long型,无参数。注意:复制 2. 例程代码例程 19- 红外遥控里的库文件夹IRremote到 Arduino的安装目录:Arduinolibraries目录下,缺失库文件可能编译出错。给小车安装红外探头,并给遥控器定义,即可完成控制过程long run_car = 0 x00FF18E7;/按键 2 long back
24、_car = 0 x00FF4AB5;/按键 8 long left_car = 0 x00FF10EF;/按键 4 long right_car = 0 x00FF5AA5;/按键 6 long stop_car = 0 x00FF38C7;/按键 5 long left_turn = 0 x00ff30CF;/按键 1 long right_turn = 0 x00FF7A85;/按键 3 if (millis() - last 250) /确定接收到信号 on = !on;/标志位置反digitalWrite(13, on ? HIGH : LOW);/板子上接收到信号闪烁一下led d
25、ump(&results);/解码红外信号 if (results.value = run_car )/按键 2 run();/前进精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 12 页,共 13 页if (results.value = back_car )/按键 8 back();/后退if (results.value = left_car )/按键 4 left();/左转if (results.value = right_car )/按键 6 right();/右转if (results.value = stop_car )/按键 5 brake();/停车if (results.value = left_turn )/按键 1 spin_left();/左旋转if (results.value = right_turn )/按键 3 spin_right();/右旋转last = millis(); irrecv.resume(); / Receive the next value 精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 13 页,共 13 页
限制150内