不知不觉,制作单片机项目已经有三年了。从开始的拖拉模块,点亮LED灯,到现在完整的物联网交互项目。增长的是单片机相关的理论知识和项目经验,不变的是对单片机的热爱。很多开发单片机的人,在学习途中都有过迷茫。不知道到底该继续干单片机,还是去选择IT行业,挣快钱。但随着开发单片机的时间增长,发现我们的思维模式,已经和单片机思维紧密相关。开发单片机不仅仅是一种谋生手段,更是我们的爱好。项目调试bug的烦闷,运行成功的喜悦,都不足为外人道也。
在这里我分享一下我的第一个单片机项目,既回忆往昔,又展望未来。
项目功能
我的第一个单片机项目是一款探测距离机器人模型,它可以通过超声波测距控制舵机转向,LED灯,语音播放,蜂鸣器。(大家看起来是不是很复杂,怎么可能是第一个项目,哈哈!因为用的是米思齐mixly和arduino)项目实现
一、 初始化设置
在初始化这里要先设置波特率。并且把初始超声波测距的初值赋值为0.
之后主要是设置蜂鸣器里面播放的音乐,我设置的是胡夏的“那些年”,有兴趣可以搜个乐谱自己打上去。tonelist为频率,几乎都是一样的,读者可以直接把我的输入在自己的上面。而musiclist为音符,就是我们熟悉的“do re mi fa so la si".而highlist为音高,想了解的可以自己搜一下。最后的rhythmlist为节拍,先看是以几分音符为一拍,比如一个音乐为四分之四拍,每个对应为1拍。(我们知道,音符节奏分为一拍、半拍、1/4拍、1/8拍,我们规定一拍音符的时间为1;半拍为0.5;1/4拍为0.25;1/8拍为0.125……,)几个特殊音符说明如下:
第一,普通音符。如第一个音符3,对应频率350,占1拍。
第二,带下划线音符,表示0.5拍;两个下划线是四分之一拍(0.25)。
第三,有的音符后带一个点,表示多加0.5拍,即1+0.5。
第四,有的音符后带一个“—”,表示多加1拍,即1+1。
读者可以自己搜乐谱来绘制自己的蜂鸣器音乐。
二、设置自己的音乐播放
根据自己想让你的执行蜂鸣器的时候播放到音乐的什么位置而停来设置i从1到某数。
三、主功能控制
我们需要先设置好每一个模块的管脚,注意数字输出和模拟输出的区别,在此程序区别不大,就不加赘述了。然后把它们之间的对应关系整理好,让他们能正常的执行你想要的功能。
在这里我分别把3个LED灯接在面包板上并对应管脚A2,2,12的正极接在S,负极接在G。
把语音模块接在A5上,其中P-L接在S,正极接V,负极接G。
把蜂鸣器和舵机分别用上面接在管脚8的播放程序procedure和管脚4控制。
然后把这些接在arduino板子上。
四,硬件连接
把各个模块按照程序里的管脚连接上去,并且把语音模块的语音录好如果觉得声音较小还可以接一个功放模块,超声波和舵机通过支架接好,LED灯必须接电阻,否则会烧坏。
五、运行上传并执行
看官可以根据自己的喜好设计个外形,把这些模块封装起来。
六、arduino代码
编程能力好的也可以在arduino里用代码写,具体如下:
#include <Servo.h>volatile int juli; volatile float speed; volatile long updown; float tonelist[]={1046.5,1174.7,1318.5,1396.9,1568,1760,1975.5}; long musiclist[]={0,1,1,2,3,3,3,4,3,3,0,3,2,1,2,2,2,4,3,3,0,2,1,7,1,1,7,1,7,6,5,5,5}; long highlist[]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,-1,0,-1,-1,-1,-1,-1}; long rhythmlist[]={8,8,8,8,4,4,4,8,8,2,8,8,8,8,4,4,4,8,8,2,4,4,4,8,8,4,8,4,4,4,8,8,2}; void procedure() { for (int i = 1; i <= 30; i = i + (1)) { tone(8,tonelist[(int)(musiclist[(int)(i - 1)] - 1)] * pow(2, highlist[(int)(i - 1)])); delay((2000 / rhythmlist[(int)(i - 1)])); noTone(8); delay(10); } } float checkdistance_A1_A0() { digitalWrite(A1, LOW); delayMicroseconds(2); digitalWrite(A1, HIGH); delayMicroseconds(10); digitalWrite(A1, LOW); float distance = pulseIn(A0, HIGH) / 58.00; delay(10); return distance; } Servo servo_4; void setup(){ Serial.begin(9600); juli = 0; speed = 120.0; updown = 0; pinMode(8, OUTPUT); pinMode(A1, OUTPUT); pinMode(A0, INPUT); pinMode(12, OUTPUT); servo_4.attach(4); pinMode(2, OUTPUT); } void loop(){ juli = checkdistance_A1_A0(); Serial.println(String(juli).toInt()); if (juli < 10) { pinMode(A2, OUTPUT); digitalWrite(A2,HIGH); pinMode(A5, OUTPUT); digitalWrite(A5,HIGH); digitalWrite(12,LOW); servo_4.write(90); delay(1000); } else if (juli < 30) { digitalWrite(2,HIGH); digitalWrite(12,LOW); procedure(); } else { digitalWrite(12,HIGH); servo_4.write(180); delay(1000); } pinMode(A5, OUTPUT); digitalWrite(A5,LOW); pinMode(A2, OUTPUT); digitalWrite(A2,LOW); digitalWrite(2,LOW); delay(1000); }
复制代码大家感兴趣的话,也可以动手试试,还是非常简单好玩的
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
相关活动:【单片机忆往昔】你做的第一个单片机项目是什么?做过最牛的项目又是什么?(500元京东卡福利)