Arduino中国 | Flamingo EDA

Archive for May 2009

May/09

23

晶振惹的祸

某Arduino,之前可以正常工作,一日发现突然不能正常下载,出错信息依然是经典的:

avrdude: stk500_getsync(): not in sync: resp=0x00
avrdude: stk500_disable(): protocol error, expect=0x14, resp=0x51

按照之前的套路,出现这一问题之前Arduino能够正常工作,多半应该是bootloader的问题。于是乎找来USBtinyISP,打开Arduino IDE烧写bootloader,然而情况不妙,avrdude无法正常与AVR通信:

avrdude: initialization failed, rc=-1
         Double check connections and try again, or use -F to override
         this check.

第一次遇到这种情况,ISP部分应该只与最小系统有关,仔细查找了原因之后,唯一可能有问题的应该只有晶振了。用示波器量了量晶振两脚的电压,似乎没有什么大的区别,于是按替换原则换了一个新的晶振上去,问题解决!

这是我第一次遇到这样的现象,看来datasheet里强调的稳定的晶振电路的确是有道理的,我等在设计这部分电路的时候还是要仔细考虑一下的;-)

May/09

10

RGB Monome 硅胶按钮

按钮是RGB Monome非常重要的一个部分,最后采用是透明硅胶制作的按钮,以保证有足够好的透光度。由于目前加工的量还不是很多,所以价格相对来讲并不是很便宜。

至此,制作RGB Monome所需要的各种元件和电路板都已经备齐,随后将通过本站的淘宝网店进行销售:-)

May/09

10

RGB Monome的串口控制

RGB Monome可以通过串口进行控制,不过由于设计时考虑到数据传输量尽可能少,是用二进制方式进行传输的。

实验时我们可以先用串口调试工具SSCOM来完成,然后再考虑怎么用诸如Flash这样的程序来实验。首先下载SSCOM,解压缩后直接运行就可以了。在“串口号”下拉列表中选择相应的串口,“波特率”需要设置成“57600″,然后点“打开串口”按钮打开串口:

单击右侧的“扩展”按钮,打开相应的扩展窗口,在这里我们可以定义发给Arduino的控制字符串。由于发送的都是二进制数据,所以将每行前的“HEX“复选框选中:

Monome最基本的控制是对一个LED的控制,这是由三个步骤组成的:第一步是设置LED颜色,第二步点亮这个LED,第三步熄灭这个LED。

第一个命令是为需要点亮的LED设计相应的颜色,该命令由4个字节组成,第一个字节“10”是固定的命令字,接下来的三个字节依次为红/蓝/绿三个LED的值,如:

10 00 FF 00

第二个命令是用刚刚设置的颜色值,来点亮指定的LED,该命令由2个字节组成,第一个字节“20”是固定的命令字,第二个字节的第一个数字为行号,第二个数字为列号,例如下面的命令将点亮第0行第1列上的那个LED:

20 01

第三个命令是熄灭指定的LED,该命令由2个字节组成,第一个字节“30”是固定的命令字,第二个字节的第一个数字为行号,第二个数字为列号,例如下面的命令将熄灭第0行第1列上的那个LED:

30 01

不过上述只是最基本的控制命令,只有在程序中合理地运用这些命令的组合,才能创造出让人惊艳的效果;-)

No tags

May/09

5

RGB Monome

时间对项目来讲是一个魔咒,你经常需要快点赶上进度,但往往又必须付出足够长的时间,才能得到相应的结果。这次制做8×8的RGB Monome再一次验证了它。

硬件的组成包括下面几个部分:

  • 4块4×4的RGB 按钮板,用来安装全彩LED和按钮
  • 1块Arduino扩展板,用来连接Arduino和按钮扩展板
  • 16块4×4的按钮
  • 4根24针的连接线

PCB板出厂之后,立马就焊接了一块RGB 按钮板和Arduino扩展板,检查连线正常之后,下载相应的程序进行验证,结果16个LED没一个亮的。仔细阅读了代码后,认为可能是初始时所有灯均为熄灭状态,可是对下面的数组进行初始化设置之后,情况依然没有什么变化:

int levelB[64] = {
1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024,
1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024,
1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024,
1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024};

