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

news2025/1/23 22:37:32

附  录

智能小车原理图

智能小车拓展板原理图

 

智能小车拓展板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舵机连续转动

}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

外部ADC之AD7949——14bit、8通道、250k

前言 在实际项目中&#xff0c;仅靠单片机内部的ADC采样&#xff0c;很有可能达不到实际采样精度&#xff0c;这个时候就需要外接外部ADC芯片进行采样&#xff0c;这些外部ADC一般都是SPI接口或者是并口。 单片机通过SPI接口或并口读写芯片内部寄存器&#xff0c;配置参考极性…

2023 年全国职业院校技能大赛(高职组) “云计算应用”赛项赛卷 B部分解析

2022 年全国职业院校技能大赛高职组云计算赛项试卷部分解析 【赛程名称】第一场&#xff1a;模块一 私有云、模块二 容器云【任务 1】私有云服务搭建[5 分]【题目 1】1.1.1 基础环境配置[0.2 分]【题目 2】1.1.2 Yum 源配置[0.2 分]【题目 3】1.1.3 配置无秘钥 ssh[0.2 分]【题…

javacv和opencv对图文视频编辑-裸眼3D图片制作

通过斗鸡眼&#xff0c;将左右两张相似的图片叠加到一起看&#xff0c;就会有3D效果。 3D图片&#xff0c;3D眼镜&#xff0c;3D视频等原理类似&#xff0c;都是通过两眼视觉差引起脑补产生3D效果。 图片&#xff1a; 图片来源&#xff1a; 一些我拍摄的真*裸眼3D照片 - 哔哩…

[Docker] 基本名词

镜像(iamge)&#xff1a; Docker 镜像就好比是一个模板&#xff0c;可以通过这个模板来创建容器服务&#xff0c; 容器&#xff08;container&#xff09;: Docker利用容器技术&#xff0c;独立运行一个或则多个应用&#xff0c;通过镜像来创建的。 启动&#xff0c;停止&a…

LeetCode-1672/1572/54/73

1.最富有客户的资产总量&#xff08;1672&#xff09; 题目描述&#xff1a; 给你一个 m x n 的整数网格 accounts &#xff0c;其中 accounts[i][j] 是第 i​​​​​​​​​​​​ 位客户在第 j 家银行托管的资产数量。返回最富有客户所拥有的 资产总量 。 客户的 资产总…

鸿蒙Harmony-线性布局(Row/Column)详解

人生的下半场&#xff0c;做个简单的人&#xff0c;少与人纠缠&#xff0c;多看大自然&#xff0c;在路上见世界&#xff0c;在途中寻自己。往后余生唯愿开心健康&#xff0c;至于其他&#xff0c;随缘就好&#xff01; 目录 一&#xff0c;定义 二&#xff0c;基本概念 三&am…

Linux实操学习

Linux常用操作 一、帮助命令1. man1.1 基本语法1.2 快捷键1.3 注意事项 2. help2.1 基本语法2.2 注意事项 3. 常用快捷键 二、文件目录类1. 常规操作1.1 pwd1.2 cd1.3 ls 2. 文件夹操作2.1 mkdir2.2 rmdir 3. 文件操作3.1 touch3.2 cp3.3 rm3.4 mv 4. 文件查看4.1 cat4.2 more4…

浏览器进程模型和JS的事件循环

一、浏览器的进程模型 1、什么是进程&#xff1f; 程序运行所需要的专属内存空间 2、什么是线程&#xff1f; ​​​​​运行​代码的称为线程&#xff08;同一个进程中的线程共享进程的资源&#xff09; ⼀个进程⾄少有⼀个线程&#xff0c;所以在进程开启后会⾃动创建⼀个线…

软件测试|Pydantic BaseModel使用详解

简介 当我们在Python中编写应用程序时&#xff0c;通常需要处理和验证数据。Pydantic 是一个流行的库&#xff0c;它可以帮助我们定义数据模型并自动进行数据验证。在Pydantic中&#xff0c;BaseModel是一个核心概念&#xff0c;它用于定义数据模型和验证输入数据。在这篇文章…

Uibot (RPA设计软件)网页表单填写————课前材料四

