封面

Arduino小车-001

最近玩儿板子已经差不多了,终于可以捣鼓梦寐以求的小车了,说干就干

▷材料清单:

部件链接
DFRduino UNO R3https://www.dfrobot.com.cn/goods-521.html
L298P Motor Shield 电机驱动 (Arduino兼容)https://www.dfrobot.com.cn/goods-203.html
MiniQ 桌面机器人底盘https://www.dfrobot.com.cn/goods-468.html
MiniQ小车传感器安装板https://www.dfrobot.com.cn/goods-984.html

以为以前买了UNO,所以就没有重新买板子;

散件大概是这个样子

包含两个电机,两个轮子,两个万向轮,还有一些配件;

▷组装:

毕竟不是专门为UNO设计的底盘,找安装的螺丝孔破费了一番功夫;

同时,UNO需要搭配额外的电机控制器,最后我在电机控制器上又叠了一个IO扩展,成千层饼的样子;

不想麻烦的同学可以购买自带电机控制器的三合一主控:

Romeo 三合一Arduino兼容控制器

https://www.dfrobot.com.cn/goods-54.html

装好之后是这个样子

接下来介绍一下这个L298P Motor Shield 电机驱动

这个控制器有两个电机供电口M1、M2,对于小小的两轮车正好够用;

技术规格如下:

  • 逻辑部分输入电压VD:5V
  • 驱动部分输入电压VS:VIN输入6.5~12V,PWRIN输入4.8~35V
  • 逻辑部分工作电流Iss:<36mA
  • 驱动部分工作电流Io:<2A
  • 最大耗散功率:25W(T=75℃)
  • 控制信号输入电平:高电平2.3V<Vin<5V  ,低电平-0.3V<Vin<1.5V
  • 驱动管脚:D4, D5, D6, D7
  • 工作温度:-25+130℃
  • 硬件接口:5.0mm间距接线柱
  • 带2.54排针接口,并可以通过杜邦线接入控制信号
  • 驱动形式:双路大功率H桥驱动
  • 引脚占用:D4~D7直接驱动电机
  • 支持PWM/PLL模式电机速度控制
  • 尺寸:55x55mm

详情可以看下官方Wiki:

http://wiki.dfrobot.com.cn/index.php/(SKU:DRI0009)L298P_Shield_2A%E5%A4%A7%E7%94%B5%E6%B5%81%E5%8F%8C%E8%B7%AF%E7%9B%B4%E6%B5%81%E7%94%B5%E6%9C%BA%E9%A9%B1%E5%8A%A8%E6%89%A9%E5%B1%95%E6%9D%BF

在电机能动的基础上增加了大按钮、蜂鸣器、还有一个LED显示随机数:


▷程序部分:

int latchPin = 8;  //数字口8连接到74HC595芯片的使能引脚
int clockPin = 11;  //数字口3连接到74HC595芯片的时钟引脚
int dataPin = 9;   //数字口9连接到74HC595芯片的数据引脚
int buttonPin = 2; // 按钮连接到数字口2

int buttonState;                 // buttonState记录按键状态
int lastButtonState = LOW;     // lastbuttonState记录按键前一个状态
long lastDebounceTime = 0;
long debounceDelay = 50;        //去除抖动时间
bool changekey = true ;        //暂停与继续

