基于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的信号给超声波,9Trig
digitalWrite(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 = cm
d = t * 0.017;
return d;
}
六.超声波模块摇头
#include <Servo.h>
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.h>
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的信号给超声波,9Trig
digitalWrite(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 = cm
d = 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个小时完成,很简单,第一次完嵌入式相关的内容。
大家可以去尝试,跟着四哥的做的。