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

智能小车拓展板原理图

智能小车拓展板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舵机连续转动}
相关文章:
智能寻迹避障清障机器人设计(电路图附件+代码)
附 录 智能小车原理图 智能小车拓展板原理图 智能小车拓展板PCB 智能小车底板PCB Arduino UNO原理图 Arduino UNO PCB 程序部分 void Robot_Traction() //机器人循迹子程序{//有信号为LOW 没有信号为HIGHSR digitalRead(SensorRight);//有信号表明在白…...
设计模式-- 3.适配器模式
适配器模式 将一个类的接口转换成客户希望的另外一个接口。使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。 角色和职责 请求者(client):客户端角色,需要使用适配器的对象,不需要关心适配器内部的实现,…...
设计一个简单的规则引擎
👏作者简介:大家好,我是爱吃芝士的土豆倪,24届校招生Java选手,很高兴认识大家📕系列专栏:Spring原理、JUC原理、Kafka原理、分布式技术原理、数据库技术🔥如果感觉博主的文章还不错的…...
openssl3.2 - 官方demo学习 - digest - EVP_MD_stdin.c
文章目录 openssl3.2 - 官方demo学习 - digest - EVP_MD_stdin.c概述笔记END openssl3.2 - 官方demo学习 - digest - EVP_MD_stdin.c 概述 使用 SHA3-512 对stdin输入做摘要, 并输出摘要值. 笔记 /*! \file EVP_MD_stdin.c \note openssl3.2 - 官方demo学习 - digest - EVP…...
浅谈 Raft 分布式一致性协议|图解 Raft
前言 大家好,这里是白泽。本文是一年多前参加字节训练营针对 Raft 自我整理的笔记。 本篇文章将模拟一个KV数据读写服务,从提供单一节点读写服务,到结合分布式一致性协议(Raft)后,逐步扩展为一个分布式的…...
4_【Linux版】重装数据库问题处理记录
1、卸载已安装的oracle数据库。 2、知识点补充: 3、调整/dev/shm/的大小 【linux下修改/dev/shm tmpfs文件系统大小 - saratearing - 博客园 (cnblogs.com)】 mount -o remount,size100g /dev/shm 4、重装oracle后没有orainstRoot.sh 【重装oracle后没有orains…...
隧道应用2-netsh端口转发监听Meterpreter
流程介绍: 跳板机 A 和目标靶机 B 是可以互相访问到的,在服务器 A 上可以通过配置 netsh 端口映射访问 B 服务器。如果要拿 B 服务器的权限通常是生成正向后门,使用 kali 的 msf 正向连接B服务器,进而得到 Meterpreter,…...
《Spring》--使用application.yml特性提供多环境开发解决方案/开发/测试/线上--方案1
阿丹有话说: 有不少同志有疑问说我正常开发的时候,需要自己搭建项目的时候。总是出现配置文件环境切换出现问题。多环境系列会出两个文章解决给搭建重点解决一下这个问题。给与两种解决的方案。正确让大家只需要按照步骤操作就可以完成。 原理…...
统计项目5000+,出具报表5分钟......捷顺科技数据中台怎么做?
捷顺创立于1992年,以智慧车行、人行出入口软硬件产品为依托,致力于智慧停车生态建设和运营,是出入口智能管理和智慧生态环境建设的开创者和引领者。 历经近三十年的发展,已经成为国内智慧停车领域的领军企业。公司集研、产、销一…...
力扣(105. 从前序与中序遍历序列构造二叉树,106. 从中序与后序遍历序列构造二叉树)
题目1链接 题目1: 思路:使用前序确定根,使用中序分左右子树,分治法。 难点:如何控制递归确定左右子树。 /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* T…...
网络安全技术新手入门:在docker上安装dvwa靶场
前言 准备工作:1.已经安装好kali linux 步骤总览:1.安装好docker 2.拖取镜像,安装dvwa 一、安装docker 输入命令:sudo su 输入命令:curl -fsSL https://download.docker.com/linux/debian/gpg | sudo apt-key …...
Docker 介绍 及 支持的操作系统
Docker组成: Docker主机(Host): 一个物理机或虚拟机, 用于运行Docker服务进程和容器, 也成为宿主机, node节点。 Docker服务器端(Server): Docker守护进程, 运行Docker容器。 Docker客户端(Client): 客户端使用docker命令或其他工…...
大模型实战营Day5 LMDeploy大模型量化部署实践
模型部署 定义 产品形态 计算设备 大模型特点 内存开销大 动态shape 结构简单 部署挑战 设备存储 推理速度 服务质量 部署方案:技术点 (模型并行 transformer计算和访存优化 低比特量化 Continuous Batch Page Attention)方案(…...
py连接sqlserver数据库报错问题处理。20009
报错 pymssql模块连接sqlserver出现如下错误: pymssql._pymssql.OperationalError) (20009, bDB-Lib error message 20009, severity 9:\nUnable to connect: Adaptive Server is unavailable or does not exist (passwordlocalhost)\n) 解决办法: 打…...
LTESniffer:一款功能强大的LTE上下行链路安全监控工具
关于LTESniffer LTESniffer是一款功能强大的LTE上下行链路安全监控工具,该工具是一款针对LTE的安全开源工具。 该工具首先可以解码物理下行控制信道(PDCCH)并获取所有活动用户的下行链路控制信息(DCI)和无线网络临时…...
SQL语句详解二-DDL(数据定义语言)
文章目录 操作数据库创建:Create查询:Retrieve修改:Update删除:Delete使用数据库 操作表常见的几种数据类型创建:Create复制表 查询:Retrieve修改:Update删除:Delete 操作数据库 创…...
web前端算法简介之链表
链表 链表 VS 数组链表类型链表基本操作 创建链表:插入操作:删除操作:查找操作:显示/打印链表:反转链表:合并两个有序链表:链表基本操作示例 JavaScript中,instanceof环形链表 判断…...
C++函数对象
任何定义了函数调用操作符的对象都是函数对象。C 支持创建、操作新的函数对象,同时也提供了许多内置的函数对象。 函数包装器 std::function 提供存储任意类型函数对象的支持。 function (C11) 包装具有指定函数调用签名的任意类型的可调用对象 (类模板) bad_funct…...
插件化简单介绍
关于作者:CSDN内容合伙人、技术专家, 从零开始做日活千万级APP。 专注于分享各领域原创系列文章 ,擅长java后端、移动开发、商业变现、人工智能等,希望大家多多支持。 未经允许不得转载 目录 一、导读二、概览三、常见的插件化方案…...
[Beego]1.Beego简介以及beego环境搭建,bee脚手架的使用,创建,运行项目
一.Beego介绍 Beego是一个开源的基于Golang的MVC框架,主要用于Golang Web开发,Beego可以用来快速开发API、Web、后端服务等各种应用。 Golang 的Web开发框架有很多,从 github star 数量来看Gin>Beego>lris>Echo>Revel>Buffalo 目前国内用的比较多的就…...
学校招生小程序源码介绍
基于ThinkPHPFastAdminUniApp开发的学校招生小程序源码,专为学校招生场景量身打造,功能实用且操作便捷。 从技术架构来看,ThinkPHP提供稳定可靠的后台服务,FastAdmin加速开发流程,UniApp则保障小程序在多端有良好的兼…...
P3 QT项目----记事本(3.8)
3.8 记事本项目总结 项目源码 1.main.cpp #include "widget.h" #include <QApplication> int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); } 2.widget.cpp #include "widget.h" #include &q…...
Java-41 深入浅出 Spring - 声明式事务的支持 事务配置 XML模式 XML+注解模式
点一下关注吧!!!非常感谢!!持续更新!!! 🚀 AI篇持续更新中!(长期更新) 目前2025年06月05日更新到: AI炼丹日志-28 - Aud…...
【Go】3、Go语言进阶与依赖管理
前言 本系列文章参考自稀土掘金上的 【字节内部课】公开课,做自我学习总结整理。 Go语言并发编程 Go语言原生支持并发编程,它的核心机制是 Goroutine 协程、Channel 通道,并基于CSP(Communicating Sequential Processes࿰…...
Java多线程实现之Thread类深度解析
Java多线程实现之Thread类深度解析 一、多线程基础概念1.1 什么是线程1.2 多线程的优势1.3 Java多线程模型 二、Thread类的基本结构与构造函数2.1 Thread类的继承关系2.2 构造函数 三、创建和启动线程3.1 继承Thread类创建线程3.2 实现Runnable接口创建线程 四、Thread类的核心…...
基于Java+MySQL实现(GUI)客户管理系统
客户资料管理系统的设计与实现 第一章 需求分析 1.1 需求总体介绍 本项目为了方便维护客户信息为了方便维护客户信息,对客户进行统一管理,可以把所有客户信息录入系统,进行维护和统计功能。可通过文件的方式保存相关录入数据,对…...
Linux nano命令的基本使用
参考资料 GNU nanoを使いこなすnano基础 目录 一. 简介二. 文件打开2.1 普通方式打开文件2.2 只读方式打开文件 三. 文件查看3.1 打开文件时,显示行号3.2 翻页查看 四. 文件编辑4.1 Ctrl K 复制 和 Ctrl U 粘贴4.2 Alt/Esc U 撤回 五. 文件保存与退出5.1 Ctrl …...
安卓基础(Java 和 Gradle 版本)
1. 设置项目的 JDK 版本 方法1:通过 Project Structure File → Project Structure... (或按 CtrlAltShiftS) 左侧选择 SDK Location 在 Gradle Settings 部分,设置 Gradle JDK 方法2:通过 Settings File → Settings... (或 CtrlAltS)…...
五子棋测试用例
一.项目背景 1.1 项目简介 传统棋类文化的推广 五子棋是一种古老的棋类游戏,有着深厚的文化底蕴。通过将五子棋制作成网页游戏,可以让更多的人了解和接触到这一传统棋类文化。无论是国内还是国外的玩家,都可以通过网页五子棋感受到东方棋类…...
Kubernetes 节点自动伸缩(Cluster Autoscaler)原理与实践
在 Kubernetes 集群中,如何在保障应用高可用的同时有效地管理资源,一直是运维人员和开发者关注的重点。随着微服务架构的普及,集群内各个服务的负载波动日趋明显,传统的手动扩缩容方式已无法满足实时性和弹性需求。 Cluster Auto…...
