基于Arduino UNO的智能摇头避障小车
目录1.首先介绍两个基本函数2.L298N控制逻辑3.让小车实现前后左右轮子动代码示例4.串口介绍5.跟随小车开发6.摇头避障小车开发7.实物展示1.首先介绍两个基本函数voidsetup(){//putyoursetupcodehere,torunonce:把你的设置代码放在这里,运行一次}voidloop(){//putyourmaincodehere,torunrepeatedly:把你的主代码放在这里,重复运行}2.L298N控制逻辑根据我们的接线:
左电机由引脚2,3控制,右电机由4,5控制。正反转导致前进后退需要根据输出端子那边的电机接线实际验证测试。
接线说明:
左电机安装朝向是接杜邦线的那侧朝外(朝轮子)左轮上,接左端子的OUT2口,左轮下,接左端子的OUT1口,IN1由2控制,IN2为3控制右电机安装朝向是接杜邦线的那侧朝内(背对轮子)右轮上,接右端子的OUT3口,右轮下,接右端子的OUT4口,IN3由4控制,IN4为5控制
3.让小车实现前后左右轮子动代码示例:voidsetup(){//putyoursetupcodehere,torunonce://左轮信号方向初始化pinMode(2,OUTPUT);//配置2口为输出引脚pinMode(3,OUTPUT);//配置3口为输出引脚//右轮信号方向初始化pinMode(4,OUTPUT);//配置4口为输出引脚pinMode(5,OUTPUT);//配置5口为输出引脚}voidloop(){//putyourmaincodehere,torunrepeatedly://小车前进digitalWrite(2,LOW);digitalWrite(3,HIGH);digitalWrite(4,HIGH);digitalWrite(5,LOW);delay(1000);//小车后退digitalWrite(2,HIGH);digitalWrite(3,LOW);digitalWrite(4,LOW);digitalWrite(5,HIGH);delay(1000);//小车左转,右轮前,左轮后digitalWrite(2,HIGH);digitalWrite(3,LOW);digitalWrite(4,HIGH);digitalWrite(5,LOW);delay(1000);//小车右转,左轮前,右轮后digitalWrite(2,LOW);digitalWrite(3,HIGH);digitalWrite(4,LOW);digitalWrite(5,HIGH);delay(1000);} 可以用函数封装,代码示例:voidqianJin(){//小车前进的功能digitalWrite(2,LOW);digitalWrite(3,HIGH);digitalWrite(4,HIGH);digitalWrite(5,LOW);}voidhouTui(){//函数的封装//小车后退的功能digitalWrite(2,HIGH);digitalWrite(3,LOW);digitalWrite(4,LOW);digitalWrite(5,HIGH);}voidzuoZhuan(){digitalWrite(2,HIGH);digitalWrite(3,LOW);digitalWrite(4,HIGH);digitalWrite(5,LOW);}voidyouZhuan(){digitalWrite(2,LOW);digitalWrite(3,HIGH);digitalWrite(4,LOW);digitalWrite(5,HIGH);}voidcarInit(){//putyoursetupcodehere,torunonce:pinMode(2,OUTPUT);//配置2口为输出引脚pinMode(3,OUTPUT);//配置3口为输出引脚//右轮信号方向初始化pinMode(4,OUTPUT);//配置4口为输出引脚pinMode(5,OUTPUT);//配置5口为输出引脚}voidsetup(){carInit();}voidloop(){qianJin();//函数的调用delay(1000);houTui();delay(1000);zuoZhuan();delay(1000);youZhuan();delay(1000);}4.串口介绍我们把程序通过电脑下载到WemosD1上的时候,就是通过串口通信
在程序中,我们也可以通过函数调用实现串口通信
串口的初始化函数:
描述:开启串口,通常置于setup()函数中。Serial.begin(speed)
参数:speed:波特率,一般取值9600,115200等。
ArduinoUno通过串口发送一个消息给电脑
Serial.print(“testmessage,这里是消息,喜欢发什么消息,就写什么消息”)
Serial.println(“testmessage,这里是消息,喜欢发什么消息,就写什么消息”),比上面多了ln,代表换行
代码示例:
voidsetup(){//putyoursetupcodehere,torunonce:Serial.begin(115200);}voidloop(){//putyourmaincodehere,torunrepeatedly:Serial.print("zglnb");Serial.println("zglnb");}打开测试
5.跟随小车开发主要用到超声波模块,型号:HC-SR04
原理图:
超声波代码通过串口测验:
voidsetup(){//putyoursetupcodehere,torunonce://Trig接9,通过9发送一个触发信号给超声波pinMode(9,OUTPUT);//Echo接8,通过读取8高电平维持的时间,确认超声波在空气中传播的时间pinMode(8,INPUT);Serial.begin(9600);}voidloop(){longshijian;longjuli;//putyourmaincodehere,torunrepeatedly://发送一个10us的信号给超声波,9TrigdigitalWrite(9,LOW);delayMicroseconds(2);digitalWrite(9,HIGH);delayMicroseconds(10);digitalWrite(9,LOW);//超声波内部开始震荡,准备发送波//关注Echo高电平维持的时间,代表超声波发送到返回的时间,微秒shijian=pulseIn(8,HIGH);//距离(cm)=时间(s)*速度340m/s34000cm/s=cmjuli=shijian*0.017;Serial.print(juli);Serial.println("cm");}//封装测距代码//函数:名参数返回值longgetDis(){//测距函数longshijian;longjuli;//putyourmaincodehere,torunrepeatedly://发送一个10us的信号给超声波,9TrigdigitalWrite(9,LOW);delayMicroseconds(2);digitalWrite(9,HIGH);delayMicroseconds(10);digitalWrite(9,LOW);//超声波内部开始震荡,准备发送波//关注Echo高电平维持的时间,代表超声波发送到返回的时间,微秒shijian=pulseIn(8,HIGH);//距离(cm)=时间(s)*速度340m/s34000cm/s=cmjuli=shijian*0.017;returnjuli;}voidsetup(){//putyoursetupcodehere,torunonce://putyoursetupcodehere,torunonce://Trig接9,通过9发送一个触发信号给超声波pinMode(9,OUTPUT);//Echo接8,通过读取8高电平维持的时间,确认超声波在空气中传播的时间pinMode(8,INPUT);Serial.begin(9600);}voidloop(){//putyourmaincodehere,torunrepeatedly:longjuli;juli=getDis();Serial.print(juli);Serial.println("cm");}跟随小车代码:
//前进voidqianJin(){//小车前进的功能digitalWrite(2,LOW);digitalWrite(3,HIGH);digitalWrite(4,HIGH);digitalWrite(5,LOW);}//后退voidhouTui(){//函数的封装//小车后退的功能digitalWrite(2,HIGH);digitalWrite(3,LOW);digitalWrite(4,LOW);digitalWrite(5,HIGH);}//tingvoidting(){//函数的封装//小车后退的功能digitalWrite(2,LOW);digitalWrite(3,LOW);digitalWrite(4,LOW);digitalWrite(5,LOW);}//测距//函数:名参数返回值longgetDis(){//测距函数longshijian;longjuli;//putyourmaincodehere,torunrepeatedly://发送一个10us的信号给超声波,9TrigdigitalWrite(9,LOW);delayMicroseconds(2);digitalWrite(9,HIGH);delayMicroseconds(10);digitalWrite(9,LOW);//超声波内部开始震荡,准备发送波//关注Echo高电平维持的时间,代表超声波发送到返回的时间,微秒shijian=pulseIn(8,HIGH);//距离(cm)=时间(s)*速度340m/s34000cm/s=cmjuli=shijian*0.017;returnjuli;}voidcarInit(){//putyoursetupcodehere,torunonce:pinMode(2,OUTPUT);//配置2口为输出引脚pinMode(3,OUTPUT);//配置3口为输出引脚//右轮信号方向初始化pinMode(4,OUTPUT);//配置4口为输出引脚pinMode(5,OUTPUT);//配置5口为输出引脚}voidsetup(){//putyoursetupcodehere,torunonce:carInit();//Trig接9,通过9发送一个触发信号给超声波pinMode(9,OUTPUT);//Echo接8,通过读取8高电平维持的时间,确认超声波在空气中传播的时间pinMode(8,INPUT);}voidloop(){//putyourmaincodehere,torunrepeatedly:delay(50);//为了放缓超声波交互的速度,交互过快,得出距离后会卡顿,影响效果体验longjuli;juli=getDis();//如果距离大于3且小于13,后退if(3