基于Arduino智能小车

基于Arduino智能小车

在这里插入图片描述

第一步:让车动起来

L298N控制逻辑
void setup() { //完整// put your setup code here, to run once:// 配置2,3口为输出引脚pinMode(2,OUTPUT);// 配置2口为输出引脚pinMode(3,OUTPUT);// 配置3口为输出引脚
}void loop() {// put your main code here, to run repeatedly://后退 2接的是IN1,3接的是IN2. 根据官方说明,正转,对应接线后的现象,后退digitalWrite(2,HIGH);digitalWrite(3,LOW);delay(1000);//前进 2接的是IN1,3接的是IN2. 根据官方说明,反转,对应接线后的现象,前进digitalWrite(2,LOW);digitalWrite(3,HIGH);delay(1000);
}

第二步:实现前后左右

void setup() {// 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 loop() {// put your main code here, to run repeatedly: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);
}

第三步:将小车运动状态封装成函数

void  S(){//左轮 后退 正转 IN1 高  IN2 低digitalWrite(2,HIGH);digitalWrite(3,LOW);//右轮 后退 反转 IN3 低  IN4 高digitalWrite(4,HIGH);digitalWrite(5,LOW);
}void W(){//左轮 前进 反转 IN1 低  IN2 高digitalWrite(2,LOW);digitalWrite(3,150);//右轮 前进 正转 IN3 高  IN4 低digitalWrite(4,LOW);digitalWrite(5,150);
}void A(){//左轮 停止 IN1 低  IN2 低digitalWrite(2,LOW);digitalWrite(3,100);//右轮 前进 正转 IN3 高  IN4 低digitalWrite(4,LOW);digitalWrite(5,230);
}void D(){//左轮 前进 反转 IN1 低 IN2 高digitalWrite(2,LOW);digitalWrite(3,230);//右轮 停止 IN3 低 IN4 低digitalWrite(4,LOW);digitalWrite(5,100);
}void stop(){// 停止digitalWrite(2,LOW);digitalWrite(3,LOW);digitalWrite(4,LOW);digitalWrite(5,LOW);
}

第四步:了解串口

void setup() {// put your setup code here, to run once:Serial.begin(115200);}void loop() {// put your main code here, to run repeatedly:Serial.print("hello");Serial.println("!!!");
}

五. 跟随模式开发

首先安装超声波测距模块
型号:HC-SR04

void HC_SR04(){//Trig接9,发送触发信号给超声波模块pinMode(9,OUTPUT);//Echo接8,通过读取8引脚高电平维持时间pinMode(8,INPUT);Serial.begin(9600);
}void setup() {// put your setup code here, to run once:carInit();HC_SR04();myServo.attach(10);}

超声波测距原理:

在这里插入图片描述


long getDis() {// 测距函数long t;long d;// put your main code here, to run repeatedly:// 发送一个10us的信号给超声波,9TrigdigitalWrite(9, HIGH);delayMicroseconds(1);digitalWrite(9, LOW);delayMicroseconds(2);digitalWrite(9, HIGH);delayMicroseconds(10);digitalWrite(9, LOW);//超声波内部开始震荡,准备发送波// 关注Echo高电平维持的时间,代表超声波发送到返回的时间,微秒t = pulseIn(8,HIGH);Serial.println(t);// 距离(cm) = 时间(s) * 速度340m/s 34000cm/s = cmd = t * 0.017;return d;
}

六.超声波模块摇头

#include Servo  myServo;//因为很多子函数要用这个变量,所以把servo定义成全局变量,作用域是整个代码文件void setup() {// put your setup code here, to run once://定义一个Servo变量myServo.attach(10);//把舵机黄色信号线插在arduino的引脚10
}void loop() {// put your main code here, to run repeatedly:myServo.write(30);//右方向delay(500);myServo.write(100);//中间方向delay(500);myServo.write(170);//左边方向delay(500);myServo.write(100);//中间方向delay(500);
}

七. 超声波摇头避障 (智障模式)


