关于设计,生活和电子的二三事

Microcontrollers 零经验玩转微控制器

零经验玩转微控制器
以Duino Display为起点,开启微控制器编程之旅
作者:Roger Shipley,呼号KA9NAH
翻译:LifeWieller
本文已发表于《电子制作》2015年5月刊

最近我打算为我的卫星地面站升级电脑控制功能。这套地面站已经有30年历史。摆在我面前的有两种选择:一种是使用市面上常见的PIC微控制器自己编写程序(但是相关资料很少),另一种是购买Parallax Basic Stamp控制卡。对于一台使用电子管的地面站,新型集成电路控制器总是显得不那么协调。
就在我研究实现方法的时候,我偶然看到一本杂志介绍入门级机器人的文章,其中的机器人使用Arduino作为控制器。出于好奇,我到Arduino网站上查找资料。很快,我便发现对于像我这种以前没有自己写过微控制器程序的人来说,Arduino绝对是入门的最好选择。[www.arduino.cc]

Arduino介绍
相比其他的微控制器,Arduino有几个明显的优点。第一,Arduino网站不但提供了入门所需的所有资料,而且软硬件方面的问题都可以到论坛上寻求帮助。第二,相比PIC微控制器和较为昂贵的Basic Stamp,Arduino便宜而且看起来简单。
Arduino板子带有USB插座,只需要在电脑上安装好驱动,下载集成开发环境(IDE)即可开始写程序。板子依靠USB供电,因此至少在写程序时候无须外接电源。事实上,我在拿到板子之后只用了不到5分钟就开始写程序了。坦率的说,PIC微控制器已经变得比我刚了解到它的时候容易使用了,但还是不如Arduino方便。
Arduino和其开发环境都支持Mac,PC和Linux,并且Arduino软硬件都是开源的,也就是说,你可以获得所有相关的文件,如原理图,电路板设计图,源代码等。你可以在Arduino基础上进行改造,甚至出售改造后的产品——只要不在产品名称中使用Arduino字样。
很多商家都有Arduino及仿制品出售,包括RadioShack,价格不贵。一块原版Arduino UNO R3板子价格约22美元,仿制品更便宜。
UNO有14个数字输入/输出引脚和6个模拟输入/输出引脚,板子上带有模拟/数字转换器(ADC,见图1)。每个引脚可以承受40mA电流。板子上有一个电源插座和5V稳压器,可以通过外接电源为Arduino和其他部分供电。模拟输入/输出引脚也可以作为数字输入/输出引脚使用,所有引脚可以通过微控制器软件切换输入/输出模式,这一点为电路设计提供了很大便利。
其他版本的板子有更多的输入/输出引脚,这些引脚通过标准0.1英寸排座连接,可以通过杜邦线连接到面包板上,无须焊接。UNO板子上有两个数字引脚和USB插座连接。如果你在编程之后仍需要将Arduino控制板和电脑连接,那么不要将这两个引脚用作其他用途。

和Arduino对话
UNO微控制器有32kB程序存储空间,其中0.5kB被bootloader占用——用来运行你编写的程序的程序。微控制器工作频率为16MHz。对微控制器编程可通过Arduino IDE,一个用Java语言编写的程序完成。当程序编写完成之后,Arduino IDE会检查你编写的程序有没有错误(但是并不会自动更正),然后将程序编译为微控制器可运行的代码,并下载到板子上的ATmega328芯片中。Arduino IDE附带的串口监视器可以显示微控制器传回的信息,帮助你调试程序。
编写Arduino程序使用的语言和IDE基于Processing和Wiring。这是两个为鼓励学生、艺术家和设计师学习电脑程序开发编写的开源软件。[processing.org; wiring.org.co]。Processing以视觉效果作为设计导向(软件的图形和动画效果很好),可以在苹果电脑,Windows和Linux下运行。另外Processing还能够生成.exe可执行文件。学会编写Arduino程序,你就几乎能够编写在电脑上运行的程序。
因为Processing是为艺术家和设计师编写的软件,软件中有些有趣的词汇。程序在Processing软件中称为速写(Sketch)(Processing自身为软件的速写本(Sketchbook))。如果你熟悉Java或C语言,为Arduino编写程序会是一件很简单的事情。如果不是,可以从Arduino参考网页开始。[arduino.cc/en/Reference/HomePage]