仔细检查电路,接线上并没有发现什么异常。由于之间在选型的时候,做了一个TLC5940的实验,而这一RGB 按钮板的核心正是一个TLC5940,于是打算用tlc5940arduino提供的BasicUse进行验证。与之前自已用3块TLC5940的想法不同,RGB 按钮板上只用了一个TLC5940,通过三个三极管的来回切换,完成三种颜色的分别控制,做法倒是经济,但调试起来很不方便。在弄清楚了RGB 按钮板的工作原理之后,为BasicUse加上了三极管控制的代码,但仍然是无法点亮任何一个LED。

#include "Tlc5940.h"

void setup()
{
  Tlc.init();
  pinMode(5, OUTPUT);
  pinMode(6, OUTPUT);
  pinMode(7, OUTPUT);
}

void loop()
{
  Tlc.clear();
  // red
  for (int channel = 0; channel < 16; channel ++) {
    Tlc.set(channel, 4095);
  }
  Tlc.update();
  digitalWrite(5, HIGH);
  digitalWrite(6, HIGH);
  digitalWrite(7, LOW);
}

继续研究RGB 按钮板的工作原理,偶然发现与TLC5940通常的共阳接法不同,这里采用的居然是共阴的接法!原因找到之后,用共阴的LED再焊接了一块RGB 按钮板,之前那块用共阳LED的按钮板壮烈牺牲!

再次用修改后的BasicUse进行测试,这次倒是按钮板上的灯能够亮了,算是一大进步。可是连接上Arduino扩展板之后,依然是LED工作得不正常,但用镊子短路按钮板上的按钮,倒是能够在串口上读到相应的数据,而且似乎结果还是正确的。

此时,我做了一个判断,让为硬件上应该基本是正确的,包括LED和按钮,问题应该主要是出在软件上,为了赶上相应的进度,我将4块4×4 RGB 按钮板和一块Arduino扩展板寄出。

但事实很快粉碎了我的设想,本来觉得应该很快弄好的代码,却一直无法让这一堆硬件正常工作。这里是我最后修改后的代码,将其下载到Arduino之后并运行的话,期待的结果是4个RGB 按钮板上的LED在上电的时候全亮,然后一个一个变成彩色再熄灭,之后就可以通过按钮来控制每一个灯的亮灭,即按下哪个按钮,相应的LED就变亮。

好几天都在来来回回折腾这段代码和这堆硬件,RGB 按钮板经常出现只有一块亮,或者均不亮的情况。仔细读了网站上的各种说明,从网上找了TLC5940的资料无数,都没有弄明白为什么BasicUse可以点亮LED,可RGB 按钮板就无法正常工作。各种能够想到的检测办法都用上了,也试着用示波器查看波形,但似乎都没有发现问题所在。

抱着试试看的态度,做了如下的修改:

  1. Arduino扩展板上的电阻,改成4.7K
  2. 尝试用Arduino扩展板上的5V外接电源

第一个改动在我的硬件上没有实质性的作用,倒是第二个改动,偶然中出现了两块RGB 按钮板都正常的情况,兴奋中!来来回回不断地插拔RGB 按钮板,并不断地调整RGB 按钮板的连接顺序,虽然没有搞明白为什么,但几个小时后终于在用5V外接电源的情况下,出现了4块RGB 按钮板均亮的情况!看着RGB 按钮板上的LED按照程序一颗一颗闪烁的时候,真是想哭的心都有了;-)

尽管此时已经是凌晨两点多了,还是抑制不住兴奋的心情,去楼下让基本上已经麻木的大脑呼吸了一把新鲜空气,回来美美地睡了一觉。

第二天起床后就赶紧验证按钮。将4块4×4 RGB 按钮板按位置摆好后,对按钮一个一个进行验证。按照上面给的Arduino代码,我期望的结果是当相应位置的按钮按下之后,该按钮下面的灯同时亮起。定做的硅胶按钮倒是表现得不错,但紧接着问题又来了,第0行上的任何一个按钮按下去的话,都会点亮相应列上的8个LED,其它行上的按钮工作正常!晕!

