当前位置:   article > 正文

基于Arduino智能小车_arduino智能小车代码

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);
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

第二步:实现前后左右

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);
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37

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

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);
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43

第四步:了解串口

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("!!!");
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

五. 跟随模式开发

首先安装超声波测距模块
型号: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);
  
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

超声波测距原理:

在这里插入图片描述


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;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

六.超声波模块摇头

#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);
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

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


#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();
  }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126
  • 127
  • 128
  • 129
  • 130
  • 131
  • 132
  • 133
  • 134
  • 135
  • 136
  • 137
  • 138
  • 139
  • 140
  • 141
  • 142
  • 143
  • 144
  • 145
  • 146
  • 147
  • 148
  • 149
  • 150
  • 151
  • 152
  • 153

八.红外循迹模块 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();  
  }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/531948
推荐阅读
  

闽ICP备14008679号