回到首页 返回首页
回到顶部 回到顶部
返回上一页 返回上一页

Arduino小车-今天吃什么解决机加强版 简单

头像 猪宅 2020.05.27 572 0

1.0版本可以看前面的文章 https://makelog.dfrobot.com.cn/article-308410.html

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


PS:欢迎访问我的博客:https://www.onecube.net/2020/05/26/arduino-car-zero/

材料清单

  • DFRduino UNO R3 X1 链接
  • L298P Motor Shield 电机驱动 (Arduino兼容) X1 链接
  • MiniQ 桌面机器人底盘 X1 链接
  • MiniQ小车传感器安装板 X1 链接
  • 配件 X1

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


散件大概是这个样子:

project-image
project-image

步骤1 组装

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

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

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

// Romeo 三合一Arduino兼容控制器 https://www.dfrobot.com.cn/goods-54.html

装好之后是这个样子:

project-image

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

project-image

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

技术规格如下:

● 逻辑部分输入电压VD:5V

● 驱动部分输入电压VS:VIN输入6.5~12V,PWRIN输入4.8~35V

● 逻辑部分工作电流Iss:<36mA

● 驱动部分工作电流Io:<2A

● 最大耗散功率:25W(T=75℃)

● 控制信号输入电平:高电平2.3V~5V ,低电平-0.3V~1.5V

● 驱动管脚:D4, D5, D6, D7

● 工作温度:-25+130℃

● 硬件接口:5.0mm间距接线柱

● 带2.54排针接口,并可以通过杜邦线接入控制信号

● 驱动形式:双路大功率H桥驱动

● 引脚占用:D4~D7直接驱动电机

● 支持PWM/PLL模式电机速度控制

● 尺寸:55x55mm

步骤2 魔改

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

注意:电机会占用D4、D5、D6、D7针脚,这几个不要接其他东西。

project-image

步骤3 注入灵魂

代码
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);
}

步骤4 最终效果

project-image

步骤5 动起来看看

评论

user-avatar