CAT | DIY
万事开头难,最后我挑了USB这部分电路开始焊接和调试,一来这部分电路在Arduino上是基本一致的,二来这部分电路可以给板子上的其他部分供电,三来它还可以同PC机实现串口通信。
USB这部分电路采用的是FTDI公司的FT232BL芯片,算起来也焊过十多回了,因此虽然换了一个刀状的铬铁头,也没有遇到什么大的麻烦。芯片焊好之后,再把电容、电阻、LED、晶振焊好,头一回焊贴片元件,左右开工,总算一一搞定:) 下面是该部分电路所用到的元件,由于手头没有1k的电阻,所以用来给发光二极管限流用的电阻R12和R13暂时用1.5k的电阻替代了。
| 类型 | 标记 | 数量 | 规格 |
|---|---|---|---|
| USB转串口芯片 | IC2 | 1 | FT232BL |
| 电容 | C1 | 1 | 10nF |
| 电容 | C2 | 1 | 33nF |
| 电容 | C3 | 1 | 100nF |
| 电容 | C4, C5 | 2 | 22pF |
| 电阻 | R1, R2 | 2 | 27 |
| 电阻 | R3 | 1 | 1.5k |
| 电阻 | R4 | 1 | 470 |
| 电阻 | R12, R13 | 2 | 1k |
| 晶振 | Q1 | 1 | 6M |
| 发光二极管 | RX, TX | 2 | 绿色 |
| 类型 | 标记 | 数量 | 规格 |
|---|---|---|---|
| 插针 | JP1 | 1 | 3脚 |
| 保险丝 | F1 | 1 | 500mA |
焊上保险丝后再次接上USB线,这回听到了熟悉的USB设备连接上的提示音,在设备管理器中也能找到这一串口了:
心里一块石头总算落地了,不过现在还很难说USB这部分电路是不是已经正常工作了, 因为无法对数据发送和接收进行完全的测试。我只是简单地用串口调试工具打开了COM4,并试着发送一些数据给FT232BL,看到的现象是发光二极管TX在不断地闪烁,或许能够说明这部分电路已经基本可以了。当然,最终的结论只能等到ATmega 128那部分的电路完成之后,真正实际串口数据的收发时才会知道。
无论如何,USB这部分电路基本算是完成了,贴一张焊好USB电路的板子局部图:
No tags
接触Arduino一段时间之后,渐渐发现其实它只能适应用于一些比较简单的应用场景,对于稍微复杂一些的互动应用来讲,一般会需要有更多的管脚,更快的处理速度,以及更大的存储空间。
Arduino在设计和实现时借鉴了Wiring的很多做法,奇怪的是Wiring远远不及Arduino成功,这可能跟Wiring项目组没有大力推广有关系。在国内目前还买不到Wiring,从国外购买的话又需要大把的银子,犹豫了好长时间后还是没有能够挡得住自己的冲动,决定DIY!
Wiring采用的是ATmega128,存储空间为128K,带有50个数字I/O管脚和8个模块输入,以及6个PWM,整体性能比Arduino高了一大截,复杂性当然也是直线上升。对于电子高手们来讲估计不是个大问题,但对我这个完全自学的业余选手来讲,自然又是一个不小的挑战:)
原理图和电路图断断续续估计画了三四周,而且第一次开始采用贴片元件,自然又是恶补了一顿有关元件封装的知识,还从电子市场买了一些元件来比划。 这一过程中最大的收获就是开始认识到Eagle CAD的确是一个不错的电路图软件,可惜国内不管专业还是业余都用Protel。现在用的共享版只能画两层板,对我来讲是够了的,等有需求同时又有银子的时候,一定买个专业版的License。
电路板送到工厂后又足足等了一周,今天总算拿到了五块PCB板,这回做的是黑色的板子:
不知专业人士是如何检查电路板的,我只做了有限的检查,估计应用会有错误,做出的这五块只当拿来练手,之前已经做好了充分的心理准备,就当是学习和练手。
这一周工作比较忙,抽空做的唯一的事情就是去淘了一个二手的示波器,已经在路上了。将很大的期望放在这个即将到来的新伙伴身上,因为DIY Wiring的重任就要落在它的身上了,期待中…
No tags
XBee是美国MaxStream公司基于ZigBee技术的一个无线传输模块,该模块使用起来非常简单,我们只需要简单的把数据输入到一个模块,它就能自动的被发送到无线连接的另一端,同时也支持AT 命令进行高级配置。
这里介绍的Arduino XBee模块包括一块针对Arduino量身定制的扩展板,以及一个XBee Pro模块:
使用这样一对Arduino XBee模块,我们就可以实现一个最简单的包含两个结点的ZigBee网络,完成Arduino之间的无线通信。ZigBee技术本身也支持多个结点组成的复杂网络。
XBee模块在正常工作之前必须进行相应的设置。对XBee模块的设置既可以按照XBee手册里介绍的AT指令,通过串行终端完成,也可以借助X-CTU这一工具来完成,你可以在这里下载本文用到的版本进行安装。
将Arduino XBee扩展板连接到Arduino母板上,然后将Arduino XBee扩展板上的两个跳线置于USB一端,这样X-CTU才能通过Arduino的USB接口对XBee模块进行配置:
注意,下面的步骤会用到Arduino的USB接口以及TX和RX管脚,所以请确保运行在Arduion上的工程里没有对串行接口的操作,或者将AVR芯片从Arduino板上取下之后再进行下面的步骤。
在用USB电缆将Arduino与PC机连接好之后, 运行X-CTU软件。首先我们在“PC Settings”中里选择对应的通信端口,并设置好波特率等参数。XBee模块出厂里默认的设置为9600,8N1。
此时我们可以单击“Test/Query”按钮,来测试是否能够正确地连接上XBee模块。如果一切正常,我们将看到如下的对话框。如果通信参数设置都是正确的,但仍然无法与XBee模块通信上,则请检查USB连线和Arduino XBee扩展板上的跳线,必要的时候可以拨掉Arduino上的ATmega单片机再试。
测试正常之后转到“Modem Configuration”。首先单击“Modem Parameters and Firmware”中的“Read”按钮读出XBee模块中的当前参数,接着在读出的“Networking & Security”中将“Channel”设为“C”,将“PAN ID”设置为“1234”。
我们在这里要实现的是一个最简单的点对点网络,所以只需要对另外一个Arduino XBee模块做完全相同的设置就可以了。两个Arduino XBee模块都设置好之后,运行两个X-CTU并在“PC Settings”中选择不同的通信接口,分别对两个Arduino XBee模块进行控制。
在X-CTU的“Terminal”中我们可以手工输入需要XBee模块传输的数据,这些数据在收到之后会被自动发送到另一个XBee模块,并在另一个X-CTU的“Terminal”中显示出来。其中蓝色的表示发送的数据,红色的表示接收的数据:
至此,基本说明你的Arduino XBee模块能够正常收发数据了,接下去要做的就是在Arduino工程里如何利用XBee进行无线数据的收发了。通过上面的步骤不难看出,在Arduino工程中只需要将要发送的数据通过Arduino的串行通信接口发送给XBee模块就可以了,然后在另一个Arduino模块中通过串行接口读出来就可以了。但要想要构建更加复杂的网络,就得仔细读读XBee的使用手册,并好好了解ZigBee技术了;-)
No tags
Arduino使用的是Atmel公司的AVR单片机,一般为ATmega8和ATmega168,这一系列的单片机都支持ISP(In System Programmability )编程,无需依赖昂贵的编程器就可以完成程序的下载。Arduino电路在设计上考虑到了ISP功能,也留出了相应的接口(ICSP),从而允许我们通过ISP下载线来完成bootloader的下载。
新买来的Arduino模块上一般都已经预先下载好了bootloader,因此上电之后就能够直接通过Arduino集成开发环境下载相应的Arduino程序。正常情况下我们在用Arduino时是不需要ISP下载线的,但在某些情况下可能会出现在Arduino集成开发环境中无法正常下载程序的现象,这很可能是由于bootloader受损所致。解决的办法就是重新将bootloader烧写到ATmega芯片中,此时你就需要用到这里介绍的ISP下载线了。
Arduio网站上给出的并口下载线电路我只成功地更新过ATmega8的bootloader,而无法为Diecimila上的ATmega168下载bootloader。此外,Arduino给出的这一下载线电路过于简单,没有做相应的隔离和保护, 经常使用可能会对Atmega芯片带来一定的损害。AVR建议使用一片74HC244来隔离并口和ATmega芯片,下面是我所使用的下载线的原理图:
以及自制的下载线:
使用并口下载线的时候,我们需要先到计算机的BIOS中将并口设为ECP(The extended capabilities port )模式,同时将I/O基地址设置成378:
此时在Windows的设备管理器中,我们会发现并口已经被标记为“ECP 打印机端口”:
用鼠标右键单击后从弹出的菜单中选择“属性”命令打开属性对话框,在“资源”页面中我们会看到相应I/O基地址的设置已经生效:
现在就可以用ISP下载线连接计算机并口和Arduino上的ICSP接口了,请特别留意连接方向:ISP下载线六口插座上标有小三角的一端应该靠近 Arduino的ICSP接口上标为1的一端。虽然计算机并口能够为下载电路提供一定的电压,但一般我还是建议给Arduino模块加上5V电压(通过USB线和外接电源都可以),以保证下载过程的稳定。
硬件准备好之后,我们就可以通过相应的软件将bootloader烧到Arduino中。支持AVR下载线的软件比较多,如AVRDUDE和SLISP等,我们在这里使用的是PonyProg。下载并安装好PonyProg v2.07a BETA版本,启动PonyProg时会提示你进行相应的校准和设置工作。首先选择“Setup”菜单中的“Calibration”命令进行校准,然后再选择“Setup”菜单中的“Intreface Setup…”命令进行相应的并口设置:
根据你的Arduino模块上的芯片类型,从“Device” 菜单中的“AVR micro”子菜单中选择“ATmega8”或者“ATmega168”。你也可以从工具栏上的Device下拉框中进行相应的选择:
首先从“Command”菜单中选择“Read All” 命令,从Arduino模块上读出ATmega中的当前数据和设置,其中最重要的是之后要设置的熔丝位。
然后选择“File”菜单中的“Open Program (FLASH) File…” 命令,打开“Open program (FLASH) content file”对话框。从你的Arduino安装目录下找出对应于的bootloader。对于Arduino 0010版本来讲,我们可以在hardware\bootloaders目录下找到atmega8和atmega168两个目录,分别对应ATmega8和ATmega168芯片所对应的bootloader(文件扩展名为.hex),在atmega168目录下可以找到ATmegaBOOT_168_diecimila.hex和ATmegaBOOT_168_ng.hex两个文件,分别对应Diecimila和NG模块。你需要根据你的Arduino模块的具体情况,加载相应的bootloader文件。
AVR通过熔丝来控制芯片内部的一些功能,比如JTAG,时钟的使用,掉电检测电压,是否允许调试等。熔丝位的配置是为Arduino下载bootloader过程中最复杂的一步,而且设置出错很有可能导致芯片锁死,所以一定要仔细。选择“Command”菜单中的“Security and Configuration Bits …”命令,打开相应的熔丝设置对话框。
Arduino的bootloader对熔丝位有一定的要求,主要是同外部时间设置相关的。对于串口模块采用的ATmega8来讲,相应的熔丝字节要设置成0xCA(Fuse High Byte)和0xFF(Fuse Low Byte),具体每位的含义可以参见Wolf Paulus的文章。在PonyProg中对ATmega8的熔丝位设置为下图所示:
对于NG和Diecimila采用的ATmega168来讲,相应的熔丝字节要设置成0xF8(Extended Fuse Byte), 0xDF(Fuse High Byte)和0xFF(Fuse Low Byte)。在PonyProg中对ATmega168的熔丝位设置为下图所示:
熔丝位设置好之后,选择“Command”菜单中的“Write All”命令,将bootloader下载到Arduino中。下载过程中Arduino上的发光二极管L会不断闪烁。下载完成之后,我们可以通过Arduino集成开发环境下载一个Arduino工程,来验证新下载的bootloader是否能够正常工作。
No tags
虽然之前DIY出来的串口模块一直工作得很正常,但USB无孔不入的事实让我明白DIY那款USB接口的Arduino只是迟早的事情,于是暂时放弃了超声波模块和各种基本电路,开始DIY Arduino USB模块。Arduino官方网站上为USB接口的Arduino给出了不同的名称(NG和Diecimila),两者似乎只是采用的USB芯片有所差异,电路上并没有太多的变化,但bootloader似乎也有些不同。
一切依旧从原理图开始,对比Arduino串口模块与USB模块的原理图后发现,原来电路图上只是将串口部分的电路用FT232BM芯片替换了,并且将Atmega8换成容量更大的Atmega168。我在自己DIY板子上用的是FT232BL,就是FT232BM的无铅版本,电子市场里淘到的是几十块钱一片,还真是不便宜(越发应该支持串口版本了)。Atmega8同Atmega168引脚上是完全兼容的,原则上原来那款串口模块上也可以接Atmega168的,只需要更新bootloader就可以了。
考虑到今后焊接上的方便,除了FT232BL外大部分用的是直插元件。电路板这回坚持要工厂用蓝色油墨,又多花了好些银子,但做出来的板子拿到后感觉好像做工没有上次仔细了,不过整体感觉还是不错的:
元件配备上这次电容100nF用的是安规电容,这是参考了Arduino成品图后专门去打听的。按照官方的说法,安规电容器失效之后不会导致电击,因此不会危及人身安全。另外电路中用到了一个陶瓷晶振,刚开始不明白为什么晶振会有三只管脚,后来Google才知道这种晶振是包含了滤波电路的,因此在FT232BL芯片周围就不需求搭其它的滤波电路了。看起来仔细研究每个电路都会有所发现啊!
元件配齐之后就开始焊接了。第一次焊接QPF封装的芯片,一开始还真不知如何下手,最后弄坏了一块才明白原来只需要靠焊盘上的焊将芯片焊上就行了,又交了一次学费;-) 其它元件焊起来就相对容易多了,基本上没有遇到什么问题。
本来以为Atmega168和Atmega8在管脚和ISP电路上没有任何区别,因此装完后就能够用Arduino网站介绍的那条简易下载线烧写bootloader了。刚开始装上Atmega168,下载bootloader就会出错,以为是板子安装的问题,仔细查找和分析后用Atmega8换下Atmega168,发现下载bootloader正常。怀疑原来用在Arduino串口模块上的下载线太简单,可能在Atmega168上无法正常工作,但此时已经能够确认板子安装基本是正确的了:-)
在Arduino网站上找到一篇介绍如何烧写Atmega168的文章,但文章中用到的是编程器而不是下载线。此时看起来有两种选择,一种是继续在下载线上纠缠,DIY一款适合Atmega168的下载线;另一种是买一个编程器,直接在编程器上完成bootloader的烧写。权衡再三后还是确定买一款编程器,虽然贵点,但以后在开发各种单片机应用的时候估计都能够用得着。此时只能用“工欲善其事,并先利其器”来安慰自己了!
编程器买回来之后,将Arduino安装目录bootloader168下的ATmegaBOOT_168_diecimila.hex文件用编程器烧到Atmega168芯片中。按下Arduino板子上的复位按钮,总算能看见接在13号管脚上的灯闪烁了,说明bootloader已经运行起来了。
安装完FT232BM USB驱动程序之后,试着在Arduino集成开发环境中打开了一个最简单的工程,编译之后再下载,再次出错!首先怀疑是Arduino设置的问题,检查了MCU的类型和串口,都没有问题,看了little bird放在YouTube上的安装过程视频,也没有发现什么不对的地方。为了定位问题所在,直接在串口调试软件里不断地给Arduino模块发数据,能够看到TX灯不断闪烁,但给bootloader发送相应的命令却得不到任何反应,RX灯也不闪烁。难道是从Arduino向外界发送数据的电路有问题?拿着万用表一段一段检查电压,似乎都正常,没有任何头绪,看起来下一个该投资的设备就是一台好一点的示波器了;-)
没有办法,只好修改bootloader的源码,让其在启动后不断地向外界发送数据。这回RX灯能够闪烁了,在串口调试软件里也能够收到数据, 看来硬件接线是正确的,总算松了一口气。不过收到的数据很奇怪,不论bootloader发送什么数据,收到的都是0×00!按照之前的经验,通常这种情况都是串口配置导致的问题,如波特率等。
继续Google没有什么收获,开始怀疑是不是时钟设置的问题,导致Atmega168发送数据时没有合适的时钟。在Makefile里找到了AVR_FREQ参数(默认值为16000000L),是外部晶振的频率,对它做了相应的修改,也不解决问题。继续在Makefile里游荡,看到ISPFUSES 参数时突然眼前一亮,会不会是熔丝(fuse)位的问题?熔丝位是Atmega168在工作时的配置参数,其中最重要的是有关频率的设置。Google到的The tale of AVRdude, ATmega168 and extended fuses bits和ATmega 8 / 168 internal clock and fuse settings证实了我的猜测。仔细阅读了Arduino网站上的说明之后,确定相应的熔丝位应该设置成0xF8, 0xDF和0xFF。刚买的那个编程器里面就能够直接设置这些熔丝位:
重新编程Atmega168,这回总算能够在Arduino集成开发环境中下载工程了,试了数字I/O和模拟I/O,一切正常;-)
No tags






