—检查函数库
在浏览参考网页时你可能会注意到网站上提供的各种函数库,这些函数库使得编程更加简单。函数库本质上是由别人写的,用来简化编程的一段代码。例如,读出某种传感器检测到的数值并在LCD上显示需要很多行程序。使用函数库之后只需要在你的程序中加上一行包含函数库的代码,IDE就会帮你完成这些程序。你可以使用几行简单的命令设定光标位置,在屏幕上显示想要的内容。我的演示程序, Duino Display就使用了Arduino IDE自带的LCD函数库在屏幕第一行显示呼号,在第二行滚动显示提醒。

—学会编程
不管是使用Arduino还是其他微控制器,你都需要学会编程,否则就只能使用别人写好的程序。好在编程并不是很难学,并且由于Arduino的流行,网上有很多相关信息可供参考。
你可以以Duino Display为起点,花费不多的精力学会微控制器编程,并且可以将Duino Display作为努力成果的证明。这个小制作使用类似面包板的安装方法,你可以将其中的Arduino和LCD模块取下用在别的制作上,或者完全抛弃外壳,只在面包板上连接电路,在学会编程之后继续进行自己的制作。

—编程前的准备
当你订购Arduino和LCD显示模块之后,可以先从Arduino下载页面下载IDE和驱动,完成软件安装。[arduino.cc/en/Main/Software]。在硬件还没有送到之前,你可以打开IDE,点击FILES->EXAMPLES,打开其中的示例程序,学习程序写法。很快你就会对编程语言有个初步认识。与此同时你可以打开Arduino参考网页[arduino.cc/en/Reference/HomePage],查找你看到的命令,你会看到很多相关教程。特别注意“for loops”相关信息,在下面Duino Display程序中会用到多次

—不懂就问
如果你遇到问题,可以买或借一本关于Arduino编程方面的书。现在有很多相关书籍可供参考。[Ham Radio for Arduino and PICAXE,作者L. Klotz,呼号WA5ZNU,可从当地ARRL经销商或ARRL书店购买,ARRL编号:3244,电话:860-594-0355,美国国内免费电话:888-277-5289,网址:www.arrl.org/shop/,邮箱:pubsales@arrl.org]。如果还是有疑问,可以到相关论坛提问。

开始动手制作
在你收到硬件之后,真正有趣的部分便开始了。不管最终你打算怎样安装Duino Display,我建议你先使用面包板搭建电路练习一次,这样你可以练习IDE里带的例程,对你学习编程很有帮助。
LCD显示屏附带有排针(可能是排座),一个10K可变电阻和一个二极管。将排针焊到显示屏上,然后插到面包板上,如图2所示。将二极管和10K可变电阻插到面包板上,并按图3将它们用22号单股导线连起来,电路便连接完成了。如果你想练习其他例程,面包板上还有空间可以使用。
如果你想增加可靠性,可以将面包板和Arduino板子固定到木板上去。否则建议在Arduino板子下面垫一张纸板以防止短路。使用USB A型转B型电缆将Arduino板子连接到电脑。

—赋予Arduino生命
打开Arduino IDE,选择正确的板子(TOOLS->BOARD->UNO)。上电后,Arduino上的LED(在数字引脚13旁边,见图1)就会开始闪烁。这是因为Arduino已经被预先写入了一个程序Blink,这个程序用来测试板子是否正常工作。你可以从FILE菜单打开这个程序(FILE->EXAMPLES->BASICS->BLINK),将程序中的delay(1000);改成delay(2000);,然后点击IDE窗口左上方的右箭头图标,将程序下载到板子中,观察LED闪烁速度。你会发现LED闪烁速度减慢到原来的一半,这是因为上面对程序的修改将LED开关之间的间隔由1000ms改为2000ms。