#include
Servo myServo;void  S(){//左轮 后退 正转 IN1 高  IN2 低digitalWrite(2,HIGH);digitalWrite(3,LOW);//右轮 后退 反转 IN3 低  IN4 高digitalWrite(4,HIGH);digitalWrite(5,LOW);
}void W(){//左轮 前进 反转 IN1 低  IN2 高digitalWrite(2,LOW);digitalWrite(3,150);//右轮 前进 正转 IN3 高  IN4 低digitalWrite(4,LOW);digitalWrite(5,150);
}void A(){//左轮 停止 IN1 低  IN2 低digitalWrite(2,LOW);digitalWrite(3,100);//右轮 前进 正转 IN3 高  IN4 低digitalWrite(4,LOW);digitalWrite(5,230);
}void D(){//左轮 前进 反转 IN1 低 IN2 高digitalWrite(2,LOW);digitalWrite(3,230);//右轮 停止 IN3 低 IN4 低digitalWrite(4,LOW);digitalWrite(5,100);
}void stop(){// 停止digitalWrite(2,LOW);digitalWrite(3,LOW);digitalWrite(4,LOW);digitalWrite(5,LOW);
}long getDis() {// 测距函数long t;long d;// put your main code here, to run repeatedly:// 发送一个10us的信号给超声波,9TrigdigitalWrite(9, HIGH);delayMicroseconds(1);digitalWrite(9, LOW);delayMicroseconds(2);digitalWrite(9, HIGH);delayMicroseconds(10);digitalWrite(9, LOW);//超声波内部开始震荡,准备发送波// 关注Echo高电平维持的时间,代表超声波发送到返回的时间,微秒t = pulseIn(8,HIGH);Serial.println(t);// 距离(cm) = 时间(s) * 速度340m/s 34000cm/s = cmd = t * 0.017;return d;
}void carInit(){//串口初始化//左轮信号配置pinMode(2,OUTPUT);pinMode(3,OUTPUT);//右轮信号配置pinMode(4,OUTPUT);pinMode(5,OUTPUT);}
void HC_SR04(){//Trig接9,发送触发信号给超声波模块pinMode(9,OUTPUT);//Echo接8,通过读取8引脚高电平维持时间pinMode(8,INPUT);Serial.begin(9600);
}
void setup() {// put your setup code here, to run once:carInit();HC_SR04();myServo.attach(10);}void loop() {// put your main code here, to run repeatedly:long youjuli;long zhongjuli;long zuojuli;myServo.write(100);//中间方向delay(500);zhongjuli = getDis();Serial.print("中间距离是:");Serial.println(zhongjuli);while(zhongjuli<=30){S();delay(300);stop();myServo.write(100);//中间方向delay(500);zhongjuli = getDis();delay(500);}if(zhongjuli<=45){stop();myServo.write(30);delay(500);youjuli = getDis();myServo.write(170);delay(500);zuojuli = getDis();if(zuojuli > youjuli){Serial.println("左转");A();delay(200);stop();myServo.write(100);//中间方向delay(500);zhongjuli = getDis();}else{Serial.println("右转");D();delay(200);stop();myServo.write(100);//中间方向delay(500);zhongjuli = getDis();}}else { //前方无障碍物,小车前进W();}
}

八.红外循迹模块 TCRT5000

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


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 W() {digitalWrite(2, LOW);analogWrite(3, 100);digitalWrite(4, LOW);analogWrite(5, 100);
}void stop() {digitalWrite(2, LOW);analogWrite(3, 0);digitalWrite(4, LOW);analogWrite(5, 0);
}void A() {digitalWrite(2, LOW);analogWrite(3, 80); digitalWrite(4, LOW);analogWrite(5, 250);
}void D() {digitalWrite(2, LOW);analogWrite(3, 250); digitalWrite(4, LOW);analogWrite(5, 80);
}void setup() {// put your setup code here, to run once:carInit();pinMode(leftX,INPUT);pinMode(rightX,INPUT);
}void loop() {if( digitalRead(leftX) == 1 && digitalRead(rightX) == 0 ){A();}if( digitalRead(leftX) == 0 && digitalRead(rightX) == 1 ){D();  }if( digitalRead(leftX) == 0 && digitalRead(rightX) == 0 ){W();  }if( digitalRead(leftX) == 1 && digitalRead(rightX) == 1 ){stop();  }
}

花了大概8到9个小时完成,很简单,第一次完嵌入式相关的内容。
大家可以去尝试,跟着四哥的做的。


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部