<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Arduino中国 &#187; DIY</title>
	<atom:link href="http://blog.flamingoeda.com/category/diy/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.flamingoeda.com</link>
	<description>Flamingo EDA</description>
	<lastBuildDate>Sat, 13 Aug 2011 11:41:38 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1.3</generator>
		<item>
		<title>深入理解Arduino Bootloader</title>
		<link>http://blog.flamingoeda.com/2008/04/26/%e6%b7%b1%e5%85%a5%e7%90%86%e8%a7%a3arduino-bootloader/</link>
		<comments>http://blog.flamingoeda.com/2008/04/26/%e6%b7%b1%e5%85%a5%e7%90%86%e8%a7%a3arduino-bootloader/#comments</comments>
		<pubDate>Sat, 26 Apr 2008 15:59:20 +0000</pubDate>
		<dc:creator>flamingoeda</dc:creator>
				<category><![CDATA[Arduino]]></category>
		<category><![CDATA[DIY]]></category>

		<guid isPermaLink="false">http://blog.booksforce.com/2008/04/26/%e6%b7%b1%e5%85%a5%e7%90%86%e8%a7%a3arduino-bootloader/</guid>
		<description><![CDATA[在调试新装的Arduino Diecimila贴片版本时，遇到一个非常诡异的现象：在将Bootloader通过编程器写入到ATmega168里之后，再通过Arduino的集成开发环境下载程序时，第一次下载完全正常，可第二次就无法完成下载了！ 一开始怀疑是熔丝位设置的问题，可奇怪的是相同的设置在直插版本上就没有问题，试了一个晚上，无果。第二天Google了一下，Arduino论坛上有人遇到了现象跟我类似的问题，别人提供的解释是说没有对加锁位（Lock Bit）进行设置。以为找到了问题的症结所在，晚上回到家继续用我的编程器狂写ATmega168，但现象依然如旧：第一次下载没有问题，第二次无法下载。几乎崩溃！ 同一个问题纠缠了两天，虽然没有解决，但是了解到了不少ATmega168有关熔丝位和Lock Bit的设置知识。根据Wolf Paulus对熔丝位的描述和Aduino Playground里对锁定位的描述，在我的编程器里分别做了如下的设置： 其中BLB1的设置比较重要，它是用来对Bootloader进行保护的。其中SPIEN经实验，在不选中时用下载线能够正常下载Bootloader。 仔细分析了各种可能性，最后还是在对照PCB检查电路时发现了问题，焊接时没有焊C11，焊上去之后就一切正常了，郁闷了我三个晚上的尽然就是一个小小的电容！ 查了查 Arduino Diecimila有关自动重启的说明，总算搞清这个电容是用来连接FT232RL的DTR和ATmega168的RESET，如果不接这个电容，或者数值不对（比如今天我就错接了22pF的），都有可能导致Arduino程序无法正确下载。 同样的问题也会发生在Arduino Mini上，得到的启示是在连接USB Adapter和Arduino Mini时，除了电源之外，还要将DTR和RST通过一个100nF的电容连接起来！ 真是到处都是陷阱啊，不过这么一折腾，倒是弄清楚了不少东西，虽然时间是花了不少:)]]></description>
			<content:encoded><![CDATA[<p>在调试新装的Arduino Diecimila贴片版本时，遇到一个非常诡异的现象：在将Bootloader通过编程器写入到ATmega168里之后，再通过Arduino的集成开发环境下载程序时，第一次下载完全正常，可第二次就无法完成下载了！</p>
<p>一开始怀疑是熔丝位设置的问题，可奇怪的是相同的设置在直插版本上就没有问题，试了一个晚上，无果。第二天Google了一下，Arduino论坛上有人遇到了<a href="http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1183647052">现象跟我类似的问题</a>，别人提供的解释是说没有对加锁位（Lock Bit）进行设置。以为找到了问题的症结所在，晚上回到家继续用我的编程器狂写ATmega168，但现象依然如旧：第一次下载没有问题，第二次无法下载。几乎崩溃！</p>
<p>同一个问题纠缠了两天，虽然没有解决，但是了解到了不少ATmega168有关熔丝位和Lock Bit的设置知识。根据<a href="http://www.arduino.cc/playground/Learning/Burn168">Wolf Paulus对熔丝位的描述</a>和<a href="http://www.arduino.cc/playground/Learning/Burn168">Aduino Playground里对锁定位的描述</a>，在我的编程器里分别做了如下的设置：<a href="http://blog.booksforce.com/wp-content/uploads/2008/04/arduino_bootloader_fuse.png"></a></p>
<p style="text-align: center"><a href="http://blog.booksforce.com/wp-content/uploads/2008/04/arduino_bootloader_fuse.png"><br />
</a></p>
<p style="text-align: center"><a href="http://blog.booksforce.com/wp-content/uploads/2008/04/arduino_bootloader_fuse.png"><img src="http://blog.booksforce.com/wp-content/uploads/2008/04/arduino_bootloader_fuse.png" /></a></p>
<p style="text-align: center"><a href="http://blog.booksforce.com/wp-content/uploads/2008/04/arduino_bootloader_fuse.png"> </a></p>
<p style="text-align: center"><a href="http://blog.booksforce.com/wp-content/uploads/2008/04/arduino_bootloader_lock.png"><img src="http://blog.booksforce.com/wp-content/uploads/2008/04/arduino_bootloader_lock.png" /></a></p>
<p>其中BLB1的设置比较重要，它是用来对Bootloader进行保护的。其中SPIEN经实验，在不选中时用下载线能够正常下载Bootloader。</p>
<p>仔细分析了各种可能性，最后还是在对照PCB检查电路时发现了问题，焊接时没有焊C11，焊上去之后就一切正常了，郁闷了我三个晚上的尽然就是一个小小的电容！</p>
<p>查了查 <a href="http://www.arduino.cc/en/Main/ArduinoBoardDiecimila">Arduino Diecimila有关自动重启</a>的说明，总算搞清这个电容是用来连接FT232RL的DTR和ATmega168的RESET，如果不接这个电容，或者数值不对（比如今天我就错接了22pF的），都有可能导致Arduino程序无法正确下载。</p>
<p>同样的问题也会发生在Arduino Mini上，得到的启示是在连接USB Adapter和Arduino Mini时，除了电源之外，还要将DTR和RST通过一个100nF的电容连接起来！ 真是到处都是陷阱啊，不过这么一折腾，倒是弄清楚了不少东西，虽然时间是花了不少:)</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.flamingoeda.com/2008/04/26/%e6%b7%b1%e5%85%a5%e7%90%86%e8%a7%a3arduino-bootloader/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Arduino Mini与USB适配器</title>
		<link>http://blog.flamingoeda.com/2008/04/21/arduino-mini%e4%b8%8eusb%e9%80%82%e9%85%8d%e5%99%a8/</link>
		<comments>http://blog.flamingoeda.com/2008/04/21/arduino-mini%e4%b8%8eusb%e9%80%82%e9%85%8d%e5%99%a8/#comments</comments>
		<pubDate>Mon, 21 Apr 2008 15:35:53 +0000</pubDate>
		<dc:creator>flamingoeda</dc:creator>
				<category><![CDATA[Arduino]]></category>
		<category><![CDATA[DIY]]></category>

		<guid isPermaLink="false">http://blog.booksforce.com/2008/04/21/arduino-mini%e4%b8%8eusb%e9%80%82%e9%85%8d%e5%99%a8/</guid>
		<description><![CDATA[Arduino Mini在设计上力求很小的体积，因此并不具有完整版的Arduino的全部功能，其中的USB下载部分就是通过USB适配器（Adapter）来实现的。USB Adapter其实就是一个USB转串口的电路，采用的是FT232RL芯片，因此原理上除了可以做为Arduino Mini的适配器外，还能够用于其它需要USB转串口（TTL电平）的场合： 在配合Arduino Mini使用时，要只需要将USB Adapter上的5V，GND，TX，RX四个端口，与Arduino Mini上相应的5V，GND，TX，RX四个端口相连接就可以了。 为了配合之后的验证，上面的电路中还加了一个LED灯，其目的是用下面的Arduino程序来验证Arduino Mini上的数字输出功能： int BASE = 2; int NUM = 12; int index = 0; void setup() { for (int i = BASE; i < BASE + NUM; i ++) { pinMode(i, OUTPUT); } } void loop() { for (int i = BASE; i < BASE + NUM; [...]]]></description>
			<content:encoded><![CDATA[<p>Arduino Mini在设计上力求很小的体积，因此并不具有完整版的Arduino的全部功能，其中的USB下载部分就是通过USB适配器（Adapter）来实现的。USB Adapter其实就是一个USB转串口的电路，采用的是FT232RL芯片，因此原理上除了可以做为Arduino Mini的适配器外，还能够用于其它需要USB转串口（TTL电平）的场合：</p>
<p><a href="http://blog.booksforce.com/wp-content/uploads/2008/04/arduino_mini_adapter.png"></a></p>
<p style="text-align: center"><a href="http://blog.booksforce.com/wp-content/uploads/2008/04/arduino_mini_adapter.png"><img src="http://blog.booksforce.com/wp-content/uploads/2008/04/arduino_mini_adapter.png" /></a></p>
<p>在配合Arduino Mini使用时，要只需要将USB Adapter上的5V，GND，TX，RX四个端口，与Arduino Mini上相应的5V，GND，TX，RX四个端口相连接就可以了。</p>
<p><a href="http://blog.booksforce.com/wp-content/uploads/2008/04/arduino_mini_adapter_circuit.png"></a></p>
<p style="text-align: center"><a href="http://blog.booksforce.com/wp-content/uploads/2008/04/arduino_mini_adapter_circuit.png"><img src="http://blog.booksforce.com/wp-content/uploads/2008/04/arduino_mini_adapter_circuit.png" /></a></p>
<p>为了配合之后的验证，上面的电路中还加了一个LED灯，其目的是用下面的Arduino程序来验证Arduino Mini上的数字输出功能：</p>
<pre><code>
int BASE = 2;
int NUM = 12;
int index = 0;

void setup()
{
  for (int i = BASE; i < BASE + NUM; i ++) {
    pinMode(i, OUTPUT);
  }
}

void loop()
{
  for (int i = BASE; i < BASE + NUM; i ++) {
    digitalWrite(i, LOW);
  }
  digitalWrite(BASE + index, HIGH);
  index = (index + 1) % NUM;
  delay(100);
}
</code></pre>
<p>这次还算顺利，上面的程序通过USB适配器很轻松地就下载到了Arduino Mini中，并且将LED接在相应的数字管脚上，都可以看到LED一闪一闪的效果。</p>
<p>现在基本能够确定USB Adapter的工作是正常的，Arduino Mini也部分正常工作了，接下来还需要验证的功能包括Arduino Mini的模拟输入部分，以及9V电源部分。此时上次买的直流电源就派上用场了，直接把输出调整到9V，接到Arduino Mini的9V和GND端口，发现刚才写入的程序完全正常，并且用万用表量了Arduino Mini上的5V管脚，电压也是5V <img src='http://blog.flamingoeda.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p><a href="http://blog.booksforce.com/wp-content/uploads/2008/04/arduino_mini_adapter_9v.png"></p>
<p style="text-align: center"><img src="http://blog.booksforce.com/wp-content/uploads/2008/04/arduino_mini_adapter_9v.png" /></p>
<p></a></p>
<p>今天先到这里，明天想想如何验证模拟输入部分，休息，休息，好好休息！</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.flamingoeda.com/2008/04/21/arduino-mini%e4%b8%8eusb%e9%80%82%e9%85%8d%e5%99%a8/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>与Arduino Mini的首次博弈</title>
		<link>http://blog.flamingoeda.com/2008/04/21/%e4%b8%8earduino-mini%e7%9a%84%e9%a6%96%e6%ac%a1%e5%8d%9a%e5%bc%88/</link>
		<comments>http://blog.flamingoeda.com/2008/04/21/%e4%b8%8earduino-mini%e7%9a%84%e9%a6%96%e6%ac%a1%e5%8d%9a%e5%bc%88/#comments</comments>
		<pubDate>Sun, 20 Apr 2008 16:10:41 +0000</pubDate>
		<dc:creator>flamingoeda</dc:creator>
				<category><![CDATA[Arduino]]></category>
		<category><![CDATA[DIY]]></category>

		<guid isPermaLink="false">http://blog.booksforce.com/2008/04/21/%e4%b8%8earduino-mini%e7%9a%84%e9%a6%96%e6%ac%a1%e5%8d%9a%e5%bc%88/</guid>
		<description><![CDATA[制作Arduino Mini的念头由来已久，但直到差不多四周之前才花了一周左右的时间来画Arduimo Mini的原理图和PCB，然后送去工厂做板又一直拖了两周才拿到电路板。这周末总算可以动手焊接了，难度不算太大，唯一能算上的麻烦的就是板子实在太小（长3.1厘米宽1.9厘米）了，要在上面定位表贴元件可不是件轻松的事情。 Arduino Mini采用的是贴片版本的ATmega168，本来打算买一个编程器转换座，直接在编程器上将Bootloader写进去，但一打听价格居然要300多块，最终决定还是决定用自己做的USB编程器。于是在实验板上搭了一个简单的Arduino Mini下载电路，并连接上USB编程器： 之后整整一个下午加一个晚上就浪费在如何将Bootloader下载到Arduino Mini里了。先是USB编程器组装好之后，在Windows上怎么也找不到这一USB设备，好在上次有成功的经验，知道电路肯定没有问题，来来回回研究了好几轮熔丝位的设置，USB编程器总算是可以被Windows识别出来了。期间一直纳闷为啥当初没有把送Whale的那个编程器的熔丝位读出来:( 接下去的过程更加令人郁闷，用avrdude怎么也无法与Arduino Mini正确地通信上，期间一度怀疑是不是Arduino Mini的板子画得有问题，但一根一根线用万用表查看似乎又是正确的，至少是ISP这一部分。于是乎不断地检查复位电路、晶振电路、ISP接口，时间就这样一点一点地流去，一点进展也没有。上网查了不少资料，唯一得到的经验就是用一个LED来检查MISO、MOSI、SCK和RST几个管脚，来看这几个信号是不是正确的，在我的Arduio Mini上，MOSI是没有任何反应的。 现象只能说明一点，ATmega168没有给出任何反馈，但一个最简单的单片机系统就只是依赖一个晶振电路和RST电路，这两部分在我看来都没有什么问题，倒底是怎么回事呢？ 最后连我自己都没有想清楚为什么会去检查USB编程器，并在JP2上加了一个跳线，问题得到解决。原因是这样的，默认出厂的ATmega168使用的是内部晶振，频率非常低，而我做的这个USB编程器在芯片频率很低的情况下必须使用JP2这个跳线。这一情况在上次烧写ATtiny的时候也遇到过，并且也是费了好大的劲才解决，看来上次得到的教训还是不够深刻啊。 再后来的过程就算比较正常了，使用avrdude设置Arduino Mini的熔丝位，并下载Bootloader： avrdude -c usbasp -p m168 -V -e -U lock:w:0x3F:m -U hfuse:w:0xDF:m -U lfuse:w:0xFF:m -U efuse:w:0xf8:m avrdude -c usbasp -p m168 -V -D -U flash:w:ATmegaBOOT_168_diecimila.hex:i avrdude -c usbasp -p m168 -V -U lock:w:0xCF:m 第一步老提示我扩展熔丝位要从0xf8变成0，我选了N，没有发现什么问题，再用智峰的ProgISP读出来也是0xf8。Bootloader下载完后，在数字I/O的13号管脚上接了一个小LED，发现是一闪一闪的，总算第一步算是完成了。兴许后面还会有别的问题，留到以后再慢慢解决吧，今天的确没有时间和精力再去纠缠了。 最近的问题是想做的事情和东西很多，自己得保持一个合适的速度和计划，还是觉得时间不够花，效率又不是那么高，不过只是玩玩，无所谓了:)]]></description>
			<content:encoded><![CDATA[<p>制作Arduino Mini的念头由来已久，但直到差不多四周之前才花了一周左右的时间来画Arduimo Mini的原理图和PCB，然后送去工厂做板又一直拖了两周才拿到电路板。这周末总算可以动手焊接了，难度不算太大，唯一能算上的麻烦的就是板子实在太小（长3.1厘米宽1.9厘米）了，要在上面定位表贴元件可不是件轻松的事情。</p>
<p align="center"> <a href="http://blog.booksforce.com/wp-content/uploads/2008/04/arduino_mini_assembled.png"><img src="http://blog.booksforce.com/wp-content/uploads/2008/04/arduino_mini_assembled.png" /></a></p>
<p>Arduino Mini采用的是贴片版本的ATmega168，本来打算买一个编程器转换座，直接在编程器上将Bootloader写进去，但一打听价格居然要300多块，最终决定还是决定用自己做的USB编程器。于是在实验板上搭了一个简单的Arduino Mini下载电路，并连接上USB编程器：</p>
<p align="center"> <a href="http://blog.booksforce.com/wp-content/uploads/2008/04/arduino_mini_usbasp.png"><img src="http://blog.booksforce.com/wp-content/uploads/2008/04/arduino_mini_usbasp.png" /></a></p>
<p> 之后整整一个下午加一个晚上就浪费在如何将Bootloader下载到Arduino Mini里了。先是USB编程器组装好之后，在Windows上怎么也找不到这一USB设备，好在上次有成功的经验，知道电路肯定没有问题，来来回回研究了好几轮熔丝位的设置，USB编程器总算是可以被Windows识别出来了。期间一直纳闷为啥当初没有把送Whale的那个编程器的熔丝位读出来:(</p>
<p>接下去的过程更加令人郁闷，用avrdude怎么也无法与Arduino Mini正确地通信上，期间一度怀疑是不是Arduino Mini的板子画得有问题，但一根一根线用万用表查看似乎又是正确的，至少是ISP这一部分。于是乎不断地检查复位电路、晶振电路、ISP接口，时间就这样一点一点地流去，一点进展也没有。上网查了不少资料，唯一得到的经验就是用一个LED来检查MISO、MOSI、SCK和RST几个管脚，来看这几个信号是不是正确的，在我的Arduio Mini上，MOSI是没有任何反应的。</p>
<p>现象只能说明一点，ATmega168没有给出任何反馈，但一个最简单的单片机系统就只是依赖一个晶振电路和RST电路，这两部分在我看来都没有什么问题，倒底是怎么回事呢？</p>
<p>最后连我自己都没有想清楚为什么会去检查USB编程器，并在JP2上加了一个跳线，问题得到解决。原因是这样的，默认出厂的ATmega168使用的是内部晶振，频率非常低，而我做的这个USB编程器在芯片频率很低的情况下必须使用JP2这个跳线。这一情况在上次烧写ATtiny的时候也遇到过，并且也是费了好大的劲才解决，看来上次得到的教训还是不够深刻啊。</p>
<p align="center"> <a href="http://blog.booksforce.com/wp-content/uploads/2008/04/arduino_mini_jumper.png"><img src="http://blog.booksforce.com/wp-content/uploads/2008/04/arduino_mini_jumper.png" /></a></p>
<p>再后来的过程就算比较正常了，使用avrdude设置Arduino Mini的熔丝位，并下载Bootloader：</p>
<p>avrdude -c usbasp -p m168 -V -e -U lock:w:0x3F:m -U hfuse:w:0xDF:m -U lfuse:w:0xFF:m -U efuse:w:0xf8:m<br />
avrdude -c usbasp -p m168 -V -D -U flash:w:ATmegaBOOT_168_diecimila.hex:i<br />
avrdude -c usbasp -p m168 -V -U lock:w:0xCF:m</p>
<p>第一步老提示我扩展熔丝位要从0xf8变成0，我选了N，没有发现什么问题，再用智峰的ProgISP读出来也是0xf8。Bootloader下载完后，在数字I/O的13号管脚上接了一个小LED，发现是一闪一闪的，总算第一步算是完成了。兴许后面还会有别的问题，留到以后再慢慢解决吧，今天的确没有时间和精力再去纠缠了。</p>
<p>最近的问题是想做的事情和东西很多，自己得保持一个合适的速度和计划，还是觉得时间不够花，效率又不是那么高，不过只是玩玩，无所谓了:)</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.flamingoeda.com/2008/04/21/%e4%b8%8earduino-mini%e7%9a%84%e9%a6%96%e6%ac%a1%e5%8d%9a%e5%bc%88/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>DIY Wiring: 外部电源和EEPROM</title>
		<link>http://blog.flamingoeda.com/2008/01/28/diy-wiring-%e5%a4%96%e9%83%a8%e7%94%b5%e6%ba%90%e5%92%8ceeprom/</link>
		<comments>http://blog.flamingoeda.com/2008/01/28/diy-wiring-%e5%a4%96%e9%83%a8%e7%94%b5%e6%ba%90%e5%92%8ceeprom/#comments</comments>
		<pubDate>Mon, 28 Jan 2008 14:22:44 +0000</pubDate>
		<dc:creator>flamingoeda</dc:creator>
				<category><![CDATA[DIY]]></category>
		<category><![CDATA[Wiring]]></category>

		<guid isPermaLink="false">http://blog.booksforce.com/2008/01/28/diy-wiring-%e5%a4%96%e9%83%a8%e7%94%b5%e6%ba%90%e5%92%8ceeprom/</guid>
		<description><![CDATA[整个Wiring最后两部分电路是外部电源和EEPROM。外部电源电路与Arduino上的基本没有什么区别，采用的也是78M05这样的电源芯片，相应的元件清单如下： 类型 标记 数量 规格 电源芯片 IC4 1 LM78M05 电容 C10, C11 2 100nF 电容 C12, C13 2 100uF 整流二极管 D1 1 1N4004 Wiring电路上带一个4K字节的EEPROM，其作用是可以用来保存一些程序的数据，如用户的配置数据等。EEPROM的电路部分并不算复杂，估计大部分工作都在于软件上，下面是相应的元件列表： 类型 标记 数量 规格 EEPROM芯片 IC3 1 93C46 电阻 R5 1 10K, 1/4W 电阻 R6 1 2.2K, 1/4W 最后焊接完的效果如下图所示： 为了对其中的EEPROM功能进行验证，我试验了另外一个Wiring工程： #include char val; void setup() { if(EEPROM.read(16) != 'F') { EEPROM.write(16, [...]]]></description>
			<content:encoded><![CDATA[<p>整个Wiring最后两部分电路是外部电源和EEPROM。外部电源电路与Arduino上的基本没有什么区别，采用的也是78M05这样的电源芯片，相应的元件清单如下：</p>
<p><center></p>
<table border="1">
<tr>
<th>类型</th>
<th>标记</th>
<th>数量</th>
<th>规格</th>
</tr>
<tr>
<td>电源芯片</td>
<td>IC4</td>
<td>1</td>
<td>LM78M05</td>
</tr>
<tr>
<td valign="top">电容</td>
<td valign="top">C10, C11</td>
<td valign="top">2</td>
<td valign="top">100nF</td>
</tr>
<tr>
<td valign="top">电容</td>
<td valign="top">C12, C13</td>
<td valign="top">2</td>
<td valign="top">100uF</td>
</tr>
<tr>
<td valign="top">整流二极管</td>
<td valign="top">D1</td>
<td valign="top">1</td>
<td valign="top">1N4004</td>
</tr>
</table>
<p></center>Wiring电路上带一个4K字节的EEPROM，其作用是可以用来保存一些程序的数据，如用户的配置数据等。EEPROM的电路部分并不算复杂，估计大部分工作都在于软件上，下面是相应的元件列表： <center></p>
<table border="1">
<tr>
<th>类型</th>
<th>标记</th>
<th>数量</th>
<th>规格</th>
</tr>
<tr>
<td>EEPROM芯片</td>
<td>IC3</td>
<td>1</td>
<td>93C46</td>
</tr>
<tr>
<td valign="top">电阻</td>
<td valign="top">R5</td>
<td valign="top">1</td>
<td valign="top">10K, 1/4W</td>
</tr>
<tr>
<td valign="top">电阻</td>
<td valign="top">R6</td>
<td valign="top">1</td>
<td valign="top">2.2K, 1/4W</td>
</tr>
</table>
<p></center>最后焊接完的效果如下图所示：<a href="http://blog.booksforce.com/wp-content/uploads/2008/01/wiring_diy_power_circuit.png"></a></p>
<p style="text-align: center"><a href="http://blog.booksforce.com/wp-content/uploads/2008/01/wiring_diy_power_circuit.png"><img src="http://blog.booksforce.com/wp-content/uploads/2008/01/wiring_diy_power_circuit.png" /></a></p>
<p>为了对其中的EEPROM功能进行验证，我试验了另外一个Wiring工程：</p>
<pre><code>
#include <WEEPROM.h>
char val; 

void setup() {
  if(EEPROM.read(16) != 'F') {
    EEPROM.write(16, 'F');
  }
  val = EEPROM.read(16);

  pinMode(48, OUTPUT);
} 

void loop() {
  if( 'F' == val) {
    digitalWrite(48, HIGH);
  }
  delay(100);
}
</code></pre>
<p>上述Wiring工程在初始化过程中先读取EEPROM中地址为16的字节单元中的值，并在其不是字符F的情况下，往该地址单元中写入字符F，然后再从中读取这来。这样如果EEPROM正常工作的话，就能够保证变量val在setup()函数执行完后，其值一定是字符F。在loop()函数中，如果检查出val的值确实是字符F，就点亮Wiring板子上自带的LED（接在数字I/O的48管脚上）。</p>
<p>习惯了Arduino程序下载时不需要按复位键，并且在下载完成后也不需要按复位键，刚接触到Wiring时对其在这两个位置上还需要按复位键的做法的确有些不适应:-) 真希望Wiring在接下去的版本中能对这一地方进行改进。昨天发邮件问Wiring的作者为什么不把bootloader的源码公布出来，得到的答案居然是他把源码弄丢了，现在只有二进建的版本，我晕&#8230;</p>
<p>最后贴一张我制作的Wiring在运行上述EEPROM工程时的效果图，用的是外接电源，右侧的红灯是电源灯，左侧的绿灯是Wiring自带的LED。</p>
<p><a href="http://blog.booksforce.com/wp-content/uploads/2008/01/wiring_diy_eeprom_circuit.png"></p>
<p style="text-align: center"><img src="http://blog.booksforce.com/wp-content/uploads/2008/01/wiring_diy_eeprom_circuit.png" /></p>
<p></a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.flamingoeda.com/2008/01/28/diy-wiring-%e5%a4%96%e9%83%a8%e7%94%b5%e6%ba%90%e5%92%8ceeprom/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>DIY Wiring: AVR电路</title>
		<link>http://blog.flamingoeda.com/2008/01/27/diy-wiring-avr%e7%94%b5%e8%b7%af/</link>
		<comments>http://blog.flamingoeda.com/2008/01/27/diy-wiring-avr%e7%94%b5%e8%b7%af/#comments</comments>
		<pubDate>Sun, 27 Jan 2008 14:58:59 +0000</pubDate>
		<dc:creator>flamingoeda</dc:creator>
				<category><![CDATA[DIY]]></category>
		<category><![CDATA[Wiring]]></category>

		<guid isPermaLink="false">http://blog.booksforce.com/2008/01/27/diy-wiring-avr%e7%94%b5%e8%b7%af/</guid>
		<description><![CDATA[Wiring的核心是一个ATmega128单片机，也是整个电路中最复杂和最容易出错的部分。焊接上因为有了之前FT232BL的相关经验，并没有遇上太大的麻烦，而剩下的一些贴片元件基本上也不算太难。唯一遇到的问题可能就是这些元件实在太小，本人的眼神又不算太好，经常弄飞一两个，掉在地上找不着了:) 类型 标记 数量 规格 AVR单片机 IC1 1 ATmega128-16AU 电容 C6, C7 2 22pF 电容 C8, C9 1 100nF 电阻 R7 1 10K 电阻 R8, R9 2 1.8k 电阻 R11 1 270 电阻 R14, R15 2 1K 晶振 Q2 1 16M, 二脚直插式 晶振 Q3 1 32.768K, 32C31, 四脚表贴式 按钮 RESET 1 四脚直插式 发光二极管 PWR 1 [...]]]></description>
			<content:encoded><![CDATA[<p>Wiring的核心是一个ATmega128单片机，也是整个电路中最复杂和最容易出错的部分。焊接上因为有了之前FT232BL的相关经验，并没有遇上太大的麻烦，而剩下的一些贴片元件基本上也不算太难。唯一遇到的问题可能就是这些元件实在太小，本人的眼神又不算太好，经常弄飞一两个，掉在地上找不着了:)</p>
<p><center></p>
<table border="1">
<tr>
<th>类型</th>
<th>标记</th>
<th>数量</th>
<th>规格</th>
</tr>
<tr>
<td>AVR单片机</td>
<td>IC1</td>
<td>1</td>
<td>ATmega128-16AU</td>
</tr>
<tr>
<td valign="top">电容</td>
<td valign="top">C6, C7</td>
<td valign="top">2</td>
<td valign="top">22pF</td>
</tr>
<tr>
<td valign="top">电容</td>
<td valign="top">C8, C9</td>
<td valign="top">1</td>
<td valign="top">100nF</td>
</tr>
<tr>
<td valign="top">电阻</td>
<td valign="top">R7</td>
<td valign="top">1</td>
<td valign="top">10K</td>
</tr>
<tr>
<td valign="top">电阻</td>
<td valign="top">R8, R9</td>
<td valign="top">2</td>
<td valign="top">1.8k</td>
</tr>
<tr>
<td valign="top">电阻</td>
<td valign="top">R11</td>
<td valign="top">1</td>
<td valign="top">270</td>
</tr>
<tr>
<td valign="top">电阻</td>
<td valign="top">R14, R15</td>
<td valign="top">2</td>
<td valign="top">1K</td>
</tr>
<tr>
<td valign="top">晶振</td>
<td valign="top">Q2</td>
<td valign="top">1</td>
<td valign="top">16M, 二脚直插式</td>
</tr>
<tr>
<td valign="top">晶振</td>
<td valign="top">Q3</td>
<td valign="top">1</td>
<td valign="top">32.768K, 32C31, 四脚表贴式</td>
</tr>
<tr>
<td valign="top">按钮</td>
<td valign="top">RESET</td>
<td valign="top">1</td>
<td valign="top">四脚直插式</td>
</tr>
<tr>
<td valign="top">发光二极管</td>
<td valign="top">PWR</td>
<td valign="top">1</td>
<td valign="top">红色</td>
</tr>
<tr>
<td valign="top">发光二极管</td>
<td valign="top">LED</td>
<td valign="top">1</td>
<td valign="top">绿色</td>
</tr>
<tr>
<td valign="top">10P引脚座</td>
<td valign="top">ISP</td>
<td valign="top">1</td>
<td valign="top">黑色</td>
</tr>
</table>
<p></center>最后焊好的效果图： <a href="http://blog.booksforce.com/wp-content/uploads/2008/01/wiring_diy_avr_circuit.png"></a></p>
<p style="text-align: center"><a href="http://blog.booksforce.com/wp-content/uploads/2008/01/wiring_diy_avr_circuit.png"><img src="http://blog.booksforce.com/wp-content/uploads/2008/01/wiring_diy_avr_circuit.png" /></a></p>
<p>Wiring的bootloader是事先驻留在ATmega128里的一小段程序，它的作用接收来自于Wiring IDE的命令，实现Wiring工程的下载。往AVR芯片里烧bootloader是非常关键的一步，同时也是对芯片能否正常工作做初步的检测，AVR系列芯片都提供ISP接口，借助这一接口和PonyProg这样的软件，就能够实现对bootloader的烧写。</p>
<p>早先就听网友说过Wiring的bootloader在Wiring的网站上找不到，试了一下果然如些，难怪Wiring不如Arduino那么流行;-)  没有办法，按照论坛里的提示，给作者发了一个邮件要bootloader，等了一天拿到bootloader的HEX文件。</p>
<p>有了之前DIY Arduino的经验，AVR熔丝位的设置这回一开始就考虑到了，按照<a href="http://www.avride.com/article/wiring/" title="这篇文单">网上搜索到的文章</a>里的说明，下图在PonyProg中为ATmega128设置的熔丝位：</p>
<p><a href="http://blog.booksforce.com/wp-content/uploads/2008/01/wiring_diy_avr_fuse.png"></a></p>
<p style="text-align: center"><a href="http://blog.booksforce.com/wp-content/uploads/2008/04/wiring_diy_avr_fuse.png"><img src="http://blog.booksforce.com/wp-content/uploads/2008/04/wiring_diy_avr_fuse.png" width="460"/></a></p>
<p>接下去的过程比较顺利，用PongProg和自制的并口下载线成功地将bootloader烧写到Wiring上的ATmega128中，由于ATmega128的Flash有128K，所以相应的烧写时间比较长。</p>
<p>最后一步就是如何将Wiring程序下载到Wiring板上了，这与在Arduino上是一样的。下面是我试验的第一个Wiring程序：</p>
<pre><code>
int ledPin = 0;

void setup()
{
  pinMode(ledPin, OUTPUT);
}

void loop()
{
  digitalWrite(ledPin, HIGH);
  delay(1000);
  digitalWrite(ledPin, LOW);
  delay(1000);
}
</code></pre>
<p>该程序比较简单，只是不断地点亮接在数字I/O管脚0上的LED，实验成功！之前我担心最有可能出现问题的电路部分基本算是调试成功。当然，之后要一个一个验证每个管脚的功能，一共50个，哈哈:)</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.flamingoeda.com/2008/01/27/diy-wiring-avr%e7%94%b5%e8%b7%af/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>DIY Wiring: USB电路</title>
		<link>http://blog.flamingoeda.com/2008/01/13/diy-wiring-usb%e7%94%b5%e8%b7%af/</link>
		<comments>http://blog.flamingoeda.com/2008/01/13/diy-wiring-usb%e7%94%b5%e8%b7%af/#comments</comments>
		<pubDate>Sat, 12 Jan 2008 16:05:53 +0000</pubDate>
		<dc:creator>flamingoeda</dc:creator>
				<category><![CDATA[DIY]]></category>
		<category><![CDATA[Wiring]]></category>

		<guid isPermaLink="false">http://blog.booksforce.com/2008/01/13/diy-wiring-usb%e7%94%b5%e8%b7%af/</guid>
		<description><![CDATA[万事开头难，最后我挑了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 绿色 [...]]]></description>
			<content:encoded><![CDATA[<p>万事开头难，最后我挑了USB这部分电路开始焊接和调试，一来这部分电路在Arduino上是基本一致的，二来这部分电路可以给板子上的其他部分供电，三来它还可以同PC机实现串口通信。</p>
<p>USB这部分电路采用的是FTDI公司的FT232BL芯片，算起来也焊过十多回了，因此虽然换了一个刀状的铬铁头，也没有遇到什么大的麻烦。芯片焊好之后，再把电容、电阻、LED、晶振焊好，头一回焊贴片元件，左右开工，总算一一搞定:) 下面是该部分电路所用到的元件，由于手头没有1k的电阻，所以用来给发光二极管限流用的电阻R12和R13暂时用1.5k的电阻替代了。<br />
<center></p>
<table border="1">
<tr>
<th>类型</th>
<th>标记</th>
<th>数量</th>
<th>规格</th>
</tr>
<tr>
<td>USB转串口芯片</td>
<td>IC2</td>
<td>1</td>
<td>FT232BL</td>
</tr>
<tr>
<td valign="top">电容</td>
<td valign="top">C1</td>
<td valign="top">1</td>
<td valign="top">10nF</td>
</tr>
<tr>
<td valign="top">电容</td>
<td valign="top">C2</td>
<td valign="top">1</td>
<td valign="top">33nF</td>
</tr>
<tr>
<td valign="top">电容</td>
<td valign="top">C3</td>
<td valign="top">1</td>
<td valign="top">100nF</td>
</tr>
<tr>
<td valign="top">电容</td>
<td valign="top">C4, C5</td>
<td valign="top">2</td>
<td valign="top">22pF</td>
</tr>
<tr>
<td valign="top">电阻</td>
<td valign="top">R1, R2</td>
<td valign="top">2</td>
<td valign="top">27</td>
</tr>
<tr>
<td valign="top">电阻</td>
<td valign="top">R3</td>
<td valign="top">1</td>
<td valign="top">1.5k</td>
</tr>
<tr>
<td valign="top">电阻</td>
<td valign="top">R4</td>
<td valign="top">1</td>
<td valign="top">470</td>
</tr>
<tr>
<td valign="top">电阻</td>
<td valign="top">R12, R13</td>
<td valign="top">2</td>
<td valign="top">1k</td>
</tr>
<tr>
<td valign="top">晶振</td>
<td valign="top">Q1</td>
<td valign="top">1</td>
<td valign="top">6M</td>
</tr>
<tr>
<td valign="top">发光二极管</td>
<td valign="top">RX, TX</td>
<td valign="top">2</td>
<td valign="top">绿色</td>
</tr>
</table>
<p></center>焊上USB接头之后，测了一下板子上5V和Gnd两个引脚间的电阻，在确认没有短路之后用USB线连到PC上，没有任何反应。打开原理图后，首先发现的是跳线JP1没有接。JP1的设计与Arduino上是完全一样的，其作用是为板子选择供电：USB电源还是外接电源。焊上JP1引脚并设置好跳线，再次插上USB线，还是没有任何反应！心底隐隐有一些不祥的感觉，拿出万用表来开始一段一段检查。USB接口上的电压是正确的，但FT232BL芯片上的电压为0， 看起来像是什么地方断路了。再次打开原理图，这次发现的是保险丝F1没有焊，它的作用是对FT232BL进行保护，电流过大时自动切断对FT232BL的供电。此时没有接F1，效果正好与电流过大保险丝烧断时的效果是一样的。<br />
<center></p>
<table border="1">
<tr>
<th>类型</th>
<th>标记</th>
<th>数量</th>
<th>规格</th>
</tr>
<tr>
<td>插针</td>
<td>JP1</td>
<td>1</td>
<td>3脚</td>
</tr>
<tr>
<td>保险丝</td>
<td>F1</td>
<td>1</td>
<td>500mA</td>
</tr>
</table>
<p></center><br />
焊上保险丝后再次接上USB线，这回听到了熟悉的USB设备连接上的提示音，在设备管理器中也能找到这一串口了：</p>
<p align="center"><a href="http://blog.booksforce.com/wp-content/uploads/2008/01/wiring_diy_usb_device.png"><img src="http://blog.booksforce.com/wp-content/uploads/2008/01/wiring_diy_usb_device.png" /></a></p>
<p>心里一块石头总算落地了，不过现在还很难说USB这部分电路是不是已经正常工作了， 因为无法对数据发送和接收进行完全的测试。我只是简单地用串口调试工具打开了COM4，并试着发送一些数据给FT232BL，看到的现象是发光二极管TX在不断地闪烁，或许能够说明这部分电路已经基本可以了。当然，最终的结论只能等到ATmega 128那部分的电路完成之后，真正实际串口数据的收发时才会知道。</p>
<p>无论如何，USB这部分电路基本算是完成了，贴一张焊好USB电路的板子局部图：</p>
<p align="center"> <a href="http://blog.booksforce.com/wp-content/uploads/2008/01/wiring_diy_usb_circuit.png"><img src="http://blog.booksforce.com/wp-content/uploads/2008/01/wiring_diy_usb_circuit.png" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.flamingoeda.com/2008/01/13/diy-wiring-usb%e7%94%b5%e8%b7%af/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>DIY Wiring: PCB</title>
		<link>http://blog.flamingoeda.com/2008/01/12/diy-wiring-pcb/</link>
		<comments>http://blog.flamingoeda.com/2008/01/12/diy-wiring-pcb/#comments</comments>
		<pubDate>Fri, 11 Jan 2008 16:25:49 +0000</pubDate>
		<dc:creator>flamingoeda</dc:creator>
				<category><![CDATA[DIY]]></category>
		<category><![CDATA[Wiring]]></category>

		<guid isPermaLink="false">http://blog.booksforce.com/2008/01/12/diy-wiring-pcb/</guid>
		<description><![CDATA[接触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的重任就要落在它的身上了，期待中&#8230;]]></description>
			<content:encoded><![CDATA[<p>接触Arduino一段时间之后，渐渐发现其实它只能适应用于一些比较简单的应用场景，对于稍微复杂一些的互动应用来讲，一般会需要有更多的管脚，更快的处理速度，以及更大的存储空间。</p>
<p>Arduino在设计和实现时借鉴了<a href="www.wiring.org.co/" target="_blank">Wiring</a>的很多做法，奇怪的是Wiring远远不及Arduino成功，这可能跟Wiring项目组没有大力推广有关系。在国内目前还买不到Wiring，从国外购买的话又需要大把的银子，犹豫了好长时间后还是没有能够挡得住自己的冲动，决定DIY！</p>
<p>Wiring采用的是ATmega128，存储空间为128K，带有50个数字I/O管脚和8个模块输入，以及6个PWM，整体性能比Arduino高了一大截，复杂性当然也是直线上升。对于电子高手们来讲估计不是个大问题，但对我这个完全自学的业余选手来讲，自然又是一个不小的挑战:)</p>
<p>原理图和电路图断断续续估计画了三四周，而且第一次开始采用贴片元件，自然又是恶补了一顿有关元件封装的知识，还从电子市场买了一些元件来比划。 这一过程中最大的收获就是开始认识到Eagle CAD的确是一个不错的电路图软件，可惜国内不管专业还是业余都用Protel。现在用的共享版只能画两层板，对我来讲是够了的，等有需求同时又有银子的时候，一定买个专业版的License。</p>
<p>电路板送到工厂后又足足等了一周，今天总算拿到了五块PCB板，这回做的是黑色的板子：</p>
<p align="center"> <a href="http://blog.booksforce.com/wp-content/uploads/2008/01/wiring_diy_pcb.png"><img src="http://blog.booksforce.com/wp-content/uploads/2008/01/wiring_diy_pcb.png" /></a></p>
<p>不知专业人士是如何检查电路板的，我只做了有限的检查，估计应用会有错误，做出的这五块只当拿来练手，之前已经做好了充分的心理准备，就当是学习和练手。</p>
<p>这一周工作比较忙，抽空做的唯一的事情就是去淘了一个二手的示波器，已经在路上了。将很大的期望放在这个即将到来的新伙伴身上，因为DIY Wiring的重任就要落在它的身上了，期待中&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.flamingoeda.com/2008/01/12/diy-wiring-pcb/feed/</wfw:commentRss>
		<slash:comments>15</slash:comments>
		</item>
		<item>
		<title>Arduino XBee模块使用手册</title>
		<link>http://blog.flamingoeda.com/2007/11/28/arduino-xbee%e6%a8%a1%e5%9d%97%e4%bd%bf%e7%94%a8%e6%89%8b%e5%86%8c/</link>
		<comments>http://blog.flamingoeda.com/2007/11/28/arduino-xbee%e6%a8%a1%e5%9d%97%e4%bd%bf%e7%94%a8%e6%89%8b%e5%86%8c/#comments</comments>
		<pubDate>Wed, 28 Nov 2007 15:51:09 +0000</pubDate>
		<dc:creator>flamingoeda</dc:creator>
				<category><![CDATA[Arduino]]></category>
		<category><![CDATA[DIY]]></category>
		<category><![CDATA[手册]]></category>

		<guid isPermaLink="false">http://blog.booksforce.com/2007/11/28/arduino-xbee%e6%a8%a1%e5%9d%97%e4%bd%bf%e7%94%a8%e6%89%8b%e5%86%8c/</guid>
		<description><![CDATA[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 &#38; 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技术了;-)]]></description>
			<content:encoded><![CDATA[<p><span style="color: black; font-family: 宋体">XBee是美国</span><span style="color: black" lang="EN-US"><a href="http://www.maxstream.net/" target="_blank">MaxStream</a>公司基于ZigBee技术的一个无线传输模块，该模块使用起来非常简单，我们只需要简单的把数据输入到一个模块，它就能自动的被发送到无线连接的另一端，同时也支持AT 命令进行高级配置。</span></p>
<p>这里介绍的Arduino XBee模块包括一块针对Arduino量身定制的扩展板，以及一个XBee Pro模块：</p>
<p><a href="http://blog.booksforce.com/wp-content/uploads/2007/11/arduino_xbee_manual_shield.png"></a></p>
<p style="text-align: center"><a href="http://blog.booksforce.com/wp-content/uploads/2007/11/arduino_xbee_manual_shield.png"><img src="http://blog.booksforce.com/wp-content/uploads/2007/11/arduino_xbee_manual_shield.png" /></a></p>
<p>使用这样一对Arduino XBee模块，我们就可以实现一个最简单的包含两个结点的ZigBee网络，完成Arduino之间的无线通信。ZigBee技术本身也支持多个结点组成的复杂网络。</p>
<p align="center"> <a href="http://blog.booksforce.com/wp-content/uploads/2007/11/arduino_xbee_manual_module.png"><img src="http://blog.booksforce.com/wp-content/uploads/2007/11/arduino_xbee_manual_module.png" /></a></p>
<p>XBee模块在正常工作之前必须进行相应的设置。对XBee模块的设置既可以按照<a href="http://site.gridconnect.com/docs/MaxStream/XBee_Manual_GC.pdf" target="_blank">XBee手册</a>里介绍的AT指令，通过串行终端完成，也可以借助<a href="http://www.maxstream.net/support/xctu/setup_x-ctu.exe" target="_blank">X-CTU</a>这一工具来完成，你可以在这里<a href="http://blog.booksforce.com/wp-content/uploads/2007/11/setup_x-ctu.exe" target="_blank">下载</a>本文用到的版本进行安装。</p>
<p>将Arduino XBee扩展板连接到Arduino母板上，然后将Arduino XBee扩展板上的两个跳线置于USB一端，这样X-CTU才能通过Arduino的USB接口对XBee模块进行配置：</p>
<p align="center"><a href="http://blog.booksforce.com/wp-content/uploads/2007/11/arduino_xbee_manual_jumper.png"><img src="http://blog.booksforce.com/wp-content/uploads/2007/11/arduino_xbee_manual_jumper.png" /></a></p>
<p><font color="#800000">注意，下面的步骤会用到Arduino的USB接口以及TX和RX管脚，所以请确保运行在Arduion上的工程里没有对串行接口的操作，或者将AVR芯片从Arduino板上取下之后再进行下面的步骤。</font></p>
<p>在用USB电缆将Arduino与PC机连接好之后， 运行X-CTU软件。首先我们在“PC Settings”中里选择对应的通信端口，并设置好波特率等参数。XBee模块出厂里默认的设置为9600，8N1。</p>
<p align="center"> <a href="http://blog.booksforce.com/wp-content/uploads/2007/11/arduino_xbee_manual_settings.png"><img src="http://blog.booksforce.com/wp-content/uploads/2007/11/arduino_xbee_manual_settings.png" /></a></p>
<p> 此时我们可以单击“Test/Query”按钮，来测试是否能够正确地连接上XBee模块。如果一切正常，我们将看到如下的对话框。如果通信参数设置都是正确的，但仍然无法与XBee模块通信上，则请检查USB连线和Arduino XBee扩展板上的跳线，必要的时候可以拨掉Arduino上的ATmega单片机再试。</p>
<p align="center"><a href="http://blog.booksforce.com/wp-content/uploads/2007/11/arduino_xbee_manual_test.png"><img src="http://blog.booksforce.com/wp-content/uploads/2007/11/arduino_xbee_manual_test.png" /></a></p>
<p> 测试正常之后转到“Modem Configuration”。首先单击“Modem Parameters and Firmware”中的“Read”按钮读出XBee模块中的当前参数，接着在读出的“Networking &amp; Security”中将“Channel”设为“C”，将“PAN ID”设置为“1234”。</p>
<p align="center"><a href="http://blog.booksforce.com/wp-content/uploads/2007/11/arduino_xbee_manual_configuration.png"><img src="http://blog.booksforce.com/wp-content/uploads/2007/11/arduino_xbee_manual_configuration.png" /></a></p>
<p> 我们在这里要实现的是一个最简单的点对点网络，所以只需要对另外一个Arduino XBee模块做完全相同的设置就可以了。两个Arduino XBee模块都设置好之后，运行两个X-CTU并在“PC Settings”中选择不同的通信接口，分别对两个Arduino XBee模块进行控制。</p>
<p>在X-CTU的“Terminal”中我们可以手工输入需要XBee模块传输的数据，这些数据在收到之后会被自动发送到另一个XBee模块，并在另一个X-CTU的“Terminal”中显示出来。其中蓝色的表示发送的数据，红色的表示接收的数据：</p>
<p align="center"> <a href="http://blog.booksforce.com/wp-content/uploads/2007/11/arduino_xbee_manual_transmit.png"><img src="http://blog.booksforce.com/wp-content/uploads/2007/11/arduino_xbee_manual_transmit.png" /></a></p>
<p> 至此，基本说明你的Arduino XBee模块能够正常收发数据了，接下去要做的就是在Arduino工程里如何利用XBee进行无线数据的收发了。通过上面的步骤不难看出，在Arduino工程中只需要将要发送的数据通过Arduino的串行通信接口发送给XBee模块就可以了，然后在另一个Arduino模块中通过串行接口读出来就可以了。但要想要构建更加复杂的网络，就得仔细读读XBee的使用手册，并好好了解ZigBee技术了;-)</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.flamingoeda.com/2007/11/28/arduino-xbee%e6%a8%a1%e5%9d%97%e4%bd%bf%e7%94%a8%e6%89%8b%e5%86%8c/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Arduino下载线使用手册</title>
		<link>http://blog.flamingoeda.com/2007/11/17/arduino%e4%b8%8b%e8%bd%bd%e7%ba%bf%e4%bd%bf%e7%94%a8%e6%89%8b%e5%86%8c/</link>
		<comments>http://blog.flamingoeda.com/2007/11/17/arduino%e4%b8%8b%e8%bd%bd%e7%ba%bf%e4%bd%bf%e7%94%a8%e6%89%8b%e5%86%8c/#comments</comments>
		<pubDate>Sat, 17 Nov 2007 15:26:27 +0000</pubDate>
		<dc:creator>flamingoeda</dc:creator>
				<category><![CDATA[Arduino]]></category>
		<category><![CDATA[DIY]]></category>
		<category><![CDATA[手册]]></category>

		<guid isPermaLink="false">http://blog.booksforce.com/2007/11/17/arduino%e4%b8%8b%e8%bd%bd%e7%ba%bf%e4%bd%bf%e7%94%a8%e6%89%8b%e5%86%8c/</guid>
		<description><![CDATA[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&#8230;”命令进行相应的并口设置： 根据你的Arduino模块上的芯片类型，从“Device” 菜单中的“AVR micro”子菜单中选择“ATmega8”或者“ATmega168”。你也可以从工具栏上的Device下拉框中进行相应的选择： 首先从“Command”菜单中选择“Read All” 命令，从Arduino模块上读出ATmega中的当前数据和设置，其中最重要的是之后要设置的熔丝位。 然后选择“File”菜单中的“Open Program (FLASH) File&#8230;” 命令，打开“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 &#8230;”命令，打开相应的熔丝设置对话框。 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 [...]]]></description>
			<content:encoded><![CDATA[<p>Arduino使用的是Atmel公司的AVR单片机，一般为ATmega8和ATmega168，这一系列的单片机都支持ISP（In System Programmability ）编程，无需依赖昂贵的编程器就可以完成程序的下载。Arduino电路在设计上考虑到了ISP功能，也留出了相应的接口（ICSP），从而允许我们通过ISP下载线来完成bootloader的下载。</p>
<p>新买来的Arduino模块上一般都已经预先下载好了bootloader，因此上电之后就能够直接通过Arduino集成开发环境下载相应的Arduino程序。正常情况下我们在用Arduino时是不需要ISP下载线的，但在某些情况下可能会出现在Arduino集成开发环境中无法正常下载程序的现象，这很可能是由于bootloader受损所致。解决的办法就是重新将bootloader烧写到ATmega芯片中，此时你就需要用到这里介绍的ISP下载线了。</p>
<p>Arduio网站上给出的<a href="http://www.arduino.cc/en/Hacking/ParallelProgrammer" target="_blank">并口下载线电路</a>我只成功地更新过ATmega8的bootloader，而无法为Diecimila上的ATmega168下载bootloader。此外，Arduino给出的这一下载线电路过于简单，没有做相应的隔离和保护， 经常使用可能会对Atmega芯片带来一定的损害。AVR建议使用一片74HC244来隔离并口和ATmega芯片，下面是我所使用的下载线的原理图：</p>
<p align="center"><a href="http://blog.booksforce.com/wp-content/uploads/2007/11/arduino_isp_manual_schematic.png"><img src="http://blog.booksforce.com/wp-content/uploads/2007/11/arduino_isp_manual_schematic.thumbnail.png" /></a></p>
<p>以及自制的下载线：</p>
<p><a href="http://blog.booksforce.com/wp-content/uploads/2007/11/arduino_isp_manual_cable.png"></a></p>
<p style="text-align: center"><a href="http://blog.booksforce.com/wp-content/uploads/2007/11/arduino_isp_manual_cable.png"><img src="http://blog.booksforce.com/wp-content/uploads/2007/11/arduino_isp_manual_cable.png" /></a></p>
<p>使用并口下载线的时候，我们需要先到计算机的BIOS中将并口设为ECP（<font size="-1">The extended capabilities port </font>）模式，同时将I/O基地址设置成378：</p>
<p align="center"><a href="http://blog.booksforce.com/wp-content/uploads/2007/11/arduino_isp_manual_parallel.png"><img src="http://blog.booksforce.com/wp-content/uploads/2007/11/arduino_isp_manual_parallel.png" /></a></p>
<p>此时在Windows的设备管理器中，我们会发现并口已经被标记为“ECP 打印机端口”：</p>
<p align="center"><a href="http://blog.booksforce.com/wp-content/uploads/2007/11/arduino_isp_manual_devices.png"><img src="http://blog.booksforce.com/wp-content/uploads/2007/11/arduino_isp_manual_devices.png" /></a></p>
<p>用鼠标右键单击后从弹出的菜单中选择“属性”命令打开属性对话框，在“资源”页面中我们会看到相应I/O基地址的设置已经生效：</p>
<p align="center"><a href="http://blog.booksforce.com/wp-content/uploads/2007/11/arduino_isp_manual_iobase.png"><img src="http://blog.booksforce.com/wp-content/uploads/2007/11/arduino_isp_manual_iobase.png" /></a></p>
<p>现在就可以用ISP下载线连接计算机并口和Arduino上的ICSP接口了，请特别留意连接方向：ISP下载线六口插座上标有小三角的一端应该靠近 Arduino的ICSP接口上标为1的一端。虽然计算机并口能够为下载电路提供一定的电压，但一般我还是建议给Arduino模块加上5V电压（通过USB线和外接电源都可以），以保证下载过程的稳定。</p>
<p>硬件准备好之后，我们就可以通过相应的软件将bootloader烧到Arduino中。支持AVR下载线的软件比较多，如<a href="http://savannah.nongnu.org/projects/avrdude/" target="_blank">AVRDUDE</a>和<a href="http://www.sl.com.cn/" target="_blank">SLISP</a>等，我们在这里使用的是<a href="http://www.lancos.com/prog.html" target="_blank">PonyProg</a>。下载并安装好<a href="http://downloads.sourceforge.net/ponyprog/ponyprogV207a.zip" target="_blank">PonyProg v2.07a BETA</a>版本，启动PonyProg时会提示你进行相应的校准和设置工作。首先选择“Setup”菜单中的“Calibration”命令进行校准，然后再选择“Setup”菜单中的“Intreface Setup&#8230;”命令进行相应的并口设置：</p>
<p align="center"><a href="http://blog.booksforce.com/wp-content/uploads/2007/11/arduino_isp_manual_interface.png"><img src="http://blog.booksforce.com/wp-content/uploads/2007/11/arduino_isp_manual_interface.png" /></a></p>
<p>根据你的Arduino模块上的芯片类型，从“Device” 菜单中的“AVR micro”子菜单中选择“ATmega8”或者“ATmega168”。你也可以从工具栏上的Device下拉框中进行相应的选择：</p>
<p align="center"><a href="http://blog.booksforce.com/wp-content/uploads/2007/11/arduino_isp_manual_avr.png"><img src="http://blog.booksforce.com/wp-content/uploads/2007/11/arduino_isp_manual_avr.png" /></a></p>
<p>首先从“Command”菜单中选择“Read All” 命令，从Arduino模块上读出ATmega中的当前数据和设置，其中最重要的是之后要设置的熔丝位。</p>
<p>然后选择“File”菜单中的“Open Program (FLASH) File&#8230;” 命令，打开“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文件。</p>
<p>AVR通过熔丝来控制芯片内部的一些功能，比如JTAG，时钟的使用，掉电检测电压，是否允许调试等。熔丝位的配置是为Arduino下载bootloader过程中最复杂的一步，而且设置出错很有可能导致芯片锁死，所以一定要仔细。选择“Command”菜单中的“Security and Configuration Bits &#8230;”命令，打开相应的熔丝设置对话框。</p>
<p>Arduino的bootloader对熔丝位有一定的要求，主要是同外部时间设置相关的。对于串口模块采用的ATmega8来讲，相应的熔丝字节要设置成0xCA（Fuse High Byte）和0xFF（Fuse Low Byte），具体每位的含义可以参见<a href="http://wolfpaulus.com/journal/embedded/arduino3.html" target="_blank">Wolf Paulus的文章</a>。在PonyProg中对ATmega8的熔丝位设置为下图所示：</p>
<p><a href="http://blog.booksforce.com/wp-content/uploads/2007/11/arduino_isp_manual_8fuse.png"></a></p>
<p style="text-align: center"><a href="http://blog.booksforce.com/wp-content/uploads/2007/11/arduino_isp_manual_8fuse.png"><img src="http://blog.booksforce.com/wp-content/uploads/2007/11/arduino_isp_manual_8fuse.png" width="480" /></a></p>
<p>对于NG和Diecimila采用的ATmega168来讲，相应的熔丝字节要设置成0xF8（Extended Fuse Byte）, 0xDF（Fuse High Byte）和0xFF（Fuse Low Byte）。在PonyProg中对ATmega168的熔丝位设置为下图所示：</p>
<p align="center"> <a href="http://blog.booksforce.com/wp-content/uploads/2007/11/arduino_isp_manual_168fuse.png"><img src="http://blog.booksforce.com/wp-content/uploads/2007/11/arduino_isp_manual_168fuse.png" width="480" /></a></p>
<p>熔丝位设置好之后，选择“Command”菜单中的“Write All”命令，将bootloader下载到Arduino中。下载过程中Arduino上的发光二极管L会不断闪烁。下载完成之后，我们可以通过Arduino集成开发环境下载一个Arduino工程，来验证新下载的bootloader是否能够正常工作。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.flamingoeda.com/2007/11/17/arduino%e4%b8%8b%e8%bd%bd%e7%ba%bf%e4%bd%bf%e7%94%a8%e6%89%8b%e5%86%8c/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>DIY Arduino: USB模块</title>
		<link>http://blog.flamingoeda.com/2007/11/04/diy-arduino-usb%e6%a8%a1%e5%9d%97/</link>
		<comments>http://blog.flamingoeda.com/2007/11/04/diy-arduino-usb%e6%a8%a1%e5%9d%97/#comments</comments>
		<pubDate>Sun, 04 Nov 2007 14:36:51 +0000</pubDate>
		<dc:creator>developer</dc:creator>
				<category><![CDATA[Arduino]]></category>
		<category><![CDATA[DIY]]></category>

		<guid isPermaLink="false">http://blog.booksforce.com/2007/11/04/diy-arduino-usb%e6%a8%a1%e5%9d%97/</guid>
		<description><![CDATA[虽然之前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&#215;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，一切正常;-)]]></description>
			<content:encoded><![CDATA[<p>虽然之前DIY出来的串口模块一直工作得很正常，但USB无孔不入的事实让我明白DIY那款USB接口的Arduino只是迟早的事情，于是暂时放弃了超声波模块和各种基本电路，开始DIY Arduino USB模块。Arduino官方网站上为USB接口的Arduino给出了不同的名称（NG和Diecimila），两者似乎只是采用的USB芯片有所差异，电路上并没有太多的变化，但bootloader似乎也有些不同。</p>
<p>一切依旧从原理图开始，对比Arduino串口模块与USB模块的原理图后发现，原来电路图上只是将串口部分的电路用<a href="http://www.ftdichip.com/Products/FT232BM.htm" target="_blank">FT232BM</a>芯片替换了，并且将Atmega8换成容量更大的Atmega168。我在自己DIY板子上用的是FT232BL，就是FT232BM的无铅版本，电子市场里淘到的是几十块钱一片，还真是不便宜（越发应该支持串口版本了）。Atmega8同Atmega168引脚上是完全兼容的，原则上原来那款串口模块上也可以接Atmega168的，只需要更新bootloader就可以了。</p>
<p>考虑到今后焊接上的方便，除了FT232BL外大部分用的是直插元件。电路板这回坚持要工厂用蓝色油墨，又多花了好些银子，但做出来的板子拿到后感觉好像做工没有上次仔细了，不过整体感觉还是不错的：</p>
<p><a href="http://blog.booksforce.com/wp-content/uploads/2007/11/arduino_usb_pcb.png"></a></p>
<p style="text-align: center"><a href="http://blog.booksforce.com/wp-content/uploads/2007/11/arduino_usb_pcb.png"><img src="http://blog.booksforce.com/wp-content/uploads/2007/11/arduino_usb_pcb.png" /></a></p>
<p>元件配备上这次电容100nF用的是安规电容，这是参考了Arduino成品图后专门去打听的。按照官方的说法，安规电容器失效之后不会导致电击，因此不会危及人身安全。另外电路中用到了一个陶瓷晶振，刚开始不明白为什么晶振会有三只管脚，后来Google才知道这种晶振是包含了滤波电路的，因此在FT232BL芯片周围就不需求搭其它的滤波电路了。看起来仔细研究每个电路都会有所发现啊！</p>
<p>元件配齐之后就开始焊接了。第一次焊接QPF封装的芯片，一开始还真不知如何下手，最后弄坏了一块才明白原来只需要靠焊盘上的焊将芯片焊上就行了，又交了一次学费;-) 其它元件焊起来就相对容易多了，基本上没有遇到什么问题。</p>
<p><a href="http://blog.booksforce.com/wp-content/uploads/2007/11/arduino_usb_assemble.png"></a></p>
<p style="text-align: center"><a href="http://blog.booksforce.com/wp-content/uploads/2007/11/arduino_usb_assemble.png"><img src="http://blog.booksforce.com/wp-content/uploads/2007/11/arduino_usb_assemble.png" /></a></p>
<p>本来以为Atmega168和Atmega8在管脚和ISP电路上没有任何区别，因此装完后就能够用Arduino网站介绍的那条简易下载线烧写bootloader了。刚开始装上Atmega168，下载bootloader就会出错，以为是板子安装的问题，仔细查找和分析后用Atmega8换下Atmega168，发现下载bootloader正常。怀疑原来用在Arduino串口模块上的下载线太简单，可能在Atmega168上无法正常工作，但此时已经能够确认板子安装基本是正确的了:-)</p>
<p>在Arduino网站上找到一篇介绍<a href="http://www.arduino.cc/playground/Learning/Burn168">如何烧写Atmega168</a>的文章，但文章中用到的是编程器而不是下载线。此时看起来有两种选择，一种是继续在下载线上纠缠，DIY一款适合Atmega168的下载线；另一种是买一个编程器，直接在编程器上完成bootloader的烧写。权衡再三后还是确定买一款编程器，虽然贵点，但以后在开发各种单片机应用的时候估计都能够用得着。此时只能用“工欲善其事，并先利其器”来安慰自己了！</p>
<p>编程器买回来之后，将Arduino安装目录bootloader168下的ATmegaBOOT_168_diecimila.hex文件用编程器烧到Atmega168芯片中。按下Arduino板子上的复位按钮，总算能看见接在13号管脚上的灯闪烁了，说明bootloader已经运行起来了。</p>
<p>安装完<a href="http://www.ftdichip.com/FTDrivers.htm" class="urllink" rel="nofollow">FT232BM USB驱动程序之后</a>，试着在Arduino集成开发环境中打开了一个最简单的工程，编译之后再下载，再次出错！首先怀疑是Arduino设置的问题，检查了MCU的类型和串口，都没有问题，看了little bird放在<a href="http://www.youtube.com/watch?v=pGU2irCtYjU">YouTube上的安装过程视频</a>，也没有发现什么不对的地方。为了定位问题所在，直接在串口调试软件里不断地给Arduino模块发数据，能够看到TX灯不断闪烁，但给bootloader发送相应的命令却得不到任何反应，RX灯也不闪烁。难道是从Arduino向外界发送数据的电路有问题？拿着万用表一段一段检查电压，似乎都正常，没有任何头绪，看起来下一个该投资的设备就是一台好一点的示波器了;-)</p>
<p>没有办法，只好修改bootloader的源码，让其在启动后不断地向外界发送数据。这回RX灯能够闪烁了，在串口调试软件里也能够收到数据， 看来硬件接线是正确的，总算松了一口气。不过收到的数据很奇怪，不论bootloader发送什么数据，收到的都是0&#215;00！按照之前的经验，通常这种情况都是串口配置导致的问题，如波特率等。</p>
<p>继续Google没有什么收获，开始怀疑是不是时钟设置的问题，导致Atmega168发送数据时没有合适的时钟。在Makefile里找到了AVR_FREQ参数（默认值为16000000L)，是外部晶振的频率，对它做了相应的修改，也不解决问题。继续在Makefile里游荡，看到ISPFUSES 参数时突然眼前一亮，会不会是熔丝（fuse）位的问题？熔丝位是Atmega168在工作时的配置参数，其中最重要的是有关频率的设置。Google到的<a href="http://tinker.it/now/2007/02/24/the-tale-of-avrdude-atmega168-and-extended-bits-fuses/" rel="bookmark" title="Permanent Link: The tale of AVRdude, ATmega168 and extended fuses bits">The tale of AVRdude, ATmega168 and extended fuses bits</a>和<a href="http://wolfpaulus.com/journal/embedded/arduino3.html">ATmega 8 / 168 internal clock and fuse settings</a>证实了我的猜测。仔细阅读了<a href="http://www.arduino.cc/playground/Learning/Burn168">Arduino网站上的说明</a>之后，确定相应的熔丝位应该设置成0xF8, 0xDF和0xFF。刚买的那个编程器里面就能够直接设置这些熔丝位：</p>
<p align="center"> <a href="http://blog.booksforce.com/wp-content/uploads/2007/11/arduino_usb_fuse.png"><img src="http://blog.booksforce.com/wp-content/uploads/2007/11/arduino_usb_fuse.png" /></a></p>
<p>重新编程Atmega168，这回总算能够在Arduino集成开发环境中下载工程了，试了数字I/O和模拟I/O，一切正常;-)</p>
<p><a href="http://blog.booksforce.com/wp-content/uploads/2007/11/arduino_usb_project.png"></a></p>
<p style="text-align: center"><a href="http://blog.booksforce.com/wp-content/uploads/2007/11/arduino_usb_project.png"><img src="http://blog.booksforce.com/wp-content/uploads/2007/11/arduino_usb_project.png" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.flamingoeda.com/2007/11/04/diy-arduino-usb%e6%a8%a1%e5%9d%97/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

