国庆转眼到了,真是令人热血沸腾啊,尤其是花车游行,那叫一个热闹!但奈何没钱买票去看,但正好家里有一个新买的小车底盘,所以我们就在家里做一个小的玩玩吧。
如图,右边是新的底盘,左边是为创客事业先走一步的亚克力底盘
材料清单
- Arduino UNO X1 链接
- L298N电机驱动板 X1 链接
- 四路灰度传感器(由于找不到自己这款,于是找了个相近的) X1 链接
- 智能小车底盘 X1 链接
- 11.1V锂电池 X1 链接
- SM插头(就是玩具用的锂电池的插头) X1 链接
- Arduino保护壳 X1 链接
- 螺柱若干(不懂型号就看着我的图片买吧) X1 链接
- 螺丝若干(不懂型号就看着我的图片买吧) X1 链接
- 杜邦线(公对母) X2 链接
- LM2596稳压模块 X1 链接
- “中国心”运动会入场道具 X1 链接
- Speech Synthesis Shiled中英文语音合成扩展板(名字真长) X1 链接
- LED灯板 X1 链接
- 喇叭 X2 链接
- 假花 X1 链接
剩下就是一些工具(电烙铁、焊锡丝、螺丝刀、热熔胶枪......)我想几乎家家必备。
PS:假花我是在学校里捡的,找不到网上的链接;我用的LED灯板貌似绝版了,在哪都找不到......
步骤1 小车部分
小车到手后把电机拿出来,焊好电机线。
焊线的小窍门:把附赠的TT马达电机有铜片的那一面朝上,左边焊红线,右边焊黑线,会更方便。
按照参考步骤安装好小车,把电机线从方孔内穿过,拉到正面,并将左右两边的电机线分别拧到一起。
前方灵魂画手出没:
就是这个样子~
步骤2 巡线小车部分
把传感器、Arduino板、L298N、巡线传感器等电路部件安装在车上用杜邦线连接起来。、
为了减少Arduino板的发热量,我连了一个LM2596稳压模块,将11.1V转成5V在给Arduino供电。
至于位置......就随便一点好了,反正要用外壳罩起来的嘛~
至于接线......现在还是简单的巡线小车,等都安好了再放电路图吧
步骤3 安装功能模块
把Speech Synthesi......名字太长了就叫语音合成板好了。
先把杜邦线拔下来,把语音合成板插到UNO板上,再把杜邦线插到语音合成板上。
从左往右分别是Arduino UNO、语音合成板和一堆杜邦线。
电路图奉上~(小声bb:这可能是全网最粗糙的电路图)
步骤4 设计外观
因为我们开了运动会,发了这个中国心(当然其他人得花钱买),所以外观就非常简单:给车盖上一个红心,在车后面粘上一朵假花。
PS:红心上一道白的是没清理干净的热熔胶丝,无伤大雅。
步骤5 一些小问题
我这里遇到几个问题,拿出来给大家分享一下。
1、地线不够用了,我相(sang)当(xin)机(bing)智(kuang)的剥了一根面包线的一端,然后绕在其中一个接在GND上的杜邦线针上......
2、LED灯板亮度不够用透过红心,所以我把LED灯板挪到了红心的上方。
3、群里大佬都在用MP3耶,好像买一个!但是......
如果不用呢?又感觉单调了点......
所以,我想到了一个折中方案:我从玩具飞碟上拆了一个喇叭..(用喇叭是因为没有蜂鸣器了),用音符输出来代替MP3音乐。
步骤6 设计地图
很粗暴的办法,把地板擦干净,在地上贴。
步骤7 编写程序
这个我弄了好久,再网上查了很多资料,写了一长串的逻辑判断,最后写了一个非常简单的判断居然过了......
注意:一定要把传感器的灵敏度调好,不然要么就像下定决心不拿到钱绝不走的债主那样赖着不走要么在原地像磕了XX丸一样来回转......
解释都在注释里。
很长!
#include <SpeechSynthesis.h> //语音合成头文件
#define Read_A0
byte sr[200];
byte a[] = {0xD7, 0xBC, 0xB1, 0xB8, 0xBE, 0xCD, 0xD0, 0xF7, 0xA3, 0xAC, 0xBF, 0xAA, 0xCA, 0xBC, 0xD5, 0xB9, 0xCA, 0xBE}; //汉字内容(GB2312)
byte b[] = {0xB5, 0xDA, 0xD2, 0xBB, 0xCF, 0xEE, 0xA3, 0xBA, 0xD1, 0xA4, 0xC0, 0xF6, 0xB2, 0xCA, 0xB5, 0xC6};//汉字内容(GB2312)
byte c[] = {0xB5, 0xDA, 0xB6, 0xFE, 0xCF, 0xEE, 0xA3, 0xBA, 0xB8, 0xE8, 0xB3, 0xAA, 0xD7, 0xE6, 0xB9, 0xFA, 0xD2, 0xF4, 0xC0, 0xD6, 0xA1, 0xA3};//汉字内容(GB2312)
byte d[] = {0xC8, 0xAB, 0xB2, 0xBF, 0xB1, 0xED, 0xD1, 0xDD, 0xBD, 0xE1, 0xCA, 0xF8, 0xA3, 0xAC, 0xB8, 0xD0, 0xD0, 0xBB, 0xB9, 0xDB, 0xBF, 0xB4, 0xA1, 0xA3};//汉字内容(GB2312)
void speak1()
{
SpeechSynthesis.buf_init(sr);//清空或者初始化缓存
SpeechSynthesis.Chinese_english(sr, a, sizeof(a), 6, 0);
SpeechSynthesis.Speaking(0, 16, 7, sr);
while (Serial.read() != 0x41)
{}
while (Serial.read() != 0x4F)
{}
}
void speak2()
{
SpeechSynthesis.buf_init(sr);//清空或者初始化缓存
SpeechSynthesis.Chinese_english(sr, b, sizeof(b), 6, 0);
SpeechSynthesis.Speaking(0, 16, 7, sr);
while (Serial.read() != 0x41)
{}
while (Serial.read() != 0x4F)
{}
}
void speak3()
{
SpeechSynthesis.buf_init(sr);//清空或者初始化缓存
SpeechSynthesis.Chinese_english(sr, c, sizeof(c), 6, 0);
SpeechSynthesis.Speaking(0, 16, 7, sr);
while (Serial.read() != 0x41)
{}
while (Serial.read() != 0x4F)
{}
}
void speak4()
{
SpeechSynthesis.buf_init(sr);//清空或者初始化缓存
SpeechSynthesis.Chinese_english(sr, d, sizeof(d), 6, 0);
SpeechSynthesis.Speaking(0, 16, 7, sr);
while (Serial.read() != 0x41)
{}
while (Serial.read() != 0x4F)
{}
}
void dftone(int tonePin, int frequency, int duration) {
if (frequency == 0) {
digitalWrite(tonePin, LOW);
return;
}
int period = 1000000.0 / frequency;
int pulse = period / 2.0;
pinMode(tonePin, OUTPUT);
for (int i = 1; i <= ((duration * 1000.0) / period); i++ ) {
digitalWrite(tonePin, HIGH);
delayMicroseconds(pulse);
digitalWrite(tonePin, LOW);
delayMicroseconds(pulse);
}
}
void setup()
{
Serial.begin(9600);
pinMode(2, OUTPUT);
pinMode(3, OUTPUT);
pinMode(4, OUTPUT);
pinMode(5, OUTPUT);
pinMode(8, OUTPUT);
pinMode(9, OUTPUT);
pinMode(10, OUTPUT);
pinMode(6, OUTPUT);
delay(100);
}
void LED()//控制LED灯板闪烁
{
for (int i = 0; i < 10; i++)
{
digitalWrite(8, HIGH);
delay(100);
digitalWrite(9, HIGH);
delay(100);
digitalWrite(9, LOW);
delay(100);
digitalWrite(8, LOW);
delay(100);
digitalWrite(10, HIGH);
delay(100);
digitalWrite(10, LOW);
delay(100);
}
for (int i = 0; i < 10; i++)
{
digitalWrite(9, HIGH);
delay(100);
digitalWrite(9, LOW);
delay(100);
digitalWrite(10, LOW);
delay(100);
digitalWrite(8, LOW);
delay(100);
digitalWrite(8, HIGH);
delay(100);
digitalWrite(10, HIGH);
delay(100);
}
for (int i = 0; i < 10; i++)
{
digitalWrite(8, HIGH);
delay(100);
digitalWrite(9, HIGH);
delay(100);
digitalWrite(8, LOW);
delay(100);
digitalWrite(10, HIGH);
delay(100);
digitalWrite(9, LOW);
delay(100);
digitalWrite(10, LOW);
delay(100);
}
}
void music() //歌唱祖国节选片段
{
for (int count1 = 0; count1 < 2; count1++)
{
for (int count = 0; count < 2; count++)
{
dftone(6, 523, 125);
}
dftone(6, 523, 1000);
}
for (int count = 0; count < 2; count++) {
dftone(6, 523, 125);
}
dftone(6, 523, 250);
dftone(6, 466, 250);
dftone(6, 440, 250);
dftone(6, 392, 250);
dftone(6, 349, 500);
dftone(6, 262, 375);
dftone(6, 262, 125);
dftone(6, 349, 500);
dftone(6, 262, 500);
dftone(6, 440, 500);
dftone(6, 349, 500);
dftone(6, 523, 750);
dftone(6, 587, 250);
dftone(6, 523, 500);
dftone(6, 523, 375);
dftone(6, 523, 125);
dftone(6, 698, 500);
dftone(6, 698, 500);
dftone(6, 587, 375);
dftone(6, 523, 125);
dftone(6, 466, 250);
dftone(6, 587, 250);
dftone(6, 523, 1500);
dftone(6, 523, 500);
dftone(6, 523, 125);
dftone(6, 587, 500);
dftone(6, 587, 500);
dftone(6, 392, 500);
dftone(6, 392, 375);
dftone(6, 392, 125);
dftone(6, 523, 750);
dftone(6, 466, 250);
dftone(6, 440, 500);
dftone(6, 262, 375);
dftone(6, 262, 125);
dftone(6, 523, 500);
dftone(6, 523, 250);
dftone(6, 587, 250);
dftone(6, 523, 250);
dftone(6, 466, 250);
dftone(6, 440, 250);
dftone(6, 392, 250);
dftone(6, 349, 750);
}
void loop()
{
//我没有用中断,而是用了一种很沙雕的办法,把循环执行变成了顺序执行
//当然,把这些代码塞进setup()里也是一样的效果
speak1();
while (not(((analogRead(A0) > 100) && (analogRead(A1) > 100)) && ((analogRead(A4) > 100) && (analogRead(A5) > 100)))) //巡线
{
if (analogRead(A4) < 100 && analogRead(A5) < 100)
{
digitalWrite(2, HIGH);
digitalWrite(3, LOW);
digitalWrite(4, LOW);
digitalWrite(5, HIGH);
}
else if (analogRead(A0) < 100 && analogRead(A1) < 100)
{
digitalWrite(2, LOW);
digitalWrite(3, HIGH);
digitalWrite(4, HIGH);
digitalWrite(5, LOW);
}
else
{
digitalWrite(2, LOW);
digitalWrite(3, HIGH);
digitalWrite(4, LOW);
digitalWrite(5, HIGH);
}
delay(10);
}
//停车
digitalWrite(2, LOW);
digitalWrite(3, LOW);
digitalWrite(4, LOW);
digitalWrite(5, LOW);
//LED闪烁
speak2();
LED();
while (not(((analogRead(A0) > 100) && (analogRead(A1) > 100)) && ((analogRead(A4) > 100) && (analogRead(A5) > 100)))) //巡线
{
if (analogRead(A4) < 100 && analogRead(A5) < 100)
{
digitalWrite(2, HIGH);
digitalWrite(3, LOW);
digitalWrite(4, LOW);
digitalWrite(5, HIGH);
}
else if (analogRead(A0) < 100 && analogRead(A1) < 100)
{
digitalWrite(2, LOW);
digitalWrite(3, HIGH);
digitalWrite(4, HIGH);
digitalWrite(5, LOW);
}
else
{
digitalWrite(2, LOW);
digitalWrite(3, HIGH);
digitalWrite(4, LOW);
digitalWrite(5, HIGH);
}
delay(10);
}
//停车
digitalWrite(2, LOW);
digitalWrite(3, LOW);
digitalWrite(4, LOW);
digitalWrite(5, LOW);
//音乐
speak3();
music();
while (not(((analogRead(A0) > 100) && (analogRead(A1) > 100)) && ((analogRead(A4) > 100) && (analogRead(A5) > 100)))) //巡线
{
if (analogRead(A4) < 100 && analogRead(A5) < 100)
{
digitalWrite(2, HIGH);
digitalWrite(3, LOW);
digitalWrite(4, LOW);
digitalWrite(5, HIGH);
}
else if (analogRead(A0) < 100 && analogRead(A1) < 100)
{
digitalWrite(2, LOW);
digitalWrite(3, HIGH);
digitalWrite(4, HIGH);
digitalWrite(5, LOW);
}
else
{
digitalWrite(2, LOW);
digitalWrite(3, HIGH);
digitalWrite(4, LOW);
digitalWrite(5, HIGH);
}
delay(10);
}
//停车
digitalWrite(2, LOW);
digitalWrite(3, LOW);
digitalWrite(4, LOW);
digitalWrite(5, LOW);
//结束
speak4();
while (1) {}
}
视频就先不放了,因为懒得弄账号-_-
那就放几张靓照吧~
豆腐渣布线-_-
从开始制作开始到完工总耗时一个月,其中好几天忙着上学,趁着放假赶工,累死我了,视频在附件里,自己看去
附件
评论