2022年机器人源程序.docx
精选学习资料 - - - - - - - - - 智能小车前后左右综合试验void leftint time / 左转 左轮不动,右轮前进 digitalWriteRight_motor_go,HIGH; / 右电机前进digitalWriteRight_motor_back,LOW; analogWriteRight_motor_go,200; analogWriteRight_motor_back,0;/PWM比例 0255调速digitalWriteLeft_motor_go,LOW; / 左轮不动digitalWriteLeft_motor_back,LOW; analogWriteLeft_motor_go,0; analogWriteLeft_motor_back,0;/PWM比例 0255调速delaytime * 100; / 执行时间,可以调整 void spin_leftint time / 左转 左轮后退,右轮前进 digitalWriteRight_motor_go,HIGH; / 右电机前进digitalWriteRight_motor_back,LOW; analogWriteRight_motor_go,200; analogWriteRight_motor_back,0;/PWM比例 0255调速digitalWriteLeft_motor_go,LOW; / 左轮后退digitalWriteLeft_motor_back,HIGH; analogWriteLeft_motor_go,0; analogWriteLeft_motor_back,200;/PWM比例 0255调速delaytime * 100; / 执行时间,可以调整 void rightint time / 右转 右轮不动,左轮前进 名师归纳总结 - - - - - - -第 1 页,共 13 页精选学习资料 - - - - - - - - - digitalWriteRight_motor_go,LOW; / 右电机不动digitalWriteRight_motor_back,LOW; analogWriteRight_motor_go,0; analogWriteRight_motor_back,0;/PWM比例 0255调速digitalWriteLeft_motor_go,HIGH;/左电机前进digitalWriteLeft_motor_back,LOW; analogWriteLeft_motor_go,200; analogWriteLeft_motor_back,0;/PWM比例 0255调速delaytime * 100; / 执行时间,可以调整 void spin_rightint time / 右转 右轮后退,左轮前进 digitalWriteRight_motor_go,LOW; / 右电机后退digitalWriteRight_motor_back,HIGH; analogWriteRight_motor_go,0; analogWriteRight_motor_back,200;/PWM比例 0255调速digitalWriteLeft_motor_go,HIGH;/左电机前进digitalWriteLeft_motor_back,LOW; analogWriteLeft_motor_go,200; analogWriteLeft_motor_back,0;/PWM比例 0255调速delaytime * 100; / 执行时间,可以调整 void backint time / 后退 digitalWriteRight_motor_go,LOW; / 右轮后退digitalWriteRight_motor_back,HIGH; 名师归纳总结 - - - - - - -第 2 页,共 13 页精选学习资料 - - - - - - - - - analogWriteRight_motor_go,0; analogWriteRight_motor_back,150;/PWM比例 0255调速digitalWriteLeft_motor_go,LOW; / 左轮后退digitalWriteLeft_motor_back,HIGH; analogWriteLeft_motor_go,0; analogWriteLeft_motor_back,150;/PWM比例 0255调速delaytime * 100; / 执行时间,可以调整 增加了向左转和向右转,向左转主要是掌握左轮不动,邮轮前进,而向右转就是右轮不动左轮前进,后退就是给两个轮子后退高电平,留意不能同时给前进和后退高电平,这样会烧坏电机,名师归纳总结 同样烧录例程时要断开vcc ,以免小车乱跑影响试验;第 3 页,共 13 页- - - - - - -精选学习资料 - - - - - - - - - 按键启动蜂鸣报警安装开关是为了在烧录过程中准时不断开vcc ,小车也不会乱跑,以后每次烧录都不必断开vcc ;int key=7;/定义按键数字 12 接口int beep=12;/定义蜂鸣器数字 7 接口void keysacn int val; val=digitalReadkey;/ 读取数字 7 口电平值赋给 val while.digitalReadkey/ 当按键没被按下时,始终循环 val=digitalReadkey;/ 此句可省略,可让循环跑空 whiledigitalReadkey/ 当按键被按下时 名师归纳总结 delay10; / 延时 10ms val 第 4 页,共 13 页val=digitalReadkey;/读取数字 7 口电平值赋给- - - - - - -精选学习资料 - - - - - - - - - ifval=HIGH / 其次次判定按键是否被按下 digitalWritebeep,HIGH; / 蜂鸣器响while.digitalReadkey / 判定按键是否被松开digitalWritebeep,LOW; / 蜂鸣器停止 else digitalWritebeep,LOW;/ 蜂鸣器停止 I/O 口的意思即为 INPUT 接口和 OUTPUT 接口,到目前为止我们设计的小灯试验都仍只是应用到 Arduino 的 I/O 口的输出功能,这个试验我们来尝试一下使用 Arduino 的 I/O 口的输入功能即为读取外接设备的输出值,智能小车寻黑线利用小车下端两个探头对光的不同反应来确定小车行驶路线,主要是当探测到白时小车行驶电机转动,当左侧压到黑线及探测到黑时小车向左行驶,当右侧探头探测到黑时就向行驶,只需在之前的程序上加一个判定的过程,非常简洁const int SensorRight = 3; / 右循迹红外传感器P3.2 OUT1 L3 亮;没信号说明压在黑线上,const int SensorLeft = 4; / 左循迹红外传感器P3.3 OUT2 SR = digitalReadSensorRight;/有信号说明在白色区域,车子底板上车子底板上 L3 灭SL = digitalReadSensorLeft;/有信号说明在白色区域,车子底板上L2 亮;没信号说明压在黑线上,车子底板上 L2 灭if SL = LOW&&SR=LOW run; / 调用前进函数左循迹红外传感器,检测到信号,车子向右偏离轨道,向左转else if SL = HIGH & SR = LOW/ left; else if SR = HIGH & SL = LOW / 右循迹红外传感器, 检测到信号,车子向左偏离轨道,向右转right; 名师归纳总结 - - - - - - -第 5 页,共 13 页精选学习资料 - - - - - - - - - else / 都是白色 , 停止brake; 这里使用了与的语句,当左边高电平右边低电频时想左,当左边低电平右边高电平常向右,假设都是高电平就停车这里的 if else 语句也满意了小车在行驶时的各种情形. 智能小车红外避障与黑线试验类似,只是将判定写到了红外探头中,当红外探头探测到障碍时小车停止或者转向或者跟随障碍物行驶指向哪里走到哪里;遇到障碍物后退else / 都是有障碍物 , 后退back3; 这里是与其他两个程序不同的一点,遇到了障碍就后退SR_2 = digitalReadSensorRight_2; SL_2 = digitalReadSensorLeft_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 / right; else / 都是有障碍物 , 后退 back3; 遇到障碍物跟随else if SL_2 = HIGH & SR_2 = LOW left; 这里与上一个程序不同,是跟随障碍物右边探测到有障碍物,有信号返回,向左转左边探测到有障碍物,有信号返回,向右转哪里有障碍物就向哪里走,这是与上一个程序不同的地方,假设前方没有障碍物就停车 可以在这句话中表达else / 没有障碍物,停 brake; SR_2 = digitalReadSensorRight_2; SL_2 = digitalReadSensorLeft_2; if SL_2 = LOW&&SR_2=LOW run; / 调用前进函数else if SR_2 = HIGH & SL_2 = LOW / left; else / 没有障碍物,停 brake; 左边探测到有障碍物,有信号返回,向左转名师归纳总结 - - - - - - -第 7 页,共 13 页精选学习资料 - - - - - - - - - 遇到障碍物转向这里遇上两个程序不同的是增加了一个自动寻路功能,向可以在下面这句话中表达else / 都是有障碍物 , 后退 back4.5;/ 后退 spin_right4.5;/ 有旋转,调整方向 先停车,停车之后转向,使得小车非常敏捷,逃避障碍物SR_2 = digitalReadSensorRight_2; SL_2 = digitalReadSensorLeft_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 / 都是有障碍物 , 后退 back4.5;/ 后退左边探测到有障碍物,有信号返回,向右转spin_right4.5;/ 有旋转,调整方向智能小车超声波测距试验这里程序中大家可以看到 Fdistance= Fdistance/58; 这里挑选除以 58 后再输出是由于为什么除以 58 等于厘米,Y 米 = X 秒*344 /2 ,X 秒 = 2*Y 米 /344 =X 秒=0.0058*Y 米 = 厘米 = 微秒 /58 void Distance_test / 量出前方距离 digitalWriteTrig, LOW; / 给触发脚低电平2 sdelayMicroseconds2; 名师归纳总结 - - - - - - -第 8 页,共 13 页精选学习资料 - - - - - - - - - digitalWriteTrig, HIGH; / 给触发脚高电平10 s,这里至少是10 sdelayMicroseconds10; digitalWriteTrig, LOW; / 连续给触发脚低电float Fdistance = pulseInEcho, HIGH; / 读取高电平常间 单位:微秒 Fdistance= Fdistance/58; / 为什么除以 58 等于厘米,Y 米= X 秒 *344 /2 / X 秒= 2*Y 米 /344 =X 秒 =0.0058*Y 米 = 厘米 = 微秒 /58 Serial.print"Distance:" / 输出距离单位:厘米Serial.printlnFdistance; / 显示距离Distance = Fdistance; 智能小车超声波避障试验 无舵机 ?这里只是比之前多了一个转向遇到障碍物可以转向逃避,并测出距离这时的小车已经非常的敏捷,可以依据距离挑选行驶的模式名师归纳总结 - - - - - - -第 9 页,共 13 页精选学习资料 - - - - - - - - - 可以在下面这句话表达 whileDistance < 60/ 再次判定是否有障碍物,假设有就转动方向后,连续判定 right1;/ 右转brake1;/ 停车Distance_test;/ 测量前方距离Distance_display;/ 液晶屏显示距离 遇到障碍物先停车后向右转向Distance_test;/ 测量前方距离Distance_display;/ 液晶屏显示距离ifDistance < 60/ 数值为遇到障碍物的距离,可以按实际情形设置whileDistance < 60/ 再次判定是否有障碍物,假设有就转动方向后,连续判定 right1;/ 右转brake1;/ 停车Distance_test;/ 测量前方距离Distance_display;/ 液晶屏显示距离 else run;/ 无障碍物,直行智能小车超声波避障试验 有舵机 ?while1 名师归纳总结 - - - - - - -第 10 页,共 13 页精选学习资料 - - - - - - - - - front_detection;/ 测量前方距离ifFront_Distance < 32/ 当遇到障碍物时 back2;/ 后退减速brake2;/ 停下来做测距left_detection;/ 测量左边距障碍物距离Distance_displayLeft_Distance;/ 液晶屏显示距离right_detection;/ 测量右边距障碍物距离Distance_displayRight_Distance;/ 液晶屏显示距离ifLeft_Distance < 35 && Right_Distance < 35 / spin_left0.7;/ 旋转掉头当左右两侧均有障碍物靠得比较近else ifLeft_Distance > Right_Distance/ 左边比右边空旷 left3;/ 左转brake1;/ 刹车,稳固方向 else/ 右边比左边空旷 right3;/ 右转brake1;/ 刹车,稳固方向 else run; / 无障碍物,直行智能小车红外遥控试验NEC 协议的特点:1 8 位地址位, 8 位命令位名师归纳总结 - - - - - - -第 11 页,共 13 页精选学习资料 - - - - - - - - - 2 为了牢靠性地址位和命令位被传输两次3 脉冲位置调制4 载波频率 38khz 5 VOUT 接到模拟口, GND 接到试验板上的GND,VCC接到试验板上的+5v ;将红外接收头依据上述方法接好,将 2,3,4,5,6,7;VOUT 接到数字 11 口引脚,将 LED 灯通过电阻接到数字引脚unsigned long last = millis;/* 应用 millis 函数可猎取机器运行的时间长度,单位 ms ;系统最长的记录时间为 9 小时 22 分,假如超出时间将从 0 开头;函数返回值为 unsigned long 型,无参数;留意:复制 2. 例程代码例程 19- 红外遥控里的库文件夹IRremote到 Arduino的安装目录:Arduinolibraries目录下,缺失库文件可能编译出错;给小车安装红外探头,并给遥控器定义,即可完成掌握过程long run_car = 0x00FF18E7;/ 按键 2 long back_car = 0x00FF4AB5;/ 按键 8 long left_car = 0x00FF10EF;/ 按键 4 long right_car = 0x00FF5AA5;/ 按键 6 long stop_car = 0x00FF38C7;/ 按键 5 long left_turn = 0x00ff30CF;/ 按键 1 long right_turn = 0x00FF7A85;/ 按键 3 if millis - last > 250 / 确定接收到信号 on = .on;/标志位置反板子上接收到信号闪耀一下led digitalWrite13, on . HIGH : LOW;/dump&results;/解码红外信号 名师归纳总结 if results.value = run_car /按键 2 第 12 页,共 13 页run;/前进- - - - - - -精选学习资料 - - - - - - - - - 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 页