当前位置: 首页 > news >正文

智能寻迹避障清障机器人设计(电路图附件+代码)

附  录

智能小车原理图

智能小车拓展板原理图

 

智能小车拓展板PCB

智能小车底板PCB

Arduino UNO原理图

Arduino UNO PCB

程序部分

void Robot_Traction()                     //机器人循迹子程序{//有信号为LOW  没有信号为HIGHSR = digitalRead(SensorRight);//有信号表明在白色区域,车子底板上L1亮;没信号表明压在黑线上,车子底板上L1灭SL = digitalRead(SensorLeft);//有信号表明在白色区域,车子底板上L2亮;没信号表明压在黑线上,车子底板上L2灭if (SL == LOW && SR == LOW)run();   //调用前进函数else if (SL == HIGH & SR == LOW)// 左循迹红外传感器,检测到信号,车子向右偏离轨道,向左转left();else if (SR == HIGH & SL == LOW) // 右循迹红外传感器,检测到信号,车子向左偏离轨道,向右转right();else // 都是白色, 停止brake();}void bz()//障碍程序{front_detection();//测量前方距离if (Front_Distance < 20) //当遇到障碍物时{brake3(2);//先刹车back3(3);//后退减速brake3(2);//停下来做测距left_detection();//测量左边距障碍物距离right_detection();//测量右边距障碍物距离if ((Left_Distance < 20 ) && ( Right_Distance < 20 )) //当左右两侧均有障碍物靠得比较近spin_left3(0.7);//旋转掉头else if (Left_Distance > Right_Distance) //左边比右边空旷{left3(4);//左转brake3(1);//刹车,稳定方向}else//右边比左边空旷{right3(4);//右转brake3(1);//刹车,稳定方向}}else{run(); //无障碍物,直行}}void gs() //跟随函数{front_detection();//测量前方距离R = digitalRead(SensorR);//有信号表明在白色区域,红外传感器LED1亮L = digitalRead(SensorL);//有信号表明在白色区域,红外传感器LED2亮if (Front_Distance >9&&Front_Distance <= 30&&L == LOW&&R==LOW)run();   //调用前进函数else if (L == HIGH & R == LOW)// 左跟随红外传感器,检测到信号,车子向右偏离轨道,向左转left();else if (R == HIGH & L == LOW) // 右跟随红外传感器,检测到信号,车子向左偏离轨道,向右转  right();else if(Front_Distance > 4 && Front_Distance <= 9&&L == LOW&&R==LOW)brake();//先刹车else if(Front_Distance > 0 && Front_Distance <= 4&&L == LOW&&R==LOW)back();else // 都是黑色, 停止brake();  }void ceju() //测距程序{front_detection();//测量前方距离if (Front_Distance > 0 && Front_Distance <= 99 ){Serial.print("distance= ");Serial.print(Front_Distance);Serial.println("cm");delay(700);}if(Front_Distance >99 )Serial.println("Out of range");delay(700);}void jxbcs(){int robotIniPosArray[4][2] = {{servopin3, 90},{servopin2, 90},  {servopin4, 90},{servopin1, 90}};for (int i = 0; i < 4; i++){servopulse(robotIniPosArray[i][0], robotIniPosArray[i][1]);}}void jxb(char val1){val = Serial.read();switch (val1) {case 'W':  a += 10;if (a > 140) a = 140;servopulse(servopin1, a);Serial.print("a="); Serial.println(a);break;case 'S': a -= 10;if (a < 70) a = 70;servopulse(servopin1, a);Serial.print("a="); Serial.println(a);break;case 'A': b += 10;if (b > 180) b = 180;  Serial.print("b="); Serial.println(b);break;case 'D': b -= 10;if (b < 0) b = 0;Serial.print("b="); Serial.println(b);break;case '8':  c += 10;if (c > 180) c = 180;Serial.print("c="); Serial.println(c);break;case '5': c -= 10;if (c < 0) c = 0;Serial.print("c="); Serial.println(c);break;case '4': d += 10;if (d > 180) d = 180;servopulse(servopin4, d);Serial.print("d="); Serial.println(d);break;case '6': d -= 10;if (d < 0) d = 0; servopulse(servopin4, d);Serial.print("d="); Serial.println(d);break;break;default:break;}}void dump(decode_results *results){int count = results->rawlen;if (results->decode_type == UNKNOWN){brake();}}void IR_IN()                             //机器人遥控子程序{if (irrecv.decode(&results)) //调用库函数:解码{if (millis() - last > 250) //确定接收到信号{on = !on;//标志位置反dump(&results);//解码红外信号}if (results.value == CH0 )    { run2();delay(100);brake2();}//前进if (results.value == CH1 )    { back2();delay(100);brake2();}//后退if (results.value == PREV )   { left2();delay(80);brake2();}//左转if (results.value == NEXT )   { right2();delay(80);brake2();}//右转if (results.value == CH2 )     brake2();//停车if (results.value == PLAY )    spin_left2();//左旋转if (results.value == EQ )      spin_right2();//右旋转if (results.value == IR_200 ) { jxbcs();keyMode = KEYMODE_1;brake2();}if (results.value == VOL1 )   { val1 = 'W';jxb(val1); }if (results.value == VOL2 )   { val1 = 'S'; jxb(val1); }if (results.value == IR_0 )   { val1 = 'A';jxb(val1); }if (results.value == IR_100 ) { val1 = 'D';jxb(val1); }if (results.value == IR_1 )   { val1 = '8'; jxb(val1); }if (results.value == IR_2 )   { val1 = '5';jxb(val1);  }if (results.value == IR_4 )   { val1 = '4';jxb(val1); }if (results.value == IR_5 )   { val1 = '6'; jxb(val1);}if (results.value == IR_6 )   keyMode = KEYMODE_1;if (results.value == IR_7)    keyMode = KEYMODE_2;if (results.value == IR_8)    keyMode = KEYMODE_3;if (results.value == IR_9)    keyMode = KEYMODE_4;last = millis();irrecv.resume(); // Receive the next value }}void LEDTask(){switch (keyMode){case KEYMODE_1: IR_IN();digitalWrite(PORT_LED1, HIGH); break; //调用复位程序case KEYMODE_2: Robot_Traction(); digitalWrite(PORT_LED1, LOW);break;case KEYMODE_3: bz();digitalWrite(PORT_LED1, HIGH);break;//用超声波避障程序case KEYMODE_4: gs();digitalWrite(PORT_LED1, LOW);break; //调用跟随程序case KEYMODE_5: ceju(); digitalWrite(PORT_LED1, HIGH);break;//测距default:break;}}void reve(){if( Serial.available()>0 ){int receive=Serial.parseInt();if(receive>=1 && receive<=5){moveSpeed=int(receive*40+55);}else if(receive==0)        {brake();Serial.println("Speed=0,brake");}//停车else if(receive==100)      { val1 = 'A';jxb(val1); }else if(receive==101)      { val1 = 'W';jxb(val1); }else if(receive==102)      { val1 = 'S';jxb(val1);}else if(receive==103)      { val1 = 'D';jxb(val1);}else if(receive==104)      { val1 = '5';jxb(val1);}else if(receive==105)      { val1 = '4';jxb(val1); }else if(receive==106)      { val1 = '6';jxb(val1);}else if(receive==107)      { val1 = '8';jxb(val1);}else if(receive==117)      { jxbcs(); keyMode = KEYMODE_1;Serial.println("FW");brake2();}     else if(receive==108)     {run(); Serial.println("run");}//前进else if(receive==109)     {back();Serial.println("back");}//后退else if(receive==110)     {brake();Serial.println("brake");}//停车else if(receive==111)     { left();Serial.println("left");}//左else if(receive==112)     {right();Serial.println("right");}//右else if(receive==113)     {keyMode = KEYMODE_2;Serial.println("Robot_Traction");}//寻迹else if(receive==114)     {keyMode = KEYMODE_3;Serial.println("bz");}//避障else if(receive==115)     {keyMode = KEYMODE_4;Serial.println("gs");}//跟随else if(receive==116)     {keyMode = KEYMODE_5;}}}void loop(){reve();//蓝牙遥控IR_IN();//红外遥控LEDTask();//模式区分servopulse(servopin2, b);//2舵机连续转动servopulse(servopin3, c);//3舵机连续转动}

