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

附  录

智能小车原理图

智能小车拓展板原理图

 

智能小车拓展板PCB

智能小车底板PCB

Arduino UNO原理图

Arduino UNO PCB

程序部分

void Robot_Traction()                     //机器人循迹子程序

{

  //有信号为LOW  没有信号为HIGH

  SR = 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舵机连续转动

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/319371.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

vue3 - 自定义弹框组件

写了一个弹框组件 <template><transition name"modal-fade"><div v-if"showFlag" class"myModal"><div class"content"><div class"topBox"><div class"leftTitle"><spa…

Chapter 8 怎样使用类和对象(下篇)

⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️ 8.2 对象数组 1.对象数组的每一个元素都是同类的对象 2.在建立数组时&#xff0c;同样…

day18【LeetCode力扣】19.删除链表的倒数第N个结点

day18【LeetCode力扣】19.删除链表的倒数第N个结点 1.题目描述 给你一个链表&#xff0c;删除链表的倒数第 n 个结点&#xff0c;并且返回链表的头结点。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5], n 2 输出&#xff1a;[1,2,3,5]示例 2&#xff1a; 输入&a…

SpringBoot+SSM项目实战 苍穹外卖(10) Spring Task WebSocket

继续上一节的内容&#xff0c;本节学习Spring Task和WebSocket&#xff0c;并完成订单状态定时处理、来单提醒和客户催单功能。 目录 Spring Task&#xff08;cron表达式&#xff09;入门案例 订单状态定时处理WebSocket入门案例 来单提醒客户催单 Spring Task&#xff08;cron…

pyqt调用UI和开启子进程

UI制作 qrc 注意调用UI前把样式表里绑定的资源(qrc)转换成py导入进去 xxx.qrc转xxx.py 两种方法 1命令 pyrcc5 -o icons_rc.py icons.qrc 2外部工具pyrcc 实参 -o $FileNameWithoutExtension$.py $FileNameWithoutExtension$.qrcsdz.qrc→→sdaz.py 在代码里写 import…

Springboot3新特性:开发第一个 GraalVM 本机应用程序(完整教程)

在讲述之前&#xff0c;各位先自行在网上下载并安装Visual Studio 2022&#xff0c;安装的时候别忘了勾选msvc 概述&#xff1a;GraalVM 本机应用程序&#xff08;Native Image&#xff09;是使用 GraalVM 的一个特性&#xff0c;允许将 Java 应用程序编译成本机二进制文件&am…

视频剪辑软件Camtasia2024最新版本快捷键大全

Camtasia Studio是一款专门录制屏幕动作的工具&#xff0c;它能在任何颜色模式下轻松地记录 屏幕动作&#xff0c;包括影像、音效、鼠标移动轨迹、解说声音等等。 今天来给大家介绍一下Camtasia快捷键的相关内容&#xff0c;Camtasia也是一个十分好用的电脑屏幕录制与视频剪辑…

GRE隧道(初级VPN)配置步骤

一、拓朴图&#xff1a; 二、配置步骤&#xff1a; 1、配置IP 2、R1、R2 配置nat&#xff0c;代理内网地址通过G0/0/0口上外网 acl 2000rule permit source anyquit # int G0/0/0ip addr 100.1.1.1 24nat outbound 2000 # 3、R1、R2 配置默认出口路由G0/0/0&#xff0c;这一…

Windows启动MongoDB服务报错(错误 1053:服务没有及时响应启动或控制请求)

问题描述&#xff1a;修改MongoDB服务bin目录下的mongod.cfg&#xff0c;然后在任务管理器找到MongoDB服务-->右键-->点击【开始】&#xff0c;启动失败无提示&#xff1a; 右键点击任务管理器的MongoDB服务-->点击【打开服务】&#xff0c;跳转到服务页面-->找到M…

C++ QtCreator启动执行报错的各类问题解决++持续更新!!

1.QTCreator启动报错"由于找不到 python310.dll" 在QtCreator加载自动缩进的LLVM插件后, 再次打开Qt时, 会报错找不到python310.dll 解决方法&#xff1a;下载python310.dll,随后复制到目录&#xff1a;C:\Program Files\LLVM\bin 即可解决该问题。下载路径附件如…

VUE element-ui实现表格动态展示、动态删减列、动态排序、动态搜索条件配置、表单组件化。

1、实现效果 1.1、文件目录 1.2、说明 1、本组件支持列表的表头自定义配置&#xff0c;checkbox实现 2、本组件支持列表列排序&#xff0c;vuedraggable是拖拽插件&#xff0c;上图中字段管理里的拖拽效果 &#xff0c;需要的话请自行npm install 3、本组件支持查询条件动态…

使用 C++/WinRT 创作 API

本主题展示了如何直接或间接使用 winrt::implements 基结构来创作 C/WinRT API 。 在此上下文中&#xff0c;“创作”的同义词有“生成”或“实现” 。 本主题介绍以下在 C/WinRT 类型上实现 API 的情形&#xff08;按此顺序&#xff09;。 你不是在创作一个 Windows 运行时类…

Python——函数的参数

1.位置参数 位置参数可以在函数中设置一个或者多个参数&#xff0c;但是必须有对应个数的值传入该函数才能成功调用&#xff0c;例如&#xff1a; def power(x):return x*xprint(powr(5)) 如果传入的值与对应函数设置的位置参数不符合&#xff0c;则会报错&#xff1a; Traceba…

小白浅学Vue3

目录 前端环境 依赖管理NPM安装配置 创建Vue项目 模板语法 文本插值{{ }} v-html 属性绑定 条件渲染 v-if 、v-else-if 、v-else v-show 列表渲染v-for 状态管理 事件 事件 事件传参 事件修饰符 数组变化监听 计算属性 Class绑定 Style绑定 侦听器 v-mod…

mysql关于创建表的小试题

目录 例题&#xff1a; 解题思路及步骤&#xff1a; 实验步骤&#xff1a; 步骤一&#xff1a;创建数据库 步骤二&#xff1a;创建表 步骤三&#xff1a;插入数据 例题&#xff1a; 1、创建一个英雄表(hero)&#xff0c;管于四大名著的主键 nam…

City Terrace Pack

“城市与露台资源包” 的主要特点:• 属于系列的一部分。• 极为逼真和现代化的城市。• 高度优化的低多边形和逼真资源。• 可用于 Oculus、GearVR、Vive、Daydream。• 可用于低端和高端移动设备。• 灵感来自于现代建筑和设计。• 36 种不同的摩天大楼和建筑物。• 其中每个…

Pandas实战100例-专栏介绍

Pandas&#xff0c;Python数据科学的心脏&#xff0c;是探索和分析数据世界的强大工具。想象一下&#xff0c;用几行代码就能洞察庞大数据集的秘密&#xff0c;无论是金融市场趋势还是社交媒体动态。 通过Pandas&#xff0c;你可以轻松地整理、清洗、转换数据&#xff0c;将杂…

ivrobot乐高EV3 鲸鱼 能力风暴自制遥控手柄库文件和编程样例 使用指南

编程示例&#xff1a; 资源下载链接&#xff1a; https://download.csdn.net/download/abilix_tony/88739582 EV3 mindstorms能用基础版和高阶版&#xff08;条形编程界面&#xff09; EV3 classroom只能用基础版 &#xff08;scratch模块形状编程界面&#xff09; 请根据使…

手撕乘积(**Multiplication** **Product**): 穷举和图示(1)

手撕乘积(Multiplication & Product): 穷举和图示(1) 乘积 r ⋅ s ∑ i 1 s r r r ⋯ r ⏟ s times ∑ j 1 r s s s ⋯ s ⏟ r times r\cdot s\sum _{i1}^{s}r\underbrace {rr\cdots r} _{s{\text{ times}}}\sum _{j1}^{r}s\underbrace {ss\cdots s} _{r{\tex…

[代码复现]BrainGNN: Interpretable Brain Graph Neural Network for fMRI Analysis

目录 1. 论文资料 2. 代码复现步骤及可能存在的问题 2.1. 环境配置 2.2. 代码运行 3. 为啥跑这个代码 1. 论文资料 &#xff08;1&#xff09;论文原文&#xff1a;BrainGNN&#xff1a;用于fMRI分析的可解释脑图神经网络 - ScienceDirect &#xff08;2&#xff09;论文…