【Arduino】生日创意
本文不是教学文章,本人也正在学习中,目前状态半桶水
这几天,友人Fan²就要生日了,时间比较赶,一时间不知道送什么好,正好最近正在学习Arduino,就想着利用这个来做点生日创意为她庆生
简单来说,Arduino就是一个开源的平台,包括硬件和软件,很多东西你都可以自己DIY出来
我用的硬件是Arduino UNO,软件是Arduino IDE。想法是配合着生日歌,显示她的生日日期。嗯,听起来很简单,那我们就开始吧
Arduino UNO
Arduino IDE
零件
接下来就一个一个较为详细的研究了,不过也只讲和今天项目有关的内容,其他就算是基础也不讲,不然内容就太多了
首先就是这个最最最主角的Arduino UNO板子。其中USB插头是通过USB和电脑进行数据交换;而图中的数据交换区域是Arduino板子和所连接的硬件进行数据交换,有很多个端口(2~13);虽然USB插口可以通过电脑给板子供电,但是总是要随身带着电脑未免有点不方便,所以就有了电源插口,可以通过电池对板子供电;最后的电源区域是板子对硬件进行供电
Arduino UNO示意图
个人困惑???
按道理,电源端口和USB端口对板子进行供电的效果应该是一样的,但是不知道为什么本人实际操作的时候总是会出问题
然后就是面包板,这个是方便人们进行电路测试的一种零件。它的内部电路构造很简单,中间部分是横向连接(中间沟处不连通,如绿线);上下两边的线是纵向连通(如蓝线和红线,这个地方一般被用作零线和火线)
面包板
面包板示意图(来自百度)
蜂鸣器,就是它发声的地方,等会用它来播生日歌。Arduino编程有自己的音调预设[1]
蜂鸣器
高压升压模板(NCH8200HV),能将板子输出的电压升到170V,供辉光管使用[2]
NCH8200HV
K155ID1,一种集成电路,驱动辉光管用。可以单纯通过控制4个端口来达到控制10个端口的目的
K155ID1
TIPS
购买这些集成电路芯片的时候,请看清型号。我就有买错过的尴尬经历。请注意型号的最后一位是N还是D。N指的是DIP(Dual In-line Package,双列直插式封装),D指的是SOP(Small Out-Line Package,贴片封装)
这个两个都是74CH595,但大的是DIP,小的是SOP,当初就这个买错了
辉光管,在LED被发明前,被用来显示信息。密封的玻璃管里围了网状的金属阳极,还有被包在里面的数字状的阴极,管中充满了低压气体或蒸汽。当阳极金属网和某一个阴极之间被加上了适当的高压,该阴极周围气体就会发出橙黄色光芒,辉光管就是通过这种方式来显示数字的
我使用的是来自前苏联的IN-14(ИН-14)侧显辉光管[3],现已停产。它除了包含"0~9"的数字之外,左右两边还有小数点。更重要的是,里面充的是水银蒸气,相对来说不那么容易老化,同时发光的时候,橙光周围还有淡淡的蓝色光辉。而且它采用“非蒸散型消气剂”(顶部小圆片),阴极不易中毒,寿命也就更长了。下图右边的两个圈是管子的底座。管子的引脚比较乱,因为是拆机的。拆机的没法保证质量,毕竟已经这么久了,所以可能会有坏管的情况
辉光管IN-14(ИН-14)
ИН-14示意图
连接电路
打开Fritzing设计电路图进行设计
Fritzing
TIPS
学会变通。我现在的电路是经过好几次修改的了,如果出现了问题,就不要一意孤行地死磕,想办法解决。另外,我原本打算一边播歌一边放数字,但得引入SCoop.h才能多线程(一次性只能进行一项任务)。不过在我测试的时候,发现数字停止变动后再放音乐,效果也很赞,就修改了电路图,并把这个方案保留下来了
我原本打算用移位寄存器74HC595的,就不需要占用那么多的端口,可惜这两天都没有研究懂。另外,由于我手上很多零件这个软件没有,所以后期PS加上去了。图上紫色线指的就是辉光管的很多引脚要接K155ID1的很多引脚,画面太复杂了就这么简化了
随便瞎画的电路图
另外连接电路的时候,还要知道以下内容:
NCH8200HV有四个引脚,A是DC INPUT,连接Arduino板子的5V电源;B是170V的DC OUTPUT,连接辉光管的阳极;剩下两个都是GND(电线接地端),通过零线连接到Arduino的GND就行。可以参考下面的接法(D,,,D我好懒得去接啊)
NCH8200HV接法参考
另外,K155ID1的引脚示意图如下
K155ID1引脚示意图
集成电路芯片DIP一般都有一个U型凹槽来帮忙确认方向。上图中芯片内部的是引脚的序号,周围的是引脚的作用。VCC(Volt Current Condenser)是电路的供电电压,GND是接地端,这两个分别接火线和零线,注意K155ID1的启动电压是4.75V,最大能承受的电压是5.25V,一般供5V电压就行
K155ID1引脚的ABCD是输入端,数字是输出端,通过对输入端不同高低电流的组合供电,可以实现2^4共16种输出,但是我们只要其中的10种输出到输出端就行。比如ABCD全部输入低电流,那0就输出。它的真值表如下(注意,这里的ABCD是倒着过来写的)
K155ID1的真值表
这样一来,我们就要把K155ID1的ABCD连接到Arduino板子的数据交换区域(2~13),而输出端连接辉光管其中除了小数点之外(因为一般用不到)的10个阴极处
辉光管的话,从底部看,中间有一个小箭头,指的就是阳极的那个引脚,顺时针看下去,接下来就是左小数点,然后1~9,再是0,最后一个右小数点就又绕回阳极了
IN-14引脚示意图
Warning
连接辉光管必须连一个20K欧的电阻防止辉光管烧坏,而且记得,这些电阻都得连在支路上而不是干路上,也就是说每一个灯管都要连一个电阻。我之前懒,连在干路上,结果一个没有亮另一个忽闪忽闪地几个阴极一起亮了。做二极管实验的时候也要每一个二极管连一个电阻
然后就可以开始瞎眼的实际接线了,真实眼花
Warning
断路后才触碰电路,尤其这里面有170V的高压,注意用电安全
安装和拔出集成电路芯片的时候要小心,以免弄坏引脚
首先拿出公对母杜邦线(是的,也有母对母,公对公)把辉光管的引脚都安排上
公对母杜邦线
安排上了,但是引脚多余的长度舍不得剪QAQ
头秃眼花又欢乐的连线环节
TIPS
连完线,请务必再检查一下,保证不出错,不要烧了任何东西
编程
接下来就是紧张而刺激且枯燥还耗神的编程环节,让我们一起打开Arduino IDE,一起做秃头预备护理吧
一般了解一个语言,我都是先了解它的注释是怎么写的。注释指的是,程序不读取执行,单纯是写在程序里,给后面的程序员看的
在Arduino IDE里注释符是这么写的(蓝色部分)
//注释
或
/*
注释
*/
Warning
程序的每一句结尾都必须记得加上英语的分号" ; ",否则程序会报错
OK,没问题,开始编程吧
//根据K155ID1真值表定义一个10*4的矩阵//int 是有返回值的定义//{}里是一个整体int numbers[10][4] = {//D,C,B,A{0,0,0,0}, //0{0,0,0,1}, //1{0,0,1,0}, //2{0,0,1,1}, //3{0,1,0,0}, //4{0,1,0,1}, //5{0,1,1,0}, //6{0,1,1,1}, //7{1,0,0,0}, //8{1,0,0,1} //9};//定义每个辉光管A引脚和蜂鸣器阳极所连的端口,方便未来更改端口的时候,可以随时更改//定义位置参考上面最后连完的图int bulb1 = 2;int bulb2 = 6;int trumpet = 10;
//void是不返回值的定义//setup部分只运行一次void setup() {
//for是循环语句//格式是for (int x = 某个初始值; 在符合此处条件的情况下,for会一直循环; x++是每一次循环,x=x+1,x--则是x=x-1)for(int i=bulb1; i<(bulb1+4); i++){//定义i端口为输出//pinMode是定义端口的函数//格式是pinMode(端口号, INPUT/OUTPUT);注意大小写pinMode(i, OUTPUT);}
//上面是定义第一个辉光管所连接的端口,下面是第二个for(int i=bulb2; i<(bulb2+4); i++){pinMode(i, OUTPUT);}
//定义蜂鸣器阳极所连接的端口为输出端口pinMode(trumpet, OUTPUT);}//setup部分结束
//loop部分会一直循环//loop部分开始void loop() {
//让两个辉光管随意显示0-9任意数字十次for (int p=0; p<10; p++){//num是我们自己定义的函数,它的定义脚本在后面//random就是随机抽取后面括号范围内的整数//后面括号取下限不取上限,即0-9num(random(0,10),random(0,10));//每次循环延迟0.2秒//delay的单位是毫秒//一定要delay,否则一次循环太快了delay(200);}
//辉光管显示" 8 8 "这个数字,这个是友人的生日日期num(8,8);//延迟1秒,即让" 8 8 "显示1秒delay(1000);
//让辉光管从" 00 " 显示到" 19 ",暗示友人的成长过程for (int p=0; p<2; p++){for(int r=0; r<10; r++){num(p,r);delay(100);}}
//最终数字停在" 20 ",这是友人今年的生日num(2,0);delay(200);
//停0.2秒开始播放生日歌,停一小会是为了能让人反应过来,这是辉光管显示"20"的时候才开始播放的song(trumpet);
//等待3s,进入下一个循环delay(3000);}//loop部分结束
//定义刚刚说的,我们自己定义的函数num,这是让两个辉光管显示数字的函数void num(int x, int y){for(int j=bulb1; j<(bulb1+4); j++){//digitalWrite是对端口进行输出,这些端口必须先被定义为输出端口//格式是digitalWrite(端口号, 要输出的数据);digitalWrite(j, numbers[x][bulb1+3-j]);}
for(int k=bulb2; k<(bulb2+4); k++){digitalWrite(k, numbers[y][bulb2+3-k]);}}//函数num定义结束
//对刚刚song函数的定义//生日快乐歌void song(int s){//tone是让蜂鸣器发声的函数//格式为tone(端口号, 要发生音调的编号,具体定义请看附录[1]);tone(s,784);//G5delay(240);//注意,很多东西都是如果你没有去改变它的话,它就会一直保持上一个状态//比如这里的tone,并不是说你让它发声发240毫秒之后它就会停下来了。相反,它会一直响这个音调,直到你修改了这个端口的值,或者切断了电源。所以我们需要noTone的存在//digitalWrite也是如此,所以最后一个数字会在播放音乐的时候一直显示//noTone是让蜂鸣器停止发声的的函数//格式为noTone(端口号);noTone(s);delay(10);tone(s,784);//G5delay(250);tone(s,880);//A5delay(500);tone(s,784);//G5delay(500);//tone(s,1047);//C6delay(500);tone(s,988);//B5delay(1000);//tone(s,784);//G5delay(240);noTone(s);delay(10);tone(s,784);//G5delay(250);tone(s,880);//A5delay(500);tone(s,784);//G5delay(500);//tone(s,1175);//D6delay(500);tone(s,1047);//C6delay(1000);//tone(s,784);//G5delay(240);noTone(s);delay(10);tone(s,784);//G5delay(250);tone(s,1568);//G6delay(500);tone(s,1319);//E6delay(500);//tone(s,1047);//C6delay(500);tone(s,988);//B5delay(500);tone(s,880);//A5delay(500);//tone(s,1397);//F6delay(240);noTone(s);delay(10);tone(s,1397);//F6delay(250);tone(s,1319);//E6delay(500);tone(s,1047);//C6delay(500);//tone(s,1175);//D6delay(500);tone(s,1047);//C6delay(1000);//noTone(s);}//song函数定义结束
测试
编程完后,点击左上角的" √ ",编译一下,看看程序有没有出错
编译
将端口设定好
设定端口
然后按左上角的" → "就可以上传到Arduino UNO进行测试了
上传
最后测试一下,没问题就算完成了。再次提醒用电安全,高压警告
测试
原本打算完成后装饰一下,但是本直男实在是没有这个动手能力就放弃了。而且黑天暗地,也看不清装饰了啥,不是吗(懒癌的借口
生日祝福
To Fan²,
不知不觉又是一年,时间真的是太快了。希望你新的一岁能有更多见识;能各种事情随自己心愿;实验再难虽然偶尔磕磕碰碰但是最后还是能够顺利完成。
老实说,上次你们两人的变化真的惊到我了,各种见闻学识让我耳目一新,醍醐灌顶,是真的佩服你们!
最后,不管时间如何流逝,我们高中这些小伙伴永远是最好的朋友,一定!保持联系!!!
生日快乐!
郡邑
2019/8/8
偷懒,拿张去年的贺图,小丑花没有源文件实在是很难改(再次懒癌),哈哈哈
附录
[1]Arduino蜂鸣器预设网址
http://arduino.cc/en/Tutorial/Tone
[2]高压升压模板(NCH8200HV)
以下图片来自YanZeyuan's DIY Studio
[3]有关于辉光管的部分内容可以参考
http://www.nixieworld.com/2019/06/19/in14/
https://tubehobby.com/datasheets/in14.pdf
--end--
声明:本文章由网友投稿作为教育分享用途,如有侵权原作者可通过邮件及时和我们联系删除:freemanzk@qq.com