1.0版本可以看前面的文章 https://makelog.dfrobot.com.cn/article-308410.html
以为以前买了UNO,所以就没有重新买板子;
散件大概是这个样子:
步骤1 组装
毕竟不是专门为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~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针脚,这几个不要接其他东西。
步骤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 最终效果
步骤5 动起来看看
评论