现在你已经开始学习编程了。打开一个新的IDE窗口(FILE->NEW),将Duino Display程序输入或复制到窗口中(可从QST in Depth网站下载,网址是www.arrl.org/qst-in-depth),并下载到Arduino板子上。如果你选择手工输入程序,可以忽略程序注释(每行“//”符号后面的所有文字),但确保其他部分正确,并且需要保留“//”符号后面的SERIAL命令。所有的分号和括号都是程序的一部分,如果缺少,程序会编译错误。程序注释解释程序每一行的作用,尽量保留程序注释,这对理解程序作用有帮助。如果看不清显示的字符,可以调节10K可变电阻改变显示对比度。你应该能够看到LCD显示屏第一行显示我的呼号,第二行从右向左滚动显示程序附带的一条信息。如果没有看到,或者程序未能成功下载到Arduino板子上,仔细检查程序是否正确。记得随时保存程序(FILE->SAVE AS)。

—添加你的信息
在程序开头找到字符串“my-Call”的声明,将呼号替换为你自己的呼号,注意不要删掉引号,重新下载程序。现在屏幕第一行应该显示你的呼号。
字符串本质上就是一组ASCII字符。尝试将程序附带的信息改为你想显示的信息,注意注释中的说明。你也可以添加信息,并修改变量NUMBEROFMESSAGES为你添加信息的数量。在对程序做任何修改之后需要保存并下载到Arduino板子中才能看到现象。
有几种方法可以让HD44780控制芯片的LCD显示屏滚动显示文字。在LCD控制器内部有80个字符存储区,但只有2行每行16个字符能够显示出来。

—滚动显示信息
关于HD44780内部字符存储区的详细说明可在网上找到。[web.alfredstate.edu/weimandn/lcd/lcd_addressing/lcd_addressing_index.html]。向控制器不能显示出来的字符存储区写入内容可能有些难以理解,所以Duino Display的程序只用到了能够被显示出来的32个字符存储区。
Duino Display程序通过一系列for loops循环和子字符串(substrings)选择将要显示的字符,然后将字符写入字符存储区。所有用到的字符串命令都可以从IDE的示例程序中找到(FILE->EXAMPLES->STRINGS)。你可以逐个将示例程序下载到Arduino中,了解不同命令的使用方法。这些命令最开始看起来可能难以理解,但多看一些程序,很快你就能理解命令的含义。

—理解程序功能
通过实验你可以更好的理解程序是如何工作的。在IDE中打开Duino Display程序,删除以Serial开头的程序前面的注释符号,将程序用新名字保存,下载到Arduino板子中,然后打开串口监视器(TOOLS->SERIAL->MONITOR)。你可以看到在LCD显示屏中滚动显示的字符一行一行的出现在串口监视器窗口中。
回头看程序中的printit1()子函数,这个函数的功能是每次在显示区域的右端增加一个字符,直到显示区域被字符填满(16个字符)。Printit2()函数的功能是建立一个子字符串(16个字符),然后每半秒删掉最左端的一个字符,在最右端增加一个字符,然后在显示屏上显示。在串口监视器上看起来就是不断变化的字符串,在LCD上的显示效果就是字符串在滚动。Printit3()函数每次删掉最左端的一个字符,然后在最右端添加一个空格,直到显示区域变为空白。然后程序从头开始循环,显示下一条信息。当最后一条信息显示完后会从第一条信息开始循环。

为Duino Display加上外壳
对于这个小制作,有很多材料都可以用来制作它的外壳。我使用Altoids薄荷糖铁盒为它制作外壳。Arduino板子在一个盒子里,显示屏在另外一个盒子里,两个盒子通过可拆卸的方式连接,以便显示屏和Arduino板子可以拆下用在别的制作上。
将LCD显示屏从面包板上取下,测量前面板金属框的尺寸,然后在铁盒顶部中心做好标记。我的显示屏尺寸是15/16 x 2 3/4(15/16*2 3/4)英寸(见图4)。在铁盒上开方形孔最好的办法是使用手持砂轮切割机。如果要使用这种方法,一定要带护目镜,注意安全。细心操作,尽量保证开孔边缘平整。如果需要修整边缘或扩大开孔,可使用三角锉。


铁盒开孔之后,将LCD从背面放进开孔中,用小钉子或锥子标记固定孔位置,使用7/64英寸钻头钻孔,然后用#4-40螺丝固定。如果固定孔不够光滑,可以用锉刀或150目砂纸打磨。
在两个盒子的导线出口我用内径5/16英寸外径7/16英寸的乙烯护套保护导线。护套开口大小要根据你能找到的护套大小确定。在钻孔时我首先使用1/8英寸钻头钻一个定位孔,然后用阶梯钻头钻孔。如果你找不到阶梯钻头也可以用普通钻头,但记得首先钻一个小定位孔,然后使用稍微大一点的钻头钻孔,直到孔大小合适。较大直径的钻头容易卡在薄金属片中,因此钻孔时在背面垫一块木头,并将盒子固定好,以确保安全。
Arduino板子安装在另外一个Altoids盒子里。我用从本地五金店买的1/8英寸厚的尼龙垫圈将板子垫起,和盒底保持一定距离以防止短路。如果你用的是一样的盒子,可以按照图4的尺寸开孔,如果不是,利用你手头能找到的绝缘材料垫在盒底,然后将板子接口贴紧盒子一边,在盒子内部标记USB和电源插座开孔位置,然后使用角尺在盒子外部也做上标记。
用砂轮切割机沿标记开孔。因为USB插座尺寸较大,盒盖和盒子都需要开孔才能露出。对于电源插座,我同样开方形孔,因为在盒子边缘开方形孔比钻孔方便。电源插座伸出板子边缘较短,因此开孔之后不会露出盒子。同样电源插座开孔也需要在盒盖和盒子上开孔。
这些都完成以后,将垫圈放在盒子底部,将Arduino板子放进盒子,移动板子的位置使USB插座伸出,然后根据Arduino板子固定孔位置在盒子底部做标记并钻四个7/64英寸孔。最后,按照图5所示,在盒盖上钻孔并安装导线护套。如果你使用螺丝固定支架,找好位置,然后按同样方法钻孔。
我使用一片1/4英寸宽的黄铜片连接LCD盒子和Arduino盒子。截下来2英寸长的一段,在中间将它掰弯成约75度角,然后在两端钻直径7/64英寸的孔(见图5)。你也可以用其他方式固定两个盒子,首先选好支架,在支架上钻孔,然后根据支架的位置在盒子上钻孔。


钻孔和开孔完成之后,你可以将盒子涂成你喜欢的颜色。我将盒子涂成了和我电台柜类似的灰色。等油漆干了,使用#4-40螺丝和尼龙垫片将显示屏安装在盒盖上。
在LCD盒子中,我在一小块洞洞板上焊上可变电阻和二极管(见图6),然后按照前面的电路连接到LCD上,并用一个垫片做间隔,固定到LCD一角的#4-40螺丝上。


连接可变电阻和LCD的导线可以使用和前面一样的22号单股导线。至于连接Arduino和LCD的导线,我建议使用细一些的多股导线,这种线比较软,容易从护套中穿过。
截8根导线,每根7英寸长,将它们分别焊到洞洞板的电源线和地线,以及LCD显示屏的排针上。确保二极管的一端连接LCD背光引脚(15脚),另一端连接电源;可变电阻可调端连接LCD对比度引脚(3脚),另外两端分别接电源和地。连好线之后,将线从护套中穿过,从Arduino盒子中穿出。为方便连接,最好在每根线上做上标记。
在线的另一端剥开约3/8英寸绝缘皮,然后焊上一小段22号单股导线。用热缩管包好连接处。将单股线露出的部分折弯90度,并将多余部分截掉,使得刚好能完全插到Arduino排座中(约3/8英寸)。
将焊好的导线插到对应的Arduino引脚排座中(如图7),用#4-40螺丝和黄铜片固定好两个盒子,将较长的导线盘起放在Arduino盒子中,然后小心盖上盒子。如果之后你想将两部分拆开用做别的实验,较长的导线会很方便。


我在显示屏周围贴了一圈照片垫板,并在垫板上LCD固定螺丝对应的位置用冲床开了四个孔,用来遮挡铁盒和LCD固定螺丝。任何厚度大于螺丝头高度的纸板都可以。相对于在铁盒上开孔,纸板可以更加精确的控制尺寸,并且能够遮挡铁盒上的瑕疵。将垫板粘在铁盒盖上,然后在上面贴上一层卡纸遮挡螺丝开孔。为了美观,我还在卡纸上打印了Duino Display文字。你可以在上面添加其他图案。

让成果飞起来
如果你的电脑有Always-powered USB插口,只需将Duino Display插上即可。如果没有,或者这个插口有别的用途,那么你需要一个9V或12V,至少400mA电流的电源适配器为Arduino供电。Arduino可以自动切换USB或电源插口供电,所以同时插上USB和电源适配器不会有什么问题。如果在安装过程中不小心碰到了可变电阻,可能需要重新调节LCD对比度。
如果你想把板子用在别的制作中,只需要打开Arduino盒子,就可以连接其他电路。如果需要,也可以暂时取下LCD盒子。
Duino Display既是一个微控制器编程的入门制作,同时也是带有外壳的实验平台。随着水平的提高,你会发现Arduino有无数种玩法。除了Duino Display以外,现在我还用它控制卫星地面站的天线旋转器。

ARRL会员Roger Shipley,呼号KA9NAH,在1982年首次获得电台执照,目前他持有中级电台执照。Roger毕业于奥伯林学院,曾经从事于教师,舞台设计师,影院经理,橱柜制造工,家居设计师,雕刻师等职业,目前已经退休。他曾经常收听卫星频率和20米波段通联。他的地址是4023 Willowbrook Ln, Bellingham, WA 98229,电子邮箱是roger.shipley@comcast.net

图1:Arduino实验板。D0-D13可以作为数字输入或输出引脚,A0-A5为模拟引脚,也可以作为数字输入输出引脚。一颗LED连接到数字引脚13,位置在数字引脚13附近(参见原文)。

图2:安装在面包板上的Duino Display。图中连接到LCD1脚和16脚的导线在LCD下方。

图3:LCD和Arduino的接线图。随LCD附带有可变电阻和二极管。从LCD正面看,1脚在左边。LCD型号是Microtivity IM162 LCD Module 1602,它的控制器是HD44780,也可使用相同控制器的1602液晶。液晶和Arduino都可以从亚马逊买到。

图4:Altoids盒子布局。导线护套开孔尺寸根据导线护套尺寸决定,支架开孔位置需要根据盒子连接方式和LCD盒子安装位置确定。

图5:将#4-40螺丝从盒子中穿出以免和Arduino排座发生干涉。

图6:显示屏盒子内部:安装可调电阻和二极管的一小块洞洞板固定在显示屏固定螺丝上,电源线和地线从洞洞板引出。

图7:Arduino盒子内部:盒子左边的空间用来整理导线多出来的长度。

图8:完成后的Duino Display。你可以在面板卡纸上绘制装饰图案。

(绿色背景部分为原文备注)

发表评论

电子邮件地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据