接着查电路吧!74HC164和74HC165的工作原理,对照着代码好好地检查了一番,再用示波器检查了一下74HC165各个输入管脚上的波形,的确有一个与别的有所不同,但一时却找不到原因所在。又一天过去了!

昨天晚上,几近崩溃但尚未放弃的我又一次检查了相应的电路,最后终于将原因锁定在了Arduino扩展板上的一个直插的排阻上。由于是第一次用到排阻,并没有仔细想到排阻也是分管脚的,而之前焊接的排阻正好焊反了!将排阻换好之后,按钮总算正常工作了。

装反了的排阻

似乎此时总算可以长舒一口气了,因为至少在目前这堆硬件固定的连接上,所有的功能都正常了!但此时还有一个问题困扰我:为什么连接RGB 按钮板的时候,有时候正常,有时候不正常呢?有时候只亮一块或者几块,有时就能够4块全亮,而且只要全亮,不管怎么断电都可以,但只要是换一下RGB 按钮板的连接顺序,就可能会有一块不亮!

还是不死心,原因没有找到,但不断实验的过程中总结出一个规律,也许有借鉴的作用。在连接RGB 按钮板的过程中,严格按照下面的步骤进行安装:

  1. 断电,只连接UPPER-RIGHT,上电,点亮第一块RGB 按钮板
  2. 断电,将连接在UPPER-RIGHT上的RGB 按钮板拔下接到LOWER-RIGHT上,将第二块RGB 按钮板连接到LOWER-RIGHT,上电,同时点亮两块RGB 按钮板
  3. 断电,将连接在LOWER-RIGHT上的RGB 按钮板拔下接到LOWER-LEFT,将连接在 UPPER-RIGHT上的RGB 按钮板拔下接到LOWER-RIGHT上,将第三块RGB 按钮板连接到UPPER-RIGHT,上电,同时点亮三块RGB 按钮板
  4. 断电,将连接在LOWER-LEFT上的RGB 按钮板拔下接到UPPER-LEFT,将连接在LOWER-RIGHT上的RGB 按钮板拔下接到LOWER-LEFT,将连接在 UPPER-RIGHT上的RGB 按钮板拔下接到LOWER-RIGHT上,将第四块RGB 按钮板连接到UPPER-RIGHT,上电,同时点亮四块RGB 按钮板

试了两块Arduino扩展板,按照上面的做法似乎都能够正常!一个猜测的原因是不是因为TLC5940里的EEPROM导致的?这个似乎需要更多的时间来研究确定,而一整夜都在排错和总结上述规律的我此时已经精疲力竭,丝毫没有任何心思来仔细啄磨这些细节了,只能上几张照片然后睡觉去:(

May/09

2

Arduino MEGA 尝鲜

Arduino MEGA采用的是ATmeag1280单片机,存储容易大了不少,同时接口数目也增加了很多,应该比较适合端口要求比较多的场合。 这次样板焊接的时候,来来回回折腾了好几回,主要是元件的选取问题。这里先奉上几张Arduion MEGA的照片:

与之前版本的Arduino采用双列直插芯片不同的是,这次采用的是贴片的ATmega1280。我的编程器暂时还没有配备相应的转接头,所以刚制作好的USBtinyISP此时正好派上用场:

Bootloader的烧写是通过下面的命令直接完成的:

avrdude -c usbtiny -p m1280 -b 115200 -V -e -U lock:w:0x3F:m -U hfuse:w:0xDA:m -U lfuse:w:0xFF:m -U efuse:w:0xF5:m
avrdude -c usbtiny -p m1280 -b 115200 -V -D -U flash:w:ATmegaBOOT_168_atmega1280.hex:i
avrdude -c usbtiny -p m1280 -b 115200 -V -U lock:w:0x0F:m

Bootloader下载完成之后,首先测试了最基本的点亮LED的实验。由于引脚的位置并没有改变,所以之前为Arduiono设计的扩展板此时还是能够直接使用的:

运行时的效果图:

Arduino MEGA一共可以提供54个数字I/O接口和16个模拟I/O接口,即便是一个一个验证这些端口,也得花不少的时间;-)

Older posts >>

Theme Design by devolux.nh2.me