//代表数字0~9
byte Tab[]={
0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
int number;
long randNumber;

float sinVal;            
int toneVal;  
int buzzerPin = 3 ;

//电机引脚

int E1 = 5;     //M1 Speed Control
int E2 = 6;     //M2 Speed Control
int M1 = 4;     //M1 Direction Control
int M2 = 7;     //M1 Direction Control

//电机函数
void stop(void)                    //Stop
{
  digitalWrite(E1,0); 
  digitalWrite(M1,LOW);    
  digitalWrite(E2,0);   
  digitalWrite(M2,LOW);    
}   

void turn_L (char a,char b)             //Turn Left
{
  analogWrite (E1,a);
  digitalWrite(M1,HIGH);    
  analogWrite (E2,b);    
  digitalWrite(M2,HIGH);
}
void turn_R (char a,char b)             //Turn Right
{
  analogWrite (E1,a);
  digitalWrite(M1,LOW);    
  analogWrite (E2,b);    
  digitalWrite(M2,LOW);
}



void setup() {
  pinMode(latchPin, OUTPUT);
  pinMode(dataPin, OUTPUT);  
  pinMode(clockPin, OUTPUT);
  randomSeed(analogRead(0));   //设置一个随机数产生源模拟口0
  pinMode(buzzerPin, OUTPUT);  // 蜂鸣器引脚设置
  Serial.begin(9600);        //设置波特率为9600 bps

  pinMode(E1, OUTPUT);
  pinMode(E2, OUTPUT);  
  pinMode(M1, OUTPUT);
  pinMode(M2, OUTPUT);

  digitalWrite(E1,LOW);   
  digitalWrite(E2,LOW);
  
}
void loop(){
int reading = digitalRead(buttonPin);//reading用来存储buttonPin的数据

if (changekey == true) {
  
  randNumber = random(10);   //产生0~9之间的随机数
  showNumber(randNumber);    //显示该随机数   
   
    if (reading != lastButtonState) {
      lastDebounceTime= millis();      // 一旦检测到数据发生变化,记录当前时间
  }
  
// 等待50ms,再进行一次判断,是否和当前button状态相同
// 如果和当前状态不相同,改变button状态
// 同时,如果button状态为高(也就是被按下),那么就改变led的状态
  if ((millis() - lastDebounceTime) >debounceDelay) {
    if (reading != buttonState) {
      buttonState = reading;
     if(buttonState == HIGH){  
      
      changekey = !changekey ;

//声调1                
            toneVal = 661 ;   
            tone(buzzerPin, toneVal);//给蜂鸣器引脚一个声音
            delay(200);
            toneVal = 742 ;  
            tone(buzzerPin, toneVal);
            delay(50);
            toneVal = 1665 ;   
            tone(buzzerPin, toneVal);//给蜂鸣器引脚一个声音
            delay(100);
            
      noTone(buzzerPin); //关闭蜂鸣器
      delay(300);
      
   //电机旋转
   turn_L(80,80);delay(3000);
   turn_R(80,80);delay(3000);
   stop();
            //声调1                
            toneVal = 661 ;   
            tone(buzzerPin, toneVal);//给蜂鸣器引脚一个声音
            delay(200);
            toneVal = 742 ;  
            tone(buzzerPin, toneVal);
            delay(50);
            toneVal = 1665 ;   
            tone(buzzerPin, toneVal);//给蜂鸣器引脚一个声音
            delay(100);
            
      noTone(buzzerPin); //关闭蜂鸣器
      
    }
    }
  }
  lastButtonState = reading;
}

else{
  
     showNumber(randNumber);    //显示该随机数 

    
   
   //判断按钮状态
    if (reading != lastButtonState) {
      lastDebounceTime= millis();      // 一旦检测到数据发生变化,记录当前时间
  }

  if ((millis() - lastDebounceTime) >debounceDelay) {
    if (reading != buttonState) {
      buttonState = reading;
     if(buttonState == HIGH){  
      
      changekey = !changekey ;


            //声调2         
            toneVal = 1665 ;   
            tone(buzzerPin, toneVal);//给蜂鸣器引脚一个声音
            delay(100);
            toneVal = 742 ;  
            tone(buzzerPin, toneVal);
            delay(50);
            toneVal = 661 ;   
            tone(buzzerPin, toneVal);//给蜂鸣器引脚一个声音
            delay(200);
            
      noTone(buzzerPin); //关闭蜂鸣器
        }
     }
  }
  lastButtonState = reading;
  
  }
      
    
    }

//该函数用于数码管显示
void showNumber(int number){
     digitalWrite(latchPin, LOW);
     shiftOut(dataPin, clockPin, MSBFIRST,Tab[number]);
     digitalWrite(latchPin, HIGH);
     delay(80);
}

▷最终效果:

▷动起来看看:

标签:

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注