嵌入式初始之Arduino智能小车

您所在的位置:网站首页 arduino按键设置变量 嵌入式初始之Arduino智能小车

嵌入式初始之Arduino智能小车

2023-06-13 17:35| 来源: 网络整理| 查看: 265

目录

硬件介绍(arduino uno)

 软件介绍

小车前进

接线说明​编辑

小车前进

串口通信

超声波测距

舵机摇头

控速与转向

红外循迹

最终成果

硬件介绍(arduino uno)

 

 软件介绍

IDE:Arduino

可以自行搜索下载,注:需要下载Arduino uno的驱动程序

小车前进 void setup() { pinMode(2, OUTPUT);//设置某个IO口为输入或者输出,这里设置LED_BUILDIN为OUTPUT,现成的,调用 } void loop() { digitalWrite(2, HIGH); //让某个IO口输出“电信号”,HIGH代表高电平,LOW代表低电平 delay(100); digitalWrite(2, LOW); delay(100); }

新建文件后会出现setup与loop方法

setup方法:电源开启后初始化运行一次

loop方法:不停进行循环运行的代码

接线说明

左电机由引脚2,3控制,右电机由4,5控制。正反转导致前进后退需要根据输出端子那边的电机接线实际验证测试。

左电机安装朝向是接杜邦线的那侧朝外(朝轮子)

左轮上,接左端子的OUT2口,

左轮下,接左端子的OUT1口,

IN1由2控制,IN2为3控制

右电机安装朝向是接杜邦线的那侧朝内(背对轮子)

右轮上,接右端子的OUT3口,

右轮下,接右端子的OUT4口,

IN3由4控制,IN4为5控制

小车前进 void qianJin() { // 小车前进的功能 digitalWrite(2,LOW); digitalWrite(3,HIGH); digitalWrite(4,HIGH); digitalWrite(5,LOW); } void houTui() {//函数的封装 // 小车后退的功能 digitalWrite(2,HIGH); digitalWrite(3,LOW); digitalWrite(4,LOW); digitalWrite(5,HIGH); } void zuoZhuan(){ digitalWrite(2,HIGH); digitalWrite(3,LOW); digitalWrite(4,HIGH); digitalWrite(5,LOW); } void youZhuan(){ digitalWrite(2,LOW); digitalWrite(3,HIGH); digitalWrite(4,LOW); digitalWrite(5,HIGH); } void carInit() { // put your setup code here, to run once: pinMode(2,OUTPUT);// 配置2口为输出引脚 pinMode(3,OUTPUT);// 配置3口为输出引脚 //右轮信号方向初始化 pinMode(4,OUTPUT);// 配置4口为输出引脚 pinMode(5,OUTPUT);// 配置5口为输出引脚 } void setup() { carInit(); } void loop() { qianJin();//函数的调用 delay(1000); houTui(); delay(1000); zuoZhuan(); delay(1000); youZhuan(); delay(1000); }

编写完代码后,将连接线连上进行上传(上传前会自动进行编译代码)

如果出现上传失败,考虑进行重装驱动。可能是驱动导致无法识别端口

串口通信 void setup() { // put your setup code here, to run once: Serial.begin(9600); } void loop() { // put your main code here, to run repeatedly: Serial.print("这里是串口输出信息"); }

在setup方法中初始化串口的波特率

在后续进行输出需要查看的串口信息

arduino中选中工具 >串口监视器

如果串口监视器无法打开,请检查连接线是否插上或者驱动是否安装正常

超声波测距

连接上超声波模块,通过超声波返回的时间计算出障碍物的距离。

//前进 void qianJin() { // 小车前进的功能 digitalWrite(2,LOW); digitalWrite(3,HIGH); digitalWrite(4,HIGH); digitalWrite(5,LOW); } //后退 void houTui() {//函数的封装 // 小车后退的功能 digitalWrite(2,HIGH); digitalWrite(3,LOW); digitalWrite(4,LOW); digitalWrite(5,HIGH); } //ting void ting() {//函数的封装 // 小车后退的功能 digitalWrite(2,LOW); digitalWrite(3,LOW); digitalWrite(4,LOW); digitalWrite(5,LOW); } //测距 //函数:名 参数 返回值 long getDis() { // 测距函数 long shijian; long juli; // put your main code here, to run repeatedly: // 发送一个10us的信号给超声波,9Trig digitalWrite(9, LOW); delayMicroseconds(2); digitalWrite(9, HIGH); delayMicroseconds(10); digitalWrite(9, LOW);//超声波内部开始震荡,准备发送波 // 关注Echo高电平维持的时间,代表超声波发送到返回的时间,微秒 shijian = pulseIn(8,HIGH); // 距离(cm) = 时间(s) * 速度340m/s 34000cm/s = cm juli = shijian * 0.017; return juli; } void carInit() { // put your setup code here, to run once: pinMode(2,OUTPUT);// 配置2口为输出引脚 pinMode(3,OUTPUT);// 配置3口为输出引脚 //右轮信号方向初始化 pinMode(4,OUTPUT);// 配置4口为输出引脚 pinMode(5,OUTPUT);// 配置5口为输出引脚 } void setup() { // put your setup code here, to run once: carInit(); // Trig 接 9,通过9发送一个触发信号给超声波 pinMode(9,OUTPUT); // Echo 接 8,通过读取8高电平维持的时间,确认超声波在空气中传播的时间 pinMode(8,INPUT); } void loop() { // put your main code here, to run repeatedly: delay(50);//为了放缓超声波交互的速度,交互过快,得出距离后会卡顿,影响效果体验 long juli; juli = getDis(); //如果距离大于3且小于13,后退 if( 3 < juli && juli < 15){ houTui(); } //如果距离大于14且小于40,前进 if( 14 < juli && juli < 40){ qianJin(); } if(juli > 50){ ting(); } } 舵机摇头

Arduino官方提供Servo类来支持舵机操作,通过舵机摇头结合测距确定障碍物的方位并进行转向。

#include Servo myServo;//因为很多子函数要用这个变量,所以把servo定义成全局变量,作用域是整个代码文件 void ting() { // 小车前进的功能 digitalWrite(2, LOW); digitalWrite(3, LOW); digitalWrite(4, LOW); digitalWrite(5, LOW); } void qianJin() { // 小车前进的功能 digitalWrite(2, LOW); digitalWrite(3, HIGH); digitalWrite(4, HIGH); digitalWrite(5, LOW); } void houTui() {//函数的封装 // 小车后退的功能 digitalWrite(2, HIGH); digitalWrite(3, LOW); digitalWrite(4, LOW); digitalWrite(5, HIGH); } void zuoZhuan() { digitalWrite(2, HIGH); digitalWrite(3, LOW); digitalWrite(4, HIGH); digitalWrite(5, LOW); } void youZhuan() { digitalWrite(2, LOW); digitalWrite(3, HIGH); digitalWrite(4, LOW); digitalWrite(5, HIGH); } void carInit() { // put your setup code here, to run once: pinMode(2, OUTPUT); // 配置2口为输出引脚 pinMode(3, OUTPUT); // 配置3口为输出引脚 //右轮信号方向初始化 pinMode(4, OUTPUT); // 配置4口为输出引脚 pinMode(5, OUTPUT); // 配置5口为输出引脚 } long getDis() { // 测距函数 long shijian; long juli; // put your main code here, to run repeatedly: // 发送一个10us的信号给超声波,9Trig digitalWrite(9, LOW); delayMicroseconds(2); digitalWrite(9, HIGH); delayMicroseconds(10); digitalWrite(9, LOW);//超声波内部开始震荡,准备发送波 // 关注Echo高电平维持的时间,代表超声波发送到返回的时间,微秒 shijian = pulseIn(8, HIGH); // 距离(cm) = 时间(s) * 速度340m/s 34000cm/s = cm juli = shijian * 0.017; return juli; } void setup() { // put your setup code here, to run once: //定义一个Servo变量 carInit(); myServo.attach(10);//把舵机黄色信号线插在arduino的引脚10 // Trig 接 9,通过9发送一个触发信号给超声波 pinMode(9, OUTPUT); // Echo 接 8,通过读取8高电平维持的时间,确认超声波在空气中传播的时间 pinMode(8, INPUT); Serial.begin(9600); } void loop() { long youjuli; long zhongjuli; long zuojuli; //如果前面没有障碍物,我让小车往前走 myServo.write(100);//中间方向 delay(500); zhongjuli = getDis(); Serial.print("中间距离是:"); Serial.println(zhongjuli); if (zhongjuli < 35) { ting();//检测到前方右障碍物 //往右边摇头,并测距 myServo.write(30);//右方向 delay(500); youjuli = getDis(); Serial.print("右边距离是:"); Serial.println(youjuli); myServo.write(100);//测完右边距离,再回到中间,此时可以不测距 delay(500); //往左边摇头,测左边距离 myServo.write(170);//左边方向 delay(500); zuojuli = getDis(); Serial.print("左边距离是:"); Serial.println(zuojuli); myServo.write(100);//测完右边距离,再回到中间,此时可以不测距 delay(500); if(zuojuli > youjuli){ Serial.println("左转"); zuoZhuan(); delay(100); ting(); } if(zuojuli < youjuli){ Serial.println("右转"); youZhuan(); delay(100); ting(); } } else { //前方无障碍物,小车前进 qianJin(); } } 控速与转向

控速:通过将analogWrite替换digitalWrite函数,实现小车的速度控制

转向:通过调整左右车轮的速度,使得两边速度不一致的方法来实现转向

红外循迹

连接上红外循迹模块,传感器的红外发射二极管不断发射红外线,当发射出的红外线没有被反射回来或被反射回来但强度不够大时,红外接收管一直处于关断状态,此时模块的输出端为高电平,指示二极管一直处于熄灭状态 。

思考:

什么情况下红外线没有返回来

红外照射在黑线上咯

在黑线上DO电平表现

高电平!

灯的表现

灭灯

什么时候该左转

说明小车偏右,说明左循迹模块在黑线上,左循迹模块的电平表现为高电平,右循迹模块能接收到红外,电平表现为低电平

什么实时该右转

说明小车偏左,右循迹在黑线上,右循迹高电平,左循迹低电平

/* 做循迹模块接Arduino的11口,右循迹模块接Arduinod的12口 小车控制速度前进 */ int leftX = 11; int rightX = 12; void carInit() { // put your setup code here, to run once: pinMode(2, OUTPUT); // 配置2口为输出引脚 pinMode(3, OUTPUT); // 配置3口为输出引脚 //右轮信号方向初始化 pinMode(4, OUTPUT); // 配置4口为输出引脚 pinMode(5, OUTPUT); // 配置5口为输出引脚 } void qianJin() { // 小车前进的功能 digitalWrite(2, LOW); analogWrite(3, 100); digitalWrite(5, LOW); analogWrite(4, 100); } void ting() { // 小车前进的功能 digitalWrite(2, LOW); analogWrite(3, 0); digitalWrite(5, LOW); analogWrite(4, 0); } void zuoZhuan() { // 小车左转,左边电机速度慢,右边电机速度快 digitalWrite(2, LOW); analogWrite(3, 80); //左 digitalWrite(5, LOW); analogWrite(4, 250);//右 } void youZhuan() { // 小车左转,左边电机速度慢,右边电机速度快 digitalWrite(2, LOW); analogWrite(3, 250); //左 digitalWrite(5, LOW); analogWrite(4, 80);//右 } void setup() { // put your setup code here, to run once: carInit(); pinMode(leftX,INPUT); pinMode(rightX,INPUT); } void loop() { // put your main code here, to run repeatedly: //什么时候该左转 //左循迹模块的电平表现为高电平,右循迹模块表现为低电平 if( digitalRead(leftX) == 1 && digitalRead(rightX) == 0 ){ zuoZhuan(); } //什么时候右转 //右循迹高电平,左循迹低电平 if( digitalRead(leftX) == 0 && digitalRead(rightX) == 1 ){ youZhuan(); } //什么时候前进 //左右都为低电平 if( digitalRead(leftX) == 0 && digitalRead(rightX) == 0 ){ qianJin(); } //什么时候停 //左右都为高电平 if( digitalRead(leftX) == 1 && digitalRead(rightX) == 1 ){ ting(); } } 最终成果



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3