微信群发助手机器人的小项目友友们可以参考小北的课前材料二博客~ (本博客中会有部分课程ppt截屏,如有侵权请及请及时与小北我取得联系~&#xff09; 紧接着小北的前两篇博客&#xff0c;友友们我们即将开展新课的学习~RPA 培训前期准备指南——安装Uibot(RPA设计软件&#x…

第 5 课 编写简单的发布器 Publisher

文章目录 第 5 课 编写简单的发布器 Publisher 第 5 课 编写简单的发布器 Publisher 本节以创建一个velocity_publisher.py的&#xff08;发布者&#xff09;节点为例进行讲解。 输入指令“roscd beginner_hiwonder”&#xff0c;回车。进入beginner_hiwonder软件包。 roscd…

电脑重置网络后连不上网了怎么办

一般电脑重置网络后都会自动重新下载好网络配置&#xff0c;但是不免会出现一些意外&#xff0c;接下来就我遇到的重置后无法联网的解决方案 做一个分享&#xff1a; 1、按下“winR”打开运行输入 services.msc 。 2、找到 WLAN AutoConfig 和 Wired AutoConfig 服务&#xff…

蓝桥杯AcWing学习笔记 8-2数论的学习(下)

蓝桥杯 我的AcWing 题目及图片来自蓝桥杯C AB组辅导课 数论&#xff08;下&#xff09; 蓝桥杯省赛中考的数论不是很多&#xff0c;这里讲几个蓝桥杯常考的知识点。 约数个数定理 我们如何去求一个数的约数个数呢&#xff1f; N N N分解质因数的结果&#xff1a; N P 1 α…

【嘿,“怪”回来了】半年未见,好久不见。新年伊始,共赴新约。

您的阅读概要&#xff1a; 故事的开头总是极尽温柔&#xff0c;故事会一直温柔……半年未见&#xff0c;好久不见新年伊始&#xff0c;共赴新约忙碌的敲代码也不要忘了浪漫呀 故事的开头总是极尽温柔&#xff0c;故事会一直温柔…… ✨【自我介绍】&#xff1a;你好&#xff0c…

【ArcGIS Pro微课1000例】0056:度分秒与十进制度互相转换(度分秒→度、度→度分秒)

ArcGIS软件可以很方便的直接实现度分秒转度、度转度分秒(度分秒→度、度→度分秒)。 文章目录 一、转换预览二、工具介绍三、案例解析一、转换预览 借助ArcGIS快速实现度分秒与度及其他格式的坐标转换,例如:度分秒→度、度→度分秒。 1. 度→度分秒 2. 度分秒→度 转换后…

Lagrange对偶法

这里写自定义目录标题 5.1.1 The Lagrangian5.1.2 The Lagrange dual function5.2 The Lagrange dual problem5.2.3 Strong duality and Slater’s constraint qualification5.2.3 Strong duality and Slater’s constraint qualification5.5.3 KKT optimality conditions Lagr…

k8s node节点加入集群,token过期

1、master01节点执行 kubeadm token create --print-join-command 2、执行命令 kubeadm join 192.168.0.236:16443 --token qucd8q.hsfq4a1afluzaky3 --discovery-token-ca-cert-hash sha256:92175a356db070deb2ddd3823e288e3005a4baeec9b68580dcc11ce4d3767195 3、查看node02…

VMware安装CentOS7虚拟机

VMware 安装 获取 VMware 安装包 下载地址&#xff1a;链接&#xff1a;https://pan.baidu.com/s/1ELR5NZa7rO6YVplZ1IUigw?pwdplz3 提取码&#xff1a;plz3 包括&#xff1a;当然&#xff0c;也可以自己去别的地方下载&#xff0c;WMware 版本都差不多&#xff0c;现在用的比…

大量的视频如何批量随机分割的方法:批量剪辑不求人

在处理大量视频文件时&#xff0c;经常要进行随机分割&#xff0c;满足不同的需求。制作短视频、片段集锦等&#xff0c;批量随机分割视频都是一个高效的方法。下面来看云炫AI智剪如何操作的吧。 分割后的视频缩略图展示&#xff0c;被分割的视频自动分类保存在对应的文件夹中。…

【SAP ABAP】数据赋值

1. 赋值 语法格式 f2 f1. 表示将变量f1的值赋值给变量f2 输出结果如下&#xff1a; 扩展补充(带偏移量的赋值) 输出结果如下&#xff1a; 将lv_a从偏移2位开始的位置&#xff0c;取长度为3的内容345赋值给 lv_b&#xff0c;赋值覆盖lv_b从偏移4位开始的位置且长度为3的内容…