http://www.lryc.cn/news/280133.html

相关文章:

  • 设计模式-- 3.适配器模式
  • 设计一个简单的规则引擎
  • openssl3.2 - 官方demo学习 - digest - EVP_MD_stdin.c
  • 浅谈 Raft 分布式一致性协议|图解 Raft
  • 4_【Linux版】重装数据库问题处理记录
  • 隧道应用2-netsh端口转发监听Meterpreter
  • 《Spring》--使用application.yml特性提供多环境开发解决方案/开发/测试/线上--方案1
  • 统计项目5000+,出具报表5分钟......捷顺科技数据中台怎么做?
  • 力扣(105. 从前序与中序遍历序列构造二叉树,106. 从中序与后序遍历序列构造二叉树)
  • 网络安全技术新手入门:在docker上安装dvwa靶场
  • Docker 介绍 及 支持的操作系统
  • 大模型实战营Day5 LMDeploy大模型量化部署实践
  • py连接sqlserver数据库报错问题处理。20009
  • LTESniffer:一款功能强大的LTE上下行链路安全监控工具
  • SQL语句详解二-DDL(数据定义语言)
  • web前端算法简介之链表
  • C++函数对象
  • 插件化简单介绍
  • [Beego]1.Beego简介以及beego环境搭建,bee脚手架的使用,创建,运行项目
  • Tomcat 静态资源访问与项目根路径设置(AI问答)
  • Docker实战09|使用AUFS包装busybox
  • 什么是uni.request()?如何使用它?
  • 用React给XXL-JOB开发一个新皮肤(一):环境搭建和项目初始化
  • 华为常用的命令——display,记得点赞收藏!
  • Costco攻入山姆大本营
  • 什么是常量?如何区分常量和变量?
  • uniapp返回上一页并刷新数据
  • LeetCode 0083.删除排序链表中的重复元素:模拟
  • Javaweb之SpringBootWeb案例新增部门的详细解析
  • 基于微信小程序的音乐平台 开源项目