Arduino智能小车搭建学习

学习一下怎么搭建一个具有智能避障,寻迹的蓝牙遥控车。个人认为可以主要分为以下两个步骤:1. 硬件电路连接。2. 编码。编好程序的Arduino去控制各个元件去发挥作用就如同人的大脑去控制手脚。

由于本人基本是属于0基础,将在此对不认识的元器件留下笔记,并尝试理解每一个电路和代码的意义。Arduino是如何实现对电子元器件控制的,单独的Arduino初步熟悉可以参考上一篇笔记,这里只记录小车中用到的功能模块。

组装好的智障鬼畜小车演示:

1. 硬件电路焊接与组装

基本流程:先焊接好各个模块,再将模块组装。焊接时先焊接小元件再焊接大元件。(由于零件都是买了的,所以不涉及PCB电路板设计,想要进一步提高,这个也得学一学,要是板子都没有,焊个啥)

主板焊接效果

(左)UNO R3开发板,(右)焊接好的主板正面

(左)UNO R3开发板,(右)焊接好的主板背面

将UNO R3引脚引出

小车底板焊接

小车主板初始位置

小车主板焊接完毕的正面

小车主板焊接完毕的背面

电池盒的焊接

电池盒的焊接主要是把两根线连接起来,先把线皮拨开(用剥线钳子我总是用不好,我用美工刀削开的),再把裸露的导线穿上热缩管(黑的和红的各套一根,再套一个热缩管子把两个捆在一起),防止短路。先把裸露的导线拧好,再焊接上,再剪掉多余的部分,再套好热缩管,用烙铁头烫一下,捆绑好就OK了。

电池盒

寻迹模块焊接

(哭了,这里R0 L0 GND VCC的排母焊接反面了,它应该是与R0和L0同侧的,然后直接就能插入小车底板P2的排针上)

下面

上面

组装好的小车

正面

底部

涉及相关工具和元器件知识

相关工具

  1. 电烙铁的使用。(手一定要远离烙铁头啊,不然你会闻道菜市场用火去除猪蹄上的毛时发出来的香味,别问我为什么知道)
  2. 吸锡器的使用。万一焊错了要用。
    电烙铁和吸锡器的使用教程链接
    松香使用教程链接
  3. 固定胶带:因为焊接电路板是在背面,背过来焊接元器件时元器件容易掉下去,胶带用来固定。

元器件

将元器件一个个焊接到主板上,秉承着先焊接小元件(电阻和LED类)再焊接大元件的原则,防止大的装上去之后,小的安装不上。然后作为小白,我主要了解下这些元器件的使用方法和功能,还有就是元器件为什么是这么安装!一个个来~

