<?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; 教程</title>
	<atom:link href="http://blog.flamingoeda.com/category/tutorial/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.flamingoeda.com</link>
	<description>Flamingo EDA</description>
	<lastBuildDate>Mon, 02 Aug 2010 05:45:22 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>使用APC220实现Arduino无线数据传输</title>
		<link>http://blog.flamingoeda.com/2009/06/14/%e4%bd%bf%e7%94%a8apc220%e5%ae%9e%e7%8e%b0arduino%e6%97%a0%e7%ba%bf%e6%95%b0%e6%8d%ae%e4%bc%a0%e8%be%93/</link>
		<comments>http://blog.flamingoeda.com/2009/06/14/%e4%bd%bf%e7%94%a8apc220%e5%ae%9e%e7%8e%b0arduino%e6%97%a0%e7%ba%bf%e6%95%b0%e6%8d%ae%e4%bc%a0%e8%be%93/#comments</comments>
		<pubDate>Sun, 14 Jun 2009 06:32:27 +0000</pubDate>
		<dc:creator>flamingoeda</dc:creator>
				<category><![CDATA[Arduino]]></category>
		<category><![CDATA[教程]]></category>
		<category><![CDATA[APC220]]></category>

		<guid isPermaLink="false">http://blog.arduino.cn/?p=450</guid>
		<description><![CDATA[在之前的文章中，曾经介绍了如何使用RF模块实现对Arduino的无线控制，其原理非常类似于遥控器，能够实现4个按钮的RF无线遥控。不过，对于要进行数据传输的场合，这样的解决办法就显得不太适合了，比如你要将Arduino采集到的光线传感器的数值，无线传输到PC机那端的时候。这种情况技术上称为无线数据传输，或者简称为无线数传。实现无线数传目前有不少解决方案，但最容易同Arduino连接使用的是类似于APC220这样通过串口来实现的无线数传，虽然数据传输的速度可能慢点（受限于串口的波特率），但的确不失为一种简单易用的方式，难怪很多网友都建议为Arduino加上这样的模块支持。 今天找出点时间来摆弄摆弄这个APC220了，厂家寄给我的模块没有任何说明，好在网络上能找到一些说明，另外就得自己摸索了。首先发现的问题是厂家给的USB适配器似乎于APC220不是很匹配：引脚的数目不一样。这个嘛，似乎不难理解，可能为了兼容不同的产品，或者至少可以说这一适配器不是为APC220专门设计的。USB适配器上用的芯片是CP2102，于是先到Silicon Laboratories网站下载相应的驱动程序，我下载的文件为cp210x_vcp_win2k_xp_s2k3.zip，解压缩后是一个exe文件，直接执行然后按照提示一步一步完成驱动的安装。 驱动安装完成之后，将USB适配器插入到PC机的USB接口中，Windows会提示找到相应的硬件，并对其进行相应的安装和配置： 当Windows提示你硬件已经可以使用之后，在设备管理器的“端口（COM 和 LPT)”下面可以找到CP2102虚拟出来的串口： 现在可以将一个APC220模块连接到USB适配器上了，由于USB适配器与APC220的引脚数目并不一致，连接时要注意插入的位置： 打开APC220厂家提供的设置程序RF-ANET，之前CP2102默认找到的串口为COM87，但RF-ANET程序似乎不能正常地打开这一端口。 在设备管理器中将串口设置成COM4后，重新插入USB适配器并打开RF-ANET，单击“Read R”按钮，一切正常，状态栏上显示“read succeed!”，表明已经能够正常地跟APC220通讯上了！ 这样PC端APC220的测试环境就建议好了，现在来看Arduino这一端端。APC220模块与Arduino之间的连线有4条：5V, GND, TX和RX，需要注意的是，APC220和Arduino都是单独的串口设备，因此Arduino上的发送端TX应该与APC220上的接收端RX连接起来，同理Arduino上的RX应该与APC220上的TX连接起来： APC220模块的默认波特率设置为9600，因此先用下面的代码来进行测试，注意在向Aduino下载程序时，先断开同APC220模块TX和RX上的连线，否则会出现下载无法正常的情况。 int val = 0; int ledPin = 13; void setup() { Serial.begin(9600); } void loop() { val = Serial.read(); if (-1 != val) { if ('A' == val &#124;&#124; 'a' == val) { Serial.println("Hello from Arduino!"); }else if ('B' [...]]]></description>
			<content:encoded><![CDATA[<p>在之前的文章中，曾经介绍了如何使用RF模块实现对Arduino的无线控制，其原理非常类似于遥控器，能够实现4个按钮的RF无线遥控。不过，对于要进行数据传输的场合，这样的解决办法就显得不太适合了，比如你要将Arduino采集到的光线传感器的数值，无线传输到PC机那端的时候。这种情况技术上称为无线数据传输，或者简称为无线数传。实现无线数传目前有不少解决方案，但最容易同Arduino连接使用的是类似于APC220这样通过串口来实现的无线数传，虽然数据传输的速度可能慢点（受限于串口的波特率），但的确不失为一种简单易用的方式，难怪很多网友都建议为Arduino加上这样的模块支持。</p>
<p>今天找出点时间来摆弄摆弄这个APC220了，厂家寄给我的模块没有任何说明，好在网络上能找到一些说明，另外就得自己摸索了。首先发现的问题是厂家给的USB适配器似乎于APC220不是很匹配：引脚的数目不一样。这个嘛，似乎不难理解，可能为了兼容不同的产品，或者至少可以说这一适配器不是为APC220专门设计的。USB适配器上用的芯片是CP2102，于是先<a href="https://www.silabs.com/products/mcu/Pages/USBtoUARTBridgeVCPDrivers.aspx">到Silicon Laboratories网站下载相应的驱动程序</a>，我下载的文件为<a href="http://blog.flamingoeda.com/wp-content/uploads/2009/06/cp210x_vcp_win2k_xp_s2k3.zip">cp210x_vcp_win2k_xp_s2k3.zip</a>，解压缩后是一个exe文件，直接执行然后按照提示一步一步完成驱动的安装。</p>
<p>驱动安装完成之后，将USB适配器插入到PC机的USB接口中，Windows会提示找到相应的硬件，并对其进行相应的安装和配置：<br />
<a href="http://blog.flamingoeda.com/wp-content/uploads/2009/06/apc220_usb_adapter.jpg"><img class="aligncenter size-full wp-image-452" title="apc220_usb_adapter" src="http://blog.flamingoeda.com/wp-content/uploads/2009/06/apc220_usb_adapter.jpg" alt="" width="253" height="85" /></a></p>
<p>当Windows提示你硬件已经可以使用之后，在设备管理器的“端口（COM 和 LPT)”下面可以找到CP2102虚拟出来的串口：<br />
<a href="http://blog.flamingoeda.com/wp-content/uploads/2009/06/apc220_usb_hardware_manager.jpg"><img class="aligncenter size-full wp-image-453" title="apc220_usb_hardware_manager" src="http://blog.flamingoeda.com/wp-content/uploads/2009/06/apc220_usb_hardware_manager.jpg" alt="" width="420" height="451" /></a></p>
<p>现在可以将一个APC220模块连接到USB适配器上了，由于USB适配器与APC220的引脚数目并不一致，连接时要注意插入的位置：<br />
<a href="http://blog.flamingoeda.com/wp-content/uploads/2009/06/acp220_usb_connection_2.jpg"><img class="aligncenter size-full wp-image-460" title="acp220_usb_connection_2" src="http://blog.flamingoeda.com/wp-content/uploads/2009/06/acp220_usb_connection_2.jpg" alt="" width="460" height="345" /></a></p>
<p>打开APC220厂家提供的设置程序<a href="http://blog.flamingoeda.com/wp-content/uploads/2009/06/apc220.zip">RF-ANET</a>，之前CP2102默认找到的串口为COM87，但RF-ANET程序似乎不能正常地打开这一端口。<br />
<a href="http://blog.flamingoeda.com/wp-content/uploads/2009/06/apc220_usb_rf_anet_1.jpg"><img class="aligncenter size-full wp-image-454" title="apc220_usb_rf_anet_1" src="http://blog.flamingoeda.com/wp-content/uploads/2009/06/apc220_usb_rf_anet_1.jpg" alt="" width="413" height="374" /></a></p>
<p>在设备管理器中将串口设置成COM4后，重新插入USB适配器并打开RF-ANET，单击“Read R”按钮，一切正常，状态栏上显示“read succeed!”，表明已经能够正常地跟APC220通讯上了！<br />
<a href="http://blog.flamingoeda.com/wp-content/uploads/2009/06/apc220_usb_rf_anet_2.jpg"><img class="aligncenter size-full wp-image-455" title="apc220_usb_rf_anet_2" src="http://blog.flamingoeda.com/wp-content/uploads/2009/06/apc220_usb_rf_anet_2.jpg" alt="" width="412" height="374" /></a></p>
<p>这样PC端APC220的测试环境就建议好了，现在来看Arduino这一端端。APC220模块与Arduino之间的连线有4条：5V, GND, TX和RX，需要注意的是，APC220和Arduino都是单独的串口设备，因此Arduino上的发送端TX应该与APC220上的接收端RX连接起来，同理Arduino上的RX应该与APC220上的TX连接起来：</p>
<p><a href="http://blog.flamingoeda.com/wp-content/uploads/2009/06/acp220_arduino_connection_1.jpg"><img class="aligncenter size-full wp-image-461" title="acp220_arduino_connection_1" src="http://blog.flamingoeda.com/wp-content/uploads/2009/06/acp220_arduino_connection_1.jpg" alt="" width="460" height="345" /></a></p>
<p>APC220模块的默认波特率设置为9600，因此先用下面的代码来进行测试，注意在向Aduino下载程序时，先断开同APC220模块TX和RX上的连线，否则会出现下载无法正常的情况。</p>
<pre class="java">int val = 0;
int ledPin = 13;
void setup()
{
  Serial.begin(9600);
}

void loop()
{
  val = Serial.read();
  if (-1 != val) {
   if ('A' == val || 'a' == val) {
     Serial.println("Hello from Arduino!");
   }else if ('B' == val || 'b' == val) {
      digitalWrite(ledPin, HIGH);
      delay(500);
      digitalWrite(ledPin, LOW);
    }
  }
}</pre>
<p>总结一下，现在我们已经分别在PC和Arduino上连接了一个APC220模块，并且已经向Arduino里面写入了相应的测试代码。一切都准备好之后，现在我们来进行相应的测试。首先要注意的是我们必须用外接电源的方式对Arduino进行供电，这是因为如果连接上USB线的话，相应的FT232模块会被激活，这样FT232实现的串口和ACP220上的串口就会因为冲突导致通信不正常：</p>
<p><a href="http://blog.flamingoeda.com/wp-content/uploads/2009/06/acp220_arduino_connection_2.jpg"><img class="aligncenter size-full wp-image-462" title="acp220_arduino_connection_2" src="http://blog.flamingoeda.com/wp-content/uploads/2009/06/acp220_arduino_connection_2.jpg" alt="" width="460" height="345" /></a></p>
<p>在将加电后的Arduino放到房间里的一个角落之后，现在来配置PC端。APC220模块通过其USB适配器之后，其原理上也相当于一个串口，因此我们可以用Arduino自带的开发环境来进行测试，只是这一情况下你的PC上连接的不再是Arduino，而是APC220 USB适配器。连接好APC220 USB适配器后，打开Arduino，在“Tools” -&gt; “Serial Ports”菜单下选择USB适配器虚拟出来的“COM4”（与之前的设置一致）。接着打开Arduino里的“Serial Monitor”，发送A字符，会收到Arduino传回来的“Hello from Arduino!”，发送B字符可以点亮Arduino上的13号LED（持续0.5秒）：<br />
<a href="http://blog.flamingoeda.com/wp-content/uploads/2009/06/apc220_arduino.jpg"><img class="aligncenter size-full wp-image-456" title="apc220_arduino" src="http://blog.flamingoeda.com/wp-content/uploads/2009/06/apc220_arduino.jpg" alt="" width="451" height="600" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.flamingoeda.com/2009/06/14/%e4%bd%bf%e7%94%a8apc220%e5%ae%9e%e7%8e%b0arduino%e6%97%a0%e7%ba%bf%e6%95%b0%e6%8d%ae%e4%bc%a0%e8%be%93/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Arduino电机驱动扩展板</title>
		<link>http://blog.flamingoeda.com/2008/05/01/arduino%e7%94%b5%e6%9c%ba%e9%a9%b1%e5%8a%a8%e6%89%a9%e5%b1%95%e6%9d%bf/</link>
		<comments>http://blog.flamingoeda.com/2008/05/01/arduino%e7%94%b5%e6%9c%ba%e9%a9%b1%e5%8a%a8%e6%89%a9%e5%b1%95%e6%9d%bf/#comments</comments>
		<pubDate>Thu, 01 May 2008 05:48:48 +0000</pubDate>
		<dc:creator>flamingoeda</dc:creator>
				<category><![CDATA[Arduino]]></category>
		<category><![CDATA[基本电路]]></category>
		<category><![CDATA[教程]]></category>

		<guid isPermaLink="false">http://blog.booksforce.com/2008/05/01/arduino%e7%94%b5%e6%9c%ba%e9%a9%b1%e5%8a%a8%e6%89%a9%e5%b1%95%e6%9d%bf/</guid>
		<description><![CDATA[除了使用传感器对各种外部物理量进行感知之外，能够对实际物体的运动进行相应的控制也是互动设计中不可或缺的一部分。在所有这类动力装置中，电机显然是最常见、最基本、最便宜的解决方案了，常用的电机的种类有很多种，如直流电机，步进电机，伺服电机，减速电机等，并且每一种电机的控制方法都有所不同。 如果你是一个电子高手，控制普通的直流电机用几个三极管就行了，否则话像L293这样的芯片将是一个更好的选择。L293芯片的核心是两个H-桥，所有的H-桥芯片都具有如下一些引脚： 逻辑输入 逻辑电压 电源电压 电源输出 地 其中逻辑电压引脚采用与微控制器相同的电压和电流，电源电压采用与运行电机所需要的电压和电流。逻辑输入引脚连接到用来向H-桥输出控制信号的微控制器上的引脚，而电源输出引脚则连接到电机上。 这么专业的术语翻译到Arduino上可以这样来理解。首先，我们需要两套电源，一套用来给Arduino供电，一套用来给电机供电。其次，我们需要用到Arduino的数字I/O管脚来控制L293，并把电机接到L293上接受控制。说到这里，正好解释一下Arduino的供电系统，通常Arduino有三种供电方式： USB供电 电池供电 变压器供电 后两者在Arduino上统称为外部供电。供电方式的选择是通过Arduino上的电源选择跳线来实现的，当把跳线接到“USB”一端时，采用的是USB供电方式，这时整个Arduino及其附属电路上的电源都由PC的USB接口提供，此时电流一般比较小，只能驱动功率比较小的电路，如LED等。当把跳线接到“EXT”一端时，采用的是外部供电方式，这时一般能够驱动比较大的设备，如电机等。Arduino内部一套电源转换电路，可以用来将外部供电时的电压（6-12V）转换成内部所需要的5V电压，使用L293控制电机正是需要这两套电源。 下面这个就是基于L293D芯片的Arduino专用电机驱动扩展板，它能够用来驱动两个直流电机。 使用该扩展板来驱动直流电机非常简单，只需要将扩展板插到Arduino上，同时将直流电机连接到扩展板上的motors引脚上就可以了。 正如上面所提到的，此时应该采用Arduino的外部供电方式，并使用变压器或者电源为Arduino提供电力。这里我选用的是9V变压器和9V的直流电机： 电机扩展板上motors引脚的上面两针是用来接电机1的，下面两针是用来接电机2的。 电路连接好之后，剩下的工作就是如何用程序进行控制了。使用这一扩展板我们能够控制直流电机的转动方向和转动速度，其中对转动方向的控制是通过Arduino上的数字I/O引脚12和13来实现的，对转速的控制则是通过数字I/O引脚9和10来实现的。 如果要控制直流电机1，我们需要向引脚9输出相应的PWM信号来控制电机的速度，同时设置引脚12和13的高低电压来控制电机的方向。如果要控制直流电机2，则需要向引脚10输出相应的PWM信号来控制电机的速度，此时也是通过设置引脚12和13 的高低电压来控制电机的方向的。 电机扩展板上带有S1和S2两个按钮，分别对应于Arduino数字I/O的7号和6号管脚 ，并且在按下时为低电平。因此我们可以像下面的程序这样利用S1来控制电机1的正反转： int switchPin = 7; // switch pin int dir1Pin = 12; // direction 1 int dir2Pin = 13; // direction 2 int speedPin = 9; // spped pin void setup() { pinMode(switchPin, INPUT); [...]]]></description>
			<content:encoded><![CDATA[<p>除了使用传感器对各种外部物理量进行感知之外，能够对实际物体的运动进行相应的控制也是互动设计中不可或缺的一部分。在所有这类动力装置中，电机显然是最常见、最基本、最便宜的解决方案了，常用的电机的种类有很多种，如直流电机，步进电机，伺服电机，减速电机等，并且每一种电机的控制方法都有所不同。</p>
<p>如果你是一个电子高手，控制普通的直流电机用几个三极管就行了，否则话像L293这样的芯片将是一个更好的选择。L293芯片的核心是两个H-桥，所有的H-桥芯片都具有如下一些引脚：</p>
<ul>
<li>逻辑输入</li>
<li>逻辑电压</li>
<li>电源电压</li>
<li>电源输出</li>
<li>地</li>
</ul>
<p>其中逻辑电压引脚采用与微控制器相同的电压和电流，电源电压采用与运行电机所需要的电压和电流。逻辑输入引脚连接到用来向H-桥输出控制信号的微控制器上的引脚，而电源输出引脚则连接到电机上。</p>
<p>这么专业的术语翻译到Arduino上可以这样来理解。首先，我们需要两套电源，一套用来给Arduino供电，一套用来给电机供电。其次，我们需要用到Arduino的数字I/O管脚来控制L293，并把电机接到L293上接受控制。说到这里，正好解释一下Arduino的供电系统，通常Arduino有三种供电方式：</p>
<ul>
<li>USB供电</li>
<li>电池供电</li>
<li>变压器供电</li>
</ul>
<p>后两者在Arduino上统称为外部供电。供电方式的选择是通过Arduino上的电源选择跳线来实现的，当把跳线接到“USB”一端时，采用的是USB供电方式，这时整个Arduino及其附属电路上的电源都由PC的USB接口提供，此时电流一般比较小，只能驱动功率比较小的电路，如LED等。当把跳线接到“EXT”一端时，采用的是外部供电方式，这时一般能够驱动比较大的设备，如电机等。Arduino内部一套电源转换电路，可以用来将外部供电时的电压（6-12V）转换成内部所需要的5V电压，使用L293控制电机正是需要这两套电源。</p>
<p>下面这个就是基于L293D芯片的Arduino专用电机驱动扩展板，它能够用来驱动两个直流电机。</p>
<p align="center"><a href="http://blog.booksforce.com/wp-content/uploads/2008/05/arduino_motor_shield.png"><img src="http://blog.booksforce.com/wp-content/uploads/2008/05/arduino_motor_shield.png" /></a></p>
<p>使用该扩展板来驱动直流电机非常简单，只需要将扩展板插到Arduino上，同时将直流电机连接到扩展板上的motors引脚上就可以了。</p>
<p align="center"><a href="http://blog.booksforce.com/wp-content/uploads/2008/05/arduino_motor_shield_circuit.png"><img src="http://blog.booksforce.com/wp-content/uploads/2008/05/arduino_motor_shield_circuit.png" /></a></p>
<p>正如上面所提到的，此时应该采用Arduino的外部供电方式，并使用变压器或者电源为Arduino提供电力。这里我选用的是9V变压器和9V的直流电机：</p>
<p><a href="http://blog.booksforce.com/wp-content/uploads/2008/05/arduino_power_ext.png"></a></p>
<p style="text-align: center"><a href="http://blog.booksforce.com/wp-content/uploads/2008/05/arduino_power_ext.png"><img src="http://blog.booksforce.com/wp-content/uploads/2008/05/arduino_power_ext.png" /></a></p>
<p><a href="http://blog.booksforce.com/wp-content/uploads/2008/05/arduino_power_ext.png"> </a></p>
<p>电机扩展板上motors引脚的上面两针是用来接电机1的，下面两针是用来接电机2的。</p>
<p><a href="http://blog.booksforce.com/wp-content/uploads/2008/05/arduino_motor_shield_motors.png"></a></p>
<p style="text-align: center"><a href="http://blog.booksforce.com/wp-content/uploads/2008/05/arduino_motor_shield_motors.png"><img src="http://blog.booksforce.com/wp-content/uploads/2008/05/arduino_motor_shield_motors.png" /></a></p>
<p>电路连接好之后，剩下的工作就是如何用程序进行控制了。使用这一扩展板我们能够控制直流电机的转动方向和转动速度，其中对转动方向的控制是通过Arduino上的数字I/O引脚12和13来实现的，对转速的控制则是通过数字I/O引脚9和10来实现的。</p>
<p>如果要控制直流电机1，我们需要向引脚9输出相应的PWM信号来控制电机的速度，同时设置引脚12和13的高低电压来控制电机的方向。如果要控制直流电机2，则需要向引脚10输出相应的PWM信号来控制电机的速度，此时也是通过设置引脚12和13 的高低电压来控制电机的方向的。</p>
<p>电机扩展板上带有S1和S2两个按钮，分别对应于Arduino数字I/O的7号和6号管脚 ，并且在按下时为低电平。因此我们可以像下面的程序这样利用S1来控制电机1的正反转：</p>
<pre><code>
int switchPin = 7;  // switch pin
int dir1Pin = 12;   // direction 1
int dir2Pin = 13;   // direction 2
int speedPin = 9;   // spped pin

void setup() {
  pinMode(switchPin, INPUT);
  pinMode(dir1Pin, OUTPUT);
  pinMode(dir2Pin, OUTPUT);
  pinMode(speedPin, OUTPUT);
}

void loop() {
  // switch is pressed
  if (digitalRead(switchPin) == LOW) {
    // set spped
    analogWrite(speedPin, 250);
    // set direction
    digitalWrite(dir1Pin, LOW);
    digitalWrite(dir2Pin, HIGH);
  } else {
    analogWrite(speedPin, 100);
    digitalWrite(dir1Pin, HIGH);
    digitalWrite(dir2Pin, LOW);
  }
}
</code></pre>
<p>在将上述程序下载到Arduino上并运行起来之后，我们就可以通过按S1键，来改变电机的旋转速度和方向了:)</p>
<p>P.S. 在调试这一电机扩展板的奇遇是，在将其插入到Arduino Diecimila的贴片版本上时，发现MC33269异常热，并且电机偶尔才能工作。进一步设计发现如果把整个扩展板很好地插入到Arduino上时，5V和Gnd之间居然是短路的。一开始并没有发现问题在哪，后来才发现扩展板上的电容C9与USB接头的外壳短路了！将其锡去掉一下，并抬高扩展板时问题得到解决。实际使用时请检查下图电容下面的引脚是否与USB接口的外壳短路了，特别是对于贴片版本来讲，最好在通电前用万用表检查一下5V和Gnd之间的电阻值:)</p>
<p><a href="http://blog.booksforce.com/wp-content/uploads/2008/05/arduino_motor_shield_warning.png"></p>
<p style="text-align: center"><img src="http://blog.booksforce.com/wp-content/uploads/2008/05/arduino_motor_shield_warning.png" /></p>
<p></a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.flamingoeda.com/2008/05/01/arduino%e7%94%b5%e6%9c%ba%e9%a9%b1%e5%8a%a8%e6%89%a9%e5%b1%95%e6%9d%bf/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>Arduino教程七: XBee无线通信</title>
		<link>http://blog.flamingoeda.com/2007/12/16/arduino%e6%95%99%e7%a8%8b%e4%b8%83-xbee%e6%97%a0%e7%ba%bf%e9%80%9a%e4%bf%a1/</link>
		<comments>http://blog.flamingoeda.com/2007/12/16/arduino%e6%95%99%e7%a8%8b%e4%b8%83-xbee%e6%97%a0%e7%ba%bf%e9%80%9a%e4%bf%a1/#comments</comments>
		<pubDate>Sun, 16 Dec 2007 13:15:08 +0000</pubDate>
		<dc:creator>flamingoeda</dc:creator>
				<category><![CDATA[Arduino]]></category>
		<category><![CDATA[教程]]></category>

		<guid isPermaLink="false">http://blog.booksforce.com/2007/12/16/arduino%e6%95%99%e7%a8%8b%e4%b8%83-xbee%e6%97%a0%e7%ba%bf%e9%80%9a%e4%bf%a1/</guid>
		<description><![CDATA[借助XBee扩展板我们可以很方便地将XBee模块连接到Arduino上，XBee模块的工作原理也非常简单，它与Arduino之间其实就是通过串行接口（即Tx和Rx引脚）进行通信。对于简单的点对点通信来讲，只需要通过串行接口向XBee模块写数据就可以实现数据的发送；当XBee模块通过无线通道接收到数据时，通过读串行接口可以很方便地获得这些数据。 原理弄清楚之后，其实我们可以将XBee模块看成是Arduino的串口，通过相应的串口操作函数来实现数据的接收和发送。首先请按照Arduino XBee模块使用手册中的说明配置好你的两个XBee模块，然后将相应的跳线连接到XBEE一端： 这里我们使用一个最简单的工程来进行相应的实验： int ledPin = 13; int val; void setup() { pinMode(ledPin, OUTPUT); Serial.begin(9600); } void loop() { // send data to another XBee module Serial.print('A'); delay(1000); // receive data from another XBee module val = Serial.read(); if (-1 != val) { if ('A' == val) { digitalWrite(ledPin, HIGH); delay(500); digitalWrite(ledPin, LOW); delay(500); [...]]]></description>
			<content:encoded><![CDATA[<p>借助XBee扩展板我们可以很方便地将XBee模块连接到Arduino上，XBee模块的工作原理也非常简单，它与Arduino之间其实就是通过串行接口（即Tx和Rx引脚）进行通信。对于简单的点对点通信来讲，只需要通过串行接口向XBee模块写数据就可以实现数据的发送；当XBee模块通过无线通道接收到数据时，通过读串行接口可以很方便地获得这些数据。</p>
<p>原理弄清楚之后，其实我们可以将XBee模块看成是Arduino的串口，通过相应的串口操作函数来实现数据的接收和发送。首先请按照<a href="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/" rel="bookmark" title="Permanent Link to Arduino XBee模块使用手册">Arduino XBee模块使用手册</a>中的说明配置好你的两个XBee模块，然后将相应的跳线连接到XBEE一端：</p>
<p align="center"><a href="http://blog.booksforce.com/wp-content/uploads/2007/12/tutorial_7_jumber.png"><img src="http://blog.booksforce.com/wp-content/uploads/2007/12/tutorial_7_jumber.png" /></a></p>
<p>这里我们使用一个最简单的工程来进行相应的实验：</p>
<pre><code>
int ledPin = 13;
int val;

void setup() {
  pinMode(ledPin, OUTPUT);
  Serial.begin(9600);
}

void loop() {
  // send data to another XBee module
  Serial.print('A');
  delay(1000);

  // receive data from another XBee module
  val = Serial.read();
  if (-1 != val) {
    if ('A' == val) {
      digitalWrite(ledPin, HIGH);
      delay(500);
      digitalWrite(ledPin, LOW);
      delay(500);
    }
  }
}
</code></pre>
<p>该工程首先通过Serial.print()函数向XBee模块发送一个字母A，该字母会被XBee模块通过无线网络发送出去，并被另外一个XBee模块接收到。紧接着再通过Serial.read()函数从XBee模块读取从无线网络接收到的数据，如果是字母A的话，则点亮相应的发光二极管。</p>
<p>将该工程编译并分别下载到两个Arduino模块中，注意下载的时候不要连接XBee扩展板，这是因为XBee模块会占用串口，从而导致下载无法正确完成。</p>
<p>下载完成后将XBee扩展板连接到Arduino上，并分别给两者上电。这两个Arduino模块都会向对方发送字母A，然后从对方接收字母A，并对点亮数字I/O管脚13上连接的发光二极管。你可以试着将两个模块放在房间里的不同位置，来对XBee模块的传输性能进行测试。</p>
<p><a href="http://blog.booksforce.com/wp-content/uploads/2007/12/tutorial_7_circuit.png"></p>
<p style="text-align: center"><img src="http://blog.booksforce.com/wp-content/uploads/2007/12/tutorial_7_circuit.png" /></p>
<p></a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.flamingoeda.com/2007/12/16/arduino%e6%95%99%e7%a8%8b%e4%b8%83-xbee%e6%97%a0%e7%ba%bf%e9%80%9a%e4%bf%a1/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Arduino教程六: 串口输入</title>
		<link>http://blog.flamingoeda.com/2007/09/16/arduino%e6%95%99%e7%a8%8b%e5%85%ad-%e4%b8%b2%e5%8f%a3%e8%be%93%e5%85%a5/</link>
		<comments>http://blog.flamingoeda.com/2007/09/16/arduino%e6%95%99%e7%a8%8b%e5%85%ad-%e4%b8%b2%e5%8f%a3%e8%be%93%e5%85%a5/#comments</comments>
		<pubDate>Sun, 16 Sep 2007 03:41:59 +0000</pubDate>
		<dc:creator>developer</dc:creator>
				<category><![CDATA[Arduino]]></category>
		<category><![CDATA[教程]]></category>

		<guid isPermaLink="false">http://blog.booksforce.com/2007/09/16/arduino%e6%95%99%e7%a8%8b%e5%85%ad-%e4%b8%b2%e5%8f%a3%e8%be%93%e5%85%a5/</guid>
		<description><![CDATA[串行通信是在实现在PC机与微控制器进行交互的最简单的办法。之前的PC机上一般都配有标准的RS-232或者RS-422接口来实现串行通信，但现在这种情况已经发生了一些改变，大家更倾向于使用USB这样一种更快速但同时也更加复杂的方式来实现串行通信。尽管在有些计算机上现在已经找不到RS-232或者RS-422接口了，但我们仍可以通过USB/串口或者PCMCIA/串口这样的转换器，在这些设备上得到传统的串口。 通过串口连接的Arduino在交互式设计中能够为PC机提供一种全新的交互方式，比如用PC机控制一些之前看来非常复杂的事情，像声音和视频等。很多场合中都要求Arduino能够通过串口接收来自于PC机的命令，并完成相应的功能，这可以通过Arduino语言中提供的Serial.read()函数来实现。 在这一实验中我们同样不需要任何额外的电路，而只需要用串口线将Arduino和PC机连起来就可以了，相应的Arduino工程代码为： int ledPin = 13; int val; void setup() { pinMode(ledPin, OUTPUT); Serial.begin(9600); } void loop() { val = Serial.read(); if (-1 != val) { if ('H' == val) { digitalWrite(ledPin, HIGH); delay(500); digitalWrite(ledPin, LOW); } } } 把工程下载到Arduino模块中之后，在Arduino集成开发环境中打开串口监视器并将波特率设置为9600，然后向Arduino模块发送字符H，如下图所示： 该工程运行起来之后会不断调用Serial.read()函数从串口获得数据。Arduino语言提供的这个函数是不阻塞的，也就是说不论串口上是否真的有数据到达，该函数都会立即返回。Serial.read()函数每次只读取一个字节的数据，当串口上有数据到达的时候，该函数的返回值为到达的数据中第一个字符的ASCII码；当串口上没有数据到达的时候，该函数的返回值则为-1。 Arduino语言的参考手册中没有对Serial.read()函数做过多的说明，我的一个疑问是如果PC机一次发送的数据太多，Arduino是否提供相应的串口缓存功能来保证数据不会丢失？Arduino语言中提供的另外一个函数Serial.available()或许能够帮助我们用实验来进行验证： int ledPin = 13; int val; void setup() { pinMode(ledPin, OUTPUT); Serial.begin(9600); [...]]]></description>
			<content:encoded><![CDATA[<p>串行通信是在实现在PC机与微控制器进行交互的最简单的办法。之前的PC机上一般都配有标准的RS-232或者RS-422接口来实现串行通信，但现在这种情况已经发生了一些改变，大家更倾向于使用USB这样一种更快速但同时也更加复杂的方式来实现串行通信。尽管在有些计算机上现在已经找不到RS-232或者RS-422接口了，但我们仍可以通过USB/串口或者PCMCIA/串口这样的转换器，在这些设备上得到传统的串口。</p>
<p>通过串口连接的Arduino在交互式设计中能够为PC机提供一种全新的交互方式，比如用PC机控制一些之前看来非常复杂的事情，像声音和视频等。很多场合中都要求Arduino能够通过串口接收来自于PC机的命令，并完成相应的功能，这可以通过Arduino语言中提供的Serial.read()函数来实现。</p>
<p>在这一实验中我们同样不需要任何额外的电路，而只需要用串口线将Arduino和PC机连起来就可以了，相应的Arduino工程代码为：</p>
<pre><code>
int ledPin = 13;
int val; 

void setup() {
  pinMode(ledPin, OUTPUT);
  Serial.begin(9600);
} 

void loop() {
  val = Serial.read();
  if (-1 != val) {
    if ('H' == val) {
      digitalWrite(ledPin, HIGH);
      delay(500);
      digitalWrite(ledPin, LOW);
    }
  }
}
</code></pre>
<p>把工程下载到Arduino模块中之后，在Arduino集成开发环境中打开串口监视器并将波特率设置为9600，然后向Arduino模块发送字符H，如下图所示：</p>
<p align="center"><a href="http://blog.booksforce.com/wp-content/uploads/2007/09/tutorial_6_serial_monitor.png" title="tutorial_6_serial_monitor.png"><img src="http://blog.booksforce.com/wp-content/uploads/2007/09/tutorial_6_serial_monitor.png" alt="tutorial_6_serial_monitor.png" /></a></p>
<p>该工程运行起来之后会不断调用Serial.read()函数从串口获得数据。Arduino语言提供的这个函数是不阻塞的，也就是说不论串口上是否真的有数据到达，该函数都会立即返回。Serial.read()函数每次只读取一个字节的数据，当串口上有数据到达的时候，该函数的返回值为到达的数据中第一个字符的ASCII码；当串口上没有数据到达的时候，该函数的返回值则为-1。</p>
<p>Arduino语言的<a href="http://www.arduino.cc/en/Reference/HomePage">参考手册中</a>没有对Serial.read()函数做过多的说明，我的一个疑问是如果PC机一次发送的数据太多，Arduino是否提供相应的串口缓存功能来保证数据不会丢失？Arduino语言中提供的另外一个函数Serial.available()或许能够帮助我们用实验来进行验证：</p>
<pre><code>
int ledPin = 13;
int val; 

void setup() {
  pinMode(ledPin, OUTPUT);
  Serial.begin(9600);
} 

void loop() {
  val = Serial.read();
  if (-1 != val) {
    if ('H' == val) {
      digitalWrite(ledPin, HIGH);
      delay(500);
      digitalWrite(ledPin, LOW); 

      Serial.print("Available: ");
      Serial.println(Serial.available(), DEC);
    }
  }
}
</code></pre>
<p>函数Serial.available()的功能是返回串口缓冲区中当前剩余的字符个数，按照Arduino提供的<a href="http://www.arduino.cc/en/Serial/Available">该函数的说明</a>，串口缓冲区中最多能缓冲128个字节。我们可以一次给Arduino模块发送多个字符，来验证这一功能：</p>
<p align="center"><a href="http://blog.booksforce.com/wp-content/uploads/2007/09/tutorial_6_multi_chars.png" title="tutorial_6_multi_chars.png"><img src="http://blog.booksforce.com/wp-content/uploads/2007/09/tutorial_6_multi_chars.png" alt="tutorial_6_multi_chars.png" /></a></p>
<p>在这一实验中，每当Arduino成功收到一个字符H，连接在数字I/O端口管脚13上的发光二极管就会闪烁一次：</p>
<p align="center"><a href="http://blog.booksforce.com/wp-content/uploads/2007/09/tutorial_6_circuit.jpg" title="tutorial_6_circuit.jpg"><img src="http://blog.booksforce.com/wp-content/uploads/2007/09/tutorial_6_circuit.jpg" alt="tutorial_6_circuit.jpg" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.flamingoeda.com/2007/09/16/arduino%e6%95%99%e7%a8%8b%e5%85%ad-%e4%b8%b2%e5%8f%a3%e8%be%93%e5%85%a5/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Arduino教程五: 串口输出</title>
		<link>http://blog.flamingoeda.com/2007/09/08/arduino%e6%95%99%e7%a8%8b%e4%ba%94-%e4%b8%b2%e5%8f%a3%e8%be%93%e5%87%ba/</link>
		<comments>http://blog.flamingoeda.com/2007/09/08/arduino%e6%95%99%e7%a8%8b%e4%ba%94-%e4%b8%b2%e5%8f%a3%e8%be%93%e5%87%ba/#comments</comments>
		<pubDate>Sat, 08 Sep 2007 14:27:38 +0000</pubDate>
		<dc:creator>developer</dc:creator>
				<category><![CDATA[Arduino]]></category>
		<category><![CDATA[教程]]></category>

		<guid isPermaLink="false">http://blog.booksforce.com/2007/09/08/arduino%e6%95%99%e7%a8%8b%e4%ba%94-%e4%b8%b2%e5%8f%a3%e8%be%93%e5%87%ba/</guid>
		<description><![CDATA[在许多实际应用场合中我们会要求在Arduino和其它设备之间实现相互通信，而最常见通常也是最简单的办法就是使用串行通信。在串行通信中，两个设备之间一个接一个地来回发送数字脉冲，它们之间必须严格遵循相应的协议以保证通信的正确性。 在PC机上上最常见的串行通信协议是RS-232串行协议，而在各种微控制器（单片机）上采用的则是TTL串行协议。由于这两者的电平有很大的不同，因此在实现PC机和微控制器的通信时，必须进行相应的转换。完成RS-232电平和TTL电平之间的转换一般采用专用芯片，如MAX232等，但在Arduino上是用相应的电平转换电路来完成的。 根据Arduino的原理图我们不难看出，ATmega的RX和TX引脚一方面直接接到了数字I/O端口的0号和1号管脚， 另一方面又通过电平转换电路接到了串口的母头上。因此，当我们需要用Arduino与PC机通信时，可以用串口线将两者连接起来；当我们需要用Arduino与微控制器（如另一块Arduino）通信时，则可以用数字I/O端口的0号和1号管脚。 串行通信的难点在于参数的设置，如波特率、数据位、停止位等，在Arduino语言可以使用Serial.begin()函数来简化这一任务。为了实现数据的发送，Arduino则提供了Serial.print()和Serial.println()两个函数，它们的区别在于后者会在请求发送的数据后面加上换行符，以提高输出结果的可读性。 在这一实验中没有用到额外的电路， 我们只需要用串口线将Arduino和PC机连起来就可以了，相应的代码为： void setup() { Serial.begin(9600); } void loop() { Serial.println("Hello World!"); delay(1000); } 在将工程下载到Arduino模块中之后，在Arduino集成开发环境的工具栏中单击“Serial Monitor”控制，打开串口监视器： 接着将波特率设置为9600，即保持与工程中的设置相一致： 如果一切正常，此时我们就可以在Arduino集成开发环境的Console窗口中看到串口上输出的数据了： 为了检查串口上是否有数据发送，一个比较简单的办法是在数字I/O端口的1号管脚（TX）和5V电源之间接一个发光二极管，如下面的原理图所示： 这样一旦Arduino在通过串口向PC机发送数据时，相应的发光二极管就会闪烁，实际应用中这是一个非常方便的调试手段;-)]]></description>
			<content:encoded><![CDATA[<p>在许多实际应用场合中我们会要求在Arduino和其它设备之间实现相互通信，而最常见通常也是最简单的办法就是使用串行通信。在串行通信中，两个设备之间一个接一个地来回发送数字脉冲，它们之间必须严格遵循相应的协议以保证通信的正确性。</p>
<p>在PC机上上最常见的串行通信协议是RS-232串行协议，而在各种微控制器（单片机）上采用的则是TTL串行协议。由于这两者的电平有很大的不同，因此在实现PC机和微控制器的通信时，必须进行相应的转换。完成RS-232电平和TTL电平之间的转换一般采用专用芯片，如MAX232等，但在Arduino上是用相应的电平转换电路来完成的。</p>
<p>根据Arduino的原理图我们不难看出，ATmega的RX和TX引脚一方面直接接到了数字I/O端口的0号和1号管脚， 另一方面又通过电平转换电路接到了串口的母头上。因此，当我们需要用Arduino与PC机通信时，可以用串口线将两者连接起来；当我们需要用Arduino与微控制器（如另一块Arduino）通信时，则可以用数字I/O端口的0号和1号管脚。</p>
<p>串行通信的难点在于参数的设置，如波特率、数据位、停止位等，在Arduino语言可以使用Serial.begin()函数来简化这一任务。为了实现数据的发送，Arduino则提供了Serial.print()和Serial.println()两个函数，它们的区别在于后者会在请求发送的数据后面加上换行符，以提高输出结果的可读性。</p>
<p>在这一实验中没有用到额外的电路， 我们只需要用串口线将Arduino和PC机连起来就可以了，相应的代码为：</p>
<pre><code>
void setup() {
  Serial.begin(9600);
}

void loop() {
  Serial.println("Hello World!");
  delay(1000);
}
</code></pre>
<p>在将工程下载到Arduino模块中之后，在Arduino集成开发环境的工具栏中单击“Serial Monitor”控制，打开串口监视器：</p>
<p align="center"><a href="http://blog.booksforce.com/wp-content/uploads/2007/09/tutorial_5_serial_monitor.png" title="tutorial_5_serial_monitor.png"><img src="http://blog.booksforce.com/wp-content/uploads/2007/09/tutorial_5_serial_monitor.png" alt="tutorial_5_serial_monitor.png" /></a></p>
<p>接着将波特率设置为9600，即保持与工程中的设置相一致：</p>
<p align="center"><a href="http://blog.booksforce.com/wp-content/uploads/2007/09/tutorial_5_baud_setting.png" title="tutorial_5_baud_setting.png"><img src="http://blog.booksforce.com/wp-content/uploads/2007/09/tutorial_5_baud_setting.png" alt="tutorial_5_baud_setting.png" /></a></p>
<p>如果一切正常，此时我们就可以在Arduino集成开发环境的Console窗口中看到串口上输出的数据了：</p>
<p align="center"><a href="http://blog.booksforce.com/wp-content/uploads/2007/09/tutorial_5_serial_output.png" title="tutorial_5_serial_output.png"><img src="http://blog.booksforce.com/wp-content/uploads/2007/09/tutorial_5_serial_output.png" alt="tutorial_5_serial_output.png" /></a></p>
<p>为了检查串口上是否有数据发送，一个比较简单的办法是在数字I/O端口的1号管脚（TX）和5V电源之间接一个发光二极管，如下面的原理图所示：</p>
<p align="center"><a href="http://blog.booksforce.com/wp-content/uploads/2007/09/tutorial_5_schematic.png" title="tutorial_5_schematic.png"><img src="http://blog.booksforce.com/wp-content/uploads/2007/09/tutorial_5_schematic.png" alt="tutorial_5_schematic.png" /></a></p>
<p>这样一旦Arduino在通过串口向PC机发送数据时，相应的发光二极管就会闪烁，实际应用中这是一个非常方便的调试手段;-)</p>
<p align="center"><a href="http://blog.booksforce.com/wp-content/uploads/2007/09/tutorial_5_circuit.jpg" title="tutorial_5_circuit.jpg"><img src="http://blog.booksforce.com/wp-content/uploads/2007/09/tutorial_5_circuit.jpg" alt="tutorial_5_circuit.jpg" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.flamingoeda.com/2007/09/08/arduino%e6%95%99%e7%a8%8b%e4%ba%94-%e4%b8%b2%e5%8f%a3%e8%be%93%e5%87%ba/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Arduino教程四: 模拟输出</title>
		<link>http://blog.flamingoeda.com/2007/09/03/arduino%e6%95%99%e7%a8%8b%e5%9b%9b-%e6%a8%a1%e6%8b%9f%e8%be%93%e5%87%ba/</link>
		<comments>http://blog.flamingoeda.com/2007/09/03/arduino%e6%95%99%e7%a8%8b%e5%9b%9b-%e6%a8%a1%e6%8b%9f%e8%be%93%e5%87%ba/#comments</comments>
		<pubDate>Sun, 02 Sep 2007 16:26:49 +0000</pubDate>
		<dc:creator>developer</dc:creator>
				<category><![CDATA[Arduino]]></category>
		<category><![CDATA[教程]]></category>

		<guid isPermaLink="false">http://blog.booksforce.com/2007/09/03/arduino%e6%95%99%e7%a8%8b%e5%9b%9b-%e6%a8%a1%e6%8b%9f%e8%be%93%e5%87%ba/</guid>
		<description><![CDATA[就像模拟输入一样，在现实的物理世界中我们经常需要输出除了0和1之外的其他数值。例如，除了想用微控制器找开或者关闭电灯之外，我们还会想控制灯光的亮度，这时就需要用到模拟输出。由于Arduino的微控制器只能产生高电压（5V）或者低电压（0V），而不能产生变化的电压，因此必须采用脉宽度调制技术（PWM，Pulse Width Modulation）来模仿模拟电压。 PWM是一种开关式稳压电源应用，它是借助微处理器的数字输出来对模拟电路进行控制的一种非常用效的技术，广泛应用在从测量、通信到功率控制与变换的许多领域中。简而言之，PWM是一种对模拟信号电平进行数字编码的方法，它通过对半导体开关器件的导通和关断进行控制，使输出端得到一系列幅值相等但宽度不相等的脉冲，而这些脉冲能够被用来代替正弦波或其它所需要的波形。 在Arduino数字I/O管脚9、10和11上，我们可以通过analogWrite()函数来产生模拟输出。该函数有两个参数，其中第一个参数是要产生模拟信号的引脚（9、10或者11）；第二个参数是用于产生模拟信号的脉冲宽度，取值范围是0到255。脉冲宽度的值取0可以产生0V的模拟电压，取255则可以产生5V的模拟电压。不难看出，脉冲宽度的取值变化1，产生的模拟电压将变化0.0196V（5/255 = 0.0196）。 本实验中我们将用模拟输出来调暗发光二极管（LED），由于正常情况下LED对电压的变化非常敏感，因此当脉冲宽度变化时人眼会感觉到LED实际上是在不断地熄灭和点亮，而不是逐渐变暗。解决这一问题可以采用滤波电路，它能使有用频率信号通过而同时抑制（或大大衰减）无用频率信号。实验中我们采用的是低通滤波器，它的原理非常简单，只需要一个电阻和一个电容，能够很好地过滤掉电路中超过某一频率的信号。 此处给出的电路并不能校平所有脉冲，它之所以被称为“低通滤波”是因为它只允许频率低于某个限度的脉冲通过，对于高于这个限度的脉冲则被平衡为伪模拟电压，滤波的频率范围由电阻器和电容器的比值决定。 实验中采用的电路原理如下： 相应的代码为： int potPin = 0; int ledPin = 11; byte bright_table[] = { 30, 30, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120, 130, 140, 150, 160, 170, 180, 190, 200, 210, 220, 230, 240, 250, 250, 240, 230, 220, 210, 200, 190, [...]]]></description>
			<content:encoded><![CDATA[<p>就像模拟输入一样，在现实的物理世界中我们经常需要输出除了0和1之外的其他数值。例如，除了想用微控制器找开或者关闭电灯之外，我们还会想控制灯光的亮度，这时就需要用到模拟输出。由于Arduino的微控制器只能产生高电压（5V）或者低电压（0V），而不能产生变化的电压，因此必须采用脉宽度调制技术（PWM，Pulse Width Modulation）来模仿模拟电压。</p>
<p>PWM是一种开关式稳压电源应用，它是借助微处理器的数字输出来对模拟电路进行控制的一种非常用效的技术，广泛应用在从测量、通信到功率控制与变换的许多领域中。简而言之，PWM是一种对模拟信号电平进行数字编码的方法，它通过对半导体开关器件的导通和关断进行控制，使输出端得到一系列幅值相等但宽度不相等的脉冲，而这些脉冲能够被用来代替正弦波或其它所需要的波形。</p>
<p>在Arduino数字I/O管脚9、10和11上，我们可以通过analogWrite()函数来产生模拟输出。该函数有两个参数，其中第一个参数是要产生模拟信号的引脚（9、10或者11）；第二个参数是用于产生模拟信号的脉冲宽度，取值范围是0到255。脉冲宽度的值取0可以产生0V的模拟电压，取255则可以产生5V的模拟电压。不难看出，脉冲宽度的取值变化1，产生的模拟电压将变化0.0196V（5/255 = 0.0196）。</p>
<p>本实验中我们将用模拟输出来调暗发光二极管（LED），由于正常情况下LED对电压的变化非常敏感，因此当脉冲宽度变化时人眼会感觉到LED实际上是在不断地熄灭和点亮，而不是逐渐变暗。解决这一问题可以采用滤波电路，它能使有用频率信号通过而同时抑制（或大大衰减）无用频率信号。实验中我们采用的是低通滤波器，它的原理非常简单，只需要一个电阻和一个电容，能够很好地过滤掉电路中超过某一频率的信号。</p>
<p align="center"> <a href="http://blog.booksforce.com/wp-content/uploads/2007/09/low_pass_filter.png" title="low_pass_filter.png"><img src="http://blog.booksforce.com/wp-content/uploads/2007/09/low_pass_filter.png" alt="low_pass_filter.png" /></a></p>
<p>此处给出的电路并不能校平所有脉冲，它之所以被称为“低通滤波”是因为它只允许频率低于某个限度的脉冲通过，对于高于这个限度的脉冲则被平衡为伪模拟电压，滤波的频率范围由电阻器和电容器的比值决定。</p>
<p>实验中采用的电路原理如下：</p>
<p align="center"> <a href="http://blog.booksforce.com/wp-content/uploads/2007/09/tutorial_4_schematic.png" title="tutorial_4_schematic.png"><img src="http://blog.booksforce.com/wp-content/uploads/2007/09/tutorial_4_schematic.thumbnail.png" alt="tutorial_4_schematic.png" /></a></p>
<p>相应的代码为：</p>
<pre><code>
int potPin = 0;
int ledPin = 11;

byte bright_table[] = {  30,  30,  30,  40,  50,  60,  70,  80,  90, 100,
                        110, 120, 130, 140, 150, 160, 170, 180, 190, 200,
                        210, 220, 230, 240, 250, 250, 240, 230, 220, 210,
                        200, 190, 180, 170, 160, 150, 140, 130, 120, 110,
                        100,  90,  80,  70,  60,  50,  40,  30,  30,  30 };
int MAX = 50;
int count = 0;
int val = 0;

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

void loop() {
  analogWrite(ledPin, bright_table[count]);
  count ++;
  if (count > MAX) {
    count = 0;
  }

  val = analogRead(potPin);
  val = val /4;
  delay(val);
}
</code></pre>
<p>该工程调用analogWrite()函数在数字I/O端口的11号管脚上模仿模拟输出，每产生一次输出后都设置了相应的延时，而延时的长度由模拟输入端口0号管脚上的电位器来决定。通过调整电位器的位置，我们可以观察到发光二极管逐渐变亮后再逐渐变暗的效果。</p>
<p align="center"> <a href="http://blog.booksforce.com/wp-content/uploads/2007/09/tutorial_4_circuit.jpg" title="tutorial_4_circuit.jpg"><img src="http://blog.booksforce.com/wp-content/uploads/2007/09/tutorial_4_circuit.jpg" alt="tutorial_4_circuit.jpg" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.flamingoeda.com/2007/09/03/arduino%e6%95%99%e7%a8%8b%e5%9b%9b-%e6%a8%a1%e6%8b%9f%e8%be%93%e5%87%ba/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Arduino教程三: 模拟输入</title>
		<link>http://blog.flamingoeda.com/2007/09/01/arduino%e6%95%99%e7%a8%8b%e4%b8%89-%e6%a8%a1%e6%8b%9f%e8%be%93%e5%85%a5/</link>
		<comments>http://blog.flamingoeda.com/2007/09/01/arduino%e6%95%99%e7%a8%8b%e4%b8%89-%e6%a8%a1%e6%8b%9f%e8%be%93%e5%85%a5/#comments</comments>
		<pubDate>Sat, 01 Sep 2007 05:33:06 +0000</pubDate>
		<dc:creator>developer</dc:creator>
				<category><![CDATA[Arduino]]></category>
		<category><![CDATA[教程]]></category>

		<guid isPermaLink="false">http://blog.booksforce.com/2007/09/01/arduino%e6%95%99%e7%a8%8b%e4%b8%89-%e6%a8%a1%e6%8b%9f%e8%be%93%e5%85%a5/</guid>
		<description><![CDATA[Arduino的优势在于对数字信号的识别和处理，但我们所生活的真实世界并不是数字（digital）化的，简单到只要用0和1就能够表示所有的现象。例如温度这一我们已经司空见惯的概念，它只能在一个范围之内连续变化，而不可能发生像从0到1这样的瞬时跳变，类似这样的物理量被人们称为是模拟（analog）的。Arduino是无法理解这些模拟量的，它们必须在经过模数转换后变成数字量后，才能被Arduino进一步处理。 像温度这样的数据必须先被转换成微处理器能够处理的形式（比如电压），才能被Arduino处理，这一任务通常由各类传感器（sensor）来完成的。例如，电路中的温度传感器能够将温度值转换成0V到5V间的某个电压，比如0.3V、3.27V、4.99V等。由于传感器表达的是模拟信号，它不会像数字信号那样只有简单的高电平和低电平，而有可能是在这两者之间的任何一个数值。至于到底有多少可能的值则取决于模数转换的精度，精度越高能够得到的值就会越多。 Arduino所采用的ATmega8微处理器一其有6个模数转换器（ADC，Analog to Digital Converter），每一个模数转换器的精度都是10bit，也就是说能够读取1024（2^10 = 1024）个状态。在Arduino的每一个模拟输入管脚上，电压的变化范畴是从0V到5V，因此Arduino能够感知到的最小电压变化是4.8毫伏（5/1024 = 4.8mV）。 电位计（potentiometer）是一种最简单的模拟输入设备，它实际上就是一个可变电阻箱，通过控制滑块所在的位置我们可以得到不同的电压值，而输入信号正是从滑块所在的位置接入到电路中的。 这一实验我们将通过改变电位计的值来控制发光二极管闪烁的频率。电位计上一共有三个管脚，分别连接到Arduino的电源、地和模拟输入的5号管脚上，发光二极管则连接到数字I/O的13号管脚上，原理图如下所示： 相应的代码为： int ledPin = 13; int potPin = 5; int value = 0; void setup() { pinMode(ledPin, OUTPUT); } void loop() { value = analogRead(potPin); digitalWrite(ledPin, HIGH); delay(value); digitalWrite(ledPin, LOW); delay(value); } 在Arduino中，对模拟输入端口不需要调用pinMode()函数将其指定为输入或者是输出模式，这点同数字I/O端口是有所不同的。 通过旋转电位计的轴，我们能改变电位计中间那根连线同地之间的电阻量，从而也就能改变从模拟输入的5号管脚上所读入的模拟量的值。当电位计完全旋转到头时，输入到模拟输入管脚上的电压为0V，用analogRead()函数读出的值为0；当电位计完全旋转到另一头时，输入到模拟I/O管脚上的电压为5V，此时用analogRead()函数读出的值为1023；当电位计旋转到中间的某个位置时，输入到模拟输入管脚上的电压是0V到5V之间的某个值，而用analogRead()函数读出的则是位于0到1023之间的某个对应值。读出的模拟量在我们的实验中被用来确定发光二极管点亮和熄灭的时间，以反映模拟量的变化。 电位计运用的是分压原理，通过旋转到不同的位置来得到不同的电压值。从这种意义上讲，它能够被用来对当前旋转到的位置进行度量，因此可以被用在转向轮等旋转装置中。 今天发现PCB板上另外一个错误，就是将模拟输入对应管脚号标反了，试了好久才意识到是这一问题。加上之前电源设计上的两个小缺陷， 一共有三个需要修改的地方。如果有机会再做PCB板的话，试着将这些问题解决一下:-)]]></description>
			<content:encoded><![CDATA[<p>Arduino的优势在于对数字信号的识别和处理，但我们所生活的真实世界并不是数字（digital）化的，简单到只要用0和1就能够表示所有的现象。例如温度这一我们已经司空见惯的概念，它只能在一个范围之内连续变化，而不可能发生像从0到1这样的瞬时跳变，类似这样的物理量被人们称为是模拟（analog）的。Arduino是无法理解这些模拟量的，它们必须在经过模数转换后变成数字量后，才能被Arduino进一步处理。</p>
<p>像温度这样的数据必须先被转换成微处理器能够处理的形式（比如电压），才能被Arduino处理，这一任务通常由各类传感器（sensor）来完成的。例如，电路中的温度传感器能够将温度值转换成0V到5V间的某个电压，比如0.3V、3.27V、4.99V等。由于传感器表达的是模拟信号，它不会像数字信号那样只有简单的高电平和低电平，而有可能是在这两者之间的任何一个数值。至于到底有多少可能的值则取决于模数转换的精度，精度越高能够得到的值就会越多。</p>
<p>Arduino所采用的ATmega8微处理器一其有6个模数转换器（ADC，Analog to Digital Converter），每一个模数转换器的精度都是10bit，也就是说能够读取1024（2^10 = 1024）个状态。在Arduino的每一个模拟输入管脚上，电压的变化范畴是从0V到5V，因此Arduino能够感知到的最小电压变化是4.8毫伏（5/1024 = 4.8mV）。</p>
<p>电位计（potentiometer）是一种最简单的模拟输入设备，它实际上就是一个可变电阻箱，通过控制滑块所在的位置我们可以得到不同的电压值，而输入信号正是从滑块所在的位置接入到电路中的。</p>
<p style="text-align: center"><a href="http://blog.booksforce.com/wp-content/uploads/2007/09/tutorial_3_pot_theory.png" title="tutorial_3_pot_theory.png"><img src="http://blog.booksforce.com/wp-content/uploads/2007/09/tutorial_3_pot_theory.png" alt="tutorial_3_pot_theory.png" /></a></p>
<p style="text-align: center"><a href="http://blog.booksforce.com/wp-content/uploads/2007/09/tutorial_3_potentiometer.jpg" title="tutorial_3_potentiometer.jpg"><img src="http://blog.booksforce.com/wp-content/uploads/2007/09/tutorial_3_potentiometer.jpg" alt="tutorial_3_potentiometer.jpg" /></a></p>
<p>这一实验我们将通过改变电位计的值来控制发光二极管闪烁的频率。电位计上一共有三个管脚，分别连接到Arduino的电源、地和模拟输入的5号管脚上，发光二极管则连接到数字I/O的13号管脚上，原理图如下所示：</p>
<p style="text-align: center"><a href="http://blog.booksforce.com/wp-content/uploads/2007/09/tutorial_3_schematic.png" title="tutorial_3_schematic.png"><img src="http://blog.booksforce.com/wp-content/uploads/2007/09/tutorial_3_schematic.thumbnail.png" alt="tutorial_3_schematic.png" /></a></p>
<p>相应的代码为：</p>
<pre>
<code>
int ledPin = 13;
int potPin = 5;
int value = 0;

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

void loop() {
  value = analogRead(potPin);
  digitalWrite(ledPin, HIGH);
  delay(value);
  digitalWrite(ledPin, LOW);
  delay(value);
}
</code></pre>
<p>在Arduino中，对模拟输入端口不需要调用pinMode()函数将其指定为输入或者是输出模式，这点同数字I/O端口是有所不同的。</p>
<p>通过旋转电位计的轴，我们能改变电位计中间那根连线同地之间的电阻量，从而也就能改变从模拟输入的5号管脚上所读入的模拟量的值。当电位计完全旋转到头时，输入到模拟输入管脚上的电压为0V，用analogRead()函数读出的值为0；当电位计完全旋转到另一头时，输入到模拟I/O管脚上的电压为5V，此时用analogRead()函数读出的值为1023；当电位计旋转到中间的某个位置时，输入到模拟输入管脚上的电压是0V到5V之间的某个值，而用analogRead()函数读出的则是位于0到1023之间的某个对应值。读出的模拟量在我们的实验中被用来确定发光二极管点亮和熄灭的时间，以反映模拟量的变化。</p>
<p style="text-align: center"><a href="http://blog.booksforce.com/wp-content/uploads/2007/09/tutorial_3_circuit.jpg" title="tutorial_3_circuit.jpg"><img src="http://blog.booksforce.com/wp-content/uploads/2007/09/tutorial_3_circuit.jpg" alt="tutorial_3_circuit.jpg" /></a></p>
<p>电位计运用的是分压原理，通过旋转到不同的位置来得到不同的电压值。从这种意义上讲，它能够被用来对当前旋转到的位置进行度量，因此可以被用在转向轮等旋转装置中。</p>
<p>今天发现PCB板上另外一个错误，就是将模拟输入对应管脚号标反了，试了好久才意识到是这一问题。加上之前电源设计上的两个小缺陷， 一共有三个需要修改的地方。如果有机会再做PCB板的话，试着将这些问题解决一下:-)</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.flamingoeda.com/2007/09/01/arduino%e6%95%99%e7%a8%8b%e4%b8%89-%e6%a8%a1%e6%8b%9f%e8%be%93%e5%85%a5/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Arduino教程二: 数字输入</title>
		<link>http://blog.flamingoeda.com/2007/09/01/arduino%e6%95%99%e7%a8%8b%e4%ba%8c-%e6%95%b0%e5%ad%97%e8%be%93%e5%85%a5/</link>
		<comments>http://blog.flamingoeda.com/2007/09/01/arduino%e6%95%99%e7%a8%8b%e4%ba%8c-%e6%95%b0%e5%ad%97%e8%be%93%e5%85%a5/#comments</comments>
		<pubDate>Sat, 01 Sep 2007 03:13:24 +0000</pubDate>
		<dc:creator>developer</dc:creator>
				<category><![CDATA[Arduino]]></category>
		<category><![CDATA[教程]]></category>

		<guid isPermaLink="false">http://blog.booksforce.com/2007/09/01/arduino%e6%95%99%e7%a8%8b%e4%ba%8c-%e6%95%b0%e5%ad%97%e8%be%93%e5%85%a5/</guid>
		<description><![CDATA[&#160; 在数字电路中开关（switch）是一种基本的输入形式，它的作用是保持电路的连接或者断开。Arduino从数字I/O管脚上只能读出高电平（5V）或者低电平（0V），因此我们首先面临到的一个问题就是如何将开关的开/断状态转变成Arduino能够读取的高/低电平。解决的办法是通过上/下拉电阻，按照电路的不同通常又可以分为正逻辑（Positive Logic）和负逻辑（Inverted Logic）两种。 在正逻辑电路中，开关一端接电源，另一端则通过一个10K的下拉电阻接地，输入信号从开关和电阻间引出。当开关断开的时候，输入信号被电阻“拉”向地，形成低电平（0V）；当开关接通的时候，输入信号直接与电源相连，形成高电平。对于经常用到的按压式开关来讲，就是按下为高，抬起为低。 在负逻辑电路中，开关一端接地，另一端则通过一个10K的上拉电阻接电源，输入信号同样也是从开关和电阻间引出。当开关断开时，输入信号被电阻“拉”向电源，形成高电平（5V）；当开关接通的时候，输入信号直接与地相连，形成低电平。对于经常用到的按压式开关来讲，就是按下为低，抬起为高。 为了验证Arduino数字I/O的输入功能，我们可以将开关接在Arduino的任意一个数字I/O管脚上（13除外），并通过读取它的接通或者断开状态，来控制其它数字I/O管脚的高低。本实验采用的原理图如下所示，其中开关接在数字I/O的7号管脚上，被控的发光二极管接在数字I/O的13号管脚上： 相应的代码为： int ledPin = 13; int switchPin = 7; int value = 0; void setup() { pinMode(ledPin, OUTPUT); pinMode(switchPin, INPUT); } void loop() { value = digitalRead(switchPin); if (HIGH == value) { // turn LED off digitalWrite(ledPin, LOW); } else { // turn LED on digitalWrite(ledPin, HIGH); } [...]]]></description>
			<content:encoded><![CDATA[<p align="center">&nbsp;</p>
<p>在数字电路中开关（switch）是一种基本的输入形式，它的作用是保持电路的连接或者断开。Arduino从数字I/O管脚上只能读出高电平（5V）或者低电平（0V），因此我们首先面临到的一个问题就是如何将开关的开/断状态转变成Arduino能够读取的高/低电平。解决的办法是通过上/下拉电阻，按照电路的不同通常又可以分为正逻辑（Positive Logic）和负逻辑（Inverted Logic）两种。</p>
<p>在正逻辑电路中，开关一端接电源，另一端则通过一个10K的<strong>下拉电阻</strong>接地，输入信号从开关和电阻间引出。当开关断开的时候，输入信号被电阻“拉”向地，形成低电平（0V）；当开关接通的时候，输入信号直接与电源相连，形成高电平。对于经常用到的按压式开关来讲，就是按下为高，抬起为低。</p>
<p align="center"><a href="http://blog.booksforce.com/wp-content/uploads/2007/09/tutorial_2_pull_down.png" title="tutorial_2_pull_down.png"><img src="http://blog.booksforce.com/wp-content/uploads/2007/09/tutorial_2_pull_down.png" alt="tutorial_2_pull_down.png" /></a></p>
<p>在负逻辑电路中，开关一端接地，另一端则通过一个10K的<strong>上拉电阻</strong>接电源，输入信号同样也是从开关和电阻间引出。当开关断开时，输入信号被电阻“拉”向电源，形成高电平（5V）；当开关接通的时候，输入信号直接与地相连，形成低电平。对于经常用到的按压式开关来讲，就是按下为低，抬起为高。</p>
<p align="center"><a href="http://blog.booksforce.com/wp-content/uploads/2007/09/tutorial_2_pull_up.png" title="tutorial_2_pull_up.png"><img src="http://blog.booksforce.com/wp-content/uploads/2007/09/tutorial_2_pull_up.png" alt="tutorial_2_pull_up.png" /></a></p>
<p>为了验证Arduino数字I/O的输入功能，我们可以将开关接在Arduino的任意一个数字I/O管脚上（13除外），并通过读取它的接通或者断开状态，来控制其它数字I/O管脚的高低。本实验采用的原理图如下所示，其中开关接在数字I/O的7号管脚上，被控的发光二极管接在数字I/O的13号管脚上：</p>
<p align="center"><a href="http://blog.booksforce.com/wp-content/uploads/2007/09/tutorial_2_schematic1.png" title="tutorial_2_schematic1.png"><img src="http://blog.booksforce.com/wp-content/uploads/2007/09/tutorial_2_schematic1.thumbnail.png" alt="tutorial_2_schematic1.png" /></a></p>
<p>相应的代码为：</p>
<pre>
<code>
int ledPin = 13;
int switchPin = 7;
int value = 0;

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

void loop() {
  value = digitalRead(switchPin);
  if (HIGH == value) {
    // turn LED off
    digitalWrite(ledPin, LOW);
  } else {
    // turn LED on
    digitalWrite(ledPin, HIGH);
  }
}</code></pre>
<p>由于采用的是负逻辑电路，开关按下时用digitalRead()函数读取到的值为LOW，此时再用digitalWrite()函数将发光二极管所在的管脚置为高，点亮发光二极管。同理，当开关抬起时，发光二极管将被熄灭，这样我们就实现了用开关来控制发光二极管的功能。</p>
<p align="center"><a href="http://blog.booksforce.com/wp-content/uploads/2007/09/tutorial_2_circuit.jpg" title="tutorial_2_circuit.jpg"><img src="http://blog.booksforce.com/wp-content/uploads/2007/09/tutorial_2_circuit.jpg" alt="tutorial_2_circuit.jpg" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.flamingoeda.com/2007/09/01/arduino%e6%95%99%e7%a8%8b%e4%ba%8c-%e6%95%b0%e5%ad%97%e8%be%93%e5%85%a5/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Arduino教程一: 数字输出</title>
		<link>http://blog.flamingoeda.com/2007/08/30/arduino%e6%95%99%e7%a8%8b%e4%b8%80-%e6%95%b0%e5%ad%97%e8%b7%91%e9%a9%ac%e7%81%af/</link>
		<comments>http://blog.flamingoeda.com/2007/08/30/arduino%e6%95%99%e7%a8%8b%e4%b8%80-%e6%95%b0%e5%ad%97%e8%b7%91%e9%a9%ac%e7%81%af/#comments</comments>
		<pubDate>Thu, 30 Aug 2007 15:32:12 +0000</pubDate>
		<dc:creator>developer</dc:creator>
				<category><![CDATA[Arduino]]></category>
		<category><![CDATA[教程]]></category>

		<guid isPermaLink="false">http://blog.booksforce.com/2007/08/30/arduino%e6%95%99%e7%a8%8b%e4%b8%80-%e6%95%b0%e5%ad%97%e8%b7%91%e9%a9%ac%e7%81%af/</guid>
		<description><![CDATA[Arduino的数字I/O被分成两个部分，其中每个部分都包含有6个可用的I/O管脚，即管脚2到管脚7和管脚8到管脚13。除了管脚13上接了一个1K的电阻之外，其他各个管脚都直接连接到ATmega上。我们可以利用一个6位的数字跑马灯，来对Arduino数字I/O的输出功能进行验证，以下是相应的原理图： 电路中在每个I/O管脚上加的那个1K电阻被称为限流电阻，由于发光二极管在电路中没有等效电阻值，使用限流电阻可以使元件上通过的电流不至于过大，能够起到保护的作用。 该工程对应的代码为： int BASE = 2; int NUM = 6; 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 [...]]]></description>
			<content:encoded><![CDATA[<p>Arduino的数字I/O被分成两个部分，其中每个部分都包含有6个可用的I/O管脚，即管脚2到管脚7和管脚8到管脚13。除了管脚13上接了一个1K的电阻之外，其他各个管脚都直接连接到ATmega上。我们可以利用一个6位的数字跑马灯，来对Arduino数字I/O的输出功能进行验证，以下是相应的原理图：</p>
<p align="center"><img src="http://blog.booksforce.com/wp-content/uploads/2007/08/tutorial-1-schematic1.png" /></p>
<p>电路中在每个I/O管脚上加的那个1K电阻被称为限流电阻，由于发光二极管在电路中没有等效电阻值，使用限流电阻可以使元件上通过的电流不至于过大，能够起到保护的作用。</p>
<p>该工程对应的代码为：</p>
<pre>
<code>
int BASE = 2;
int NUM = 6;
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>下载并运行该工程，连接在Arduino数字I/O管脚2到管脚7上的发光二极管会依次点亮0.1秒，然后再熄灭：</p>
<p align="center"><img src="http://blog.booksforce.com/wp-content/uploads/2007/08/tutorial-1-circuit.jpg" /></p>
<p>这个实验可以用来验证数字I/O输出的正确性。Arduino上一共有十二个数字I/O管脚，我们可以用同样的办法验证其他六个管脚的正确性，而这只需要对上述工程的第一行做相应的修改就可以了：</p>
<pre>
<code>
int BASE = 8;
</code></pre>
]]></content:encoded>
			<wfw:commentRss>http://blog.flamingoeda.com/2007/08/30/arduino%e6%95%99%e7%a8%8b%e4%b8%80-%e6%95%b0%e5%ad%97%e8%b7%91%e9%a9%ac%e7%81%af/feed/</wfw:commentRss>
		<slash:comments>13</slash:comments>
		</item>
	</channel>
</rss>