主板上焊接的元器件与相应位置坐标

  1. 色环电阻的识别,金色条带的朝着右边摆放,这里用的四环电阻。功能:分流分压。

  2. LED灯,长为正级,短为负极。

  3. 蜂鸣器,长为正级,短为负极。

  4. 瓷片电容,无极性,以陶瓷作为绝缘介质的电容,电容量较小,用于高稳定振荡回路中,作为回路电容器及垫整电容器。

    电解电容,长脚为正,短脚为负极,用氧化膜(氧化铝或五氧化二钽)作电介质,电容量较大,通常在电源电路或中频、低频电路中起电源滤波、退耦、信号耦合及时间常数设定、隔直流等作用。

    拓展:

    电容的公式为:C=εS/4πkd 。其中,ε是一个常数,S为电容极板的正对面积,d为电容极板的距离,k则是静电力常量。常见的平行板电容器,电容为C=εS/d(ε为极板间介质的介电常数,S为极板面积,d为极板间的距离)。

    关键参数:1.标称容值与误差 2.额定电压 3.温度系数 4.绝缘电阻 5.损耗 6.频率特性 7.介质 8.封装尺寸

    电容器选择参考:https://jingyan.baidu.com/article/a17d52851fa6fe8099c8f27f.html

  5. 红外接收:主要用于将红外信号转化为电信号,底层原理可自行按照规格搜索(拓展资料)。

  6. 按键开关,拨动开关:控制电源短路与断路。

  7. 稳压芯片:稳压芯片可以保护电路,使电路不会因为脉冲而受到破坏。这里是配合锂电池使用,原理和选择(拓展资料

  8. 二极管:有白边的为负极,不清楚时可以用万用表测试。功能:1. 整流 2. 开关 3. 限幅 4. 续流 5. 检波 6. 变容 7. 显示 8. 稳压 9. 触发

  9. IC座(16PIC座子)与驱动芯片(L293D):这里主要用来驱动电机。

  10. 接线座(XH-2P与XH-7P):用于接通导线。

  11. 排针与排母

    主板上焊接的元器件与相应位置坐标

  12. 跳线:跳线实际就是连接电路板两需求点的金属连接线。

  13. 直流减速电机:小车前面两个轮子的动力驱动装置,是减速机和马达的集合体,此处两个电机必须都是红线朝外,黑线朝内,镜像对称。

  14. 寻迹模块:透明断是发射(接板子的T),黑色是接收(接板子的R)

  15. 红外反射开关

  16. 可调电位器:本质就是一个可变电阻。

  17. 舵机云台:舵机主要是控制物体角度的,包含三根线,黄色的是IO口,中间的橙线是VCC,旁边的褐色线是GND。

  18. 超声波模块:上述的舵机云台主要用于控制超声波模块转向用。
  19. 蓝牙模块:供给主板蓝牙数据传输功能。
  20. 面包板:开发板上还有富余的IO口,可以连接面包板拓展功能。

2. 程序导入

软件是Arduino 1.8.13,烧入程序时一定要先看下,选得是不是所用的Arduino UNO板,还有就是软件菜单栏中工具的端口那选得是和设备管理中端口一样,我这里是COM3。主要是看下小车的黑线循迹、避障、遥控实验是如何实现的,其中避障可以靠红外实现,也可以靠超声波模块实现,故各摘取了一些程序,等代码完全看得懂了,也可以自己修改和添加来调控板子上的元器件。

卖家提供程序代码解读

程序是Copy卖家的哦,以后需要功能再在这个基础上改。

1、智能小车黑线循迹、避障、遥控实验综合程序。

//============================智宇科技===========================
//  智能小车黑线循、红外避障、遥控综合实验
//===============================================================
//#include  
#include //包含红外库  关键点
int RECV_PIN = A4;//端口声明
IRrecv irrecv(RECV_PIN);
decode_results results;//结构声明
int on = 0;//标志位
unsigned long last = millis();

long run_car = 0x00FF629D;//按键CH
long back_car = 0x00FFA857;//按键+
long left_car = 0x00FF22DD;//按键<<
long right_car = 0x00FFC23D;//按键>||
long stop_car = 0x00FF02FD;//按键>>|
long left_turn = 0x00ffE01F;//按键-
long right_turn = 0x00FF906F;//按键EQ

int Left_motor_go=8;     //左电机前进(IN1)
int Left_motor_back=9;     //左电机后退(IN2)
int Right_motor_go=10;    // 右电机前进(IN3)
int Right_motor_back=11;    // 右电机后退(IN4)

#define PORT_KEY  A2     //定义按键 数字A2 接口
#define PORT_LED1  7    //定义LED 数字7 接口
#define PORT_LED2  12   //定义LED2 数字12 接口
int beep=A3;//定义蜂鸣器 数字A3 接口

#define KEYMODE_1   1  // 定义按键模式1
#define KEYMODE_2   2  // 定义按键模式2
#define KEYMODE_3   3  // 定义按键模式3
uint8_t keyMode;      //指无符号8bit整型数
const int SensorRight = 3;       //右循迹红外传感器(P3.2 OUT1)
const int SensorLeft = 4;         //左循迹红外传感器(P3.3 OUT2)
const int SensorRight_2 = 5;       //中间红外避障传感器()

int SR_2;    //中间红外避障传感器状态

int SL;    //左循迹红外传感器状态
int SR;    //右循迹红外传感器状态

void setup()
{
  //初始化电机驱动IO为输出方式
  pinMode(Left_motor_go,OUTPUT); // PIN 8 (PWM)
  pinMode(Left_motor_back,OUTPUT); // PIN 9 (PWM)
  pinMode(Right_motor_go,OUTPUT);// PIN 10 (PWM) 
  pinMode(Right_motor_back,OUTPUT);// PIN 11 (PWM)
  pinMode(beep,OUTPUT);

  pinMode(SensorRight, INPUT); //定义右循迹红外传感器为输入
  pinMode(SensorLeft, INPUT); //定义左循迹红外传感器为输入
  pinMode(SensorRight_2, INPUT); //定义右红外传感器为输入

  pinMode(13, OUTPUT);////端口模式,输出
  Serial.begin(9600);    //波特率9600
  irrecv.enableIRIn(); // Start the receiver

   KeyScanInit();
   LEDInit();
}
//=======================智能小车的基本动作  遥控控制单独用电机驱动函数=========================
//  遥控实验不可调节电机速度,调节pwm值会影响红外的信号接收
void run2()     // 前进
{
   digitalWrite(Right_motor_go,HIGH);  // 右电机前进
   digitalWrite(Right_motor_back,LOW);     

   digitalWrite(Left_motor_go,LOW);  // 左电机前进
   digitalWrite(Left_motor_back,HIGH);

}

void brake2()         //刹车,停车
{
  digitalWrite(Right_motor_go,LOW);
  digitalWrite(Right_motor_back,LOW);
  digitalWrite(Left_motor_go,LOW);
  digitalWrite(Left_motor_back,LOW);

}

void left2()         //左转(左轮不动,右轮前进)
{
  digitalWrite(Right_motor_go,HIGH);    // 右电机前进
  digitalWrite(Right_motor_back,LOW);

  digitalWrite(Left_motor_go,LOW);   //左轮后退
  digitalWrite(Left_motor_back,LOW);

}

void spin_left2()         //左转(左轮后退,右轮前进)
{
  digitalWrite(Right_motor_go,HIGH);    // 右电机前进
  digitalWrite(Right_motor_back,LOW);

  digitalWrite(Left_motor_go,HIGH);   //左轮后退
  digitalWrite(Left_motor_back,LOW);
}

void right2()        //右转(右轮不动,左轮前进)
{
  digitalWrite(Right_motor_go,LOW);   //右电机后退
  digitalWrite(Right_motor_back,LOW);

  digitalWrite(Left_motor_go,LOW);//左电机前进
  digitalWrite(Left_motor_back,HIGH);
}

void spin_right2()        //右转(右轮后退,左轮前进)
{
  digitalWrite(Right_motor_go,LOW);   //右电机后退
  digitalWrite(Right_motor_back,HIGH);

  digitalWrite(Left_motor_go,LOW);//左电机前进
  digitalWrite(Left_motor_back,HIGH);
}

void back2()          //后退
{
  digitalWrite(Right_motor_go,LOW);  //右轮后退
  digitalWrite(Right_motor_back,HIGH);

  digitalWrite(Left_motor_go,HIGH);  //左轮后退
  digitalWrite(Left_motor_back,LOW);  
}


//=======================智能小车的基本动作=========================
//void run(int time)     // 前进
void run()
{
   digitalWrite(Right_motor_go,HIGH);  // 右电机前进
  digitalWrite(Right_motor_back,LOW);     
  analogWrite(Right_motor_go,150);//PWM比例0~255调速,左右轮差异略增减
  analogWrite(Right_motor_back,0);
  digitalWrite(Left_motor_go,LOW);  // 左电机前进
  digitalWrite(Left_motor_back,HIGH);
  analogWrite(Left_motor_go,0);//PWM比例0~255调速,左右轮差异略增减
  analogWrite(Left_motor_back,150);
  //delay(time * 100);   //执行时间,可以调整  
}

//void brake(int time)  //刹车,停车
void brake()
{
  digitalWrite(Right_motor_go,LOW);
  digitalWrite(Right_motor_back,LOW);
  digitalWrite(Left_motor_go,LOW);
  digitalWrite(Left_motor_back,LOW);
  //delay(time * 100);//执行时间,可以调整  
}

//void left(int time)         //左转(左轮不动,右轮前进)
void left()
{
  digitalWrite(Right_motor_go,HIGH);    // 右电机前进
  digitalWrite(Right_motor_back,LOW);
  analogWrite(Right_motor_go,150); 
  analogWrite(Right_motor_back,0);//PWM比例0~255调速
  digitalWrite(Left_motor_go,LOW);   //左轮后退
  digitalWrite(Left_motor_back,LOW);
  analogWrite(Left_motor_go,0); 
  analogWrite(Left_motor_back,0);//PWM比例0~255调速
  //delay(time * 100);    //执行时间,可以调整  
}

void spin_left()         //左转(左轮后退,右轮前进)
{
   digitalWrite(Right_motor_go,HIGH);    // 右电机前进
  digitalWrite(Right_motor_back,LOW);
  analogWrite(Right_motor_go,200); 
  analogWrite(Right_motor_back,0);//PWM比例0~255调速
  digitalWrite(Left_motor_go,HIGH);   //左轮后退
  digitalWrite(Left_motor_back,LOW);
  analogWrite(Left_motor_go,200); 
  analogWrite(Left_motor_back,0);//PWM比例0~255调速
 // delay(time * 100);    //执行时间,可以调整  
}

//void right(int time)        //右转(右轮不动,左轮前进)
void right()
{
  digitalWrite(Right_motor_go,LOW);   //右电机后退
  digitalWrite(Right_motor_back,LOW);
  analogWrite(Right_motor_go,0); 
  analogWrite(Right_motor_back,0);//PWM比例0~255调速
  digitalWrite(Left_motor_go,LOW);//左电机前进
  digitalWrite(Left_motor_back,HIGH);
  analogWrite(Left_motor_go,0); 
  analogWrite(Left_motor_back,150);//PWM比例0~255调速
  //delay(time * 100);    //执行时间,可以调整  
}

void spin_right(int time)        //右转(右轮后退,左轮前进)
{
  digitalWrite(Right_motor_go,LOW);   //右电机后退
  digitalWrite(Right_motor_back,HIGH);
  analogWrite(Right_motor_go,0); 
  analogWrite(Right_motor_back,200);//PWM比例0~255调速
  digitalWrite(Left_motor_go,LOW);//左电机前进
  digitalWrite(Left_motor_back,HIGH);
  analogWrite(Left_motor_go,0); 
  analogWrite(Left_motor_back,200);//PWM比例0~255调速
  delay(time * 100);    //执行时间,可以调整    
}

//void back(int time)          //后退
void back()
{
  digitalWrite(Right_motor_go,LOW);  //右轮后退
  digitalWrite(Right_motor_back,HIGH);
  //analogWrite(Right_motor_go,0);
 // analogWrite(Right_motor_back,200);//PWM比例0~255调速
  digitalWrite(Left_motor_go,HIGH);  //左轮后退
  digitalWrite(Left_motor_back,LOW);
  //analogWrite(Left_motor_go,200);
//analogWrite(Left_motor_back,0);//PWM比例0~255调速
  //delay(time * 100);     //执行时间,可以调整  
}
//==========================================================


void dump(decode_results *results)
{
  int count = results->rawlen;
  if (results->decode_type == UNKNOWN) 
  {
    //Serial.println("Could not decode message");
    brake();
  } 
}
void IR_IN()                             //机器人遥控子程序
{

  if (irrecv.decode(&results)) //调用库函数:解码
  {
    // If it's been at least 1/4 second since the last
    // IR received, toggle the relay
    if (millis() - last > 250) //确定接收到信号
    {
      on = !on;//标志位置反
      digitalWrite(13, on ? HIGH : LOW);//板子上接收到信号闪烁一下led
      dump(&results);//解码红外信号
    }

    if (results.value == run_car )//按键CH
      run2();//前进
    if (results.value == back_car )//按键+
      back2();//后退
    if (results.value == left_car )//按键<<
      left2();//左转
    if (results.value == right_car )//按键>||
      right2();//右转
    if (results.value == stop_car )//按键>>|
      brake2();//停车
    if (results.value == left_turn )//按键-
      spin_left2();//左旋转
    if (results.value == right_turn )//按键EQ
      spin_right2();//右旋转
    last = millis();      
    irrecv.resume(); // Receive the next value
  }

}
void Robot_Avoidance()                   //机器人避障子程序
{
 //有信号为LOW  没有信号为HIGH
    SR_2 = digitalRead(SensorRight_2);
    if (SR_2==HIGH)//前面没有障碍物
    {
      run();   //调用前进函数
      digitalWrite(beep,LOW);        //蜂鸣器不响
      //digitalWrite(LED,LOW);        //LED不亮
    } 
    else if ( SR_2 == LOW)// 前面探测到有障碍物,有信号返回,向左转 
       { 
         digitalWrite(beep,HIGH);        //蜂鸣器响
         //digitalWrite(LED,HIGH);        //LED亮
         brake();//停止200MS
         delay(300);
         back();//后退500MS
         delay(400);
         left();//调用左转函数  延时500ms 
         delay(500);        
     }
}
void Robot_Traction()                     //机器人循迹子程序
{
   //有信号为LOW  没有信号为HIGH
  SR = digitalRead(SensorRight);//有信号表明在白色区域,车子底板上L1亮;没信号表明压在黑线上,车子底板上L1灭
  SL = digitalRead(SensorLeft);//有信号表明在白色区域,车子底板上L2亮;没信号表明压在黑线上,车子底板上L2灭
  if (SL == LOW&&SR==LOW)
    run();   //调用前进函数
  else if (SL == HIGH & SR == LOW)// 左循迹红外传感器,检测到信号,车子向右偏离轨道,向左转 
    left();
  else if (SR == HIGH & SL == LOW) // 右循迹红外传感器,检测到信号,车子向左偏离轨道,向右转  
    right();
  else // 都是白色, 停止
  brake();

}
// 按键处理初始化
void KeyScanInit(void)
{
    pinMode(PORT_KEY,INPUT_PULLUP); //输入模式,内部上拉。
    keyMode = KEYMODE_1;
}

// 任务:按键处理
void KeyScanTask(void)//
{
    static uint8_t keypre = 0; //按键被按下时置1.
    if( (keypre == 0) && (digitalRead(PORT_KEY) == HIGH) ) //按键被按下
    {
        keypre = 1; //置1,避免持续按下按键时再次进入此函数体。
        switch(keyMode)
        {
        case KEYMODE_1:
            keyMode = KEYMODE_2;  //关键点错位赋值
            break;
        case KEYMODE_2:
            keyMode = KEYMODE_3;
            break;
        case KEYMODE_3:
            keyMode = KEYMODE_1;
            break;
        default:
            break;
        }
    }
    if(digitalRead(PORT_KEY) == LOW) //按键被放开
    {
        keypre = 0; //置0,允许再次切换LED模式
    }
}
// LED初始化
void LEDInit(void)
{
    pinMode(PORT_LED1,OUTPUT);
    pinMode(PORT_LED2,OUTPUT);
    digitalWrite(PORT_LED1,LOW);
    digitalWrite(PORT_LED2,LOW);
}
// 任务:循迹、避障、遥控模式处理
void LEDTask(void)
{
    switch(keyMode)
    {
    case KEYMODE_1:
        digitalWrite(PORT_LED1,HIGH);
        digitalWrite(PORT_LED2,LOW);
        Robot_Traction(); //调用循迹子程序
        break;
    case KEYMODE_2:
        digitalWrite(PORT_LED1,LOW);
        digitalWrite(PORT_LED2,HIGH);
        Robot_Avoidance(); // 调用避障子程序
        break;
    case KEYMODE_3:
        digitalWrite(PORT_LED1,HIGH);
        digitalWrite(PORT_LED2,HIGH);
        IR_IN();    //调用遥控子程序
        break;
    default:
        break;
    }
}
void loop()
{ 
  /*while(1)
  {
    keysacn();//调用按键扫描函数
    //Robot_Traction();
    //Robot_Avoidance();
    //IR_IN(); 
  }*/
   KeyScanTask();
   LEDTask();
}//

对应遥控器按键:

2、智能小车超声波避障实验(无舵机)。

//============================智宇科技===========================
//  智能小车超声波避障实验(无舵机)
//===============================================================
//#include  
#include  //申明1602液晶的函数库
//申明1602液晶的引脚所连接的Arduino数字端口,8线或4线数据模式,任选其一
//LiquidCrystal lcd(12,11,10,9,8,7,6,5,4,3,2);   //8数据口模式连线声明
LiquidCrystal lcd(13,12,7,6,5,4,3); //4数据口模式连线声明 P13--LCD 4脚  P12--LCD 5脚  
              //P7--LCD 6脚   P6--LCD 11脚  P5--LCD 12脚  P4--LCD 13脚  P3--LCD 14脚  

int Echo = A1;  // Echo回声脚(P2.0)
int Trig =A0;  //  Trig 触发脚(P2.1)

int Distance = 0;

int Left_motor_go=8;     //左电机前进(IN1)
int Left_motor_back=9;     //左电机后退(IN2)

int Right_motor_go=10;    // 右电机前进(IN3)
int Right_motor_back=11;    // 右电机后退(IN4)

int key=A2;//定义按键 A2 接口
int beep=A3;//定义蜂鸣器 A3 接口

void setup()
{
  Serial.begin(9600);     // 初始化串口
  //初始化电机驱动IO为输出方式
  pinMode(Left_motor_go,OUTPUT); // PIN 8 (PWM)
  pinMode(Left_motor_back,OUTPUT); // PIN 9 (PWM)
  pinMode(Right_motor_go,OUTPUT);// PIN 10 (PWM) 
  pinMode(Right_motor_back,OUTPUT);// PIN 11 (PWM)
  pinMode(key,INPUT);//定义按键接口为输入接口
  pinMode(beep,OUTPUT);
  // pinMode(SensorRight, INPUT); //定义右循迹红外传感器为输入
  // pinMode(SensorLeft, INPUT); //定义左循迹红外传感器为输入
  //pinMode(SensorRight_2, INPUT); //定义右红外传感器为输入
  //pinMode(SensorLeft_2, INPUT); //定义左红外传感器为输入
  //初始化超声波引脚
  pinMode(Echo, INPUT);    // 定义超声波输入脚
  pinMode(Trig, OUTPUT);   // 定义超声波输出脚
  lcd.begin(16,2);      //初始化1602液晶工作                       模式
  //定义1602液晶显示范围为2行16列字符  
}
//=======================智能小车的基本动作=========================
//void run(int time)     // 前进
void run()     // 前进
{
  digitalWrite(Right_motor_go,HIGH);  // 右电机前进
  digitalWrite(Right_motor_back,LOW);     
  analogWrite(Right_motor_go,150);//0~255调速,左右轮差异略增减
  analogWrite(Right_motor_back,0);
  digitalWrite(Left_motor_go,LOW);  // 左电机前进
  digitalWrite(Left_motor_back,HIGH);
  analogWrite(Left_motor_go,0);//PWM比例0~255调速,左右轮差异略增减
  analogWrite(Left_motor_back,150);
  //delay(time * 100);   //执行时间,可以调整  
}

void brake(int time)  //刹车,停车
{
  digitalWrite(Right_motor_go,LOW);
  digitalWrite(Right_motor_back,LOW);
  digitalWrite(Left_motor_go,LOW);
  digitalWrite(Left_motor_back,LOW);
  delay(time * 100);//执行时间,可以调整  
}

//void left(int time)         //左转(左轮不动,右轮前进)
void left()         //左转(左轮不动,右轮前进)
{
  digitalWrite(Right_motor_go,HIGH);    // 右电机前进
  digitalWrite(Right_motor_back,LOW);
  analogWrite(Right_motor_go,150); 
  analogWrite(Right_motor_back,0);//PWM比例0~255调速
  digitalWrite(Left_motor_go,LOW);   //左轮后退
  digitalWrite(Left_motor_back,LOW);
  analogWrite(Left_motor_go,0); 
  analogWrite(Left_motor_back,0);//PWM比例0~255调速
  //delay(time * 100);    //执行时间,可以调整  
}

void spin_left(int time)         //左转(左轮后退,右轮前进)
{
  digitalWrite(Right_motor_go,HIGH);    // 右电机前进
  digitalWrite(Right_motor_back,LOW);
  analogWrite(Right_motor_go,150); 
  analogWrite(Right_motor_back,0);//PWM比例0~255调速
  digitalWrite(Left_motor_go,HIGH);   //左轮后退
  digitalWrite(Left_motor_back,LOW);
  analogWrite(Left_motor_go,150); 
  analogWrite(Left_motor_back,0);//PWM比例0~255调速
  delay(time * 100);    //执行时间,可以调整  
}

void right(int time)
//void right()        //右转(右轮不动,左轮前进)
{
  digitalWrite(Right_motor_go,LOW);   //右电机后退
  digitalWrite(Right_motor_back,LOW);
  analogWrite(Right_motor_go,0); 
  analogWrite(Right_motor_back,0);//PWM比例0~255调速
  digitalWrite(Left_motor_go,LOW);//左电机前进
  digitalWrite(Left_motor_back,HIGH);
  analogWrite(Left_motor_go,0); 
  analogWrite(Left_motor_back,150);//PWM比例0~255调速
  delay(time * 100);    //执行时间,可以调整  
}

void spin_right(int time)        //右转(右轮后退,左轮前进)
{
  digitalWrite(Right_motor_go,LOW);   //右电机后退
  digitalWrite(Right_motor_back,HIGH);
  analogWrite(Right_motor_go,0); 
  analogWrite(Right_motor_back,150);//PWM比例0~255调速
  digitalWrite(Left_motor_go,LOW);//左电机前进
  digitalWrite(Left_motor_back,HIGH);
  analogWrite(Left_motor_go,0); 
  analogWrite(Left_motor_back,150);//PWM比例0~255调速
  delay(time * 100);    //执行时间,可以调整        
}

void back(int time)          //后退
{
  digitalWrite(Right_motor_go,LOW);  //右轮后退
  digitalWrite(Right_motor_back,HIGH);
  analogWrite(Right_motor_go,0);
  analogWrite(Right_motor_back,150);//PWM比例0~255调速
  digitalWrite(Left_motor_go,HIGH);  //左轮后退
  digitalWrite(Left_motor_back,LOW);
  analogWrite(Left_motor_go,150);
  analogWrite(Left_motor_back,0);//PWM比例0~255调速
  delay(time * 100);     //执行时间,可以调整   
}
//==========================================================

void keysacn()//按键扫描
{
  int val;
  val=digitalRead(key);//读取数字7 口电平值赋给val
  while(!digitalRead(key))//当按键没被按下时,一直循环
  {
    val=digitalRead(key);//此句可省略,可让循环跑空
  }
  while(digitalRead(key))//当按键被按下时
  {
    delay(10);    //延时10ms
    val=digitalRead(key);//读取数字7 口电平值赋给val
    if(val==HIGH)  //第二次判断按键是否被按下
    {
      digitalWrite(beep,HIGH);        //蜂鸣器响
      while(!digitalRead(key))    //判断按键是否被松开
        digitalWrite(beep,LOW);        //蜂鸣器停止
    }
    else
      digitalWrite(beep,LOW);          //蜂鸣器停止
  }
}

void Distance_test()   // 量出前方距离 
{
  digitalWrite(Trig, LOW);   // 给触发脚低电平2μs
  delayMicroseconds(2);
  digitalWrite(Trig, HIGH);  // 给触发脚高电平10μs,这里至少是10μs
  delayMicroseconds(10);
  digitalWrite(Trig, LOW);    // 持续给触发脚低电
  float Fdistance = pulseIn(Echo, HIGH);  // 读取高电平时间(单位:微秒)
  Fdistance= Fdistance/58;       //为什么除以58等于厘米,  Y米=(X秒*344)/2
  // X秒=( 2*Y米)/344 ==》X秒=0.0058*Y米 ==》厘米=微秒/58
  Serial.print("Distance:");      //输出距离(单位:厘米)
  Serial.println(Fdistance);         //显示距离
  Distance = Fdistance;
}  

void Distance_display()//显示距离
{
   if((2

3、智能小车超声波避障实验(有舵机)。

//============================智宇科技========================================
//  智能小车超声波避障实验(有舵机)
//  程序中电脑打印数值部分都被屏蔽了,打印会影响小车遇到障碍物的反应速度
//  调试时可以打开屏蔽内容Serial.print,打印测到的距离
//  本实验控制速度的pwm值和延时均有调节,但还是配合实际情况,实际电量调节数值
//=============================================================================
//#include  
#include  //申明1602液晶的函数库
//申明1602液晶的引脚所连接的Arduino数字端口,8线或4线数据模式,任选其一
//LiquidCrystal lcd(12,11,10,9,8,7,6,5,4,3,2);   //8数据口模式连线声明
LiquidCrystal lcd(13,12,7,6,5,4,3); //4数据口模式连线声明 P13--LCD 4脚  P12--LCD 5脚  
              //P7--LCD 6脚   P6--LCD 11脚  P5--LCD 12脚  P4--LCD 13脚  P3--LCD 14脚  

int Echo = A1;  // Echo回声脚(P2.0)
int Trig =A0;  //  Trig 触发脚(P2.1)

int Front_Distance = 0;//
int Left_Distance = 0;
int Right_Distance = 0;

int Left_motor_go=8;     //左电机前进(IN1)
int Left_motor_back=9;     //左电机后退(IN2)

int Right_motor_go=10;    // 右电机前进(IN3)
int Right_motor_back=11;    // 右电机后退(IN4)

int key=A2;//定义按键 A2 接口
int beep=A3;//定义蜂鸣器 A3 接口

//const int SensorRight = 3;       //右循迹红外传感器(P3.2 OUT1)
//const int SensorLeft = 4;         //左循迹红外传感器(P3.3 OUT2)

//const int SensorRight_2 = 6;       //右红外传感器(P3.5 OUT4)
//const int SensorLeft_2 = 5;     //左红外传感器(P3.4 OUT3)

//int SL;    //左循迹红外传感器状态
//int SR;    //右循迹红外传感器状态
//int SL_2;    //左红外传感器状态
//int SR_2;    //右红外传感器状态

int servopin=2;//设置舵机驱动脚到数字口2
int myangle;//定义角度变量
int pulsewidth;//定义脉宽变量
int val;

void setup()
{
  Serial.begin(9600);     // 初始化串口
  //初始化电机驱动IO为输出方式
  pinMode(Left_motor_go,OUTPUT); // PIN 8 (PWM)
  pinMode(Left_motor_back,OUTPUT); // PIN 9 (PWM)
  pinMode(Right_motor_go,OUTPUT);// PIN 10 (PWM) 
  pinMode(Right_motor_back,OUTPUT);// PIN 11 (PWM)
  pinMode(key,INPUT);//定义按键接口为输入接口
  pinMode(beep,OUTPUT);
  // pinMode(SensorRight, INPUT); //定义右循迹红外传感器为输入
  // pinMode(SensorLeft, INPUT); //定义左循迹红外传感器为输入
  //pinMode(SensorRight_2, INPUT); //定义右红外传感器为输入
  //pinMode(SensorLeft_2, INPUT); //定义左红外传感器为输入
  //初始化超声波引脚
  pinMode(Echo, INPUT);    // 定义超声波输入脚
  pinMode(Trig, OUTPUT);   // 定义超声波输出脚
  lcd.begin(16,2);      //初始化1602液晶工作                       模式
  //定义1602液晶显示范围为2行16列字符  
  pinMode(servopin,OUTPUT);//设定舵机接口为输出接口
}
//=======================智能小车的基本动作=========================
//void run(int time)     // 前进
void run()     // 前进
{
  digitalWrite(Right_motor_go,HIGH);  // 右电机前进
  digitalWrite(Right_motor_back,LOW);     
  analogWrite(Right_motor_go,165);//PWM比例0~255调速,左右轮差异略增减
  analogWrite(Right_motor_back,0);
  digitalWrite(Left_motor_go,LOW);  // 左电机前进
  digitalWrite(Left_motor_back,HIGH);
  analogWrite(Left_motor_go,0);//PWM比例0~255调速,左右轮差异略增减
  analogWrite(Left_motor_back,160);
  //delay(time * 100);   //执行时间,可以调整  
}

void brake(int time)  //刹车,停车
{
  digitalWrite(Right_motor_go,LOW);
  digitalWrite(Right_motor_back,LOW);
  digitalWrite(Left_motor_go,LOW);
  digitalWrite(Left_motor_back,LOW);
  delay(time * 100);//执行时间,可以调整  
}

void left(int time)         //左转(左轮不动,右轮前进)
//void left()         //左转(左轮不动,右轮前进)
{
  digitalWrite(Right_motor_go,HIGH);    // 右电机前进
  digitalWrite(Right_motor_back,LOW);
  analogWrite(Right_motor_go,180); 
  analogWrite(Right_motor_back,0);//PWM比例0~255调速
  digitalWrite(Left_motor_go,LOW);   //左轮后退
  digitalWrite(Left_motor_back,LOW);
  analogWrite(Left_motor_go,0); 
  analogWrite(Left_motor_back,0);//PWM比例0~255调速
  delay(time * 100);    //执行时间,可以调整  
}

void spin_left(int time)         //左转(左轮后退,右轮前进)
{
  digitalWrite(Right_motor_go,HIGH);    // 右电机前进
  digitalWrite(Right_motor_back,LOW);
  analogWrite(Right_motor_go,200); 
  analogWrite(Right_motor_back,0);//PWM比例0~255调速
  digitalWrite(Left_motor_go,HIGH);   //左轮后退
  digitalWrite(Left_motor_back,LOW);
  analogWrite(Left_motor_go,200); 
  analogWrite(Left_motor_back,0);//PWM比例0~255调速
  delay(time * 100);    //执行时间,可以调整   
}

void right(int time)
//void right()        //右转(右轮不动,左轮前进)
{
  digitalWrite(Right_motor_go,LOW);   //右电机后退
  digitalWrite(Right_motor_back,LOW);
  analogWrite(Right_motor_go,0); 
  analogWrite(Right_motor_back,0);//PWM比例0~255调速
  digitalWrite(Left_motor_go,LOW);//左电机前进
  digitalWrite(Left_motor_back,HIGH);
  analogWrite(Left_motor_go,0); 
  analogWrite(Left_motor_back,200);//PWM比例0~255调速
  delay(time * 100);    //执行时间,可以调整  
}

void spin_right(int time)        //右转(右轮后退,左轮前进)
{
   digitalWrite(Right_motor_go,LOW);   //右电机后退
  digitalWrite(Right_motor_back,HIGH);
  analogWrite(Right_motor_go,0); 
  analogWrite(Right_motor_back,150);//PWM比例0~255调速
  digitalWrite(Left_motor_go,LOW);//左电机前进
  digitalWrite(Left_motor_back,HIGH);
  analogWrite(Left_motor_go,0); 
  analogWrite(Left_motor_back,150);//PWM比例0~255调速
  delay(time * 100);    //执行时间,可以调整   
}

void back(int time)          //后退
{
   digitalWrite(Right_motor_go,LOW);  //右轮后退
  digitalWrite(Right_motor_back,HIGH);
  analogWrite(Right_motor_go,0);
  analogWrite(Right_motor_back,150);//PWM比例0~255调速
  digitalWrite(Left_motor_go,HIGH);  //左轮后退
  digitalWrite(Left_motor_back,LOW);
  analogWrite(Left_motor_go,150);
  analogWrite(Left_motor_back,0);//PWM比例0~255调速
  delay(time * 100);     //执行时间,可以调整  
}
//==========================================================

void keysacn()//按键扫描
{
  int val;
  val=digitalRead(key);//读取数字7 口电平值赋给val
  while(!digitalRead(key))//当按键没被按下时,一直循环
  {
    val=digitalRead(key);//此句可省略,可让循环跑空
  }
  while(digitalRead(key))//当按键被按下时
  {
    delay(10);    //延时10ms
    val=digitalRead(key);//读取数字7 口电平值赋给val
    if(val==HIGH)  //第二次判断按键是否被按下
    {
      digitalWrite(beep,HIGH);        //蜂鸣器响
      while(!digitalRead(key))    //判断按键是否被松开
        digitalWrite(beep,LOW);        //蜂鸣器停止
    }
    else
      digitalWrite(beep,LOW);          //蜂鸣器停止
  }
}

float Distance_test()   // 量出前方距离 
{
  digitalWrite(Trig, LOW);   // 给触发脚低电平2μs
  delayMicroseconds(2);
  digitalWrite(Trig, HIGH);  // 给触发脚高电平10μs,这里至少是10μs
  delayMicroseconds(10);
  digitalWrite(Trig, LOW);    // 持续给触发脚低电
  float Fdistance = pulseIn(Echo, HIGH);  // 读取高电平时间(单位:微秒)
  Fdistance= Fdistance/58;       //为什么除以58等于厘米,  Y米=(X秒*344)/2
  // X秒=( 2*Y米)/344 ==》X秒=0.0058*Y米 ==》厘米=微秒/58
  //Serial.print("Distance:");      //输出距离(单位:厘米)
  //Serial.println(Fdistance);         //显示距离
  //Distance = Fdistance;
  return Fdistance;
}  

void Distance_display(int Distance)//显示距离
{
  if((2 Right_Distance)//左边比右边空旷
      {      
        left(3);//左转
        brake(1);//刹车,稳定方向
      }
      else//右边比左边空旷
      {
        right(3);//右转
        brake(1);//刹车,稳定方向
      }
    }
    else
    {
      run(); //无障碍物,直行     
    }
  } 
}

3. 原理图

思考三个问题:1. 要学哪些知识可以看懂这种图? 2. 要学哪些知识会设计这种图? 3. 要学哪些软件会画这种图?

转接控制板原理图

小车底板原理图

Arduino UNO R3原理图


文章作者: Lee
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Lee !
评论
  目录