<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0">
   <channel>
      <title>BITimE // 咀嚼时光</title>
      <link>http://wells.osall.com/</link>
      <description>有了未来为什么还要有过去？没有过去怎么会有未来？过去是凝固的现在？现在是凝固的未来？</description>
      <generator>http://sylvan.osall.com</generator>
      <language>zh-cn</language>
      <item>
         <title>电工笔记 - 第七章 - DS1307时钟芯片</title>
         <link>http://wells.osall.com/blog/index.php?m=content&amp;p=1588&amp;uid=1</link>
         <description><![CDATA[<p> </p>
<div> <h2>开始 Arduino 之旅!&nbsp;–&nbsp;第七章</h2> <hr>

 <p> 原文作者：John Boxall (john at tronixstuff dot com)<br /> 

 中文翻译：Wells Wang (wellswang at osall dot com) <br /> 

 原文地址：<a href="http://tronixstuff.wordpress.com/2010/05/20/getting-started-with-arduino-%e2%80%93-chapter-seven/">http://tronixstuff.wordpress.com/2010/05/20/getting-started-with-arduino-%e2%80%93-chapter-seven/</a><br /> 

 中文版地址：<a href="http://arduino.osall.com/ch07.html">http://arduino.osall.com/ch07.html</a> </p>
 

  <hr> 

 <p><strong>[请注意从2010年11月1日起，教程中的文件可以在<a href="https://sites.google.com/site/tronixstuff/">这里</a>下载]</strong></p>
 

  <p>这是一个关于Arduino微控制器的系列教程“<a href="http://tronixstuff.wordpress.com/tutorials/">开始 Arduino 之旅</a>”中的一篇，可以作为 Massimo Banzi 的“<a href="http://www.littlebirdelectronics.com/products/Getting-Started-with-Arduino.html">Getting Started with Arduino</a>”一书的补充材料阅读。</p>
 

  <p>教程的<a href="http://arduino.osall.com/ch00.html">第一章在这里</a>。</p>
 

  <p><em>欢迎回来，arduino的爱好者们！</em></p>
 

  <p>这一周我们将围绕着<strong>实时时钟</strong>的概念，学习如何在我们的项目中使用时钟。一旦我们能够在我们的代码中使用时钟，一些全新的想法和项目将成为可能。从一个简单的闹钟，到复杂的时序自动化系统，都可以通过我们的设计和Arduino来实现。不要浪费时间了，我们快开始吧！</p>
 

  <p>首先，有几个数学概念和变量类型需要了解一下，以便能够理下面的代码。这的确有点枯燥，不过我会尽量减少这样的内容。</p>
 

  <p>首先是二进制编码的十进制数字。</p>
 

  <p>你能记得在<a href="http://arduino.osall.com/ch04.html">第四章</a>中提到的二进制数是如何工作的？如果忘了，先去复习一下，然后再回来。二进制编码的十进制数（BCD）与其相似，但不同的是，每一位上的数字都会用一个<em>四位</em>的数据来存储。还记得使用74HC595位移寄存器工作时，我们向它发送一个<em>字节</em>的数据么——四位就是一个字节的一半。例如：</p>
 

  <p style="text-align:center"><a href="http://arduino.osall.com/images/ch07/b_bcdtable.jpg">
<img class="aligncenter size-large wp-image-955" title="BCD码的例子 - 点击放大" src="http://arduino.osall.com/images/ch07/bcdtable.jpg" alt="" height="44" width="491"></a></p>
 

  <p style="text-align:left">下面是一个二进制编码的十进制数的短片——使用LED显示的从0到9的计数：</p>
 

  <p style="text-align:left"><strong>
  <span class="embed-youtube" style="text-align:center;display:block">
   <embed src="http://player.youku.com/player.php/sid/XMzAwNTcyMTQ0/v.swf" quality="high" allowscriptaccess="sameDomain" type="application/x-shockwave-flash" align="middle" height="400" width="480">
  </span></strong></p>
 

  <p style="text-align:left">但是，请记住每个数字是一个四位二进制数，如果要表达较大的数字，则需要更多的比特位数(bit)。例如，12 就是 0001 0010，256 就是 0010 0101 0110，等等。请注意，两个BCD编码组成了一个<em>字节</em>。例如，数字56的BCD表达是 0101 0110，这需要 2 × 4位 = 1字节。</p>
 

  
 

  <p style="text-align:left">下一步，我们将需要了解的是<em>字节</em>型变量。就像其他变量一样，可以很方便的声明字节型变量，例如：</p>
<p>[code=C]<br />byte seconds = B11111;<br />[/code]</p>
 

  <p style="text-align:left">B11111 就是十进制数字31，（也就是2^4 + 2^3 + 2^2 + 2^1 + 2^0 或 16 + 8 + 4 + 2 + 1）</p>
 

  <p style="text-align:left">不过，您可以使用一个整数型变量来表示一个同样值的字节型变量。这里是一段<a href="https://sites.google.com/site/tronixstuff/home/arduino-tutorial-series-files/example7p1.pde">简单的代码</a>。</p>
 

  <p style="text-align:left">以及代码运行的结果：</p>
 

<p style="text-align:center"><a href="http://arduino.osall.com/images/ch07/b_example7p1.jpg">
<img class="aligncenter size-full wp-image-963" title="例4.2." src="http://arduino.osall.com/images/ch07/example7p1.jpg" alt="" height="612" width="365"></a></p>
 

  <p style="text-align:left">如果你把例子7.1中的代码运行的结果打印出来，对于在第五章中提到的<a href="http://arduino.osall.com/ch05.html">二进制猜谜游戏</a>来说，就是一个完美的答案表。</p>
 

  <p style="text-align:left">总之，我们继续，现在来看看十六进制数字。“十六进制”数字基数为16，通过使用16个数字
/字符来表示数字。你知道不同基数的数字的表示模式吗？二进制数的基数是2，因为它们使用0和1来表示数字；十进制数以10为基数，因为它们使用0到9来
表示数字；十六进制数字则使用数字0到9，然后再使用字母A到F来表示数字。运行<a href="https://sites.google.com/site/tronixstuff/home/arduino-tutorial-series-files/example7p2.pde">下面的代码</a>来看看它们和二进制、十进制数字之间的比较。</p>
 

  <p style="text-align:left">下面是结果的截图：左列是二进制，中间是十进制，右列则是十六进制（译者注：根据截图，英文原文的顺序是错误的，此处译文已根据截图更正）。</p>
 

<p style="text-align:center"><a href="http://arduino.osall.com/images/ch07/b_example7p21.jpg">
<img class="aligncenter size-full wp-image-1041" title="例4.2." src="http://arduino.osall.com/images/ch07/example7p21.jpg" alt="" height="776" width="573"></a></p>
 

  <p style="text-align:left">遗憾的是，我们使用的时钟芯片采用的是BCD码，所以我们需要能够从BCD转换到时钟数据。</p>
 

  <p style="text-align:left">现在我们已经了解了BCD，二进制，十进制数，字节，十六进制，以及4位二进制数（半个字节）。真是学了不少！</p>
 

  <p style="text-align:left">休息时间到了。</p>
 

  <p style="text-align:left">在我们学习时钟之前，让我们先来看看一个新语句：<em>switch ... case</em> 。假设你需要检查一个变量，然后要在这个变量的值的基础上作出相应的决定，而且会有两种以上的可能性。你当然可以使用多个<em>if ... then ... else if</em>语句，但这对于代码的可阅读性来说，是非常糟糕的。所以，这就是<em>switch ... case</em>的用武之地。看看这个例子，情况就不言自明了：</p>
<span style="font-family: monospace;">[code=C]<br />switch (zz) {<br />&nbsp;&nbsp;&nbsp; case 10:<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //当变量zz等于10时，所需要做的事<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; break;<br />&nbsp;&nbsp;&nbsp; case 20:<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //当变量zz等于20时，所需要做的事<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; break;<br />&nbsp;&nbsp;&nbsp; case 30:<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //当变量zz等于30时，所需要做的事<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; break;<br />&nbsp;&nbsp;&nbsp; default:<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //如果没有其他的匹配，默认的情况<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //默认是可选项<br />}<br />[/code]<br /></span><p>Ok，我们又回来了。这一章似乎看起来都是和数字相关的内容，没什么别的东西，但是这些都是为了能够让我们使用时钟集成电路而所需要的基础知识。在我们开始学习时钟电路之前，还有最后一件事必须先要了解的。那就是……</p>
 

  <p><span style="color:rgb(0, 0, 0)"><a href="http://ics.nxp.com/interface/#I2C">I2C</a></span>总线。</p>
 

  <p>（有两种方法可以来解释说明，简单的方法，以及详细的方法。由于这是“Arduino入门”教程，我会用简单的方法来说明。如果您想了解更详细的技术信息，请阅读此文件：<a href="http://arduino.osall.com/images/ch07/b_nxp-i2c-bus-master-guide.pdf"><span style="color:rgb(0,0,0)">NXP I2C Bus.pdf</span></a> ，或阅读<a href="http://ics.nxp.com/interface/#I2C"><span style="color:rgb(0,0,0)">NXP的网站</span></a>获得详细信息。）</p>
 

  <p>I2C总线（也被称为“双线接口”）是一种设备（集成电路）之间互相通信、控制以及共享数据所使用的接口的名称。（这是20世纪70年代中后期由飞利浦发明的。[<a href="http://www.philips.com/"><span style="color:rgb(0,0,0)">飞利浦</span></a>的半导体部门已经被分拆为<a href="http://www.nxp.com/"><span style="color:rgb(0,0,0)">恩智浦(NXP)</span></a>] ）。这种数据交换流是串行的，使用了两条线（所以被称为双线接口），一条线被称为SDA（串行数据），另一条则是SCL（串行时钟）。</p>
 

<p style="text-align:center"><a href="http://arduino.osall.com/images/ch07/b_nxpi2cbussmall.jpg">
<img title="I2C总线" src="http://arduino.osall.com/images/ch07/nxpi2cbussmall.jpg" alt=""></a> <br />I2C总线-图像从<a href="http://ics.nxp.com/interface/#I2C"><span style="color:rgb(0,0,0)">恩智浦(NXP)</span></a>文档中截取</p>
 

  <p>一个设备可以是主控设备，或从设备。在我们的例子中，Arduino为主控设备，而时钟芯片则是从设备。总线上的每个芯片都有自己独特的“地
址”，就像您的家庭住址，但都是以二进制或十六进制来表示的。在与指定的设备通信之前，你需要在代码中指定该设备在I2C总线上的地址。能够在I2C总线
上工作的设备，有许多不同的类型，从照明控制器，模拟数字转换器，到LED驱动器，各种各样的设备，种类非常多。但这一章中我们感兴趣的芯片，是：</p>
 

  <p>Maxim (马克西姆)的<a href="http://www.maxim-ic.com/quick_view2.cfm/qv_pk/2688"><span style="color:rgb(0,0,0)">DS1307</span></a>串行I2C实时时钟芯片。我们来看一下：</p>
 

  <p style="text-align:center"><a href="http://arduino.osall.com/images/ch07/b_ds1307small.jpg">
<img class="aligncenter size-medium wp-image-973" title="滴答... ...滴答... ..." src="http://arduino.osall.com/images/ch07/ds1307small.jpg" alt="" "=""></a></p>
 <p>这惊人的小芯片，只有很少的外部元件，但是可以记录和输出12和24小时格式的时间，星期，日、月、年，闰年，以及一个月内的天数。有趣的是，它也可以产生在1Hz、4kHz、8kHz或32kHz的方波。如需进一步的技术信息，请参考<a href="http://arduino.osall.com/images/ch07/maxim-ds1307-rtc.pdf"><span style="color:rgb(0,0,0)">DS1307 的数据表文件(DS1307 data sheet.pdf)</span></a> 。注意——DS1307不能工作在0摄氏度/32华氏度以下，如果你需要在冰点以下使用，请使用DS1307N。</p>
 

  <p>使用Arduino主控板来控制DS1307是非常简单的，你可以<a href="http://www.littlebirdelectronics.com/products/Real-Time-Clock-Module.html"><span style="color:rgb(0,0,0)">购买</span></a>一块现成的带有时钟芯片与外部电路的电路板，或者自己来制作电路。如果你想要自己来做的话，这里是你需要的电路图：（点击图片放大）</p>
 

  <p style="text-align:center"><a href="http://arduino.osall.com/images/ch07/b_ds1307exampleuse.jpg">
<img class="aligncenter size-medium wp-image-1780" src="http://arduino.osall.com/images/ch07/ds1307exampleuse.jpg" alt="" height="165" width="300"></a></p>
 

<address><span style="font-style:normal">3V电池是用来备用的，比较好的实现是使用CR2032纽扣电池——不过任何的3V、长效的电源，都是可以使用的。</span><span style="font-style:normal">如果您购买了DS1307的电路板，在使用前记得检查电池电压……我的板子不停丢失时间记录，最后我才意识到它买来时配的电池就已经是快失效的了。</span><span style="font-style:normal">当Vcc下降（主电源断开）时，备用电池将不会允许该芯片沟通，它只是用来使芯片保持时间记录，以便于等到主电源恢复正常时，芯片内的时间是准确的。</span><span style="font-style:normal">好极了。</span><span style="font-style:normal">晶振是32.768kHz的，<a href="http://www.littlebirdelectronics.com/products/Crystal-32kHz.html"><span style="color:rgb(0,0,0)">很容易买到</span></a> 。</span><span style="font-style:normal">电容就是一个标准的0.1uF的瓷片电容。</span></address> <p>现在来看一下我们的代码如何使DS1307工作的。为了在Arduino上使用I2C总线，可以在代码中使用<a href="http://arduino.cc/en/Reference/Wire"><span style="color:rgb(0,0,0)">wire</span></a>库，它包含了与我们的I2C总线连接的设备通信所需的功能。要使用的Arduino的引脚是模拟端口4（SDA 串口数据）和模拟端口5（SCL 串口时钟）。如果您使用的是<a href="http://www.littlebirdelectronics.com/products/arduino-mega-2560">Mega控制板</a> ，它们是端口20（串口数据）和端口21（串口时钟）。只有三件我们需要完成的事情：把时间数据初始化设定到芯片中，从芯片中读回时间数据，并启用1Hz的方波函数（非常有用的 - 如果你是一个LED时钟，你可以有一个很好的LED闪烁）。</p>
 

  <p>首先，我们需要知道我们的DS1307的I2C地址。它是十六进制数0x68。地址对于一个类型的设备来说是唯一的，而不是对相同类型中的每个设备唯一的。</p>
 

  <p>接下来，DS1307按照一个特定的顺序来接受或返回时间数据……</p>
 

  <ul>
	<li>秒（秒总是设置为零，否则DS1307的振荡器将保持关闭）</li>
	<li>分钟</li>
	<li>小时</li>
	<li>星期（您可以将此数设置为1和7之间的任何值，例如：1是星期日，2则是星期一...）</li>
	<li>每月中的第几天</li>
	<li>月份</li>
	<li>年</li>
	<li>控制寄存器（可选——用于控制方波的频率和逻辑电平）</li>
</ul>
 <p>……但它只能接受及返回BCD格式的数据。所以，我们将需要一些能够将BCD码与十进制数互相转换的函数（除非你想要做一个BCD时钟……）。</p>
 

  <p>不过，为了便于使用，我会提供一个模板代码，你可以复制并粘贴到您自己的创作的代码中。请查看这个<a href="https://sites.google.com/site/tronixstuff/home/arduino-tutorial-series-files/example7p3.pde">文件</a> 。请注意，这段代码也激活了1Hz的方波，就在芯片的7号引脚。下面是一个在我的小<a href="http://tronixstuff.wordpress.com/2010/05/07/kit-review-jye-tech-oscilloscope/">示波器</a>上观察这个方波的的视频：</p>
 

  <p><strong>
  <span class="embed-youtube" style="text-align:center;display:block">
   <embed src="http://player.youku.com/player.php/sid/XMzAwNTcyMzg0/v.swf" quality="high" allowscriptaccess="sameDomain" type="application/x-shockwave-flash" align="middle" height="400" width="480">
 
  </span></strong></p>
 

  <p>在这个星期，我们将着眼于只使用24小时格式的时间，在不久的将来，我们会研究如何使用DS1307的12小时（上午/下午）格式的时间。</p>
 

  <p>这里是一个串行输出的抓屏：</p>
 

<p style="text-align:center"><a href="http://arduino.osall.com/images/ch07/b_example7p3.jpg">
<img class="aligncenter size-medium wp-image-1013" title="滴答... ...滴答... ..." src="http://arduino.osall.com/images/ch07/example7p3.jpg" alt="" height="273" width="300"></a></p>
 

  <p>现在，你学会了将这个时间数据发送到串行输出，同样，你可以将它发送到其他设备。例如，我们来做一个简单的LCD时钟。这非常容易，只要修改例子7.3的代码就好了，唯一需要考虑是LCD模块上的可用空间。为了节省时间，我使用了<a href="http://tronixstuff.wordpress.com/2010/04/28/kit-review-seeedstudio-electronic-brick-starter-kit-2/">Electronic Brick（电子积木）</a>套件来组装这个例子。下面是我们的LCD时钟运行的短片：</p>
 

  <p><strong>
  <span class="embed-youtube" style="text-align:center;display:block">
   <embed src="http://player.youku.com/player.php/sid/XMzAwNTcyNjc2/v.swf" quality="high" allowscriptaccess="sameDomain" type="application/x-shockwave-flash" align="middle" height="400" width="480">
  </span></strong></p>
 

  <p>这里是例子的<a href="https://sites.google.com/site/tronixstuff/home/arduino-tutorial-series-files/example7p4.pde">代码</a> 。当我看到时钟点亮并正常工作后，我觉得真是太棒了——我希望你也是这样。现在，让我们回到数字时钟风靡的时代……</p>
 

  <p><em>练习 7.1</em></p>
 

  <p>使用我们的Arduino，DS1307芯片，以及练习6.2中使用的同样的硬件（除了不需要的可变电阻）——来创造一个不错的简单的数字时钟。它只需要显示小时和分钟，除非你想添加更多的显示部件。开始吧！</p>
 

  <p>这里是我的实验结果，请看视频：</p>
 

  <p><strong>
  <span class="embed-youtube" style="text-align:center;display:block">
   <embed src="http://player.youku.com/player.php/sid/XMzAwNTcyOTA0/v.swf" quality="high" allowscriptaccess="sameDomain" type="application/x-shockwave-flash" align="middle" height="400" width="480"> 
  </span></strong></p>
 

  <p>还有<a href="https://sites.google.com/site/tronixstuff/home/arduino-tutorial-series-files/exercise7p1.pde">代码</a> 。还有一个有意思的需要注意的地方——在你上传代码设置完时间之后，注释掉设置时间的那部分代码，然后再把代码上传一次。否则每次你的时钟在断电和重启后，它都会从代码中定义的时间开始计时！</p>
 

  <p>如前所述，通过使用DS1307的方波的输出，我们可以创造出各种应用。这个方波是从7号引脚引出的。要控制方波(SQW)是非常容易的——我们只需要设置指针指向SQW寄存器，然后设定一个频率值。下面的代码解释了这一点：<span style="font-family: monospace;"><br /></span></p>
<p>[code=C]<br />/*<br />&nbsp;&nbsp;&nbsp; DS1307的方波机制<br />&nbsp;&nbsp;&nbsp; 用于演示四种不同的<br />&nbsp;&nbsp;&nbsp; Maxim的DS1307的方波输出<br />&nbsp;&nbsp;&nbsp; 更多信息见数据表9页<br /><br />&nbsp;&nbsp;&nbsp; http://tronixstuff.wordpress.com<br />&nbsp;&nbsp;&nbsp; CC by-nc-sa v3.0<br />*/<br /><br />#include "Wire.h"<br />#define DS1307_I2C_ADDRESS 0x68 //每种I2C设备有一个唯一的总线地址， DS1307 是 0x68<br /><br />void setup()<br />{<br />&nbsp;&nbsp;&nbsp; Wire.begin();<br />}<br /><br />void sqw1() //设置为 1Hz<br />{<br />&nbsp;&nbsp;&nbsp; Wire.beginTransmission(DS1307_I2C_ADDRESS);<br />&nbsp;&nbsp;&nbsp; Wire.send(0x07); //将指针移到 SQW 地址<br />&nbsp;&nbsp;&nbsp; Wire.send(0x10); //发送0x10 (hex) 00010000 (binary)<br />&nbsp;&nbsp;&nbsp; Wire.endTransmission();<br />}<br /><br />void sqw2() //设置为 4.096 kHz<br />{<br />&nbsp;&nbsp;&nbsp; Wire.beginTransmission(DS1307_I2C_ADDRESS);<br />&nbsp;&nbsp;&nbsp; Wire.send(0x07); //将指针移到 SQW 地址<br />&nbsp;&nbsp;&nbsp; Wire.send(0x11); //发送0x11 (hex) 00010001 (binary)<br />&nbsp;&nbsp;&nbsp; Wire.endTransmission();<br />}<br /><br />void sqw3() //设置为 8.192 kHz<br />{<br />&nbsp;&nbsp;&nbsp; Wire.beginTransmission(DS1307_I2C_ADDRESS);<br />&nbsp;&nbsp;&nbsp; Wire.send(0x07); //将指针移到 SQW 地址<br />&nbsp;&nbsp;&nbsp; Wire.send(0x12); //发送 0x12 (hex) 00010010 (binary)<br />&nbsp;&nbsp;&nbsp; Wire.endTransmission();<br />}<br /><br />void sqw4() //设置为 32.768 kHz (晶振频率)<br />{<br />&nbsp;&nbsp;&nbsp; Wire.beginTransmission(DS1307_I2C_ADDRESS);<br />&nbsp;&nbsp;&nbsp; Wire.send(0x07); //将指针移到 SQW 地址<br />&nbsp;&nbsp;&nbsp; Wire.send(0x13); //发送 0x13 (hex) 00010011 (binary)<br />&nbsp;&nbsp;&nbsp; Wire.endTransmission();<br />}<br /><br />void sqwOff() //关闭SQW<br />{<br />&nbsp;&nbsp;&nbsp; Wire.beginTransmission(DS1307_I2C_ADDRESS);<br />&nbsp;&nbsp;&nbsp; Wire.send(0x07); //将指针移到 SQW 地址<br />&nbsp;&nbsp;&nbsp; Wire.send(0x00); //关闭SQW引脚<br />&nbsp;&nbsp;&nbsp; Wire.endTransmission();<br />}<br /><br />void loop()<br />{<br />&nbsp;&nbsp;&nbsp; sqw1();<br />&nbsp;&nbsp;&nbsp; delay(5000);<br />&nbsp;&nbsp;&nbsp; sqw2();<br />&nbsp;&nbsp;&nbsp; delay(5000);<br />&nbsp;&nbsp;&nbsp; sqw3();<br />&nbsp;&nbsp;&nbsp; delay(5000);<br />&nbsp;&nbsp;&nbsp; sqw4();<br />&nbsp;&nbsp;&nbsp; delay(5000);<br />&nbsp;&nbsp;&nbsp; sqwOff();<br />&nbsp;&nbsp;&nbsp; delay(5000);<br />}<br />[/code]</p>
 

   <p>下面是一个演示的视频 - 我们已经把DS1307的第7号引脚连接到了一个非常古老的频率计数器上：</p>
 

  <p style="text-align:center">
  <span class="embed-youtube" style="text-align:center;display:block">
   <embed src="http://player.youku.com/player.php/sid/XMzI3MDUzOTcy/v.swf" quality="high" allowscriptaccess="sameDomain" type="application/x-shockwave-flash" align="middle" height="400" width="480">
 </span></p>
 

  <p>又完成了一周的学习！我已经在迫不及待的想写下一篇文章了……祝贺所有那些参加学习，并创造出有趣的东西的朋友们！请订阅本页面（见这个页面的右上方）来接收文章更新的通知。文中高分辨率的照片可以在<a href="http://www.flickr.com/photos/tronixstuff/sets/72157623642420559/">Flickr</a>找到 。</p>
 

  <p>如果您有任何问题，可以在文章后面发表评论。我们也有一个专门的<a href="http://groups.google.com/group/tronixstuff">Google Group</a>来讨论这些项目和相关的内容- <a href="http://groups.google.com/group/tronixstuff">你可以在这里注册</a> ，它是免费的，这样我们都可以一起学习，共同进步。</p>
 

  <p>如果你想在这篇文章中展示您的作品，请把图片或链接发送到john at tronixstuff dot com。</p>
 

  <p>甚至你也许能够获得奖品呢！不要忘了去<a href="http://www.littlebirdelectronics.com/">Little Bird Electronics</a>看一下有没有合适的备件!</p>
 

  <p><strong><em>注意安全，享受乐趣吧，希望能尽快在<a href="http://arduino.osall.com/ch08.html">下一章</a>与你相遇！</em></strong></p>
 

  <hr> 

<strong> 在本教程中的所有材料，除非特别指出的，都基于 <a href="http://creativecommons.org/licenses/by-nc-sa/3.0/deed.zh_HK">Commons 的 姓名标示-非商业性-相同方式分享 v3.0 许可证</a>发布。</strong><strong>如果需要转发本作品，请按照相同的许可证发布，并注意发布页面不得有商业广告（包括但不限于Google Adsense等）。</strong><strong>如果你想在其他场合使用本作品，请发邮件给 原作者 john (at) tronixstuff dot com 以及中文化作者 wellswang (at) osall dot com 取得联系。</strong><strong>我们非常欢迎任何的回馈、留言以及建设性的意见！ </strong><hr> 

 

  <p style="padding-left:30px"> </p>
 

  </div>

  <p class="meta"> <span class="date"> 原文撰写时间：<a href="http://tronixstuff.wordpress.com/2010/05/20/">May 20, 2010</a> </span><br /> 

<span class="date"> 翻译时间：2011年11月26日 </span> </p>]]></description>
         <category>Arduino</category>
         <pubDate>Mon, 28 Nov 2011 16:06:21 +0900</pubDate>
      </item>
      <item>
         <title>电工笔记 - 第六章 （补记） - 4位7段数码管的补充说明</title>
         <link>http://wells.osall.com/blog/index.php?m=content&amp;p=1587&amp;uid=1</link>
         <description><![CDATA[<p> </p>
<div> <h2>开始 Arduino 之旅!&nbsp;–&nbsp;第六章 补记</h2> <hr>

 <p> 原文作者：John Boxall (john at tronixstuff dot com)<br />

 中文翻译：Wells Wang (wellswang at osall dot com) <br />

 原文地址：<a href="http://tronixstuff.wordpress.com/2010/05/16/getting-started-with-arduino-%e2%80%93-chapter%c2%a0six%c2%a0addendum/">http://tronixstuff.wordpress.com/2010/05/16/getting-started-with-arduino-%e2%80%93-chapter%c2%a0six%c2%a0addendum/</a><br />

 中文版地址：<a href="http://arduino.osall.com/ch06a.html">http://arduino.osall.com/ch06a.html</a> </p>

 <hr>

 <p>这是关于Arduino为控制器的系列教程“<a href="http://tronixstuff.wordpress.com/2010/04/04/getting-started-with-arduino-chapter-zero/">开始Arduino之旅!</a>”中的一篇。可以作为 Massimo Banzi 所著的“<a href="http://www.littlebirdelectronics.com/products/Getting-Started-with-Arduino.html">Getting Started with Arduino</a>”一书的补充材料阅读。教程的<a href="http://tronixstuff.wordpress.com/2010/04/04/getting-started-with-arduino-chapter-zero/">第一章在这里</a>。</p>

 <p><em>欢迎回来，arduino的爱好者们！</em></p>

 <p>重新回顾我们的教程的<a href="http://arduino.osall.com/ch06.html">第六章</a>之后，我认为我们漏掉了一些关于驱动4位7段LED显示模块的重要信息。虽然我们已经讨论了使用该模块来显示数字，并希望你能够通过练习6.2来实现将传感器读入的数据不断的写入显示屏。</p>

 <p>但我们是如何来发送一个数字给显示屏的——并且还要保持显示？我们需要一个函数来接受要显示的数字——以及要保持显示的时间（以周期为单位）。我已经重写了练习6.2的代码中的函数 <em>displaynumber()</em>——现在它能够接受另一个值，“循环周期(cycle)” 。这是数字在显示屏上想要保持显示的周期次数。</p>
[code=C]<br />void displaynumber(int rawnumber, int cycles)<br />// 获得一个整数，并显示在我们的4位LED显示模块上，并保持显示指定的“循环”周期数<br />{<br />&nbsp;&nbsp;&nbsp; for (int q=1; q&lt;=cycles; q++)<br />&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if (rawnumber&gt;=0 &amp;&amp; rawnumber&lt;10)<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; onedigitnumber(rawnumber);<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; else if (rawnumber&gt;=10 &amp;&amp; rawnumber&lt;100)<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; twodigitnumber(rawnumber);<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; else if (rawnumber&gt;=100 &amp;&amp; rawnumber&lt;1000)<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; threedigitnumber(rawnumber);<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; else if (rawnumber&gt;=1000)<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; fourdigitnumber(rawnumber);<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; }<br />}<br />[/code]<br /><br /><p>这里是一个<a href="https://sites.google.com/site/tronixstuff/home/arduino-tutorial-series-files/exercise6p2addendum.pde">演示此功能的代码</a>，硬件是和练习6.2相同的，除了不需要可变电阻器。</p>

 <p>如果没有一个演示的视频的话，这一天就不完美了。这个例子中<em>周期</em>被设置为500。</p>

 <span class="embed-youtube" style="text-align:center;display:block">
  <embed src="http://player.youku.com/player.php/sid/XMzAwNTcxODk2/v.swf" quality="high" allowscriptaccess="sameDomain" type="application/x-shockwave-flash" align="middle" height="400" width="480">
 </span> 
 
 <p>好了，你已经了解了！现在，你已经有了能够有效地使用这些多位数LED显示模块的知识了。我们已经掌握了它们，我们可以继续学习更有趣的和有用的其他类型的显示屏了。你可以在本网页的右上方加入<a href="http://go2.wordpress.com/?id=725X1342&amp;site=tronixstuff.wordpress.com&amp;url=http%3A%2F%2Fgroups.google.com%2Fgroup%2Ftronixstuff&amp;sref=http%3A%2F%2Ftronixstuff.wordpress.com%2F">我们的Google Group</a>！</p>

 <p style="text-align:center"><span style="font-family:tahoma,verdana,sans-serif;line-height:18px;font-size:12px;color:rgb(51, 51, 51)"><strong><em>注意安全，享受乐趣吧，希望能尽快在<a href="http://arduino.osall.com/ch07.html">下一章</a>与你相遇！</em></strong></span></p>

 <hr>

<strong> 在本教程中的所有材料，除非特别指出的，都基于 <a href="http://creativecommons.org/licenses/by-nc-sa/3.0/deed.zh_HK">Commons 的 姓名标示-非商业性-相同方式分享 v3.0 许可证</a>发布。</strong><strong>如果需要转发本作品，请按照相同的许可证发布，并注意发布页面不得有商业广告（包括但不限于Google Adsense等）。</strong><strong>如果你想在其他场合使用本作品，请发邮件给 原作者 john (at) tronixstuff dot com 以及中文化作者 wellswang (at) osall dot com 取得联系。</strong><strong>我们非常欢迎任何的回馈、留言以及建设性的意见！ </strong><hr>



 <p style="padding-left:30px"> </p>

 </div>

 <p class="meta"> <span class="date"> 原文撰写时间：<a href="http://tronixstuff.wordpress.com/2010/05/16/">May 16, 2010</a> </span><br />

<span class="date"> 翻译时间：2011年11月16 日 </span> </p>]]></description>
         <category>Arduino</category>
         <pubDate>Mon, 28 Nov 2011 14:04:45 +0900</pubDate>
      </item>
      <item>
         <title>电工笔记 - 第六章 - Sharp红外距离传感器，位移寄存器和4位7段LED数码管</title>
         <link>http://wells.osall.com/blog/index.php?m=content&amp;p=1579&amp;uid=1</link>
         <description><![CDATA[<div> <h2>开始 Arduino 之旅!&nbsp;–&nbsp;第六章</h2>
 <hr> <p> 原文作者：John Boxall (john at tronixstuff dot com)<br /> 中文翻译：Wells Wang (wellswang at osall dot com)、一坨 (zhuzhonghao at gmail dot com)<br /> 原文地址：<a href="http://tronixstuff.wordpress.com/2010/05/14/getting-started-with-arduino-%e2%80%93-chapter-six/">http://tronixstuff.wordpress.com/2010/05/14/getting-started-with-arduino-%e2%80%93-chapter-six/</a><br />中文版地址： <a href="http://arduino.osall.com/ch05.html">http://arduino.osall.com/ch06.html</a></p>
 <hr> <p><strong>[请注意从2010年11月1日起。</strong><strong>教程中的文件可以在<a href="https://sites.google.com/site/tronixstuff/">这里</a>下载]</strong></p>
 <p>这是关于Arduino为控制器的系列教程“<a href="http://arduino.osall.com/ch00.html">开始Arduino之旅!</a>”中的一篇。可以作为 Massimo Banzi 所著的“<a href="http://www.littlebirdelectronics.com/products/Getting-Started-with-Arduino.html">Getting Started with Arduino</a>”一书的补充材料阅读。</p>
 <p>教程的<a href="http://arduino.osall.com/ch00.html">第一章在这里</a>。</p>
 <p><em>欢迎回来，arduino的爱好者们！</em></p>
 <p>欢迎来到新一期的Arduino教程。这一周，我们要学习许多东西，包括距离探测、使用原型实验板、使用位移寄存器获得更多的变化、4位7段数码管以及通过一些练习来加深扩展你的知识。WOW- 让我们开始吧……</p>
 <p>你知道如何保持距离吗？有些人会这么做，有些人却不会。这同样适用于机电一体化的东西（比如那些小巧的清洁机器人），因此为了保持距离，你可以在
你的设计中安装距离传感器。希望在读过本节之后，你能够获得此类传感器的知识，并能在自己以后的项目中利用它们。总之，今天我们将学习Sharp 
GP2Y0A21YK0F红外<a href="http://www.littlebirdelectronics.com/products/sharp-gp2y0a21yk0f-analog-distance-sensor-10-80cm">距离传感器</a>。有趣的是，它看起来像一个机器人的头部：</p>
 <p align="center"><a href="http://arduino.osall.com/images/ch06/b_sharpsensorsmall.jpg">
<img class="aligncenter size-medium wp-image-846" title="#5 was alive..." src="http://arduino.osall.com/images/ch06/sharpsensorsmall.jpg" alt="" width="300" height="163"></a></p>
 <p>白色的JST接插件有三个接头，+5V，GND，和模拟输出。购买时应该附带一个<a href="http://www.littlebirdelectronics.com/products/3-pin-female-jst-ph-style-cable-for-sharp-distance-sensors-30cm">匹配的接插件</a>以节省时间。</p>
 <p>它的工作原理很简单（我不能这么说，有些事情不是看起来那么简单……）—— 传感器包含一个红外发射器和一个接收器。它将返回与和它前面的物体之间距离有关的一个电压信号。这个输出电压和距离成反比，<a href="http://arduino.osall.com/images/ch06/sharpdistancesensor.pdf">数据表(datasheet)文件</a>中的图可以更好的说明这一点。</p>
 <p align="center"><a href="http://arduino.osall.com/images/ch06/b_voltagedistance.jpg">
<img class="aligncenter size-medium wp-image-845" src="http://arduino.osall.com/images/ch06/voltagedistance.jpg" alt=""></a></p>
 <p>然而，自己测量出来将会更有趣。所以，我把一个传感器放在我的桌子上来进行80cm范围的测量，测量时用万用表测量传感器的模拟输出。</p>
 <p align="center"><a href="http://arduino.osall.com/images/ch06/b_sensorchecksmall.jpg">
<img class="aligncenter size-medium wp-image-845" title="同时，在实验室..." src="http://arduino.osall.com/images/ch06/sensorchecksmall.jpg" alt="" width="300" height="225"></a></p>
 <p>这个方法虽然很粗略，但很有效。我举了一张白色的纸板在传感器前面，从1米多开始移到最靠近传感器的地方，再移回去，见这个视频：</p>
 <p><strong><span class="embed-youtube" style="text-align:center;display:block">
 <embed src="http://player.youku.com/player.php/sid/XMjk4MjAyNDgw/v.swf" quality="high" allowscriptaccess="sameDomain" allowfullscreen="true" type="application/x-shockwave-flash" width="480" align="middle" height="400">
 </span></strong></p>
 <p>只看万用表的数据似乎太没有意思了，希望接下来的会更好玩！</p>
 <p><em>练习6.1</em></p>
 <p>从Sharp的数据表文件（参考前面的链接）中的图表上的值，来设计自己的距离测量设备。使用液晶模块来显示公制和英制的测量结果。这应该不是太
难，只需从传感器输入一个模拟量信号，并进行一些基本的算术运算，然后显示在LCD上。此外，为了便携，可以连接一个9V 
PP3电池到DC插头来取电。提示：计算距离之前，运行一个测试程序只从传感器返回<em>analogRead()</em>值，然后你能够让自己确定电压-距离之间的运算关系。为了节省时间，我们用<a href="http://www.littlebirdelectronics.com/products/Electronic-brick-%252d-Starter-kit.html">Electronic Bricks</a>来快速的搭建模型。</p>
 <div id="_mcePaste">你将需要：</div>
 <div id="_mcePaste"> <ul>
	<li>你的Arduino的标准套件（计算机，数据线，Uno或兼容的控制板）</li>
	<li>一个并行液晶显示模块</li>
	<li>一个<a href="http://www.littlebirdelectronics.com/products/sharp-gp2y0a02yk0f-analog-distance-sensor-20-150cm">Sharp</a>的红外距离感应器和传感器<a href="http://www.littlebirdelectronics.com/products/3-pin-female-jst-ph-style-cable-for-sharp-distance-sensors-30cm">连接线</a></li>
	<li>一块面包板和一些导线</li>
</ul>
 </div>
 <p>下面是我搭建出来的照片：</p>
 <p align="center"><strong><a href="http://arduino.osall.com/images/ch06/b_exercise6p1small.jpg">
<img class="aligncenter size-medium wp-image-857" title="handheld... for giants" src="http://arduino.osall.com/images/ch06/exercise6p1small.jpg" alt="" width="300" height="225"></a></strong></p>
 <p>以及视频剪辑：</p>
 <p><strong><span class="embed-youtube" style="text-align:center;display:block">
<embed src="http://player.youku.com/player.php/sid/XMjk4MjAyODU2/v.swf" quality="high" allowscriptaccess="sameDomain" allowfullscreen="true" type="application/x-shockwave-flash" width="480" align="middle" height="400">
 </span>
 </strong></p>
 <p>还有我的实验所用的<a href="https://sites.google.com/site/tronixstuff/home/arduino-tutorial-series-files/exercise6p1.pde">代码</a>。你可能需要更准确的调整决策树中的判定值。在这个传感器上花了一些时间之后，我觉得我不会用它来进行一些精确的距离计算，不过它在一些通用的检测项目上将会非常有用，例如空气开关等等。接下来的两个星期，我们将研究另一种类型的距离感应器。</p>
 <p>这个传感器还有什么其他的用途呢？机器人传感器，防盗报警器，开启和关闭一些设备……。希望你已经获得了一些有关该传感器的知识，并已实践了一些想法。</p>
 <p>咖啡时间到了，休息一下。</p>
 <p>现在，我们花了几个星期利用面包板和Electronic Bricks来建造我们的原型，现在是时候来看看我们如何做的更紧凑、更永久。正如你所知道的，Android系统允许你在控制板上面插上一些PCB来增加一些额外的功能，这就是所谓“模块”。其中之一是<a href="http://tronixstuff.wordpress.com/2010/04/28/kit-review-seeedstudio-electronic-brick-starter-kit-2/">Electronic Brick</a>底座，另一种流行的是<a href="http://www.littlebirdelectronics.com/products/ethernet-shield-with-poe">以太网</a>模块。</p>
 <p>现在清楚了，但是我们可以DIY吗？当然可以。你需要一个原型板模块。有两种类型的原型板，一种是模块上有一个可供使用的小面包板：</p>
 <p style="text-align:center"><a href="http://arduino.osall.com/images/ch06/b_dfshield1.jpg">
<img class="aligncenter size-full wp-image-793" title="protoshield" src="http://arduino.osall.com/images/ch06/dfshield1.jpg" alt="" width="479" height="293"></a></p>
 <p style="text-align:left">另一种模块上面是可以立即用来焊接电路的PCB。下面这种包括两个LED和一个按钮的PCB板是很不错的。此外，黄色的PCB会更显眼。</p>
 <p style="text-align:center"><a href="http://arduino.osall.com/images/ch06/b_soldershield.jpg">
<img class="aligncenter size-full wp-image-794" title="bare protoshield" src="http://arduino.osall.com/images/ch06/soldershield.jpg" alt="" width="379" height="326"></a></p>
 <p style="text-align:left">正如你想到的，这种和上一种相比电路可以保持的更永久一些​​。在这一章中，你可以跟着我在简单的PCB原型板上搭建自己的电路。</p>
 <p style="text-align:left">最近我为了制作一个有2位7段数码管和74HC595移位寄存器的模块购买了两块<a href="http://www.littlebirdelectronics.com/collections/freetronics/products/protoshield-basic-5-pack">原型板</a>（上面黄色的那种）—— 因为我在面包板上花了很长时间来接线。我首先绘制了一个引脚之间连接关系的图，然后摆放、焊接元器件。</p>
 <p align="center"><a href="http://arduino.osall.com/images/ch06/b_p10609221.jpg">
<img class="aligncenter size-medium wp-image-796" title="the start" src="http://arduino.osall.com/images/ch06/p10609221.jpg" alt="" width="300" height="225"></a></p>
 <p style="text-align:left">板子基本上是镀锡通孔组成的，所以板子的两面都可以焊接。这使得连接元件变得很简单：</p>
 <p align="center"><a href="http://arduino.osall.com/images/ch06/b_p1060923.jpg">
<img class="aligncenter size-medium wp-image-797" title="the rear" src="http://arduino.osall.com/images/ch06/p1060923.jpg" alt="" width="300" height="225"></a></p>
 <p style="text-align:left">然而你还需要仔细的从顶层到底层排布你的连接线来避免杂乱无章。</p>
 <p align="center"><a href="http://arduino.osall.com/images/ch06/b_messy.jpg">
<img class="aligncenter size-medium wp-image-799" title="凌乱" src="http://arduino.osall.com/images/ch06/messy.jpg" alt="" width="300" height="225"></a></p>
 <p style="text-align:left">另外需要避免的是不要在一个地方挤很多元件，这会让你做出一些很有创意的焊接：</p>
 <p align="center"><a href="http://arduino.osall.com/images/ch06/b_p1060924.jpg">
<img class="aligncenter size-medium wp-image-800" title="resistors resisting" src="http://arduino.osall.com/images/ch06/p1060924.jpg" alt="" width="300" height="225"></a></p>
 <p style="text-align:left">我计划在一个洞里穿过一根引线和一只电阻的脚共两根线，我很难做到整齐。不过，我最后还是神奇的做到了……</p>
 <p align="center"><a href="http://arduino.osall.com/images/ch06/b_finalmess.jpg">
<img class="aligncenter size-medium wp-image-801" title="最后的烂摊子" src="http://arduino.osall.com/images/ch06/finalmess.jpg" alt="" width="300" height="225"></a></p>
 <p style="text-align:left">这个例子中，有些电线被焊接在正面。事实上，其中大多数是焊接在背面的。最后一件事情，为了使
我们的新原型板能插在Arduino上，我们需要焊接好接插件的引脚。你可以使用像Arduino那样的排针座，如果你不需要在上面再插其他模块的话也可
以使用排针。在这个实验中，我们不会用另一个模块盖在数码管上面，因此，我们只需要焊接排针就好了。焊接排针的最好方法是先把排针插到Arduino控制
板上，在上面放上原型板，再进行焊接。就像这样：</p>
 <p align="center"><a href="http://arduino.osall.com/images/ch06/b_solderingpins.jpg">
<img class="aligncenter size-thumbnail wp-image-802" title="lining up the pins" src="http://arduino.osall.com/images/ch06/solderingpins.jpg" alt="" width="150" height="112"></a></p>
 <p style="text-align:left">当我把原型板装到Arduino上去时，发生了一件（对我来说）很有趣的事情——根本装不平！Arduino上面的微控制芯片会影响到PCB下面的连线。</p>
 <p align="center"><a href="http://arduino.osall.com/images/ch06/b_misfit.jpg">
<img class="aligncenter size-thumbnail wp-image-803" title="misfit!" src="http://arduino.osall.com/images/ch06/misfit.jpg" alt="" width="150" height="112"></a></p>
 <p style="text-align:left">因此需要提示你的是：在三个维度上都需要仔细排布你的原型板！否则，事情可能不会按计划进行，你绝对不想要一个插在一起会像比萨斜塔那样的模块。在经过了仔细的重新布线后，我的原型板终于完成了：</p>
 <p align="center"><a href="http://arduino.osall.com/images/ch06/b_itworked.jpg">
<img class="aligncenter size-medium wp-image-804" title="it worked" src="http://arduino.osall.com/images/ch06/itworked.jpg" alt="" width="300" height="225"></a></p>
 <p style="text-align:left">现在原型板已经做好了，在这个过程中快速的演示了当使用空白原型板来设计模块时该做和不该做的一些注意事项。不久的将来，我们会有更多的使用它的实例。</p>
 <p style="text-align:left">让我们继续……</p>
 <p style="text-align:left">前面的章节，我们使用了74HC595移位寄存器控制7段数码管，最多同时使用了三个。正如你
可能已经意识到的，我们使用了很多的连线、电阻，消耗了很多的时间和精力。但是，如果你需要4位或者更多位呢？或许你可以使用LCD……不过有时你会因为
外观、价格、清晰度，或者仅仅因为你喜欢LED的原因而选择使用LED。幸运的是，你可以找到四位数码管，而不必使用两个2位的或这四个1位的数码管。让
我们先来看一下：</p>
 <p align="center"><a href="http://arduino.osall.com/images/ch06/b_4dig7segsmall.jpg">
<img class="aligncenter size-medium wp-image-878" title="almost a phone number" src="http://arduino.osall.com/images/ch06/4dig7segsmall.jpg" alt="" width="300" height="225"></a></p>
 <p style="text-align:left">这种显示模块上只有很少的引脚会让新手感到有些惊讶。这是一件好事，只是看起来稍微有点复杂，
但我们能克服这些障碍并且很方便的使用它。我们要怎样使用呢？再一次的，我们可以动动脑筋，通过两个74HC595位移寄存器来控制它。首先，让我们来看
看它的引脚 —— 
从左至右，它们分别是：E，D，C，G，F，B，A，C1，C2，C3，C4，小数点，未使用，未使用。这款数码管是共阴极的，所以（举例来说）要在在第
3位显示数字1，您将需要给引脚6和7加上大约2伏的电压，并将引脚10接地。这个和一位的数码管用起来是几乎一样的，除了你需要选择一下你想要显示数字
的那一位数码管的阴极。在本教程中，我们使用的是<strong>共阴极</strong>的数码管。为了满足你的好奇心，这里提供在本章中使用的数码管的数据表：<a href="http://arduino.osall.com/images/ch06/4dig7segdata.pdf">data sheet.pdf</a>。</p>
 <p style="text-align:left">其次，我们如何去用Arduino控制这些数码管的阴极？电流是从阴极流出来的，所以它没办法
接受我们的数字输出引脚的信号。我们需要做的是在每个阴极引脚和地之间加一个简单的开关，这样我们就能选择我们所需要的那一位数码管了。那我们要怎样才能
用Arduino来实现这个呢？简单……我们可以使用一个简单的NPN三极管来当开关。还记得我们在<a href="http://arduino.osall.com/ch03.html">第三章</a>用继电器来实现这个吗！</p>
 <p style="text-align:left">不过采用4个数字输出引脚来控制阴极太浪费了，我们可以使用我们值得信赖的位移寄存器来控制它们。因此，这意味着我们总共需要两个位移寄存器，第一个用来控制数字（0〜9）的显示，第二个用来控制阴极的开关从而来确定需要显示数字的位数。让我们开始动手来实验吧！</p>
 <p style="text-align:left">Arduino连接的第一个（左手边的）位移寄存器通过560欧姆的电阻控制数码管的显示段的
部分。就和上次的实验一样。第二个（右边的）位移寄存器控制4位数码管的阴极。引脚Q0〜Q3通过一个1K欧姆的电阻连接到BC548三极管的基极。三极
管的集电极连接到数码管的阴极，并发射到地面。就像这样：</p>
 <p align="center"><a href="http://arduino.osall.com/images/ch06/b_example6p1schematicsmall.jpeg">
<img class="aligncenter size-medium wp-image-882" title="example" src="http://arduino.osall.com/images/ch06/example6p1schematicsmall.jpeg" alt="" width="300" height="260"></a></p>
 <p style="text-align:left">请注意，上面的原理图仅供参考。不过下面是实际的接线图：</p>
 <p align="center"><a href="http://arduino.osall.com/images/ch06/b_example6p1small.jpg">
<img class="aligncenter size-medium wp-image-883" title="例子 6.1" src="http://arduino.osall.com/images/ch06/example6p1small.jpg" alt="" width="300" height="225"></a></p>
 <p style="text-align:left">经过几个项目之后，连接数码管和位移寄存器对你来说应该熟练许多了。这里下面的演示视频中所<a href="https://sites.google.com/site/tronixstuff/home/arduino-tutorial-series-files/example6p1.pde">对应的代码</a>。</p>
 <p><strong><span class="embed-youtube" style="text-align:center;display:block">
  <embed src="http://player.youku.com/player.php/sid/XMjk4MjAzMDg0/v.swf" quality="high" allowscriptaccess="sameDomain" allowfullscreen="true" type="application/x-shockwave-flash" width="480" align="middle" height="400">
 </span></strong></p>
 <p style="text-align:left">你不得不承认，即使在2010年，LED数码管仍然看上去是那么令人着迷。或许这只是我的想法！这里是我所用的LED数码管的数据表文件<a href="http://arduino.osall.com/images/ch06/4digit7seg_datasheet.pdf">display.pdf</a>。您可以使用其它的数码管，只要是共阴极的就行；只要将你的数码管的显示段引脚和第一个位移寄存器所对应，然后将控制显示位的阴极引脚和第二个位移寄存器对应。</p>
 <p style="text-align:left">接着来做一些有用的东西……</p>
 <p style="text-align:left"><em>练习 6.2</em></p>
 <p style="text-align:left">使用上面的例子6.1中硬件，来创建一个设备，用来显示一个模拟传感器的值。例如，如果我们在
模拟输入端口连接一个10K的可变电阻，Arduino会返回一个0和1023之间的读数。从硬件的角度来看，你所需要做的的就是添加一个模拟传感器（如
LDR，10K的可变电阻器，红外线传感器等）。软件方面会有点麻烦，但如果你完成了<a href="http://tronixstuff.wordpress.com/2010/05/06/getting-started-with-arduino-chapter-five/">练习5.1</a>或
5.2，那对于你来说，应该不会有问题了。不过由于一次只能在非常短的时间显示一个数字，因此要尽量减少清除数码管显示的次数——这样能使你的数码管显示
保持在最大亮度（译者注：数码管的显示方式是每次显示一位数字，瞬间切换到下一位、再下一位……往复循环，由于切换频率非常高，加上视觉残留效应，所以我
们看到的就像是同时显示多位数字那样）。</p>
 <p style="text-align:left">你需要：</p>
 <ul>
	<li>Arduino的标准套件（计算机，连接线，Uno或兼容的Arduino控制板）。</li>
	<li>一个4位7段LED数码管，共阴极的。</li>
	<li>两个74HC595位移寄存器。</li>
	<li>四个BC548或等效的NPN三极管。</li>
	<li>8 个 560欧姆0.25 W的电阻。用作LED显示和地线之间的限流保护。</li>
	<li>一个10K的可变电阻。</li>
	<li>面包板和一些连接用的导线。</li>
</ul>
 <p style="text-align:left">作为提示，这是我的实验结果的视频剪辑。有两个例子，一个数字前有零，一个则没有：</p>
 <p><strong><span class="embed-youtube" style="text-align:center;display:block">
 <embed src="http://player.youku.com/player.php/sid/XMjk4MjAzNjky/v.swf" quality="high" allowscriptaccess="sameDomain" allowfullscreen="true" type="application/x-shockwave-flash" width="480" align="middle" height="400">
 </span></strong></p>
 <p style="text-align:left">以及实验的<a href="https://sites.google.com/site/tronixstuff/home/arduino-tutorial-series-files/exercise6p2.pde">代码</a> 。</p>
 <p style="text-align:left">这并不是很难，对吧？现在，您可以在你的各种项目中更加容易的用这样的数码管显示器来显示输出你的结果。</p>
 <p style="text-align:left">&nbsp;</p>
 <p>另一章完成了！恭喜所有参加学习，并创造出一些有用的东西的朋友！请订阅本站来收到文章更新的通知。高分辨率的照片可以在<a href="http://www.flickr.com/photos/tronixstuff/sets/72157623642420559/">flickr</a> 上找到。</p>
 <p>如果你有任何问题请在下面留言。如果你愿意分享你根据在这篇文章中学到的知识作出的作品，请把照片或链接发送给 john at tronixstuff dot com。你也许能得到奖品呢。</p>
 <p style="text-align:center">不要忘记在<a href="http://littlebirdelectronics.com/collections/arduino">Little Bird Electronics</a>有非常酷和有趣的Arduino套件。</p>
 <p style="text-align:center">那么，期待在<a href="http://arduino.osall.com/ch06a.html"><strong>下一个章节</strong></a>中再次和你相遇！</p>
 <hr><strong> 在本教程中的所有材料，除非特别指出的，都基于 <a href="http://creativecommons.org/licenses/by-nc-sa/3.0/deed.zh_HK">Commons 的 姓名标示-非商业性-相同方式分享 v3.0 许可证</a>发布。</strong><strong>如果需要转发本作品，请按照相同的许可证发布，并注意发布页面不得有商业广告（包括但不限于Google Adsense等）。</strong><strong>如果你想在其他场合使用本作品，请发邮件给 原作者 john (at) tronixstuff dot com 以及中文化作者 wellswang (at) osall dot com 取得联系。</strong><strong>我们非常欢迎任何的回馈，留言以及建设性的意见！</strong><hr>
 <p style="padding-left:30px"> </p>
 </div>
 <p class="meta"> <span class="date"> 原文撰写时间：<a href="http://tronixstuff.wordpress.com/2010/05/14/">May 14, 2010</a> </span><br /><span class="date">翻译时间：2011年5月14日</span></p>]]></description>
         <category>Arduino</category>
         <pubDate>Tue, 25 Oct 2011 12:02:20 +0900</pubDate>
      </item>
      <item>
         <title>电工笔记 - 第五章 - 更多的扩展端口、7段LED数码管、玩具车改造和二进制游戏</title>
         <link>http://wells.osall.com/blog/index.php?m=content&amp;p=1576&amp;uid=1</link>
         <description><![CDATA[<div> 
<h2>开始 Arduino 之旅!&nbsp;–&nbsp;第五章</h2> 
<hr> 
<p> 原文作者：John Boxall (john at tronixstuff dot com)<br />
 中文翻译：Wells Wang (wellswang at osall dot com) <br />
 原文地址：<a href="http://tronixstuff.wordpress.com/2010/05/06/getting-started-with-arduino-chapter-five/">http://tronixstuff.wordpress.com/2010/05/06/getting-started-with-arduino-chapter-five/</a><br />
 中文版地址： <a href="http://arduino.osall.com/ch05.html">http://arduino.osall.com/ch05.html</a>
</p>
 
<hr> 
<p><strong>[请注意从2010年11月1日起。</strong><strong>教程中的文件可以在<a href="https://sites.google.com/site/tronixstuff/">这里</a>下载]</strong></p>
 
<p>这是关于Arduino为控制器的系列教程“<a href="http://tronixstuff.wordpress.com/2010/04/04/getting-started-with-arduino-chapter-zero/">开始Arduino之旅!</a>”中的一篇。可以作为 Massimo Banzi 所著的“<a href="http://www.littlebirdelectronics.com/products/Getting-Started-with-Arduino.html">Getting Started with Arduino</a>”一书的补充材料阅读。</p>
 
<p>教程的第一章可以<a href="http://arduino.osall.com/ch00.html">在这里</a>找到。</p>
 
<p><em>欢迎回来，arduino的爱好者们！</em></p>
 
<p>欢迎大家来到新的一周的Arduino课程。这一周要学习各种的东西，包括：利用位移寄存器控制更多的端口，一些数学运算，7段数码管，基于arduino的遥控玩具车，并最终做出一个我们自己的电子游戏机！Wow - 让我们开始吧……</p>
 
<p>在<a href="http://arduino.osall.com/ch04.html">上一章节</a>中，我们通过Arduino上的三个引脚使用<a href="http://www.littlebirdelectronics.com/products/shift-register-8bit-74hc595">74HC595位移寄存器</a>来
控制八个数字输出。这是非常有趣和实用的——不过还有更棒的！你可以连接两个或更多的位移寄存器，控制更多的引脚！这要怎样来实现呢？首
先，74HC595芯片上还有一个我们之前没有用过的的数据输出脚(Pin9)，如果我们把它连接到另一个74HC595的数据输入脚(Pin14)，第
一个位移寄存器能够将一个字节的数据位移到下一个位移寄存器，以此类推。</p>
 
<p>回想一下我们的练习4.1中的这部分的代码：</p>
[code=C]<br />digitalWrite(latchpin, LOW);<br />shiftOut(datapin, clockpin, MSBFIRST, loopy);<br />digitalWrite(latchpin, HIGH);<br />[/code]<br /><p>如果我们在第一个<em>shiftOut()</em>后再添加一个，我们就发送了两个字节的数据给位移寄存器。在这种情况下第一个字节首先被第
一个位移寄存器（数据输入[14]引脚连接到Arduino的那个）接受，当下一个字节沿着数据线路传送进来时，它将第一个寄存器中的数据“推送”到第二
个位移寄存器，而传送进来的第二个字节的数据则留在了第一个位移寄存器中。</p>
 
<p>所以，现在我们可以只用三个Arduino的输出引脚来控制十六个输出信号。而且，没错——你还可以有第三个，第四个……位移寄存器。如果有人给我
发送一个YouTube片段，来演示如何使用8个74HC595的级联的话，我一定会给他们颁一个奖。所以，要怎么实现呢？代码非常简单。 <a href="https://sites.google.com/site/tronixstuff/home/arduino-tutorial-series-files/example5p1.pde">这里可以下载代码</a> 。</p>
 
<p>在硬件方面，它也很简单。如果你喜欢闪烁的LED的话，那这个例子就像是你的节日一样了。这是和<a href="https://sites.google.com/site/tronixstuff/home/arduino-tutorial-series-files/exercise4point1_pde.pde">练习 4.1</a>相同的，但你要把将另一个74HC595连接到另外的8个LED。两个'595的时钟和锁存引脚是连在一起的，另外第一个位移寄存器的9号引脚和第二个的14号引脚要被连接在一起。下面是我的接线布局照片：</p>
 
<p align="center"><a href="http://arduino.osall.com/images/ch05/b_example5p1small.jpg">
<img class="aligncenter size-thumbnail wp-image-674" title="Example 5.1" src="http://arduino.osall.com/images/ch05/example5p1small.jpg" alt="" height="112" width="150"></a></p>
 
<p>以及视频：</p>
<span class="embed-youtube" style="text-align:center;display:block">
<embed src="http://player.youku.com/player.php/sid/XMjk4MTk5OTM2/v.swf" quality="high" width="480" height="400" align="middle" allowScriptAccess="sameDomain" type="application/x-shockwave-flash"></embed>
</span> 
<p>你能想出来<a href="http://www.littlebirdelectronics.com/categories/Components/LEDs/7%252dSegment/">什么东西</a>有七个或八个LED吗？希望这张照片将唤起你的回忆：</p>
 
<p align="center"><a href="http://arduino.osall.com/images/ch05/b_ch57seg_small.jpg">
<img class="aligncenter size-thumbnail wp-image-675" title="显示！" src="http://arduino.osall.com/images/ch05/ch57seg_small.jpg?w=150&amp;h=145" alt="" height="145" width="150"></a></p>
<p style="padding-left:60px"><em>速成：如果你想得到余数，使用取模运算符——“%”。</em><em>例如：</em></p>
<p style="padding-left:90px"><em>a = 10 % 3;</em></p>
<p style="padding-left:90px"><em>返回值为1，因为10除以3等于3且余数为1。</em></p>
<p style="padding-left:60px"><em>以及</em></p>
<p style="padding-left:60px"><em>如果你需要将一个浮点数转换成整数，很容易。使用int();函数。</em><em>它不是四舍五入或者向下取整，它仅仅是去掉了小数部分，只留下了整数。</em></p>
 
<p>总之，现在我们可以考虑让我们的Arduino通过74HC595来控制这些数码管了。使用LCD来显示的确非常吸引人，但如果你只需要显示几个数
字，或需要相当高的可视性，LED显示屏是最好的选择。此外，比起背光显示的LCD，LED消耗的电流也要小很多，在相当远的距离也能够辨识上面的信息。
一个带小数点的7段数码管是由八个LED排列组成的。下面就是一个数码管的引脚示意图：</p>
 
<p align="center"><a href="http://arduino.osall.com/images/ch05/b_7segpinout.jpg">
<img class="aligncenter size-thumbnail wp-image-676" title="7段数码管引脚的例子" src="http://arduino.osall.com/images/ch05/7segpinout.jpg" alt="" height="89" width="150"></a></p>
 
<p>请注意，引脚可能会有所不同，如果可能的话，一定要参考数据表文件。</p>
 
<p>数码管可以是共阳极的或共阴极的。也就是说，数码管中所有的LED段的阳极或者阴极是共用一个引脚的。通常我们会使用共阴极，这样我们从位移寄存器
“供应”电流，通过一个电阻（560欧姆），然后再通过LED，最后到接地。如果您使用的是共阳极，你需要从+5v“下拉”电流，通过电阻和LED，然后
再到控制器IC。现在，你可以想像如何使用这种类型的显示器来显示数字的——我们只需要<em>shiftOut();</em>一个字节的数据到位移寄存器，而这个数据就是你要显示的数字的用来显示的二进制表示。</p>
 
<p>嗯？</p>
 
<p>比方说，我们要在显示屏上显示数字'8'。您将需要点亮除小数点外的所有引脚。不幸的是，并非所有的7段数码管都是一样的，所以你需要找出每段
LED所对应的引脚（请查阅数码管的数据表文件），然后找到相应的二进制数来表示的需要引脚，然后将其转换成要发送到显示器的10进制数。为了用起来更方
便，我创建了一个表格：</p>
 
<p align="center"><a href="http://arduino.osall.com/images/ch05/b_example5p2pintable.jpg">
<img class="aligncenter size-thumbnail wp-image-678" title="例子 5.2 pintable" src="http://arduino.osall.com/images/ch05/example5p2pintable.jpg" alt="" height="68" width="150"></a></p>
 
<p>这里是一个空白的表格，你可以打印出来使用：<a href="http://tronixstuff.files.wordpress.com/2010/05/example5p2blankpintable.pdf">blank pin table.pdf</a> 。</p>
 
<p>现在让我们来把一个7段数码管和我们的Arduino的连接起来，并看看它是如何工作的。在这里，7段数码管模块取代了在练习4.1中使用的八个
LED。我所使用的模块的引脚定义供大家参考一下：(7,6,4,2,1,9,10,5,3,8)=(a,b,c,d,e,f,g,DP, C, 
C)。其中DP是小数点，而最后的两个C是阴极（连接到GND）。代码在这里：<a href="https://sites.google.com/site/tronixstuff/home/arduino-tutorial-series-files/example5p2.pde">例子 5.2</a> 。需要注意的是，在代码中小数点也被使用了，在这个例子中代表小数点的值是128。如果你给代码中的loopy[]变量增加128的值，小数点就会和数字一起被点亮。</p>
 
<p align="center"><a href="http://arduino.osall.com/images/ch05/b_example5p2small.jpg">
<img class="aligncenter size-thumbnail wp-image-679" title="例子5.2" src="http://arduino.osall.com/images/ch05/example5p2small.jpg" alt="" height="112" width="150"></a></p>
 
<p>视频在这里：</p>
 
<span class="embed-youtube" style="text-align:center;display:block">
<embed src="http://player.youku.com/player.php/sid/XMjk4MjAwMTcy/v.swf" quality="high" width="480" height="400" align="middle" allowScriptAccess="sameDomain" type="application/x-shockwave-flash"></embed>
</span> 
<p>你试一下吧——很容易就能实现了。现在该轮到你做一些练习了！</p>
 
<p><em>练习 5.1</em></p>
 
<p>使用两个数码管和位移寄存器来制造一个电路从0数到99，然后再倒着数回来。它并不难，硬件基本上是和例子5.1相同，但使用的是7段数码管。</p>
 
<p>你将需要：</p>
<ul>
	<li>Arduino的标准套件（计算机，连接线，Uno或兼容的Arduino控制板）。</li>
	<li>两个<a href="http://www.littlebirdelectronics.com/products/fnd500lts543rs505rwb-common-cathode-7-segment-display">7段</a> ，共阴极数码管。</li>
	<li>两个74HC595位移寄存器。</li>
	<li>16个560欧姆0.25瓦的电阻。用于对数码管中的LED和作限流保护。</li>
	<li>面包板和一些连接用的导线。</li>
	<li>一些水。</li>
</ul>
 
<p>你可能想知道当数字超过10时如何来分割个位和十位数字……给你一个提示：34取10的余数等于4，34除以10等于3.4……但是3.4不是一个整数。当你思考的时候，给你参考一下我的接线布局的照片：</p>
 
<p align="center"><a href="http://arduino.osall.com/images/ch05/b_exercise5p1small.jpg">
<img class="aligncenter size-thumbnail wp-image-682" title="练习5.1" src="http://arduino.osall.com/images/ch05/exercise5p1small.jpg" alt="" height="146" width="150"></a></p>
 
<p>还有无处不在的视频：</p>
 
<span class="embed-youtube" style="text-align:center;display:block">
<embed src="http://player.youku.com/player.php/sid/XMzAwNTcxMzQw/v.swf" quality="high" width="480" height="400" align="middle" allowScriptAccess="sameDomain" type="application/x-shockwave-flash"></embed>
</span> 
<p>以及针对这个练习的<a href="https://sites.google.com/site/tronixstuff/home/arduino-tutorial-series-files/exercise5p1.pde">我的代码</a>。</p>
<div id="_mcePaste">我希望你已经对如何使用位移寄存器获得了更深入的理解。在下周的课程中我们会继续深入学习。</div> 
<p>好了，接下来是我们课程计划上的一些对现实生活中一些东西的改造了。本章的这一节和一般的教程比起来更像是一些<em>评论说明</em>，但我希望你会觉得有趣，看完后能够获得一些启示或者产生一些想法。</p>
 
<p>虽然我们一直觉得在工作台上创造一些小玩意非常有乐趣（我一直这样觉得，希望大家也一样），不过现在是该放慢脚步来改造一下现实中已有的一些东西
了。有一天，我正在一个杂货店里买一些胶水，碰巧看到了一个很便宜的遥控汽车。我仔细看了一下，发现它可以被全方向遥控（左/右 和 
前/后），我想到我们可以用Arduino来控制它。所以，花了$9之后，它就来到了我的桌子上：</p>
 
<p align="center"><a href="http://arduino.osall.com/images/ch05/b_example5p3.jpg">
<img class="aligncenter size-thumbnail wp-image-686" title="vroom" src="http://arduino.osall.com/images/ch05/example5p3.jpg" alt="" height="112" width="150"></a></p>
 
<p>自然而然的，我停下了手上的活，试着玩了一会。但是它的速度太快了！</p>
 
<span class="embed-youtube" style="text-align:center;display:block">
<embed src="http://player.youku.com/player.php/sid/XMjk4MjAwNzYw/v.swf" quality="high" width="480" height="400" align="middle" allowScriptAccess="sameDomain" type="application/x-shockwave-flash"></embed>
</span> 
<p>首先要做的事情就是让它放慢速度。由于这是一个廉价的产品，所以它没有变速控制。所以，首先需要做的就是打开外壳，看看我们要怎么修改：</p>
 
<p align="center"><a href="http://arduino.osall.com/images/ch05/b_example5p3-2small.jpg">
<img class="aligncenter size-thumbnail wp-image-687" title="外壳" src="http://arduino.osall.com/images/ch05/example5p3-2small.jpg" alt="" height="112" width="150"></a></p>
 
<p align="center"><a href="http://arduino.osall.com/images/ch05/b_example5p3-3small.jpg">
<img class="aligncenter size-thumbnail wp-image-688" title="发动机" src="http://arduino.osall.com/images/ch05/example5p3-3small.jpg" alt="" height="112" width="150"></a></p>
 
<p>它的设计其实很简单，一个电机控制转向，另一个控制速度。幸运的是，从PCB上引出了四根电线连接到电机，这样就很容易进行改造。</p>
 
<p align="center"><a href="http://arduino.osall.com/images/ch05/b_example5p3-4small.jpg">
<img class="aligncenter size-thumbnail wp-image-689" title="越来越棘手……" src="http://arduino.osall.com/images/ch05/example5p3-4small.jpg" alt="" height="112" width="150"></a></p>
 
<p>通常我们可以使用脉宽调制(PWM)来使电机减速，但我不认为我们可以通过无线电来传送PWM控制信号。相反，我们可以方便的通过降低电机的电压来
达到减速的目的。所以我把车翻过来，把遥控设置成前进档，然后再去测量四根导线之间的电压。在前进档时，黑色和绿色间是+3.7V，在倒车当时这两根线之
间没有电压。而黑色和红色之间在倒车档时电压为+3.7V，前进档时没有电压。这就简单了——只需找出电机全速运转时需要多大的电流，那么我们就可以用欧
姆定律（电压=电流x电阻）计算速度慢到大约70%或其他速度时所需要的电阻值。</p>
 
<p>电机在启动时消耗的电流大小大约在500mA，然后在大约一秒钟后减少到约250mA。但是，从10至120欧姆范围内的电阻似乎没有多大的效果，
而一个560欧姆电阻则完全让车停止运行。因此，看来没法用硬件方法来控制车速，我们将用软件的方法来尝试一下……也许是用PWM，或用我们自创的办法。</p>
 
<p>现在，先来研究一下Arduino如何与遥控器交互吧。首先，我把汽车重新组装好，然后开始研究遥控器：</p>
 
<p align="center"><a href="http://arduino.osall.com/images/ch05/b_example5p3-5small.jpg">
<img class="aligncenter size-thumbnail wp-image-690" title="打开遥控器" src="http://arduino.osall.com/images/ch05/example5p3-5small.jpg" alt="" height="112" width="150"></a></p>
 
<p>尝试打开遥控器时，还割破了我的手指，结果遥控器最终还是被暴力拆解了。但这种努力是值得的——可以看到控制按钮是那种很简单的覆盖在PCB的触点之上的导电橡胶：</p>
 
<p align="center"><a href="http://arduino.osall.com/images/ch05/b_example5p3-6small.jpg">
<img class="aligncenter size-thumbnail wp-image-691" title="遥控器的PCB" src="http://arduino.osall.com/images/ch05/example5p3-6small.jpg" alt="" height="112" width="150"></a></p>
 
<p>非常棒——每个控制器基本上就是一个单刀双掷(SPDT)开关，并且在PCB上有充足的空间来焊接一些与Arduino以及面包板通信的导线。而按钮可以用Arduino所控制的BC548三极管来取代——与我们<a href="http://arduino.osall.com/ch03.html">第三章</a>学习的继电器一样控制。</p>
 
<p>接下来就是是从印刷电路焊接一些导线出来，以便于连接到我的面包板上：</p>
 
<p align="center"><a href="http://arduino.osall.com/images/ch05/b_example5p3-7small.jpg">
<img class="aligncenter size-thumbnail wp-image-692" title="千万不要带这个去机场……" src="http://arduino.osall.com/images/ch05/example5p3-7small.jpg" alt="" height="112" width="150"></a></p>
 
<p>绿线是共用的回路，而黄线前进、后退、左转和右转。现在开始设置实验电路板。四个数字输出引脚，分别通过一个1K的电阻连接到BC548三极管的基极。发射级连接至GND，同时也连接到遥控器的GND。</p>
 
<div align="center"><a href="http://arduino.osall.com/images/ch05/b_example5p3-8small.jpg">
<img class="aligncenter size-thumbnail wp-image-693" title="boarding it up" src="http://arduino.osall.com/images/ch05/example5p3-8small.jpg" alt="" height="112" width="150"></a></div> 
<p>当我刚刚完成实验电路板的连接，转身关好窗的时候，我的胳膊刮到了遥控器，它发出了一声“喀嚓”的噪音。</p>
 
<p align="center"><a href="http://arduino.osall.com/images/ch05/b_example5p3-9small.jpg">
<img class="aligncenter size-thumbnail wp-image-694" title="bugger" src="http://arduino.osall.com/images/ch05/example5p3-9small.jpg" alt="" height="112" width="150"></a></p>
 
<p>脱焊了！哦，好吧，还好只是倒车档！不管怎样，继续往下做吧。我再一次把车朝天翻过来，并向Arduino中上传下面的代码：(<a href="https://sites.google.com/site/tronixstuff/home/arduino-tutorial-series-files/example5p3.pde">下载代码</a>)</p>
 
<div><br />[code=C]<br />/*<br />&nbsp;&nbsp;&nbsp; 例子 5.3<br />&nbsp;&nbsp;&nbsp; 使用Arduino控制玩具遥控车<br />&nbsp;&nbsp;&nbsp; 第五章 @ http://www.tronixstuff.com/tutorials<br />*/<br /><br />int forward = 12;<br />int left = 9;<br />int right = 7;<br />int del = 5000;<br /><br />void setup()<br />{<br />&nbsp;&nbsp;&nbsp; pinMode(forward, OUTPUT);<br />&nbsp;&nbsp;&nbsp; pinMode(left, OUTPUT);<br />&nbsp;&nbsp;&nbsp; pinMode(right, OUTPUT);<br />}<br /><br />void loop()<br />{<br />&nbsp;&nbsp;&nbsp; digitalWrite(right, HIGH);<br />&nbsp;&nbsp;&nbsp; delay(1000);<br />&nbsp;&nbsp;&nbsp; digitalWrite(right, LOW);<br />&nbsp;&nbsp;&nbsp; delay(1000);<br />&nbsp;&nbsp;&nbsp; digitalWrite(left, HIGH);<br />&nbsp;&nbsp;&nbsp; delay(1000);<br />&nbsp;&nbsp;&nbsp; digitalWrite(left, LOW);<br />&nbsp;&nbsp;&nbsp; delay(1000);<br />&nbsp;&nbsp;&nbsp; digitalWrite(forward, HIGH);<br />&nbsp;&nbsp;&nbsp; delay(del);<br />&nbsp;&nbsp;&nbsp; digitalWrite(forward, LOW);<br />&nbsp;&nbsp;&nbsp; delay(1000);<br />}<br />[/code]<br /><p>它不停循环三种遥控汽车的功能（太棒了，工作正常！）。让我们看看会发生什么：</p>
</div> 
<span class="embed-youtube" style="text-align:center;display:block">
<embed src="http://player.youku.com/player.php/sid/XMjk4MjAxMzg0/v.swf" quality="high" width="480" height="400" align="middle" allowScriptAccess="sameDomain" type="application/x-shockwave-flash"></embed>
</span> 
<div> 
<p><span style="font-weight:normal">这是一个好的开始，当我们希望实现什么样的功能时，它就实现了</span> 。<span style="font-weight:normal">但是，汽车的马达转速似乎有些跳动的变化。</span><span style="font-weight:normal">也许和连接到Arduino的电阻-三极管桥有些关系。</span><span style="font-weight:normal">所以，我放弃了谨慎，直接将数字输出端口连接到了遥控器。</span><span style="font-weight:normal">哇！</span><span style="font-weight:normal">搞定了。</span><span style="font-weight:normal">电机全速运转了。</span></p>
 
<p>使用我们学到的Arduino代码的知识，这让这个车左右转向将是非常简单的事。让我们尝试一下…… 这里是我们的<a href="https://sites.google.com/site/tronixstuff/home/arduino-tutorial-series-files/example5p4.pde">代码</a> ：</p>
<p>[code=C]</p>
<p>/*<br />&nbsp;&nbsp;&nbsp; 例子 5.4<br />&nbsp;&nbsp;&nbsp; 用Arduino控制玩具遥控车 - 八字形运动<br />&nbsp;&nbsp;&nbsp; 第五章 @ http://www.tronixstuff.com/tutorials<br />*/<br /><br />int forward = 12;<br />int left = 9;<br />int right = 7;<br />int del = 5000;<br /><br />void setup()<br />{<br />&nbsp;&nbsp;&nbsp; pinMode(forward, OUTPUT);<br />&nbsp;&nbsp;&nbsp; pinMode(left, OUTPUT);<br />&nbsp;&nbsp;&nbsp; pinMode(right, OUTPUT);<br />}<br /><br />// 为了更方便的创造汽车的运动轨迹，定义了一些功能函数<br /><br />void goleft(int runtime)<br />{<br />&nbsp;&nbsp;&nbsp; digitalWrite(left, HIGH);&nbsp; // 开始左转<br />&nbsp;&nbsp;&nbsp; digitalWrite(forward, HIGH); // 前进<br />&nbsp;&nbsp;&nbsp; delay(runtime);<br />&nbsp;&nbsp;&nbsp; digitalWrite(forward, LOW);<br />&nbsp;&nbsp;&nbsp; digitalWrite(left, LOW);&nbsp; // 停止转向，保持直行<br />}<br /><br />void goright(int runtime)<br />{<br />&nbsp;&nbsp;&nbsp; digitalWrite(right, HIGH);&nbsp; // 开始右转<br />&nbsp;&nbsp;&nbsp; digitalWrite(forward, HIGH); // 直行<br />&nbsp;&nbsp;&nbsp; delay(runtime);<br />&nbsp;&nbsp;&nbsp; digitalWrite(forward, LOW);<br />&nbsp;&nbsp;&nbsp; digitalWrite(right, LOW);&nbsp; // 停止右转，保持直行<br />}<br /><br />void goforward(int runtime)<br />// 开动马达并保持"runtime"毫秒<br />{<br />&nbsp;&nbsp;&nbsp; digitalWrite(forward, HIGH);&nbsp; // 开始直行<br />&nbsp;&nbsp;&nbsp; delay(runtime);<br />&nbsp;&nbsp;&nbsp; digitalWrite(forward, LOW); // 停车<br />}<br /><br />void loop()<br />{<br />&nbsp;&nbsp;&nbsp; goforward(1000);<br />&nbsp;&nbsp;&nbsp; goleft(1000);<br />&nbsp;&nbsp;&nbsp; goright(1000);<br />}<br /></p>
<p>[/code]</p>
<p>由于某种原因，现在前进档变成了倒车档。只有当我去掉了从Arduino到面包板上的GND导线才恢复正常。有意思，不过也许还有其他的问题。</p>
</div> 
<p>我们完成了。这是我们第一次尝试把现成的东西Arduino化。现在该用一个练习来回到我们的教程！</p>
 
<p><em>练习 5.2</em></p>
 
<p><em><span style="font-style:normal">又该轮到你来创造一些东西了。我们已经讨论了二进制数、位移寄存器、模拟和数字输入和输出、创建我们自己的函数、如何使用各种显示设备，等等。现在我们的任务是建立一个二进制问答游戏。这个游戏设备将实现：</span></em></p>
 
 
<div>
<ul>
	<li>以二进制形式显示从0到255之间的数字（使用8个LED）。</li>
	<li>你需要用一个电位器（可变电阻）来选择一个0和255之间的数字，这个数字是使用3个7段数码管来显示的。</li>
	<li>然后按下一个按钮来确认你的答案。游戏会告诉你，你的答案是正确的或者错误的。</li>
	<li>这基本上就是一种“二进制测验”机！</li>
</ul>
</div> 
<p>我明白如果使用LCD液晶屏的话会方便，但这并不是本次练习中的一部分。先试着想象一下关于用户界面和游戏的难度的设计。开始的时候，感觉会很难，
但如果好好想一下的话，应该是可以实现的。首先，你应该制定一个计划，设计一个算法来告诉硬件该如何运作。这个计划只要简单的写一下什么时候要做什么事。
接着把你的计划分解成一个个的任务，这样你可以更方便的实现这些功能。一些功能甚至还能分解成更小的功能——没错——它可以帮助代码的规划设计和保持代码
的整洁。你也许还要自己写一些测试代码，来看一下传感器是如何工作的以及如何把这个功能整合到你的主程序中。最后把所有的内容整合在一起，再看看运行结
果！</p>
 
<p>你将需要：（要做出我的例子那样的装置的话）</p>
<ul>
	<li>Arduino的标准套件（计算机，连接线，Uno或兼容的Arduino控制板）。</li>
	<li>三个7段共阴极数码管。</li>
	<li>八个LED（用作二进制数显示）。</li>
	<li>四个74HC595位移寄存器。</li>
	<li>32个 560欧姆 0.25瓦 的电阻。用作LED显示和地线之间的限流保护。</li>
	<li>面包板和一些连接用的导线。</li>
	<li>10K <a href="http://www.littlebirdelectronics.com/products/rotary-potentiometer-10k-ohm-linear">线性电位器</a> （可变电阻）。</li>
	<li>一些水。</li>
</ul>
 
<p>这是我的连线布局照片，你可以参考一下：</p>
 
<p align="center"><strong><a href="http://arduino.osall.com/images/ch05/b_exercise5p2small.jpg">
<img class="aligncenter size-thumbnail wp-image-697" title="二进制测验！" src="http://arduino.osall.com/images/ch05/exercise5p2small.jpg" alt="" height="112" width="150"></a></strong></p>
 
<p>以及玩游戏时的操作视频。在接通电源后，游戏会说“你好”。你按下按钮的话就可以开始游戏。它会用LED来显示一个二进制数，这时你就需要用电位器
来选择一个十进制的数。当你选择好你的答案，按下按钮——如果你的答案是正确的，这个游戏机将告诉你答案正确并显示你的分数；或者，如果你的答案是错误
的，它会告诉你正确的答案，以及你的分数。</p>
 
<p>为了方便演示，我已经设置了一场比赛只需要回答几个问题就好了：</p>
 

<span class="embed-youtube" style="text-align:center;display:block">
<embed src="http://player.youku.com/player.php/sid/XMjk4MjAxODU2/v.swf" quality="high" width="480" height="400" align="middle" allowScriptAccess="sameDomain" type="application/x-shockwave-flash"></embed>
</span> 
<p>同样的——这里是我的关于这个练习的<a href="https://sites.google.com/site/tronixstuff/home/arduino-tutorial-series-files/exercise5p2.pde">代码</a> 。</p>
 
<p>从现在开始，我们会暂时离开这个教程一个星期，第六章将在五月二十一日左右发表。不过等一下——我们还会有两个新的套件的测评、一些不错的元件的测评以及一个新的项目将会在未来的七天发表。所以记得订阅和关注我们——就在这个页面的右上方！</p>
 
<p>你可以在<a href="http://www.flickr.com/photos/tronixstuff/sets/72157623642420559/">flickr</a>上找到本课程的高分辨率图像。</p>
 
<p>如果你有任何问题请在下面留言。如果你愿意分享你根据在这篇文章中学到的知识作出的作品，请把照片或链接发送给 john at tronixstuff dot com。你也许能得到奖品呢。</p>
<p style="text-align:center">不要忘记在<a href="http://littlebirdelectronics.com/collections/arduino">Little Bird Electronics</a>有非常酷和有趣的Arduino套件。</p>
<p style="text-align:center">那么，期待在 <strong><a href="http://arduino.osall.com/ch06.html">下一个章节</a></strong>中再次和你相遇！</p>
<hr><strong> 在本教程中的所有材料，除非特别指出的，都基于 <a href="http://creativecommons.org/licenses/by-nc-sa/3.0/deed.zh_HK">Commons 的 姓名标示-非商业性-相同方式分享 v3.0 许可证</a>发布。</strong><strong>如果需要转发本作品，请按照相同的许可证发布，并注意发布页面不得有商业广告（包括但不限于Google Adsense等）。</strong><strong>如果你想在其他场合使用本作品，请发邮件给 原作者 john (at) tronixstuff dot com 以及中文化作者 wellswang (at) osall dot com 取得联系。</strong><strong>我们非常欢迎任何的回馈、留言以及建设性的意见！ </strong><hr>
<p style="padding-left:30px">
</p>
</div>
<p class="meta">
<span class="date"> 原文撰写时间：<a href="http://tronixstuff.wordpress.com/2010/05/06/">May 6, 2010</a>
</span><br /><span class="date"> 翻译时间：2011年9月15日 </span>
</p>]]></description>
         <category>Arduino</category>
         <pubDate>Thu, 15 Sep 2011 21:43:22 +0900</pubDate>
      </item>
      <item>
         <title>电工笔记 - 第四章 - 扩展端口、蜂鸣器和扬声器、数组和数据记录器</title>
         <link>http://wells.osall.com/blog/index.php?m=content&amp;p=1572&amp;uid=1</link>
         <description><![CDATA[<div>
<h2>开始 Arduino 之旅!&nbsp;–&nbsp;第四章</h2>
<hr>
<p>
	原文作者：John Boxall (john at tronixstuff dot com)<br />
	中文翻译：Wells Wang (wellswang at osall dot com) <br />
	原文地址：<a href="http://tronixstuff.wordpress.com/2010/04/30/getting-started-with-arduino-%E2%80%93-chapter-four/">http://tronixstuff.wordpress.com/2010/04/30/getting-started-with-arduino-%E2%80%93-chapter-four/</a><br />
	中文版地址：<a href="http://arduino.osall.com/ch04.html">http://arduino.osall.com/ch04.html</a>
	</p>
<hr>

                <p><strong>[请注意从2010年11月1日起.教程中的文件可以在<a href="https://sites.google.com/site/tronixstuff/" target="_blank">这里</a>下载]</strong></p>
 <p>这是关于Arduino为控制芯片的系列教程 “<a href="http://tronixstuff.wordpress.com/2010/04/04/getting-started-with-arduino-chapter-zero/" target="_blank">开始 Arduino 之旅！”</a> 中的一篇。这部教程可以作为 Massimo Banzi 所写的 “<a href="http://www.littlebirdelectronics.com/products/Getting-Started-with-Arduino.html" target="_blank">Getting Started with Arduino”</a> 一书的补充材料来阅读。</p>

<p>系列教程的第一章可以在<a href="http://arduino.osall.com/ch00.html" target="_blank">这里</a>找到。</p>
<div>
<p><em>欢迎回来，Arduino的爱好者！</em></p>
<p>欢迎来到这一周新的课程。这一期的课程开始的有些早。这一次我们要开了解一下如何用较少的端口来扩展出更多的输出端口，学一下如何输出声音音调，了解数组的使用，以及创建一个数据记录器！</p>
<p><em>那么，就让我们开始吧！</em></p>
</div>
<p>端口扩展 —— 听上去不太现实，对吗？不，这是真的！我们马上就要来学习如何使用一个小小的特殊的<a href="http://www.littlebirdelectronics.com/products/shift-register-8bit-74hc595" target="_blank">74HC595</a>8位串行输入/并行输出移位寄存器芯片来做到这一点。我们先来看一下他长什么样：</p>

<p align="center"><a href="http://arduino.osall.com/images/ch04/b_74hc595small.jpg">
<img class="aligncenter size-medium wp-image-615" title="hello!" src="http://arduino.osall.com/images/ch04/74hc595small.jpg" alt="" height="151" width="300"></a></p>
<div>
<p>在开始前，我们需要先来了解一下 位、字节和二进制数。</p>
<p>二进制数仅仅使用0和1来表示数值。 二进制数(binary)也被称为 
“二元数(base-2)″，因为它仅仅使用了两个数字。我们通常使用的数字是十进制数 
(使用了0到9的数字；十六进制则使用了0到9和A到F)。二进制数是怎样用两个数字来表示一个很大的数值的呢？它使用了很多的1和0。我们来看一个二进
制数 
01010101（译者注：这里原文写错了，原文中的二进制数是10101010，与下表中的数字不符。记住2的0次方是最右边的最低位数字，而2的7次
方则是左边的高位第八位数字）。作为一个二进制数，第几位就表示2的几次方，位数从0开始。</p>
</div>
<p style="text-align: center;"><a href="http://arduino.osall.com/images/ch04/b_binary12.jpg">
<img class="aligncenter size-large wp-image-620" title="binary1" src="http://arduino.osall.com/images/ch04/binary12.jpg" alt="" height="55" width="430"></a></p>
<div>
<p>通过上面那张表就能够了解二进制数的每一位分别表示的十进制数的数值。因此上面举的那个二进制数就表示十进制的 85 —— 85就是二进制数每一位上表示的十进制数的总和。</p>
<p>另一个例子 —— 二进制数11111111表示十进制的255。</p>
</div>
<p style="text-align: center;"><a href="http://arduino.osall.com/images/ch04/b_binary2.jpg">
<img class="aligncenter size-large wp-image-619" title="binary2" src="http://arduino.osall.com/images/ch04/binary2.jpg" alt="" height="54" width="430"></a></p>

<p>二进制数中的每一位数字都会在内存中占用一个“比特位”的空间，八个比特位则组成了一个字节。一个字节是一个特殊的数据长度，它正好是一个 <a href="http://www.littlebirdelectronics.com/products/shift-register-8bit-74hc595" target="_blank">74HC595</a> 芯片所能控制的输出端口的个数。 (这一节不会变成数学课的)。如果我们使用Arduino通过数字端口来发送一个十进制数到 595 芯片，它会将其转换为二进制数同时将对应的输出端口设定为高或低电平。</p>
<p>所以，当你发送数字255给595芯片时，所有的输出端口都是高电平。如果你发送二进制数01100110，只有端口1、2、5、6是高电平。现在
你可以想象怎样扩展你的数字输出端口了吗？数字0到255可以用来表示595芯片的输出端的各种可能的输出组合。此外每个字节都有一个“最低有效位”和
“最高有效位”——这是由最左边和最右边的比特位来表示的。</p>
<p>下面我们来实践一下。先看一下74HC595的引脚输出示意图：(摘自 Philips/<a href="http://tronixstuff.files.wordpress.com/2010/04/nxp74hc595datasheet1.pdf">NXP 74HC595 的数据表文件</a>)</p>
<p align="center"><a href="http://arduino.osall.com/images/ch04/b_74hc595pinouts.jpg">
<img class="aligncenter size-full wp-image-621" title="74HC595 pinouts" src="http://arduino.osall.com/images/ch04/74hc595pinouts.jpg" alt="" height="539" width="630"></a></p>
<div>
<p>引脚 Q0~Q7 是我们想要控制的输出端口。Q7′ 引脚并未使用。 
595的14号引脚是数据(data)端口，12号引脚是锁定(latch)端口，11号引脚是时钟(clock)端口。数据端口连接到Arduino的
数字输出端口，锁定端口就像一个开关，当它为低电平时，595会接收数据，当它为高电平时，595不接受任何输入。时钟端口需要在收到每一个数据位后切换
电平信号。因此传送数据给595芯片的过程就应该是这样的：</p>
</div>

<div>
<ol>
	<li>将锁定端口设置为低电平 (引脚12)</li>
	<li>传送一个字节的数据给595芯片 (引脚14)</li>
	<li>切换时钟端口的电平信号 (引脚11)</li>
	<li>将锁定端口设置为高电平 (引脚12)</li>
</ol>


</div>
<p>10号引脚(重置/reset)要被连接到 +5V，13号引脚(激活输出/output enable)要保持接地。</p>
<div>
<p>在这过程中，你能够使用 digitalWrite() 来处理锁定端口的信号输出。第二和第三步是可以用同一个命令来实现的，那就是 <em>shiftOut();</em>。语法说明如下：</p>

<pre style="padding-left: 90px;">shiftout(a,b,c,d);</pre>
<p>其中：</p>
<ul>
	<li>a = 连接到595的数据输入引脚(14号引脚)的数字输出端口号。</li>
	<li>b = 连接到595的时钟端口引脚(11号引脚)的数字输出端口号。</li>
	<li>c 可以是 LSBFIRST 或者 MSBFIRST。MSBFIRST 表示 595 从左向右读取二进制数；LSBFIRST 则表示从右向左读取。</li>
	<li>d = 实际要传送给595用来表示二进制输出端口状态的数值 (0~255)。</li>
</ul>



<p style="padding-left: 60px;">&nbsp;</p>
</div>
<div>
<p>因此，如果你想要使595的输出端口1、2、5、6为高电平，其余为低电平时，你只要执行如下代码：</p>
[code=C]<br />digitalWrite(latchpin, LOW);<br />shiftOut(datapin, clockpin, MSBFIRST,102);<br />digitalWrite(latchpin, HIGH);<br />[/code]<br /><p>那么，现在你能用595的输出端口来做什么呢？几乎无所不能！只是你要记住每个输出端口能够输出的电流最大只有35毫安。</p>
</div>
<div>
<p>请看一些例子：</p>
<ul>
	<li>一个LED和一个连接到地线的限流电阻……你能够用Arduino控制比平常更多的LED。</li>
	<li>一个NPN三极管以及其他一些需要大电流的设备，例如直流电机或者一个较大的电灯。</li>
	<li>一个NPN三极管来控制继电器 (<a href="http://arduino.osall.com/ch03.html" target="_blank">还记得么？</a>)</li>
</ul>
<p>使用两个或者更多的595芯片，你能够控制一个LED矩阵或者7段数字显示LED以及其他——这些会在以后几章中讲到。</p>
<p>现在，我们需要来做一个不错的练习来巩固一下知识，熟悉寄存器位移操作的过程。</p>
<p><strong><em>练习 4.1</em></strong></p>
<div>
<p>创建一个电路，使用LED来显示二进制的0~255。你将需要以下元件：</p>
<ul>
	<li>你的标准的Arduino套件 (电脑、数据线、Uno或者兼容的控制板)。</li>
	<li>八个LED。 </li>
	<li>一个 <a href="http://www.littlebirdelectronics.com/products/shift-register-8bit-74hc595" target="_blank">74HC595</a> 位移寄存器。</li>
	<li>八个 560欧姆 0.25瓦 的电阻。用作保护LED的限流电阻。</li>
	<li>一块面包板和一些导线。</li>
</ul>
<p>硬件设置非常简单。记住LED的正极接到595上，负极连接限流电阻后接地。你能够使用Arduino控制板上的 5V 和 GND 端口。</p>
<p>我的接线图如下图所示：</p>
</div>

<p align="center"><a href="http://arduino.osall.com/images/ch04/b_ex4p1layoutsmall.jpg">
<img class="aligncenter size-medium wp-image-622" title="Exercise 4.1 layout" src="http://arduino.osall.com/images/ch04/ex4p1layoutsmall.jpg" alt="" height="225" width="300"></a></p>
</div>
<div>
<p>当然还有视频 —— 作为演示，我加快了视频的速度。</p>
<span class="embed-youtube" style="text-align: center; display: block;">
<embed src="http://player.youku.com/player.php/sid/XMjk4MTk3OTEy/v.swf" quality="high" allowscriptaccess="sameDomain" type="application/x-shockwave-flash" align="middle" height="400" width="480">
</span>
<p>你的实验做的怎么样了？<a href="https://sites.google.com/site/tronixstuff/home/arduino-tutorial-series-files/exercise4point1_pde.pde" target="_blank">这里可以下载到代码</a>，如果你需要一些提示的话。</p>
<p><strong>今天要学习的下一个内容是另一种形式的输出——</strong><em><strong>声音</strong></em>。</p>
<p>当然你已经听说过了，不过我们还没了解(或许应该说是，听过) Arduino 系统的声音功能。最简单的发出声音的办法是使用压电式蜂鸣器。在下面左边的图中就是一个例子：</p>

</div>
<p align="center"><a href="http://arduino.osall.com/images/ch04/b_soundmachine_small.jpg">
<img class="aligncenter size-medium wp-image-625" title="Sounds... " src="http://arduino.osall.com/images/ch04/soundmachine_small.jpg" alt="" height="225" width="300"></a></p>
<div>
<p>蜂鸣器使用起来非常简单，声音也非常响，非常恼人。要发出蜂鸣声，只需要将正极接到数字输出端口，负极接到地线，然后在你需要发出蜂鸣音时将输出端口设置成高电平就好了。就像这样：</p>
[code=C]<br />/* 例子 4.1<br />&nbsp;&nbsp;&nbsp; 恼人的蜂鸣声！<br />&nbsp;&nbsp;&nbsp; CC by-sa v3.0<br />&nbsp;&nbsp;&nbsp; http://tronixstuff.wordpress.com<br />*/<br /><br />void setup()<br />{<br />&nbsp;&nbsp;&nbsp; pinMode(12, OUTPUT);<br />}<br /><br />void loop()<br />{<br />&nbsp;&nbsp;&nbsp; digitalWrite(12, HIGH);<br />&nbsp;&nbsp;&nbsp; delay(500);<br />&nbsp;&nbsp;&nbsp; digitalWrite(12, LOW);<br />&nbsp;&nbsp;&nbsp; delay(2000);<br />}<br />[/code]<br /><p>幸好我的摄像机没有录下声音，因此你不必忍受那恼人的噪音了……</p>
<p>不管怎样，你应该会想要听到比蜂鸣声更好听的声音吧。Arduino 提供了 <em>tone();</em> 命令，它能够生成指定频率和时长的声音。它的语法是这样的：</p>
<pre style="padding-left: 60px;">tone(pin, frequency, duration);</pre>
<p>其中 pin 是扬声器所连接的数字输出端口的端口号；frequency 是以赫兹为单位的声音的频率；duration 是以毫秒为单位的要发出的声音的时长。真是简单！</p>
<p>如果你省略了 duration 的值，那么就会一直持续发出声音，直到调用了 <em>notone();</em> 语句。此外，<em>tone();</em> 只能够在第3和11数字端口与 PWM 设备交互，除非你使用的是 Arduino <a href="http://www.littlebirdelectronics.com/products/arduino-mega-2560" target="_blank">Mega</a>。</p>

<p>小巧的0.25瓦8欧姆的<a href="http://www.littlebirdelectronics.com/products/speaker-05w-8ohm" target="_blank">扬声器</a>是一个不错的选择。在我的例子中，我从音乐绒毛玩具中拆了一个扬声器下来，就是上面那张照片中右边的那个。在连接电路时，还需要在扬声器和Arduino的数字输出端口间串联一个100欧姆的电阻。好了，让我们来弄出点声音吧——嗯——汽笛声！(<a href="https://sites.google.com/site/tronixstuff/home/arduino-tutorial-series-files/example4p2.pde" target="_blank">下载代码</a>)</p>
[code=C]<br />/* 例子 4.2<br />&nbsp;&nbsp;&nbsp; 恼人的汽笛声<br />&nbsp;&nbsp;&nbsp; CC by-sa v3.0<br />&nbsp;&nbsp;&nbsp; http://tronixstuff.wordpress.com<br />*/<br /><br />void setup()<br />{<br />&nbsp;&nbsp;&nbsp; pinMode(8, OUTPUT); // 扬声器连接到数字端口8<br />}<br /><br />int del = 250; // 声音时长<br />int lowrange = 2000; // 音调的最低频率<br />int highrange = 4000; // 音调的最高频率<br /><br />void loop()<br />{<br />&nbsp;&nbsp;&nbsp; // 提高音调<br />&nbsp;&nbsp;&nbsp; for (int a = lowrange; a&lt;=highrange; a++)<br />&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; tone (8, a, del);<br />&nbsp;&nbsp;&nbsp; }<br /><br />&nbsp;&nbsp;&nbsp; // 降低音调<br />&nbsp;&nbsp;&nbsp; for (int a = highrange; a&gt;=lowrange; a--)<br />&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; tone (8, a, del);<br />&nbsp;&nbsp;&nbsp; }<br />}<br />[/code]<br /><p>但愿你能够承受这声音！</p>
<div>
<p><em><strong>数组！Hooray? 不……是Array。（译者注：万岁/Hooray的英文拼写和数组/Array的拼写有些类似）</strong></em></p>
<p>什么是数组？</p>
<p>让我们来用我的旧的计算机教材上的一个比喻来说明吧。首先，你知道什么是变量(你现在应该知道的)。把它想象成一张索引卡，上面写有一些数据，例
如，数字8。现在，我们要拿取更多一些的索引卡片，并些分别在每张卡片上写下一个数字：6, 7, 5, 3, 0, 
9。所以现在你一共有七张写有数字的卡片，也就是七个变量。它们之间互相关联，并且它们上面的数值可以修改。我们需要用一种易于引用的方式来把它们作为一
组卡片放在一起，于是我们把这些卡片放在一个档案分类盒中，同时给这个盒子贴上一个标签，例如 “Jenny”。</p>

<p>数组就是这样的一个档案分类盒。它保存了一个序列的Arduino所支持的类型的变量。要创建一个数组，你需要像定义其他变量一样去定义它。例如，要创建一个包含10个整数型变量的数组jenny的话，需要这么做：</p>
<pre style="padding-left: 60px;">int jenny[10];</pre>
<p>同时，向其他变量一样，你能够预定义数组中变量的值。例如：</p>
<pre style="padding-left: 60px;">int jenny[10] = {0,7,3,8,6,7,5,3,0,9};</pre>
<p>别激动，数组能够存放的数据量是有限制的。在 Arduino Duemilanove 上，我们只能够存放 2KB 大小的变量数据。请参考Arduino的<a href="http://arduino.cc/en/Main/ArduinoBoardDuemilanove" target="_blank">硬件规格</a>来获得内存或其他方面的详细信息。如果需要更多的内存的话，我们需要与外部RAM芯片进行交互，这在今后的课程中会进一步说明。</p>

<p>要修改数组中的内容是非常方便的，例如：</p>
<pre style="padding-left: 60px;">jenny[3] = 12;</pre>
<p>将会把数组的值修改为：</p>
<pre style="padding-left: 60px;">int jenny[10] = {0,7,3,12,6,7,5,3,0,9};</pre>
<p style="padding-left: 60px;">&nbsp;</p>
<p>噢，但是怎么修改的是第四个变量的值呢？没错，因为数组是从0开始索引的，所以数组中的第一个变量的索引值是0。因此，在上面的例子中 jenny[4] = 6 。就这么简单。</p>
<p>你在使用数组时，也能够用变量来进行索引。例如：</p>
[code=C]<br />for (int i = 0; i&lt;10;&nbsp; i++; i&lt;10)<br />{<br />&nbsp;&nbsp;&nbsp; jenny[i] = 8;<br />}<br />[/code]<br /><br />将会把我们的数组的值变成：
<pre style="padding-left: 60px;"><span style="white-space: pre;"> </span>jenny[] = {8,8,8,8,8,8,8,8,8,8}</pre>
<p>可以用下面这种快捷的办法将许多数字端口设置成输出模式：</p>
[code=C]<br />int pinnumbers [] = {2,3,4,5,6,7,8,9,10,11,12,13}<br /><br />for (int i= 0; i++; i&lt;12)<br />{<br />&nbsp;&nbsp;&nbsp; pinMode(pinnumbers[i],OUTPUT);<br />}<br />[/code]<br /><br />有趣……非常有趣。想象一下如果你有一个非常大的数组，一个模拟传感器，一个for循环，还有一个delay语句，你就能做出一个数据记录器。好吧，事实上，我们正要做这个。
</div>
<div>
<p><em><strong>练习 4.2</strong></em></p>
<p>创造一个温度记录器。它每隔一段时间会读取一次温度，共测量24次。当它完成测量后，将会显示测到的值、最低温度、最高温度和平均温度。你能够根据
你的选择设定测量的间隔时间。 那么，先让我们来想一下代码的算法。我们需要能够存放24次读读数的空间（嗯……一个数组？）。</p>

<ul>
	<li>循环24次，在循环内将读取的温度值存入数组，并等待一段时间。</li>
	<li>当24次循环结束后，计算并在LCD及所连接的电脑的串口监视窗口(如果Arduino被连接到电脑)中显示结果。</li>
</ul>
<p>我知道你能够实现这个想法，这个项目只是将之前学到的知识结合在一起。如果你需要帮助，你可以发邮件给我或是在这篇文章的结尾留言。</p>
<p>要完成这个练习，你需要以下材料：</p>
<ul>
	<li>你的标准的Arduino套件 (计算机、数据线、Uno 或者兼容的Arduino控制板)</li>
	<li>水 (多喝水是有好处的)</li>
	<li>Analog Devices 出品的 TMP36 温度传感器 (element-14 商店的产品号 <a href="http://au.element14.com/analog-devices/tmp36gt9z/ic-sensor-temp-to-92-3/dp/1438760" target="_blank">143-8760</a>)</li>
	<li>一个小的<a href="http://www.littlebirdelectronics.com/products/Mini-Push-Button-Switch.html" target="_blank">按钮</a>开关</li>
	<li>一个10k 0.25瓦的电阻，用来和按钮一起使用</li>
	<li>一块面包板和一些导线</li>
	<li>一个<a href="http://www.littlebirdelectronics.com/products/16x2-character-lcd-parallel-interface" target="_blank">LCD</a>显示模块</li>
</ul>
<p><em>开始吧！</em></p>
<p>这次我决定换用<a href="http://tronixstuff.wordpress.com/2010/04/28/kit-review-seeedstudio-electronic-brick-starter-kit-2/" target="_blank">Electronic Bricks</a> (译者注：是seeedstudio出品的Arduino的兼容控制板)来完成，它非常棒！</p>
</div>
<p>下面是我的实验的照片：</p>
<p align="center"><a href="http://arduino.osall.com/images/ch04/b_ex4p2layoutsmall.jpg">
<img class="aligncenter size-medium wp-image-627" title="data logger" src="http://arduino.osall.com/images/ch04/ex4p2layoutsmall.jpg" alt="" height="225" width="300"></a></p>
<p>串口输出到计算机上的结果的照片：</p>
<p align="center"><a href="http://arduino.osall.com/images/ch04/b_ex4p3serialoutput.jpg">
<img class="aligncenter size-medium wp-image-634" title="Serial output" src="http://arduino.osall.com/images/ch04/ex4p3serialoutput.jpg" alt="" height="300" width="247"></a></p>
<p>当然还有无所不在的视频。为了方便演示，采样的时间间隔被我大大缩短了……</p>

<p>(在下面的视频中，字幕中会提到是练习4.1，这是错误的。这段视频的的确确是练习4.2的视频）</p>
<span class="embed-youtube" style="text-align: center; display: block;">
<embed src="http://player.youku.com/player.php/sid/XMjk4MTk5MTU2/v.swf" quality="high" allowscriptaccess="sameDomain" type="application/x-shockwave-flash" align="middle" height="400" width="480">
</span>
<p>还有，如果你想偷懒的话，在<a href="https://sites.google.com/site/tronixstuff/home/arduino-tutorial-series-files/exercise4point2.pde?attredirects=0&amp;d=1" target="_blank">这里可以下载到代码</a>。高分辨率的照片可以在<a href="http://www.flickr.com/photos/tronixstuff/sets/72157623642420559/" target="_blank">flickr</a>上找到。</p>
<div>
<p>又完成了一个章节！我已经迫不及待的想要写下一章节的内容了……祝贺那些参与学习，并做出了一些有趣的东西的各位朋友！</p>
</div>
</div>

<div>您可以订阅或者在<a href="http://twitter.com/tronixstuff" target="_blank">twitter上关注我</a>来接收教程的更新通知。如果你有任何问题，可以在下面给我留言。如果你想给大家分享你的关于这篇文章的作品，请把你的照片给我email过来(john at tronixstuff dot com)。你也许会得到我们的奖品哦。</div>
<div>
<p style="text-align:center;">不要忘记在<a href="http://littlebirdelectronics.com/collections/arduino" target="_blank">Little Bird Electronics</a>有非常酷和有趣的Arduino套件。</p>
<p style="text-align:center;">那么，期待在 <strong><a href="http://arduino.osall.com/ch05.html" target="_self">下一个章节</a></strong>中再次和你相遇！</p>

<hr><strong>
在本教程中的所有材料，除非特别指出的，都基于 <a href="http://creativecommons.org/licenses/by-nc-sa/3.0/deed.zh_HK" target="_blank">Commons 的 姓名标示-非商业性-相同方式分享 v3.0 许可证</a>发
布。如果需要转发本作品，请按照相同的许可证发布，并注意发布页面不得有商业广告（包括但不限于Google 
Adsense等）。如果你想在其他场合使用本作品，请发邮件给 原作者 john (at) tronixstuff dot com 以及中文化作者
 wellswang (at) osall dot com 取得联系。我们非常欢迎任何的回馈、留言以及建设性的意见！
</strong><hr>

<p style="padding-left:30px;">
</p>
		</div>
                <p class="meta">

               		<span class="date">
                                        原文撰写时间：<a href="http://tronixstuff.wordpress.com/2010/04/30/">April 30, 2010</a> <br />
										翻译时间：2011年8月25日
                  </span>

             		</p>

              </div>]]></description>
         <category>Arduino</category>
         <pubDate>Thu, 25 Aug 2011 14:49:26 +0900</pubDate>
      </item>
      <item>
         <title>电工笔记 - 第三章 - 继电器、函数、中断和舵机</title>
         <link>http://wells.osall.com/blog/index.php?m=content&amp;p=1569&amp;uid=1</link>
         <description><![CDATA[<div>
<h2>开始 Arduino 之旅!&nbsp;–&nbsp;第三章</h2>
<hr>
<p>
	原文作者：John Boxall (john at tronixstuff dot com)<br />
	中文翻译：Wells Wang (wellswang at osall dot com) <br />
	原文地址：<a href="http://tronixstuff.wordpress.com/2010/04/20/getting-started-with-arduino-chapter-three/">http://tronixstuff.wordpress.com/2010/04/20/getting-started-with-arduino-chapter-three/</a><br />
	中文版地址：<a href="http://arduino.osall.com/ch03.html">http://arduino.osall.com/ch03.html</a>
	</p>
<hr>

<p>这是<a style="text-decoration: none; color: rgb(34, 102, 153); font-weight: bold;" href="http://tronixstuff.wordpress.com/about-2/" target="_blank">John Boxall</a>所写的关于Arduino单片机的“开始 Arduino 之旅 / 深入 Arduino 之旅!”系列教程中的一篇。这个Arduino系列教程感觉像是没有止境的，目前还在一直更新。整个系列的第一篇文章在<a href="http://arduino.osall.com/ch00.html" target="_blank">这里</a>，系列的详细目录介绍可以在<a href="http://arduino.osall.com/index.html" target="_blank">这里</a>找到。教程中的文件可以在<a href="https://sites.google.com/site/tronixstuff/" target="_blank">这里</a>下载</p>

<div id="_mcePaste"><strong>欢迎回来，Arduino的爱好者们！</strong></div>
<br />
<br />
<div>在这一章节，我们将会了解一下继电器，实现更多的功能的函数，中断操作，以及最后学习如何使用伺服电机。那么我们赶快开始吧！</div>
<p>根据计划，首先是继电器。</p>
<p>什么是继电器？我们把它想象成两个非常接近的物体：一个线圈,有时会有电流通过它；以及一个开关,默认值是一个方向。当电流通过线圈,那么它将产生一个电磁场使开关改变状态。使用继电器的好处是：你可以用一个小电流和电压来控制打开或关闭一个使用非常大的电流和/或电压的负载——开关和线圈电流是彼
此独立的。下面是一个继电器的例子：</p>
<p><a href="http://arduino.osall.com/images/ch03/b_relayinternalssmall.jpg">
<img class="aligncenter size-medium wp-image-521" title="relay!" src="http://arduino.osall.com/images/ch03/relayinternalssmall.jpg" alt="" height="225" width="300"></a></p>
<p>如果你仔细看,你可以看到线圈和内部的开关。这一款继电器有一个双刀双掷开关。这意味着两个输入可以切换两个方向中的任何一个。线圈需要12伏的电
压才能激活；而开关能承受250伏5安培的交流电；线圈阻值是200欧姆。欧姆定律(电压=电流x电阻)告诉我们，该线圈电流是60毫安。由于我们无法通过Arduino得到很大的电流的——因此需要使用继电器。(如果任何人想要尝试,把它拍摄下来发给我们！)唯一的问题是,继电器中有移动的部件(开关),因此时间久了会有损耗。所以如果你设计了一个使用继电器的项目的话，要确保在给最终用户或维护的人的维修保养计划中要记录下这一点。
</p>
<p>我们怎样用arduino来驱动继电器呢？还是那句话——非常简单。不过我们需要给继电器找个搭档——一个交换式三极管。找个简单的常用的NPN型号的就行了，例如 BC548。不过，在选择三极管的时候，你需要确认它能够承受线圈所需要的电流。在三极管的数据表文件(data 
sheet)(例如，我们选的 <a href="http://tronixstuff.files.wordpress.com/2010/04/fairchildbc548.pdf">BC548</a>)会提到一个名为 Ic (集电极电流) 的值。我们选择的 BC548 的值是 100mA，大于继电器线圈要求的 60mA。太棒了！</p>

<p>差不多就这些了……不过，当一个线圈被关掉,线圈内的电磁辐射需要被释放，否则电磁脉冲将会影响三极管。因此，可以在继电器线圈旁并联一个普通的1A的整流二极管(如1N4004)，允许电流循环流过线圈和二极管直到它释放完毕。</p>
<p>最后一件事是检查继电器线圈的电压。如果你有一个小电流的5V继电器，你可以使用arduino供电，然而在大多数情况下,线圈的电压是12V,所以它需要自己的电源来供电。</p>
<p>这是一个使用12V继电器和小电流三极管的电路图。在写这篇文章的时候，我发现了一些 <a href="http://au.element14.com/jsp/search/productdetail.jsp?SKU=9913882" target="_blank">线圈电压为5V的继电器</a>， 就不需要12V的供电了。</p>
<p><a href="http://arduino.osall.com/images/ch03/b_examp3p1.jpg">
<img class="aligncenter size-medium wp-image-1571" src="http://arduino.osall.com/images/ch03/examp3p1.jpg" alt="" height="175" width="300"></a></p>
<p>所以，下面来做个简单的测试，找一下使用继电器的感觉……这里是代码：(<a href="https://sites.google.com/site/tronixstuff/home/arduino-tutorial-series-files/example3_1.pde" target="_blank">下载</a>)</p>
[code=C]<br />// 例子 3.1<br />// 继电器测试 - John Boxall - http://tronixstuff.wordpress.com<br /><br />void setup()<br />{ <br />&nbsp;&nbsp;&nbsp; pinMode (2, OUTPUT); // 设置数字端口 2 为输出模式/span&gt;<br />} <br />void loop()<br />{ <br />&nbsp;&nbsp;&nbsp; for (int i = 1; i&lt;=20; i++) // 循环20次<br />&nbsp;&nbsp;&nbsp; { <br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; digitalWrite (2, HIGH); // 打开数字端口2一秒钟，然后关闭一秒钟<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; delay (1000);<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; digitalWrite (2, LOW);<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; delay (1000);<br />&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; delay (2000);<br />}<br />[/code]<br />&nbsp;
<address>&nbsp;</address>
<address><span style="font-style: normal;">我们的硬件和上面电路图中的一模一样。这是照片：</span></address>
<address>&nbsp;</address>
<address>&nbsp;</address>
<pre><span style="font-style: normal;"><a href="http://arduino.osall.com/images/ch03/b_example3_1small.jpg">
<img class="aligncenter size-medium wp-image-527" title="example 3.1" src="http://arduino.osall.com/images/ch03/example3_1small.jpg" alt="" height="225" width="300"></a></span></pre>
<address><span style="font-style: normal;"><br />
</span></address>

<address>&nbsp;</address>
<address><span style="font-style: normal;">当然还有视频。你可以看到线圈使开关切换时的细节。</span></address>

<address><span style="font-style: normal;"><br />
</span></address>
<address>&nbsp;</address>
<address><span style="font-style: normal;"><span class="embed-youtube" style="text-align: center; display: block;">
<embed src="http://player.youku.com/player.php/sid/XMjg1Nzk4MDY0/v.swf" quality="high" allowscriptaccess="sameDomain" allowfullscreen="true" type="application/x-shockwave-flash" align="middle" height="400" width="480">
</span></span></address>
<address><span style="font-style: normal;"><br />
</span></address>
<address>&nbsp;</address>
<address><span style="font-style: normal;">现在，你可以使用arduino来开关使用非常高的电流/电压的负载了。在练习时请注意安全，在操作市电时请记得一定要请教专家（译者注：请记住，操作市电一定要请教专业电工，否则非常危险）。市电可能导致生命危险。 </span></address>
<address>&nbsp;</address>
<p><span style="font-style: normal;"><em>接下来该学习一下函数了。 </em></span></p>
<p><span style="font-style: normal;">在Arduino的代码里有三个主要的组成部分：变量、结构和函数。函数就是用来执行一些操作的命令，例如 <em>analogRead();</em>。
你能够定义自己的函数来优化你的代码的结构和流程。如果你之前有过编程经验，你可以把它认为是子过程，或者多年前的BASIC语言中的 GOSUB 
回调命令。在上一课中的练习2.2中，使用自定义函数来实现将是非常理想的——我们可以写一个函数来显示最低/最高温度，或者重置记录的数据。不过在实践之前，我们得先把它学会了……</span></p>

<p><span style="font-style: normal;">你还记得 <em>void loop();</em> 吗？我希望你还记得——这就是在你的代码的setup段之后的函数。实际上，它定义了要不停循环执行，除非你重置或者关闭Arduino才会停止的代码段。你可以用同样的方法来方便的来定义你自己的函数。例如：</span></p>
[code=C]<br />void blinkthree()&nbsp; // 函数名是 "blinkthree"<br />{<br />&nbsp;&nbsp;&nbsp; for (int i = 0; i &lt;3; i++) // 循环三次<br />&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; digitalWrite(8, HIGH); // 打开数字端口8上连接的LED<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; delay (1000);<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; digitalWrite(8, LOW); // 关闭数字端口8上连接的LED<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; delay (1000);<br />&nbsp;&nbsp;&nbsp; }<br />}<br />[/code]<br /><p>现在，函数已经定义好了，当你想要让数字端口8上连接的LED闪烁三次的时候，只要在你的代码段中需要的地方插入 <em>blinkthree(); </em> 就好了。不过如果你要改变闪烁的次数呢？这时，你可以传递一个参数给你的函数。例如：</p>
[code=C]<br />void blinkblink(int blinks)&nbsp; // 函数名是 "blinkblink"，接受一个整数型参数，并把值存到变量blinks中<br />{<br />&nbsp;&nbsp;&nbsp; for (int i = 0; i &lt;blinks; i++) // 循环"blinks"次<br />&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; digitalWrite(8, HIGH); // 打开数字端口8上连接的LED<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; delay (1000);<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; digitalWrite(8, LOW); // 关闭数字端口8上连接的LED<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; delay (1000);<br />&nbsp;&nbsp;&nbsp; }<br />}<br />[/code]<br /><br /><div>现在你要让LED闪烁42次的话，只要执行<em>blinkblink(42); </em>就好。你还想要指定自定义的等待时间？那这样试试看：</div><br />[code=C]<br />void blinkblink(int blinks, int del)&nbsp; // 函数名为 "blinkblink"，接受两个整数型参数，一个存入变量blinks，另一个存入del<br />{<br />&nbsp;&nbsp;&nbsp; for (int i = 0; i&lt;blinks; i++) // 循环"blinks"次<br />&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; digitalWrite(8, HIGH); // 打开数字端口8上连接的LED<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; delay (del);<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; digitalWrite(8, LOW); // 关闭数字端口8上连接的LED<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; delay (del);<br />&nbsp;&nbsp;&nbsp; }<br />}<br />[/code]<br /><br />现在，你要闪烁42次，每次开关等待367毫秒的话，只要执行<em>blinkblink(42,367); </em>就好了。非常简单吧，不是么？

<div>好了，还要说明的一件事是，函数还能够作为数学函数来使用，可以返回一个结果。 
<img src="http://arduino.osall.com/images/icon_smile.gif" alt=":)" class="wp-smiley"> </div>
<div>例如：</div><br />[code=C]<br />float circlearea (float radius)<br />{<br />&nbsp;&nbsp;&nbsp; float result = 0;<br />&nbsp;&nbsp;&nbsp; result = 3.141592654 * radius * radius;<br />&nbsp;&nbsp;&nbsp; return result;<br />}<br />[/code]<br /><br />你知道会发生什么样的结果吗？如果我们的代码中有一个圆半径的值被存放在变量radius2中，那么这个圆的面积就可以这样来获得
<pre style="padding-left: 30px;">area2 = circlearea(radius2);</pre>
<p>真方便。</p>
<p>现在，你可以创建你自己的函数了。最然这不是最引人注目的部分，但这却是我们需要知道的。</p>
<p>轮到休息时间了，出去走走吧，五分钟后再回来。</p>
<p><em>现在该打断你的休息时间来学习一些中断了。</em></p>
<p>中断是指一个数字输入端口状态发生变化时发生的一个事件，它会呼叫并执行一个特定函数。</p>
<p>例如，你有一个测量室温的系统，并且能自动调节空调的温度来精确维持到23摄氏度。你同时还有一个监测主电源电压的传感器，当停电时会改变状态。这就是一个中断触发器——你能够在断电后马上知道，而不是在经过较长一段时间，室温慢慢升起后才发现了。这样你可以在室温升高之前做一些补救措施了。</p>
<p>另外一个例子是一个机器人……当它在地面高兴的转悠时，它的接近传感器会不断的探测离地距离。当机器人被升离地面时将触发中断——可以关掉车轮或发出警报(“救命，我被人偷了！”)。我确信你的想象力可以想出许多其它的例子。</p>

<p>那么我们该怎么做才能实现一个中断呢？这非常容易，除了有一些限制外。你只能监控两个端口(对一个普通arduino板)或者在 Arduino <span style="color: rgb(0, 0, 0);">mega</span>
 上监控六个。此外，你还不能在中断函数中使用 delay() 函数。现在，你需要决定三件事：你需要监控的端口 (数字端口 2 或者 3, 
被映射为中断 0 或 1)；当中断发生时要执行的函数；以及要监控的端口上触发中断的行为——也就是端口状态变化的情况。你要监控数字端口也需要使用 <em>pinMode();.</em> 函数来设置成输出模式（译者注：可能John在这个地方写错了，需要监听的端口是不需要使用pinMode()函数来指定模式的，这已经在arduino语言中被预定义过，被硬编码为监听模式了）。</p>
<p>对于监听端口的状态变化，共有四种情况：LOW (当监听端口为低电平)，CHANGE (电平状态发生变化，低变高或者高变低)，RISING 
(由低电平变为高电平) 以及 FALLING (由高电平变为低电平)。一开始看上去挺难记住这些的，但是当你理解后就会觉得非常简单了。</p>
<p>噢 –要学的东西实在太多了。所以，用一些实践来代替理论学习吧。</p>
<p><em>例子 3.2 – 中断演示。</em></p>
<p>在这个例子中，我们会延用例子2.2中的随机数生成器，同时监控两个中断。中断将会在按钮按下时被触发：(<a href="https://sites.google.com/site/tronixstuff/home/arduino-tutorial-series-files/example3_2.pde?attredirects=0&amp;d=1" target="_blank">下载</a>)</p>
[code=C]<br />/*<br />&nbsp;&nbsp;&nbsp; 例子 3.2 – 中断<br />&nbsp;&nbsp;&nbsp; 创建于 21/04/2010<br />&nbsp;&nbsp;&nbsp; 作者 John Boxall<br />&nbsp;&nbsp;&nbsp; http://tronixstuff.wordpress.com<br />&nbsp;&nbsp;&nbsp; CC by-sa v3.0<br />&nbsp;&nbsp;&nbsp; 向 LCD 屏幕传送一些信息，同时监听两个中断<br />*/<br /><br />#include &lt;LiquidCrystal.h&gt; // 需要这个库来控制LCD<br /><br />// 使用指定的端口，初始化LCD函数库<br />LiquidCrystal lcd(7, 8, 9, 10, 11, 12);<br /><br />float noisy = 0;<br /><br />void setup()<br />{<br />&nbsp;&nbsp;&nbsp; lcd.begin(16, 2); // 需要制定LCD显示屏显示的行数和列数<br />&nbsp;&nbsp;&nbsp; lcd.setCursor(0,0);<br />&nbsp;&nbsp;&nbsp; lcd.println('* example 3.2 * ');<br />&nbsp;&nbsp;&nbsp; lcd.setCursor(0,1);<br />&nbsp;&nbsp;&nbsp; lcd.println('tronixstuff.com ');<br />&nbsp;&nbsp;&nbsp; lcd.setCursor(0,1);<br />&nbsp;&nbsp;&nbsp; delay(4000);<br />&nbsp;&nbsp;&nbsp; lcd.clear();<br />&nbsp;&nbsp;&nbsp; randomSeed(analogRead(0)); // 刷新随机数种子<br />&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; // 当中断 0 (数字端口 2) 的状态发生改变，将触发中断并执行函数 'panicone'<br />&nbsp;&nbsp;&nbsp; attachInterrupt(0, panicone, RISING); <br />&nbsp;&nbsp;&nbsp; // 当中断 1 (数字端口 3) 的状态发生改变，将触发中断并执行函数 'panictwo'<br />&nbsp;&nbsp;&nbsp; attachInterrupt(1, panictwo, RISING); <br />}<br /><br />void loop()<br />{<br />&nbsp;&nbsp;&nbsp; noisy=random(1000);<br />&nbsp;&nbsp;&nbsp; lcd.setCursor(0,0);<br />&nbsp;&nbsp;&nbsp; lcd.print('Random Numbers!');<br />&nbsp;&nbsp;&nbsp; lcd.setCursor(0,1);<br />&nbsp;&nbsp;&nbsp; lcd.print('Number: ');<br />&nbsp;&nbsp;&nbsp; lcd.print(noisy,0);<br />&nbsp;&nbsp;&nbsp; delay(1000);<br />}<br /><br />void panicone()<br />{<br />&nbsp;&nbsp;&nbsp; lcd.clear();<br />&nbsp;&nbsp;&nbsp; lcd.println('Interrupt one&nbsp;&nbsp; ');<br />}<br /><br />void panictwo()<br />{<br />&nbsp;&nbsp;&nbsp; lcd.clear();<br />&nbsp;&nbsp;&nbsp; lcd.println('Interrupt two&nbsp;&nbsp; ');<br />}<br />[/code]<br /><br />当然，还有实验电路板的布局照片—— 我们重用了在例子2.2中使用的LCD显示屏，并且添加了两个标准的按钮和 10k 电阻(在<a href="http://www.littlebirdelectronics.com/products/Getting-Started-with-Arduino.html" target="_blank">书</a>的第 42 页)作为中断。 下面就是照片：
<p><a href="http://arduino.osall.com/images/ch03/b_example3_2small.jpg">
<img class="aligncenter size-medium wp-image-546" title="Example 3.2" src="http://arduino.osall.com/images/ch03/example3_2small.jpg" alt="" height="225" width="300"></a></p>

<p>以及实验的视频…… 
这两个按钮开关照理应该使用消抖电路来去除抖动（译者注：由于按钮开关是机械部件，按下或松开时接触点可能出现瞬间通断的状态，被称为抖动。抖动的时间长
度由按钮的机械特性决定，通常在5ms到10ms之间），但是由于是实验演示的关系，就省略了这部分电路。</p>
<span class="embed-youtube" style="text-align: center; display: block;">
<embed src="http://player.youku.com/player.php/sid/XMjg1Nzk4NDcy/v.swf" quality="high" allowscriptaccess="sameDomain" allowfullscreen="true" type="application/x-shockwave-flash" align="middle" height="400" width="480">
</span>
<p>最后——轮到 <a href="http://en.wikipedia.org/wiki/Servomechanism" target="_blank">伺服电机（舵机）</a> 了！我真的希望你在学习这部分之前去浏览其他部分的内容——尽管它们可能不是那么有趣,不过你一定会觉得非常有用的。</p>
<p><strong><em>什么是伺服电机？</em></strong></p>
<p>想象一下有一个小电机连接到一个可调电阻器。一个电动脉冲或者命令被发送到电机之后，电机旋转到匹配指定的电位值的角度。嗯，那样说听起来有点难以理解。</p>
<p>一个更简单的解释是：伺服电机,就是一个可以被指定旋转到一个特定的角度的电动马达。例如，它通常可以用来控制遥控汽车的转向系统。在这里，我们要再次感谢Arduino和朋友们，要使用一个伺服电机是很容易的，它可以让你创造出富有想象力的设计，唯一的局限就只有你的时间和资金了。 
<img src="http://arduino.osall.com/images/icon_smile.gif" alt=":)" class="wp-smiley"> </p>

<p>当你想要使用伺服电机时，需要考虑一些因素，包括：</p>
<ul>
	<li>旋转范围，指的是电机可以旋转的角度的范围。例如 180 度或者 360 度 (<a href="http://www.littlebirdelectronics.com/products/servo-large-full-rotation" target="_blank">全旋</a>)，等等。</li>
	<li>旋转速度(通常以旋转每一度所花费的时间来衡量)。</li>
	<li><a href="http://www.physics.uoguelph.ca/tutorials/torque/Q.torque.intro.html" target="_blank">扭矩</a>，伺服电机能够产生的扭矩 (旋转的力量)。</li>
	<li>在负载的状态下的电流大小。</li>
	<li>重量、成本以及其他因素。</li>
</ul>
<p>脑海中首先想到的一个问题就是“哇——我能够同时使用多少个电机呢？”答案是……&nbsp;在duemilanove上，可以使用<strong>12</strong>个；在arduino mega上，可以使用<strong>48 </strong>个(哇)。请注意当你使用伺服电机函数库时，你不能在第9和第10端口上使用<em>analogWrite(); </em>函数。你可以在 arduino&nbsp;<a href="http://arduino.cc/en/Reference/Servo" target="_blank">伺服电机函数库</a> 页面找到更多的细节。</p>
<p>在今天的例子和练习中，我使用了 <a href="http://www.adafruit.com/index.php?main_page=product_info&amp;cPath=34&amp;products_id=169" target="_blank">Turnigy TG9</a> 伺服电机。它相当的便宜，而且重量轻，非常适合演示实验，这款电机也经常被用于遥控飞机。它的旋转范围是180度。(它真的非常便宜)</p>

<p><a href="http://arduino.osall.com/images/ch03/b_servosmall.jpg">
<img class="aligncenter size-medium wp-image-551" title="here to serve you..." src="http://arduino.osall.com/images/ch03/servosmall.jpg" alt="" height="225" width="300"></a></p>
<p>我希望你注意到伺服电机上一共有三根导线。一根是 +5V 电源，一根是 GND 接地，另一根是控制信号——连接到arduino的一个数字输出端口上。导线的颜色不是固定的，不过对于这一款 <a href="http://www.adafruit.com/index.php?main_page=product_info&amp;cPath=34&amp;products_id=169" target="_blank">adafruit的伺服电机</a>
 来说，颜色最深的的是地线GND，最浅的是控制信号线，不深不浅的就是 +5V 电源线了。这一款电机非常小，额定电流也不大，所以可以使用你的 
Arduino 
控制板直接驱动。然而，当你使用更大的电机或者电机有较大的负载时，你就需要为电机独立供电，这样才能提供它所需要的电流。如果你要同时使用两个以上的这类轻量级的电机时，你需要使用外接电源以及一个<a href="http://shop.snootlab.com/lang-en/powerduino/87-rotoshield.html" target="_blank">电机扩展板</a>。</p>
<p>当你使用角度计量时，你最好准备一个量角器，就像这样的：</p>
<p><a href="http://arduino.osall.com/images/ch03/b_protractorsmall.jpg">
<img class="aligncenter size-medium wp-image-552" title="protractor!" src="http://arduino.osall.com/images/ch03/protractorsmall.jpg" alt="" height="225" width="300"></a></p>
<p>我们要怎样才能控制伺服电机呢？首先我们需要使用伺服电机<a href="http://arduino.cc/en/Reference/Libraries" target="_blank">函数库</a>。就像我们在第二章中使用LCD显示屏那样，在代码的开头部分写下这样一行：</p>
<pre style="padding-left: 30px;">#include &lt;Servo.h&gt;</pre>

<p>这样，我们就可以使用伺服电机控制命令了。</p>
<p>接下来需要在代码中创建伺服电机的对象(object)，以便于引用，例如：</p>
<pre style="padding-left: 30px;">Servo myservo;</pre>
<p>最后，为了控制电机，将电机对象绑定到一个数字端口(在 void setup(); 代码段中 )。</p>
<pre style="padding-left: 30px;">myservo.attach(9);&nbsp; // 在端口9上绑定电机对象</pre>
<p>代码的设置部分就只有这些了，接下来所需要做的就只有……</p>
<pre style="padding-left: 30px;">myservo.write(pos);</pre>
<p><em>pos</em> 是一个 0 到 180 (或者多或者少，这决定于伺服电机旋转的角度的范围) 之间的数字。</p>

<p>好了，空谈不如实践，我们要用一个例子来将所有的东西包括伺服电机的旋转都结合在一起。 
<img src="http://arduino.osall.com/images/icon_smile.gif" alt=":)" class="wp-smiley"> 下面的例子将让你看到指针从左边移动到中间再移动到右边并重复循环： (<a href="https://sites.google.com/site/tronixstuff/home/arduino-tutorial-series-files/example3_3.pde" target="_blank">下载</a>)</p>
[code=C]<br />/*<br />&nbsp;&nbsp;&nbsp; 例子 3.3 – 伺服电机监测<br />&nbsp;&nbsp;&nbsp; 创建于 21/04/2010<br />&nbsp;&nbsp;&nbsp; 作者 John Boxall<br />&nbsp;&nbsp;&nbsp; http://tronixstuff.wordpress.com<br />&nbsp;&nbsp;&nbsp; CC by-sa v3.0<br />*/<br /><br />#include &lt;Servo.h&gt;<br /><br />Servo myservo;&nbsp; // 创建电机对象<br />int pos = 0;&nbsp;&nbsp;&nbsp; // 存放电机旋转角度的变量<br />int del = 100; // 延时（单位：毫秒）<br /><br />void setup()<br />{<br />&nbsp;&nbsp;&nbsp; Serial.begin(9600);<br />&nbsp;&nbsp;&nbsp; myservo.attach(9);&nbsp; // 将伺服电机控制信号连接到在端口9并绑定电机对象<br />}<br /><br />void loop()<br />{<br />&nbsp;&nbsp;&nbsp; for (int loopy = 0; loopy&lt;=3; loopy++)<br />&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; for (pos = 180; pos &gt;=0; pos--) // 将Hextronik HXT900电机从左向右旋转<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; myservo.write(pos);<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; delay(del);<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; delay(1000);<br />&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; for (int loopy = 0; loopy&lt;=3; loopy++)<br />&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; myservo.write(180);<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; delay (1000);<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; myservo.write(90);<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; delay (1000);<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; myservo.write(0);<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; delay (3000);<br />&nbsp;&nbsp;&nbsp; }<br />}<br />[/code]<br /><br />电路板的连接非常的简单，仅仅只有伺服电机的三根导线被连接到了arduino控制板上。
<p><a href="http://arduino.osall.com/images/ch03/b_example3_3small.jpg">
<img class="aligncenter size-medium wp-image-558" title="Example 3.3" src="http://arduino.osall.com/images/ch03/example3_3small.jpg" alt="" height="225" width="300"></a></p>
<p>下面是视频。抱歉的是，我的摄像机没有录下声音，因此你无法听到电机转动时的嗡嗡声。</p>

<span class="embed-youtube" style="text-align: center; display: block;">
<embed src="http://player.youku.com/player.php/sid/XMjg1ODAzMDc2/v.swf" quality="high" allowscriptaccess="sameDomain" allowfullscreen="true" type="application/x-shockwave-flash" align="middle" height="400" width="480">
</span>
<p>好了，你应该也已经读够了也看够了，该是你来做些练习的时候了。记得用上到现在为止我们所讨论过的所有的知识……</p>
<p><em>练习 3.1</em></p>
<p>我们可以使用数码技术来让一些东西变得更加有用和与众不同——比如带有以下功能的模拟式的（指针式的）数字温度计：</p>
<ul>
	<li>指针可旋转180度范围的模拟式的温度显示。所表示温度的范围则根据你所在地的气候而不同。在我的例子中将表示 0~40 摄氏度。</li>
	<li>一个可以用来显示是否需要打开加热器或者空调或者关闭的模拟的指针。也就是 <a href="http://arduino.osall.com/ch02.html" target="_blank">练习 2.1</a> 的模拟显示版本。</li>
	<li>可以在需要的时候显示最低和最高温度，同时有一个指示器(用LED就好)来说明显示的是什么内容。另外还要有个重置按钮。</li>
</ul>
<p>你可以把你自己的函数、温度传感器、一些判断语句、数字和模拟输入、数字和模拟的输出以及一些你的创意结合在一起，来完成这个练习。如果要照我的样例去完成练习的话，你需要以下的元件：</p>
<ul>
	<li>你的Arduino标准套件。</li>
	<li>水（记得补充水分）。</li>
	<li>Analog Devices 出品的 TMP36 温度传感器(element-14 备件号 <a href="http://au.element14.com/analog-devices/tmp36gt9z/ic-sensor-temp-to-92-3/dp/1438760?Ntt=1438760" target="_blank">143-8760</a>)。</li>
	<li>2 个小的 <a href="http://www.littlebirdelectronics.com/products/Mini-Push-Button-Switch.html" target="_blank">按钮。</a></li>
	<li>2 个 10k 0.25W 的电阻。将作为按钮的限流电阻使用。</li>
	<li>两颗LED来说明显示的是最低/最高温度。</li>
	<li>2 个 390 ohm 0.25 W 电阻，作为LED的限流保护电阻。</li>
</ul>
<p>可以开始了……如果你有任何问题，你可以在文章最后留言，或者发邮件给 john at tronixstuff dot com 。</p>
<p>实验的成果如下，这是我的电路板的布线照片：</p>
<p><a href="http://arduino.osall.com/images/ch03/b_exer3_1boardsmall.jpg">
<img class="aligncenter size-medium wp-image-565" title="the board" src="http://arduino.osall.com/images/ch03/exer3_1boardsmall.jpg" alt="" height="225" width="300"></a></p>
<p><a href="http://arduino.osall.com/images/ch03/b_exer3_1board2small.jpg">
<img class="aligncenter size-medium wp-image-566" title="board controls" src="http://arduino.osall.com/images/ch03/exer3_1board2small.jpg" alt="" height="225" width="300"></a></p>
<p>你可以看到用来显示最低/最高温度的按钮和重置按钮。同时两个LED用来说明右边的伺服电机上的指针显示的是最低或是最高的温度，在同时亮起时则是询问你是否需要重置温度记录。当然，还有实验的视频：</p>

<span class="embed-youtube" style="text-align: center; display: block;">
<embed src="http://player.youku.com/player.php/sid/XMjg1ODA0NjQw/v.swf" quality="high" allowscriptaccess="sameDomain" allowfullscreen="true" type="application/x-shockwave-flash" align="middle" height="400" width="480">
</span>
<p>这里可以下载到<a href="https://sites.google.com/site/tronixstuff/home/arduino-tutorial-series-files/exercise3_1.pde" target="_blank">我的实验代码</a>。</p>
<p>哇！最后要祝贺参与学习和实践的朋友们！</p>

<div>您可以订阅或者在<a href="http://twitter.com/tronixstuff" target="_blank">twitter上关注我</a>来接收教程的更新通知。如果你有任何问题，可以在下面给我留言。如果你想给大家分享你的关于这篇文章的作品，请把你的照片给我email过来(john at tronixstuff dot com)。你也许会得到我们的奖品哦。</div>
<div>
<p style="text-align:center;">不要忘记在<a href="http://littlebirdelectronics.com/collections/arduino" target="_blank">Little Bird Electronics</a>有非常酷和有趣的Arduino套件。</p>
<p style="text-align:center;">那么，期待在 <strong><a href="http://arduino.osall.com/ch04.html" target="_self">下一个实验</a></strong>中再次和你相遇！</p>

<hr><strong>
在本教程中的所有材料，除非特别指出的，都基于 <a href="http://creativecommons.org/licenses/by-nc-sa/3.0/deed.zh_HK" target="_blank">Commons 的 姓名标示-非商业性-相同方式分享 v3.0 许可证</a>发
布。如果需要转发本作品，请按照相同的许可证发布，并注意发布页面不得有商业广告（包括但不限于Google 
Adsense等）。如果你想在其他场合使用本作品，请发邮件给 原作者 john (at) tronixstuff dot com 以及中文化作者
 wellswang (at) osall dot com 取得联系。我们非常欢迎任何的回馈、留言以及建设性的意见！
</strong><hr>

<p style="padding-left:30px;">
</p>
		</div>
                <p class="meta">

               		<span class="date">
                                        原文撰写时间：<a href="http://tronixstuff.wordpress.com/2010/04/20/">April 20, 2010</a> <br />
										翻译时间：2011年8月9日
                  </span>

             		</p>

              </div>]]></description>
         <category>Arduino</category>
         <pubDate>Tue, 09 Aug 2011 22:55:22 +0900</pubDate>
      </item>
      <item>
         <title>电工笔记 - 第二章 - 电子温度计、While循环和函数库</title>
         <link>http://wells.osall.com/blog/index.php?m=content&amp;p=1564&amp;uid=1</link>
         <description><![CDATA[<div>
<h2>开始 Arduino 之旅!&nbsp;–&nbsp;第二章</h2>
<hr>
<p>
	原文作者：John Boxall (john at tronixstuff dot com)<br />
	中文翻译：Wells Wang (wellswang at osall dot com) <br />
	原文地址：<a href="http://tronixstuff.wordpress.com/2010/04/15/getting-started-with-arduino-chapter-two/">http://tronixstuff.wordpress.com/2010/04/15/getting-started-with-arduino-chapter-two/</a><br />
	中文版地址：<a href="http://arduino.osall.com/ch02.html">http://arduino.osall.com/ch02.html</a>
	</p>
<hr>

                <p><strong>[请注意从2010年11月1日起.教程中的文件可以在<a href="https://sites.google.com/site/tronixstuff/" target="_blank">这里</a>下载]</strong></p>
<p>这是关于Arduino单片机的“开始 Arduino 之旅!”系列教程中的一篇，请作为Massimo Banzi的“<a href="http://www.littlebirdelectronics.com/products/Getting-Started-with-Arduino.html" target="_blank">Getting Started with Arduino</a>”一书的补充材料一起阅读。 <a href="http://arduino.osall.com/ch01.html" target="_self"><strong>这里是前一篇教程——第一章</strong></a><strong>。</strong></p>

<p><em><strong>Arduino的爱好者们，欢迎回来！</strong></em></p>
<p>我希望通过这些文章大家能够学会并创造出一些有趣的东西。如果你还没能做到这一点，慢慢来，你很快就能做到了！</p>
<p>今天要完成以下几个课题：读取温度，将数据从Arduino传送回电脑，打开Arduino函数库，使用LCD显示屏，以及通过一些练习来回顾和巩固所学到的知识。</p>
<p>首先，我们要来研究一个新的传感器——温度传感器。你可以想象，这个传感器可以用来创造许许多多的应用，从简单的告诉你现在的温度，到一个基于Arduino的恒温控制系统。其实创造这些要比大多数人想象的简单的多——所以，准备好去让大家大吃一惊吧！</p>
<p>让我们来了解一下 Analog Devices 公司的 TMP36 <a href="http://au.element14.com/analog-devices/tmp36gt9z/ic-sensor-temp-to-92-3/dp/1438760" target="_blank">低电压温度传感器</a>吧：</p>
<p style="text-align: center;"><strong><a href="http://arduino.osall.com/images/ch02/b_tmp36small.jpg">
<img class="aligncenter size-medium wp-image-393" title="I like it hot..." src="http://arduino.osall.com/images/ch02/tmp36small.jpg" alt="" height="289" width="300"></a><br />
</strong></p>
<p>非常小，不是么？因为它使用了标准的 TO-92 封装，它看上去就像是一个标准的三极管(例如 
BC548)。TMP36使用起来也非常简单——把平的那面朝上，引脚 1 是 +5V 电源 
(你可以把这个引脚连接到Arduino的+5V供电插孔中)，引脚 2 是电压输出端 (读数，温度值)，引脚 3 是接地 
(连接到Arduino的接地插孔中)。 如果想知道更多的信息，可以参考TMP36的数据表文件，里面有着更详细的信息，也非常容易阅读。 <a href="http://tronixstuff.files.wordpress.com/2010/04/tmp36-sensor.pdf">TMP36 数据表文件(data sheet)</a></p>

<p>TMP36会返回用来表示温度的电压。每一摄氏度用 10 mV 来表示，可以测量的温度范围是 -40 到 125 度。</p>
<p>TMP36传感器用起来非常方便，不需要任何附加的电阻或其他元件。不过还有一种情况比较复杂——远程使用传感器。当你在面包板上测试传感器的时
候，一切都非常方便，但是如果你想要把传感器放置在窗外，你的酒窖里，或者养鸡场的鸡舍中，问题就来了……因为传感器输出的电压非常低，放在室外的传感器
比较容易受到干扰或信号衰减。所以需要给传感器加一个附加的电路，以及使用屏蔽线来连接传感器和室内的基板。关于长距离传输信号的详细信息，请参考数据表
文件的第15页。</p>
<p>不好意思，现在我们要解决一些数学上的问题。在数据表文件的第八页上，描述了传感器的 <em>输出规格参数</em>。当温度每升高一摄氏度时，TMP36的输出电压就增加10毫伏；在25摄氏度时，输出电压是750毫伏；偏移电压则是500mV，通过<em>analogRead()</em>所得到的结果需要减去这个偏移电压再进行计算。这个偏移电压并不是没有用处的——它的存在允许传感器在测量零下的温度时能够传回可读取的电压值。</p>
<p style="padding-left: 30px;"><em>注记：一种新的变量类型。到现在为止，我们使用过 </em>int<em> 类型来表示整数……不过现在该引入实数了！你可以在代码中把变量定义成为 </em>float<em> 类型来表示浮点数。</em></p>

<p>现在我们已经知道怎样通过 <em>analogRead()</em> 来测量一个模拟输入Arduino的电压值，但是我们需要把读数转化成一个有含义的大家能直接看懂的数字。我们来看一下怎么做……</p>
<p><em>analogRead()</em> 返回 0 到 1023 之间的数值——这个数值对应于0到5V (5000 mV)之间的一个电压。我们可以非常简单的先把返回的数值转换成电压值，然后再把它转换成温度。所以，原始的通过 <em>analogRead()</em>
 获取的TMP36的读数乘以 (5000/1024) 就可以得到传感器返回的实际的电压值 
[我们使用毫伏作为单位，而不是伏特]。现在问题就变得简单了——减去 500 来去掉偏移电压，然后再除以 10 [记住每 1 摄氏度是用 10毫伏
 来表示的]。看！我们得到了以摄氏度为单位的结果。</p>
<p>如果你的所在地是以华氏作为温度的计量单位的，你还需要把摄氏度的结果乘以1.8再加上32。</p>
<p style="padding-left: 30px;"><em>注记：你在之前的代码中已经见过我们通过串口输出一些信息并使用arduino的软件把它显示在串口观察窗口中。请注意如果你要使用串口输入输出的话，就不能使用数字端口0和1了。我们在代码的 <span style="font-style: normal;">void setup();</span> 段落使用了 <span style="font-style: normal;">Serial.begin(9600)</span>; 语句来初始化串口输入输出。你可以使用 </em>Serial.print();&nbsp;<em> 以及 </em>Serial.println();<em> 语句来向串口观察窗口输出一些字符串信息。例如，使用以下的命令：</em></p>
<p style="padding-left: 30px;">[code=C]<br />Serial.print("The temperature is: ");<br />Serial.print(temperature, 2);<br />Serial.println(" degrees Celsius");<br />[/code]</p>
<p style="padding-left: 30px;"><em>将会在串口观察窗口中生成如下的几行文本 (假设</em>温度<em>为23.73摄氏度)：</em></p>
<p style="padding-left: 60px;">The temperature is 23.73 degrees Celsius</p>
<p style="padding-left: 30px;"><em>同时在行尾还输出了一个换行符。相较于 </em>Serial.print();&nbsp;<em> ，</em>Serial.println(); <em> 多出来的 </em>-ln<em> 则表示在输出文本的最后多输出一个换行符(也就是说，将光标位置设置到下一行的开始)。你是否注意到在前一句的</em>Serial.print();<em>中的数字 </em>2<em> ？你可以指定</em>float<em>类型变量的小数点的位置；或者如果你使用整数，你也可以指定要把整数按照多少进制来显示，例如 DEC, HEX, OCT, BIN, BYTE ——分别表示十进制，十六进制，八进制，二进制，或者字节格式。如果你不指定 </em>Serial.print();<em> 的第二个参数，默认将整数显示成十进制，浮点数则保留两位小数。</em></p>

<p>现在我们来测量温度吧！你所要做的仅仅是把TMP36连接到你的Arduino控制板上。引脚1接5v电源，引脚2接模拟端口0，引脚3接地。这是一张接线的照片：</p>
<p align="center"><strong><a href="http://arduino.osall.com/images/ch02/b_example2point1small.jpg">
<img class="aligncenter size-medium wp-image-394" title="the board layout" src="http://arduino.osall.com/images/ch02/example2point1small.jpg" alt="" height="225" width="300"></a><br />
</strong></p>
<p>以及代码：</p>
<span style="font-style: normal;">[code=C]<br />/*<br />&nbsp;&nbsp;&nbsp; 例子 2.1 - 数字温度计<br />&nbsp;&nbsp;&nbsp; 创建于 14/04/2010<br />&nbsp;&nbsp;&nbsp; 作者 John Boxall <br />&nbsp;&nbsp;&nbsp; http://tronixstuff.wordpress.com<br />&nbsp;&nbsp;&nbsp;  CC by-sa v3.0<br />&nbsp;&nbsp;&nbsp; 使用 Analog Devices 出品的 TMP36 来测量温度并通过串口返回测量结果<br />&nbsp;&nbsp;&nbsp; TMP36 引脚1连接到 Arduino 5V 电源插孔<br />&nbsp;&nbsp;&nbsp; TMP36 引脚2连接到 Arduino 模拟端口0<br />&nbsp;&nbsp;&nbsp; TMP36 引脚3连接到 Arduino GND 插孔<br />*/<br /><br />void setup()<br />{<br />&nbsp;&nbsp;&nbsp; Serial.begin(9600);&nbsp;&nbsp; // 激活串口输入输出<br />}<br /><br />float voltage = 0; // 设置一些变量<br />float sensor = 0;<br />float celsius = 0;<br />float fahrenheit = 0;<br /><br />void loop()<br />{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 开始测量<br />&nbsp;&nbsp;&nbsp; sensor = analogRead(0);<br />&nbsp;&nbsp;&nbsp; voltage = (sensor*5000)/1024; // 将回传值转化成电压值（毫伏）<br />&nbsp;&nbsp;&nbsp; voltage = voltage-500;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 去除偏移电压<br />&nbsp;&nbsp;&nbsp; celsius = voltage/10;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 转化电压值为摄氏度<br />&nbsp;&nbsp;&nbsp; fahrenheit = ((celsius * 1.8)+32); // 转化摄氏度到华氏度<br />&nbsp;&nbsp;&nbsp; Serial.print("Temperature: ");<br />&nbsp;&nbsp;&nbsp; Serial.print(celsius,2);<br />&nbsp;&nbsp;&nbsp; Serial.println(" degrees C");<br />&nbsp;&nbsp;&nbsp; Serial.print("Temperature: ");<br />&nbsp;&nbsp;&nbsp; Serial.print(fahrenheit,2);<br />&nbsp;&nbsp;&nbsp; Serial.println(" degrees F");<br />&nbsp;&nbsp;&nbsp; Serial.println("_ _ _ _ _ _ _ _ _ _ _ _ _ _&nbsp; ");<br />&nbsp;&nbsp;&nbsp; delay (1000); // 等待一秒，否则串口观察窗口刷新太快难以阅读<br />}<br />[/code]<br /><br />
</span>
<div><span style="font-style: normal;">当然还有实验的视频。在实验开始的时候测量的是室温，然后把一个冰袋在TMP36上放了一会，最后用两根手指帮助温度回升……</span></div>
<div><span style="font-style: normal;"><br />
</span></div>

<div style="text-align: center;"><span class="embed-youtube" style="text-align: center; display: block;"><embed src="http://player.youku.com/player.php/sid/XMjg1Nzk2MTU2/v.swf" quality="high" allowscriptaccess="sameDomain" type="application/x-shockwave-flash" align="middle" height="400" width="480"></span></div>
<div><span style="font-style: normal;"><br />
</span></div>
<div style="padding-left: 30px;"><em>注记： </em>while()<em> 语句。有时候你想让你的代码等待用户的输入，或者等待传感器得到一个特定的值才往下执行代码，这时你就可以使用 </em>while()<em> 语句。在 </em>while<em> 语句中的条件表达式成立的情况下，它所包含的代码块将被不停的循环执行。</em></div>

<div style="padding-left: 30px;"><em><br />
</em></div>
<div style="padding-left: 30px;"><em>例如：</em></div>
<div style="padding-left: 30px;"><br />[code=C]<br />while (digitalRead(3) == LOW)<br />{<br />&nbsp;&nbsp;&nbsp; Serial.writeln("Button on digital pin 3 has not been pressed");<br />}<br />[/code]<br />
</div><div style="padding-left: 30px;"><em><br />
</em></div>
<div><span style="font-style: normal;">好了，我们回到下一个练习——该是由你来动手的时间了！</span></div>

<div><strong><em><br />
</em></strong></div>
<div><em>练习 2.1</em></div>
<div><em><br />
</em></div>
<div><span style="font-style: normal;">最近一段时间，能源的成本不停的上升，我们需要尽可能的减少使用加热或
制冷设备来节约能源。不幸的是有些家庭成员常常在不需要的时候也习惯性的打开空调或中央供暖设备，对于是否要打开或关闭取暖/制冷设备也常常会有一些争
执。因此我们最好能有一个坐在休息室里的公正的判定者来告诉我们是否需要使用加热或是制冷设备。</span></div>
<div><span style="font-style: normal;"><br />
</span></div>
<div><span style="font-style: normal;">所以，我们来制造一个设备能够告诉我们什么时候该打开空调、取暖器或者
其他的设备。也许可以考虑使用三个LED或者一个多色LED来作出指示。显示红色打开取暖设备，蓝色打开空调制冷，绿色则代表“现在很舒适，不需要打开任
何设备”。你需要根据自己的情况定义自己的温度判断标准。由于我住在澳大利亚的东北部地区，所以我打算超过28摄氏度时打开空调制冷，在低于15摄氏度时
则打开供暖系统。 </span></div>
<div><span style="font-style: normal;"><br />
</span></div>
<div>希望你能够想起在<a href="http://arduino.osall.com/ch01.html" target="_blank">第一章</a>中我们制作的电压表，我们可以在它的基础上进行改进。如果你想不起来了，可以再回过头复习一下，如果你都了解，那么就跳过，继续往下……</div>

<div>总之，这是我的接线示意图……</div>
<div align="center"><a href="http://arduino.osall.com/images/ch02/b_exercise2point1small.jpg">
<img class="aligncenter size-medium wp-image-407" title="Exercise 2.1 board layout" src="http://arduino.osall.com/images/ch02/exercise2point1small.jpg" alt="" height="225" width="300"></a></div>
<div>你需要：</div>
<div>
<ul>
	<li>标准的Arduino套件(电脑，数据线，<a href="http://www.littlebirdelectronics.com/products/Arduino-Uno.html" target="_blank">Uno</a> 或者 <a href="http://www.littlebirdelectronics.com/products/Freetronics-TwentyTen.html" target="_blank">兼容的 Arduino 控制板</a>)</li>
	<li>三颗LED或者一颗<a href="http://www.littlebirdelectronics.com/products/Triple-Output-LED-RGB-%252d-Diffused.html" target="_blank">七彩RGB</a> LED</li>
	<li>三个 560欧姆 0.25瓦 的电阻。用于限制电流来保护LED。</li>
	<li>一块<a href="http://www.littlebirdelectronics.com/products/Basic-Breadboard.html" target="_blank">面包板</a>和一些<a href="http://www.littlebirdelectronics.com/products/Jumper-Wires-Premium-6%22-M%7B47%7DM-Pack-of-10.html" target="_blank">导线</a>。</li>
	<li>一台相机(可选)——来记录实验过程。</li>
</ul>
</div>
<div>这个练习的代码如下: (<a href="https://sites.google.com/site/tronixstuff/home/arduino-tutorial-series-files/exercise2point1.pde" target="_blank">下载</a>)</div>
<pre style="padding-left: 60px;">[code=C]<br />/*<br />&nbsp;&nbsp;&nbsp; 练习 2.1 - 温度控制判定器<br />&nbsp;&nbsp;&nbsp; 创建于 14/04/2010<br />&nbsp;&nbsp;&nbsp; 作者 John Boxall <br />&nbsp;&nbsp;&nbsp; http://tronixstuff.wordpress.com<br />&nbsp;&nbsp;&nbsp; CC by-sa v3.0 Share the love!<br />&nbsp;&nbsp;&nbsp; 使用 Analog Devices 出品的 TMP36 来测量温度并根据设定的条件来决定是否使用取暖器或空调<br />*/<br /><br />int redLED = 13; // 定义数字端口和LED颜色的对应关系<br />int greenLED = 12;<br />int blueLED = 11;<br /><br />float voltage = 0; // 初始化温度检测所需要的变量<br />float sensor = 0;<br />float celsius = 0;<br /><br />float heaterOn = 15; // 如果温度低于该值，打开取暖器<br />float airconOn = 26; // 如果温度高于该值，打开空调<br /><br />void setup()<br />{<br />	pinMode(redLED, OUTPUT);    // 将数字端口设置成输出模式<br />	pinMode(greenLED, OUTPUT);  // 模拟端口不需要类似的设定<br />	pinMode(blueLED, OUTPUT);<br />}<br /><br />void loop()<br />{<br />	digitalWrite(redLED, LOW);    // 关闭LED<br />	digitalWrite(greenLED, LOW);<br />	digitalWrite(blueLED, LOW);<br />	<br />	// 读取温度传感器并把结果转换为摄氏度<br />	sensor = analogRead(0);       // TMP36传感器的输出引脚连接到了Arduino的模拟端口0<br />	voltage = (sensor*5000)/1024; // 将原始数据转化成电压（单位毫伏）<br />	voltage = voltage-500;        // 去除偏移电压<br />	celsius = voltage/10;         // 将电压转换到对应的摄氏度温度<br />	<br />	// 现在判断是否太热或太冷<br />	if (celsius&gt;=airconOn)<br />	{<br />		digitalWrite(blueLED, HIGH); // 打开空调<br />	} else if (celsius&lt;=heaterOn)<br />	{<br />		digitalWrite(redLED, HIGH);<br />	} else<br />	{<br />		digitalWrite(greenLED, HIGH); // 非常舒适<br />	}<br />	<br />	delay(1000); // 等待非常有必要，否则代码运行太快，LED不能在关闭前及时点亮<br />}<br />[/code]</pre>
<div>当然还有视频。为了演示，我将判断标准的值设定的非常接近，这样就能方便的演示LED的变化。视频中的塑料袋里装满了冰水。</div>

<div style="text-align: center;"><strong><span class="embed-youtube" style="text-align: center; display: block;"><embed src="http://player.youku.com/player.php/sid/XMjg1Nzk2Njky/v.swf" quality="high" allowscriptaccess="sameDomain" type="application/x-shockwave-flash" align="middle" height="400" width="480"></span></strong></div>

<div><strong><br />
</strong></div>
<div>那的确非常有趣，我希望你能够乐在其中并且想出一些使用温度传感器的新点子。不过现在我们得先来学习一两个Arduino函数库……</div>

<div style="padding-left: 30px;"><em>注记：你已经知道，Processing语言中提供了一些基本语句来控制
Arduino和它的逻辑。然而随着时间的推移，有些爱好者编写出一些能够给其他用户使用的新的命令语句。他们编写了一些程序，能够让Atmel的微控制
器解释新的命令。这些命令就被包含在函数库中。此外，由于 Arduino 
是开放源代码的，所以你能够自己编写自己的函数库然后向全世界发布（或者只留给自己使用……）。在 Arduino IDE 软件中，查看一下 </em>Sketch&gt;&gt;Import Library… <em> 菜单选项，或者查看 <a href="http://arduino.cc/en/Reference/Libraries" target="_blank">这里</a> 来获取更多的函数库！好好的使用它吧……</em></div>
<div style="padding-left: 30px;"><em><br />

</em></div>
<div><em><span style="font-style: normal;">现在该来看看液晶显示屏了！(终于……)</span></em></div>
<div><em><span style="font-style: normal;"><br />
</span></em></div>
<div><em><span style="font-style: normal;">如同你所注意到的，现在到处都是LCD，几乎所有的电子产品都
需要用户输入或信息显示的装置。你现在就应该正盯着一块巨大的液晶显示屏看着呢！但是对于一般的电子爱好者而言，LCD用起来少少有一些难度。不过现
在，Arduino使得在你的项目中使用不同样式的LCD变得非常的简单。</span></em></div>
<div><em><span style="font-style: normal;"><br />
</span></em></div>
<div><strong>更新 —— 现在在 <a href="http://arduino.osall.com/ch24.html" target="_blank">第二十四章</a>详细的介绍了LCD。不过你也别忘了回到并继续完成本章的内容！</strong></div>
<div><em><span style="font-style: normal;"><br />
</span></em></div>
<div>好了，让我们休息一下。不过等你回来的时候，我们就要……</div>


<div><em>练习 2.2</em></div>
<div><em><br />
</em></div>
<div>这是到现在为止最复杂的一个项目，不过请不要放弃。你已经学习过并且也实践过在这个练习中所需要的命令和硬件了。你只需要一点想象力和花一些时
间来完成。你的任务是创建一个电子温度计，使用LCD来输出结果。除了显示当前的温度以外，它还能记录并显示最低和最高温度——这些记录都能被重置。此
外，电子温度计能够同时支持摄氏度和华氏度。</div>
<div>首先请不要去担心硬件或者代码。先想一下操作的流程，你想要它怎样工作？在开始阶段，它需要从TMP36传感器不时的读取温度信息，这个你已经
你能够实现了。每一个读数都会与最低和最高温度进行比较，这就需要加入一些判断和基础的数学运算，这你也能做到。用户需要按下一些按钮来显示或者重置记录
的数据，你也能实现——只是在数字输入为高电平时做一些动作罢了。剩下的就由你来完成了。</div>
<div><strong><span style="font-weight: normal;">所以，开始吧！</span></strong></div>
<div>
<p><strong><span style="font-weight: normal;"> </span></strong>你需要 (这可能会根据你的设计而有所不同，不过这是我们所用的)：</p>

<div>
<ul>
	<li>你的Arduino标准套件 (电脑，数据线，<a href="http://www.littlebirdelectronics.com/products/Arduino-Uno.html" target="_blank">Uno</a> 或者 <a href="http://www.littlebirdelectronics.com/products/Freetronics-TwentyTen.html" target="_blank">兼容的Arduino控制板</a>)。</li>
	<li>水 (你需要保持补充水分)。</li>
	<li>两个 10k欧 0.25瓦 的电阻。用来制作Arduino使用的按钮。</li>
	<li>Analog Devices 出品的 TMP36 温度传感器 (element-14商店的产品号/part number <a href="http://au.element14.com/analog-devices/tmp36gt9z/ic-sensor-temp-to-92-3/dp/1438760" target="_blank">143-8760</a>)。</li>
	<li>两个小的<a href="http://www.littlebirdelectronics.com/products/Mini-Push-Button-Switch.html" target="_blank">按钮开关</a>。</li>
	<li>一块<a href="http://www.littlebirdelectronics.com/products/Basic-Breadboard.html" target="_blank">面包板</a> 和一些 <a href="http://www.littlebirdelectronics.com/products/Jumper-Wires-Premium-6%22-M%7B47%7DM-Pack-of-10.html" target="_blank">导线</a>。</li>
	<li>16*2 字符的 <a href="http://www.littlebirdelectronics.com/products/20x4-Character-LCD-with-LED-Backlight-%28Parallel-Interface%29.html" target="_blank">LCD模块</a>（译者注：1602液晶显示模块，淘宝有很多，10元人民币左右）以及一个10k的线性电位器/可变电阻 (用来调节LCD的对比度)</li>
	<li>一台相机 (可选) ——用来记录你成功的实验！</li>
</ul>

</div>
<p>为了启发你的灵感，这是我的布线的示意图：</p>
</div>
<div><strong><span style="font-weight: normal;"><br />
</span></strong></div>
<div align="center"><strong><a href="http://arduino.osall.com/images/ch02/b_ex2p2boardsmall.jpg">
<img class="aligncenter size-medium wp-image-418" title="Exercise 2.2 example board" src="http://arduino.osall.com/images/ch02/ex2p2boardsmall.jpg" alt="" height="300" width="225"></a><br />
</strong></div>
<div><strong><br />
</strong></div>
<p>以及数字温度计实验的视频录像：</p>
<p style="text-align: center;"><strong><span class="embed-youtube" style="text-align: center; display: block;"><embed src="http://player.youku.com/player.php/sid/XMjg1Nzk3Nzc2/v.swf" quality="high" allowscriptaccess="sameDomain" type="application/x-shockwave-flash" align="middle" height="400" width="480"></span></strong></p>

<p>这是我的代码的样例 —— <span style="color: rgb(0, 0, 0);"><a href="https://sites.google.com/site/tronixstuff/home/arduino-tutorial-series-files/exercise2p2.pde" target="_blank">练习 2.2 代码样例</a></span></p>
<div style="text-align: center;"><strong>哇！恭喜所有参与学习的以及</strong><em><strong>成功创造出一些东西</strong></em>的朋友们！</div>
<div><em><strong><br />
</strong></em></div>
<div style="text-align: center;"><em>我们要把更诚挚的祝贺送给我们的读者，就像 Randall 那样成功的创造了自己的“乐透数字生成器”(<a href="http://5volthotsauce.blogspot.com/2010/09/try-your-luck-with-lotto.html" target="_blank">看这里</a>)的读者们！ </em></div>
<div style="text-align: center;"><em><br />
</em></div>
<div align="center"><em><strong><a href="http://arduino.osall.com/images/ch02/b_pinsborder.jpg">
<img class="aligncenter size-medium wp-image-3598" src="http://arduino.osall.com/images/ch02/pinsborder.jpg" alt="" height="33" width="300"></a></strong></em></div>
<div><em><strong><br />

</strong> </em></div>

<div>您可以订阅或者在<a href="http://twitter.com/tronixstuff" target="_blank">twitter上关注我</a>来接收教程的更新通知。如果你有任何问题，可以在下面给我留言。如果你想给大家分享你的关于这篇文章的作品，请把你的照片给我email过来(john at tronixstuff dot com)。你也许会得到我们的奖品哦。</div>
<div>
<p style="text-align:center;">不要忘记在<a href="http://littlebirdelectronics.com/collections/arduino" target="_blank">Little Bird Electronics</a>有非常酷和有趣的Arduino套件。</p>
<p style="text-align:center;">那么，期待在 <strong><a href="http://arduino.osall.com/ch03.html" target="_self">下一个实验</a></strong>中再次和你相遇！</p>

<hr><strong>
在本教程中的所有材料，除非特别指出的，都基于 <a href="http://creativecommons.org/licenses/by-nc-sa/3.0/deed.zh_HK" target="_blank">Commons 的 姓名标示-非商业性-相同方式分享 v3.0 许可证</a>发
布。如果需要转发本作品，请按照相同的许可证发布，并注意发布页面不得有商业广告（包括但不限于Google 
Adsense等）。如果你想在其他场合使用本作品，请发邮件给 原作者 john (at) tronixstuff dot com 以及中文化作者
 wellswang (at) osall dot com 取得联系。我们非常欢迎任何的回馈、留言以及建设性的意见！
</strong><hr>

<p style="padding-left:30px;">
</p>
		</div>
                <p class="meta">

               		<span class="date">
                                        原文撰写时间：<a href="http://tronixstuff.wordpress.com/2010/04/15/">April 15, 2010</a> <br />
										翻译时间：2011年7月21日
                  </span>

             		</p>

              </div>]]></description>
         <category>Arduino</category>
         <pubDate>Fri, 22 Jul 2011 00:11:59 +0900</pubDate>
      </item>
      <item>
         <title>电工笔记 - 第一章 - for / if...else和模拟输入</title>
         <link>http://wells.osall.com/blog/index.php?m=content&amp;p=1561&amp;uid=1</link>
         <description><![CDATA[<div>
<h2>开始 Arduino 之旅!&nbsp;–&nbsp;第一章</h2>
<hr>
<p>
	原文作者：John Boxall (john at tronixstuff dot com)<br />
	中文翻译：Wells Wang (wellswang at osall dot com) <br />
	原文地址：<a href="http://tronixstuff.wordpress.com/2010/04/10/getting-started-with-arduino-chapter-one/">http://tronixstuff.wordpress.com/2010/04/10/getting-started-with-arduino-chapter-one/</a><br />
	中文版地址：<a href="http://arduino.osall.com/ch01.html">http://arduino.osall.com/ch01.html</a>
	</p>
<hr>

                <p><strong>[请注意从2010年11月1日起.教程中的文件可以在<a href="https://sites.google.com/site/tronixstuff/" target="_blank">这里</a>下载]</strong></p>
<p>这是关于Arduino单片机的“开始 Arduino 之旅!”系列教程中的一篇，请作为Massimo Banzi的“<a href="http://www.littlebirdelectronics.com/products/Getting-Started-with-Arduino.html" target="_blank">Getting Started with Arduino</a>”一书的补充材料一起阅读。 <a href="http://arduino.osall.com/ch00.html" target="_self"><strong>这里是前一篇教程</strong></a><strong>。</strong></p>

<p><em><strong>Arduino的爱好者们，欢迎回来！</strong></em></p>
<p>希望大家能够享受<a href="http://www.littlebirdelectronics.com/products/Getting-Started-with-Arduino.html" target="_blank">Massimo的书</a>和
新学来的关于Arduino系统的技术所带来的乐趣。现在有许多非常有趣的任务要在这周完成：读完书的第四和第五章，其中有着一些重要的关于电子技术的信
息；我们还要学习一些新的Arduino语言的语句，这些新的命令能够节省你的时间和Arduino的内部存储空间；再看一下脉宽调制技术；随机函数；
接收模拟输入信号；条件判断语句；最后——完成一个练习项目来验证你所学到的知识。</p>
<p>首先，请继续从第38页一直阅读到第四章结束。其中包含了一些如何处理“弹跳开关(switch-bounce)”的不错的方法，这将在以后非常有用。我们稍后见！</p>
<p><em>欢迎回来。</em></p>
<p>让我们回顾一下上一课程中的练习代码，其中有许多重复的指令来按照顺序控制每个LED的开关，例如：</p>
[code=C]<br />digitalWrite(2, HIGH);&nbsp;&nbsp; // 打开连接在端口2上的LED<br />delay(del);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 等待 (等待的时间由变量'del'决定)<br />digitalWrite(2, LOW);&nbsp;&nbsp;&nbsp; // 关闭LED<br /><br />digitalWrite(3, HIGH);&nbsp;&nbsp; // 打开连接在端口3上的LED<br />delay(del);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 等待<br />digitalWrite(3, LOW);&nbsp;&nbsp;&nbsp; // 关闭LED<br /><br />digitalWrite(4, HIGH);&nbsp;&nbsp; // 打开连接在端口4上的LED<br />delay(del);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 等待<br />digitalWrite(4, LOW);&nbsp;&nbsp;&nbsp; // 关闭LED<br /><br />digitalWrite(5, HIGH);&nbsp;&nbsp; // 打开连接在端口5上的LED<br />delay(del);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 等待<br />digitalWrite(5, LOW);&nbsp;&nbsp;&nbsp; // 关闭LED<br /><br />digitalWrite(6, HIGH);&nbsp;&nbsp; // 打开连接在端口6上的LED<br />delay(del);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 等待<br />digitalWrite(6, LOW);&nbsp;&nbsp;&nbsp; // 关闭LED<br /><br />digitalWrite(7, HIGH);&nbsp;&nbsp; // 打开连接在端口7上的LED<br />delay(del);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 等待<br />digitalWrite(7, LOW);&nbsp;&nbsp;&nbsp; // 关闭LED<br /><br />digitalWrite(8, HIGH);&nbsp;&nbsp; // 打开连接在端口8上的LED<br />delay(del);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 等待<br />digitalWrite(8, LOW);&nbsp;&nbsp;&nbsp; // 关闭LED<br /><br />digitalWrite(9, HIGH);&nbsp;&nbsp; // 打开连接在端口9上的LED<br />delay(del);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 等待<br />digitalWrite(9, LOW);&nbsp;&nbsp;&nbsp; // 关闭LED<br />[/code]<br /><br />这看起来非常啰嗦并且还浪费了时间——这些都与Arduino存在的目的而相违背！不过，我们可以使用 <em>for </em>循环语句来解决这个问题。<em>for</em> 语句的目的是根据指定的次数(当然这个<em>次数</em>必须是一个整数——你不可能重复执行一个循环3.141次！)来重复执行一段代码.

<p>下面是一个非常简单的例子，能让第9端口上的LED闪烁五次：(<a href="https://sites.google.com/site/tronixstuff/home/arduino-tutorial-series-files/example1point1.pde" target="_blank">下载代码</a>)</p>
[code=C]<br />/* 例子 1.1 – 使用 ‘for’循环<br />Created 02/04/2010 ---&nbsp; CC by-sa v3.0 Share the love!<br />By John Boxall --- http://tronixstuff.wordpress.com<br />闪烁数字端口9上的LED五次……<br />代码基于 H. Barragan 为 Wiring i/o 板设计的程序开发<br />*/<br /><br />void setup()<br />{<br />&nbsp;&nbsp;&nbsp; pinMode(9, OUTPUT);&nbsp;&nbsp;&nbsp;&nbsp; // 初始化数字端口9为输出端口<br />}<br /><br />void loop()<br />{<br />&nbsp;&nbsp;&nbsp; for (int wow = 1; wow &lt;= 5;&nbsp; wow++)<br />&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; digitalWrite(9, HIGH); // 打开连接在端口9上的LED<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; delay(1000);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 等待一段时间<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; digitalWrite(9, LOW); // 关闭连接在端口9上的LED<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; delay(1000);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 等待一段时间<br />&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; delay(10000); // 等待10秒，然后整段代码会被重新执行<br />}<br />[/code]<br /><br />这里面究竟发生了什么：
<ul>
	<li>整数变量 “wow” 的值被赋为1</li>
	<li>循环段中的代码被执行</li>
	<li>代码检查 “wow”的值是否小于或等于5，如果成立则“wow”的值加上1，否则退出循环</li>
</ul>
<p>你也可以使用“wow--”来把wow的值减去1，或者用在其他变量上。不管怎样，如果 wow 小于等于5，循环还继续；如果大于5，则跳出循环执行下面的代码。</p>

<p>希望你现在就明白如何使用这个语句来简化上一课程中的练习0.1的代码。还没理解？那我们就试着改一下。那一大段控制LED按照一定顺序开关的代码都可以用两个循环来取代——一个循环控制从2到9号端口依次开关，另一个循环控制从8到3号端口依次开关。</p>
<p>你了解了吗？下面是我们的代码： (<a href="https://sites.google.com/site/tronixstuff/home/arduino-tutorial-series-files/exercise1point1_pde.pde" target="_blank">下载</a>)</p>
[code=C]<br />/*<br />练习 1.1 - 在练习0.1中使用 'for' 循环<br />创建于 02/04/2010 ---&nbsp; CC by-sa v3.0 Share the love! - 作者 John Boxall --- http://tronixstuff.wordpress.com<br />代码基于 H. Barragan 为 Wiring i/o 板设计的程序开发<br />*/<br /><br />int del=1000; // 设置默认的延时时间，1000毫秒 (一秒)<br /><br />void setup()<br />{<br />&nbsp;&nbsp;&nbsp; // 将数字端口初始化为输出端口<br />&nbsp;&nbsp;&nbsp; for (int i = 2; i&lt;=9 ; i++)<br />&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; pinMode(i, OUTPUT);<br />&nbsp;&nbsp;&nbsp; } // 循环结束<br />} // setup方法结束<br /><br />void loop()<br />{<br />&nbsp;&nbsp;&nbsp; for (int i = 2; i&lt;=9; i++) // 从 2 到 9 端口闪烁LED<br />&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; digitalWrite(i, HIGH);<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; delay(del);<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; digitalWrite(i, LOW);<br />&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; for (int i = 8; i&gt;=3; i--) // 从 8 到 3 端口闪烁LED<br />&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; digitalWrite(i, HIGH);<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; delay(del);<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; digitalWrite(i, LOW);<br />&nbsp;&nbsp;&nbsp; }<br />}<br />[/code]<br /><br />好了，是不是代码比以前好多了？那些 <em>for</em> 循环节省了我们不少的时间，同时变量的使用也使得今后修改代码变得更加方便，不用再到代码中去寻找每一个值了。太棒了！
<p>接下来让我们快速的看一下：</p>

<p><span style="color: rgb(51, 51, 51);"><span style="font-family: tahoma,verdana,sans-serif;">嘿，你需要随机整数吗？简单！</span></span></p>
<p><span style="color: rgb(51, 51, 51);"><span style="font-family: tahoma,verdana,sans-serif;"><em>random(x) </em>返回一个 0 到 x-1 之间的随机整数。例如，如果你需要一个在0到255之间的随机数，就可以使用 <em>random(256)</em>
 来获得。然而，使用 random() 函数生成的并不是真正彻底的随机数，你需要先使用 randomSeed(analogRead(0))函数在Arduino芯片中生成一个随机数种子，除了模拟端口0以外你也可以使用任何一个没有使用的模拟端口。在random()函数中，你也可以指定一个范围，例如 random(10,20) 会生成 10 到 19 之间的一个随机整数(下限10包含在内，上限20则除外——这也是为什么返回值是10～19的原因)。</span></span></p>
<p>下一个主题是 <em>脉宽调制(PWM)</em>。我们不需要重新发明车轮，所以，请阅读<a href="http://www.littlebirdelectronics.com/products/Getting-Started-with-Arduino.html" target="_blank">书本</a>的第五章，直到第62页末尾。</p>

<p>现在，你已经模拟了风靡大众的智能汽车了，是时候用PWM和色彩来创造点新的乐趣了。Massimo提到使用红色、绿色和蓝色的LED来创造光谱中的任何一个颜色。这可以非常方便的用Arduino来实现（像许多其它事情一样）！你还记得你在学校的美术课上学到的东西吗？红色+黄色=橙色、红色+绿色=蓝色，等等。你不但能够用LED来做到同样的效果，还能显示颜色的不同的亮度等级来创造出整个色谱。</p>
<p>首先，我们要看一下怎样使用三原色来创造出各种各样的颜色的。这个例子简单的演示了使用红、绿、蓝灯光来创造颜色的可能性。</p>
<p>你需要：</p>
<ul>
	<li>标准的Arduino套件(电脑、数据线、<a href="http://www.littlebirdelectronics.com/products/Arduino-Uno.html" target="_blank">Uno</a>或者<a href="http://www.littlebirdelectronics.com/products/Freetronics-TwentyTen.html" target="_blank">兼容的</a>Arduino控制板)</li>
	<li>一个<em><a href="http://www.littlebirdelectronics.com/products/triple-output-led-rgb-diffused-1pcs" target="_blank">雾状</a></em> (不透明)的红绿蓝（七彩）发光二极管。雾状的LED会像灯泡一样发光，聚光透明的那种会像一个5mm的光点。</li>
	<li>两个 50欧姆 0.25瓦 的电阻。被用来限制电流，保护绿色和蓝色的LED部分。</li>
	<li>一个 150欧姆 0.25瓦 的电阻。被用来限制电流，保护红色的LED部分。</li>
	<li>一块<a href="http://www.littlebirdelectronics.com/products/Basic-Breadboard.html" target="_blank">面包板</a>以及一些<a href="http://www.littlebirdelectronics.com/products/Jumper-Wires-Premium-6%22-M%7B47%7DM-Pack-of-10.html" target="_blank">导线</a></li>
	<li>一台相机(可选)——用来记录实验的过程！</li>
</ul>
<p>电路非常简单，不过LED的引脚比较难区分。这里是LED引脚布局的说明：</p>
<p><a href="http://arduino.osall.com/images/ch01/b_rgbdata.jpg">
<img class="aligncenter size-medium wp-image-295" title="RGB led pinout" src="http://arduino.osall.com/images/ch01/rgbdata.jpg" alt="" height="300" width="297"></a></p>

<p>电阻被放在PWM输出端口到LED正极之间。下面是布局示意图：</p>
<p><a href="http://arduino.osall.com/images/ch01/b_example1point2small.jpg">
<img class="aligncenter size-medium wp-image-296" title="Example 1.2" src="http://arduino.osall.com/images/ch01/example1point2small.jpg" alt="" height="225" width="300"></a></p>
<p>下面是程序，呃……代码：(<a href="https://sites.google.com/site/tronixstuff/home/arduino-tutorial-series-files/example1point2.pde" target="_blank">下载</a>)</p>
[code=C]<br />/*<br />例子 1.2 - 好玩的 PWM 和 RGB LED -&nbsp; 创建于 07/04/2010 ---&nbsp; CC by-sa v3.0 Share the love!<br />作者 John Boxall --- http://tronixstuff.wordpress.com<br />*/<br /><br />int red = 11; // LED所使用的端口<br />int green = 9;<br />int blue = 10;<br /><br />int i = 0; // 循环使用<br />int j = 0;<br /><br />void setup()<br />{<br />&nbsp;&nbsp;&nbsp; pinMode(red, OUTPUT); // 初始化为输出端口<br />&nbsp;&nbsp;&nbsp; pinMode(green, OUTPUT);<br />&nbsp;&nbsp;&nbsp; pinMode(blue, OUTPUT);<br />}<br /><br />void loop()<br />{<br />&nbsp;&nbsp;&nbsp; for (j = 1; j &lt; 6; j++)<br />&nbsp;&nbsp;&nbsp; {&nbsp; // 循环五次<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; for (i = 0; i &lt; 255; i++)<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; { // 从0到254循环(渐入)<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; analogWrite(red, i);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 设置LED的亮度<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; delay(20); // 等待20毫秒，因为模拟写入(analogWrite)不是立刻生效的<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; analogWrite(red,0);<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; delay (20);<br /><br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; for (i = 0; i &lt; 255; i++)<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; { // 从0到254循环(渐入)<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; analogWrite(green, i);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 设置LED的亮度<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; delay(20); // 等待20毫秒，因为模拟写入(analogWrite)不是立刻生效的<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; analogWrite(green,0);<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; delay (20);<br /><br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; for (i = 0; i &lt; 255; i++)<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; { // 从0到254循环(渐入)<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; analogWrite(blue, i);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 设置LED的亮度<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; delay(20); // 等待20毫秒，因为模拟写入(analogWrite)不是立刻生效的<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; analogWrite(blue,0);<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; delay (20);<br />&nbsp;&nbsp;&nbsp; }<br /><br />&nbsp;&nbsp;&nbsp; // 魔幻时间～<br />&nbsp;&nbsp;&nbsp; for (j = 1; j &lt; 10000; j++)<br />&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; analogWrite(red,random(255)); // 在0到254之间随机设定红色的亮度<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; delay (random(10,31));&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 随机设定10到30毫秒的等待时间<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; analogWrite(green,random(255));<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; delay (random(10,31));<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; analogWrite(blue,random(255));<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; delay (random(10,31));<br />&nbsp;&nbsp;&nbsp; }<br />}<br />[/code]<br /><br />下面是实验的视频录像，多么迷人的颜色呀！

<p style="text-align: center;"><span class="embed-youtube" style="text-align: center; display: block;"><embed src="http://player.youku.com/player.php/sid/XMjg1NzkyMzc2/v.swf" quality="'high'" allowscriptaccess="'sameDomain'" type="'application/x-shockwave-flash'" align="'middle'" height="'400'" width="'480'"></span></p>
<p>好玩吗？我希望我写的这些能给你带来学习的乐趣。</p>
<p>不过也别老是盯着LED看了……我们要继续学习模拟传感器了！继续阅读 <a href="http://www.littlebirdelectronics.com/products/Getting-Started-with-Arduino.html">书本</a>直到第69页结束。</p>
<p>现在要学一些完全不同的东西，新的语句： <em>if…else</em></p>
<p>你的代码常常需要做出一些决定：开关被打开了吗？还是关着？如果变量 ph 的值等于 8657309 我就需要把这个数字传给GSM模块并拨打这个号码！我们又要再说一次，用Arduino来实现这个将是非常简单方便的！ 
<img src="http://arduino.osall.com/images/icon_smile.gif" alt=":)" class="wp-smiley"> </p>

<p>例子：如果<em>温度</em>的值大于100，关闭端口13，否则打开。</p>
[code=C]<br />if ( temperature &gt; 100 )<br />{<br />&nbsp;&nbsp;&nbsp; digitalWrite(13, LOW); // 关闭电水壶<br />}<br />else<br />{<br />&nbsp;&nbsp;&nbsp; digitalWrite(13, HIGH); // 水壶保持通电<br />}<br />[/code]<br /><br />你还可以用else if…语句来进行扩展。
<p>例子：如果温度超过100度，关闭端口13；否则如果湿度大于80，打开端口7。</p>
[code=C]<br />if ( temperature &gt; 100 )<br />{<br />&nbsp;&nbsp;&nbsp; digitalWrite(13, LOW); // 关闭电水壶<br />}<br />else if (humidity &gt; 80 )<br />{<br />&nbsp;&nbsp;&nbsp; digitalWrite(7, HIGH); // 打开端口7<br />}<br />[/code]<br /><br />在 <em>if…else</em> 语句中，你可以选择使用六种比较运算符：

<ul>
	<li>== 	等于</li>
	<li>&gt; 	大于</li>
	<li>&lt; 	小于</li>
	<li>&gt;= 	大于等于</li>
	<li>&lt;= 	小于等于</li>
	<li>!= 	不等于</li>
</ul>
<p>现在你可以去休息一下，呼吸一下新鲜空气。因为接下来就是……</p>

<p><em>练习 1.1</em></p>
<p>现在我们要把目前所学到的所有东西都放在一块儿，模拟输入、数字输出、许多LED……我们要做一个电压表！想象一下10个LED组成的条状指示灯，
每一个LED代表一段电压范围。整个电压表的测量范围是0到10V的直流电——这样我们可以使用它在电池丢弃前测试一下电池还剩多少电量。</p>
<p>听上去非常复杂(代码，电池)，但是当我们把它分解成许多小任务后，就变得简单多了。我们一起来想一下……</p>
<p>我们知道 <em>analogRead() </em> 能够测量0到5伏之间的电压，并根据测量值返回0到1023之间的数值。嗯，但是我们想要测量最大10伏的电压。简单——我们可以使用分压电阻。(需要回忆一下？ <a href="http://tronixstuff.files.wordpress.com/2010/03/27/dividing-voltage-with-resistors/" target="_blank">请看这篇文章</a>)。使用两个相等阻值的电阻来进行分压(例如 560 欧姆 0.25 瓦)。</p>
<p>下一步，我们要把 <em>analogRead() </em>传回的数值转换成用LED来表示。我们知道它会传回0到1023的数值。在我们的例子中，它表示0～10伏。因此每个LED可以表示最大读数的十分之一。所以当<em>analogRead() </em>返回 0 到 102.3 (实际上应该是 102，因为返回值是整数，而不是浮点数)时，第一个LED就会亮起，第二个LED则在 <em>analogRead()</em> 返回 103 到 205 时亮起。以此类推。</p>

<p>现在，剩下的就变得非常简单了……在代码中使用新学到的判断来决定哪一个LED需要亮起(当然也别忘了需要把它熄灭)。开始去做吧……</p>
<p><em>你需要：</em></p>
<ul>
	<li>标准的Arduino套件</li>
	<li>你自己选的<a href="http://www.littlebirdelectronics.com/products/assorted-led-pack-pack-of-100" target="_blank">十颗LED</a>。标准的就挺好的，不过也可以试试看各种颜色混合的？</li>
	<li>三个 560欧姆 0.25瓦 的电阻。一个被用来限制电流保护LED，另外两个被做成分压电阻。</li>
	<li>一个 10k欧 0.25瓦 的电阻。用来接在模拟输入端。</li>
	<li>一块<a href="http://www.littlebirdelectronics.com/products/Basic-Breadboard.html" target="_blank">面包板</a>和一些<a href="http://www.littlebirdelectronics.com/products/Jumper-Wires-Premium-6%22-M%7B47%7DM-Pack-of-10.html" target="_blank">导线</a>。</li>
	<li>一台相机(可选)——用来记录实验的过程！</li>
</ul>
<p><span style="color: rgb(51, 51, 51); font-family: tahoma,verdana,sans-serif;">下面是电路示意图：</span></p>
<p style="text-align: center;"><a href="http://arduino.osall.com/images/ch01/b_exer1p1.jpg">
<img class="aligncenter size-medium wp-image-4174" title="click to enlarge" src="http://arduino.osall.com/images/ch01/exer1p1.jpg" alt="" height="153" width="300"></a></p>

<p style="text-align: center;"><span style="color: rgb(51, 51, 51); font-family: tahoma,verdana,sans-serif;">这是真实的接线照片：</span></p>
<p align="center"><a href="http://arduino.osall.com/images/ch01/b_ex1point1_small.jpg">
<img class="aligncenter size-medium wp-image-298" title="Exercise 1.1 board layout" src="http://arduino.osall.com/images/ch01/ex1point1_small.jpg" alt="" height="225" width="300"></a></p>
<p>……以及实验的视频！在测试时，我们使用了可变电源来输出变化的电压到我们做的电压表上……</p>
<p style="text-align: center;"><span class="embed-youtube" style="text-align: center; display: block;"><embed src="http://player.youku.com/player.php/sid/XMjg1Nzk1MDAw/v.swf" quality="'high'" allowscriptaccess="'sameDomain'" type="'application/x-shockwave-flash'" align="'middle'" height="'400'" width="'480'">
</span></p>

<p>不过因为电阻的误差以及其它因为使用面包板导致的模拟电路的问题，我们的电压表还有一些偏差。所以就像一些精密仪器那样，我们需要对电压表做一些校准。可以有两种方法来实现：</p>
<ul>
	<li>在分压电路放一个可变电阻。然后提供一个已知的准确的电源，例如LM7805稳压芯片提供的5V电源，然后慢慢调整可变电阻直到第五个LED常亮；</li>
</ul>
<ul>
	<li>用另一个电压表 (例如，一个 <a href="http://www.littlebirdelectronics.com/products/Digital-Multimeter.html" target="_blank">万用表</a>)
 来一起测量输入的要我们的电压表测量的电压； 使用 serial.begin 和 serial.println() 函数 (在书本的第 69 
页)在屏幕上打印出电压所对应的值。调整需要测试的电压直到正好是 1V、2V……10V ——记下串口输出的值，让后将这些值替换进代码中的 
if…then 判断决策树中，来决定哪个LED需要亮起。</li>
</ul>
<p>第二种方法更加准确也更容易实现，所以我增加了串口部分的代码到样例的代码中。</p>
<p>下面是一段使用第二种方法校准后的测试视频：</p>
<p style="text-align: center;"><span class="embed-youtube" style="text-align: center; display: block;">
<embed src="http://player.youku.com/player.php/sid/XMjg1NzkzODky/v.swf" quality="'high'" allowscriptaccess="'sameDomain'" type="'application/x-shockwave-flash'" align="'middle'" height="'400'" width="'480'">
</span></p>

<p>怎么样？你成功了吗？如果没有也没关系，你可以通过修正错误来加深学习。记住 - 如果你有任何问题，都可以在文章最后的留言栏内提出，我会进行回答。不过为了节省你的时间，这里提供了现成的<a href="https://sites.google.com/site/tronixstuff/home/arduino-tutorial-series-files/exercise1point1_pde.pde" target="_blank">代码</a>.</p>
<p style="padding-left: 60px; text-align: center;"><a href="http://arduino.osall.com/images/ch01/b_ledborder1.jpg">
<img class="aligncenter size-medium wp-image-1878" title="ledborder1" src="http://arduino.osall.com/images/ch01/ledborder1.jpg" alt="" height="52" width="300"></a></p>
<p>好了，完成了。今天你又学到了许多对于学习Arduino来说非常有用的东西。</p>
<p>请订阅本站来获得文章更新的通知。如果你有任何问题请在下面留言。如果你愿意分享你根据在这篇文章中学到的知识作出的作品，请把照片或链接发送给 john at tronixstuff dot com。你也许能得到奖品呢。</p>
<p style="text-align:center;">不要忘记在<a href="http://littlebirdelectronics.com/collections/arduino" target="_blank">Little Bird Electronics</a>有非常酷和有趣的Arduino套件。</p>
<p style="text-align:center;">那么，期待在 <strong><a href="http://arduino.osall.com/ch02.html" target="_self">下一个实验</a></strong>中再次和你相遇！</p>

<hr><strong>
在本教程中的所有材料，除非特别指出的，都基于 <a href="http://creativecommons.org/licenses/by-nc-sa/3.0/deed.zh_HK" target="_blank">Commons 的 姓名标示-非商业性-相同方式分享 v3.0 许可证</a>发
布。如果需要转发本作品，请按照相同的许可证发布，并注意发布页面不得有商业广告（包括但不限于Google 
Adsense等）。如果你想在其他场合使用本作品，请发邮件给 原作者 john (at) tronixstuff dot com 以及中文化作者
 wellswang (at) osall dot com 取得联系。我们非常欢迎任何的回馈、留言以及建设性的意见！
</strong><hr>

<p style="padding-left:30px;">
</p>
		</div>
                <p class="meta">

               		<span class="date">
                                        原文撰写时间：<a href="http://tronixstuff.wordpress.com/2010/04/10/">April 10, 2010</a> <br />
										翻译时间：2011年7月17日
                  </span>

             		</p>]]></description>
         <category>Arduino</category>
         <pubDate>Sun, 17 Jul 2011 17:49:07 +0900</pubDate>
      </item>
      <item>
         <title>电工笔记 - 第零章 - 开始 Arduino 之旅!</title>
         <link>http://wells.osall.com/blog/index.php?m=content&amp;p=1560&amp;uid=1</link>
         <description><![CDATA[<h2>第零章&nbsp;–&nbsp;开始 Arduino 之旅!</h2>
<hr>
<p>
	原文作者：John Boxall (john at tronixstuff dot com)<br />
	中文翻译：Wells Wang (wellswang at osall dot com) <br />
	原文地址：<a href="http://tronixstuff.wordpress.com/2010/04/04/getting-started-with-arduino-chapter-zero/">http://tronixstuff.wordpress.com/2010/04/04/getting-started-with-arduino-chapter-zero/</a><br />
	中文版地址：<a href="http://arduino.osall.com/ch00.html">http://arduino.osall.com/ch00.html</a>
	</p>
<hr>

                <p><strong>[请注意从2010年11月1日起.教程中的文件可以在<a href="https://sites.google.com/site/tronixstuff/" target="_blank">这里</a>下载]</strong></p>
<p>Hello world!</p>
<p>欢迎加入到我们中来与我们一起通过<a href="http://arduino.osall.com/index.html" target="_blank">这一套教程</a>一起学习Arduino和电子技术！ 
 我非常乐意与你分享学习、探索Arduino系统的乐趣，并一起创造一些有趣的、好玩的、实用的玩意。噢，有太多东西需要学习，有太多乐趣在这其中呢！
这套教程文章的索引在这里可以被找到。另外，如果还有一些你所感兴趣的问题，别担心，你可以提出来。</p>
<p>在开始的前几篇文章中，我们会参考 Arduino 的官方网站以及下面的这本书：</p>
<ul>
	<li><span style="color:#000080;"><span style="text-decoration:underline;"><a href="http://www.littlebirdelectronics.com/products/Getting-Started-with-Arduino.html">Getting Started with Arduino</a></span></span> (Massimo Banzi)</li>
</ul>
<p>另外我假设大家对电子工程都有了基础的了解。针对这方面的内容，我推荐下面这本书：</p>
<ul>
	<li><span style="color:#000080;"><span style="text-decoration:underline;"><a href="http://www.littlebirdelectronics.com/products/make-electronics" target="_blank">Make: Electronics</a></span></span> (Chales Platt)</li>
</ul>
<p>以及在<a href="http://www.tronixstuff.com/electronics" target="_blank">这里</a>所列出的我所写过的关于电子学的基础知识的文章。</p>
<p>如果你有任何问题需要我们的支持或回答，你可以在我们的<a href="http://groups.google.com/group/tronixstuff" target="_blank">Google 用户组</a>中发表你的问题。这是一个非常友好的讨论问题的地方 
<img src="http://arduino.osall.com/images/icon_smile.gif" alt=":)" class="wp-smiley"> </p>
<p>首先，我们把整个系统分解成几个基础的部分。这样我们就能够方便的理解Arduino到底是个什么东西了。</p>
<p style="padding-left:30px;"><em>Arduino是一个基于一个简单的输入/输出的控制板和一个实现了Processing语言 (<span style="text-decoration:underline;"><a href="http://www.processing.org/">www.processing.org</a></span>)的开发环境的开放源代码的物理计算平台。Arduino能够被开发成独立运作的交互式设备或者和你的计算机上的软件连接使用。</em>[1]</p>
<p>所以，我们把整个系统分解成了硬件和软件。我们的硬件是一台能够运行Arduino IDE（集成开发环境）软件的个人电脑，以及Arduino控制板本身和他的电子配件。</p>
<p>
我们的软件就是IDE集成开发环境 - 这是一个类似于字处理程序的软件，但是它能够将Arduino代码(或者被称为 “<em>草稿/sketch</em>”) 传输到微控制器上。这些<em>草稿</em>就
是用processing语言（类似于C语言）编写的程序。 它们将会由boot loader（引导装载程序）解释执行（boot 
loader是芯片中能够理解读懂你的草稿代码的软件）。由于Arduino系统是开放源代码的，因此任何人都可以购买一个空白的微控制器，然后将
boot loader烧录进去，甚至写入自己的boot loader或者修改原有的boot loader。</p>
<p>现在该轮到Arduino控制板本身了。 它到底是什么样子的呢？让我们来看一看吧……</p>
<p><a href="http://arduino.osall.com/images/ch00/b_arduinounofront1.jpg">
<img class="aligncenter size-medium wp-image-3671" src="http://arduino.osall.com/images/ch00/arduinounofront1.jpg" alt="" height="248" width="300"></a></p>
<p>
 在这块电路板上安装了一个微控制器、一个USB接口、一个直流电源插口、许多输入输出线路（以后会详细介绍）还有许多用来显示状态的LED和其他一些杂七杂八的部件。途中的这块Arduino的型号是<span style="text-decoration:underline;"><em><a href="http://www.littlebirdelectronics.com/products/arduino-uno" target="_blank">Uno</a></em></span>，它使用ATMega328微控制器</p>
<p>除了Uno还有许多尺寸大一些、小一些的，型号旧的、新的不同的Arduino控制板。他们之间的区别在于物理尺寸、接口类型、可用的代码和内存空间大小等等。<a href="http://www.littlebirdelectronics.com/products/eleven-100-arduino-uno-compatible" target="_blank">Freetronics</a>网站上还有一个非常不错的基于Arduino而改进的控制板。
控制板的目的是最大化的简化与微控制器的连接，能够让使用者方便的驱动输入、输出和电源，连接上PC编程，以及与其他的电路通信。尽管使用Arduino控制板会非常方便，但是你也可以在你的设计中直接使用<span style="text-decoration:underline;"><a href="http://www.littlebirdelectronics.com/products/ATmega328-with-Arduino-Bootloader.html">已经编程的</a></span>微控制器，而不使用控制板。</p>
<p><em><strong>总结一下</strong></em> – 使用Arduino，你能够连接不同形式的输入输出设备，创建一个程序来处理和响应输入输出。例如，你可以制作一个温度报警器 – 当你的房间的温度超过了你所设定的值时，让Arduino发出声音警报。</p>
<p>输入设备包括：
按钮、开关、运动传感器、温度传感器、光线传感器、气体传感器(!)、旋钮/拨盘（比如音量旋钮）、无线数据接收设备等等。输出设备包括：灯光、声音发生
器、马达、泵、其他电路、液晶显示屏等等。基本上，所有能够被开关的或者能被电力控制的设备，都能够被Arduino所控制。</p>
<p>为了更方便的使用，你可以购买或者自己制作 <em>扩展板(Shield)</em>。
扩展版顾名思义是一块可以插在Arduino控制板上面的扩展接口的电路板。有许许多多种不同类型的不同功能的接口板，例如<span style="text-decoration:underline;"><a href="http://www.littlebirdelectronics.com/products/WiFly-Shield.html">无线</a></span>或者<span style="text-decoration:underline;"><a href="http://www.littlebirdelectronics.com/collections/freetronics/products/ethernet-shield-with-poe" target="_blank">有线以太网</a></span>网络扩展卡、用于游戏或者机器人控制的<span style="text-decoration:underline;"><a href="http://www.littlebirdelectronics.com/products/joystick-shield-kit" target="_blank">操纵杆</a></span>，或者LCD扩展模块</p>
<p><a href="http://arduino.osall.com/images/ch00/b_ethernetshield.jpg">
<img class="size-medium wp-image-206 alignleft" title="Ethernet shield" src="http://arduino.osall.com/images/ch00/ethernetshield.jpg" alt="" height="300" width="300"></a><a href="http://arduino.osall.com/images/ch00/b_joystickshield.jpg">
<img class="aligncenter size-medium wp-image-207" title="Joystick shield" src="http://arduino.osall.com/images/ch00/joystickshield.jpg" alt="" height="300" width="300"></a></p>
<p>所以，当你有了正确的<em>代码(sketch)</em>，正确的硬件接口（也许是个扩展板），你就能做几乎任何事情了！<em>太棒了！</em></p>
<p>上面这些就是我们目前需要了解的关于Arduino的基础知识。现在，是<em>实践</em>的时间了。你需要准备以下三样东西：</p>
<ul>
	<li>一台能够连接互联网、有着USB端口的运行了Linux，MacOS或者Windows的个人电脑；</li>
	<li>一条与你的Arduino板匹配的USB数据线；</li>
	<li>一块<a href="http://www.littlebirdelectronics.com/products/arduino-uno" target="_blank">Arduino</a>或者<a href="http://www.littlebirdelectronics.com/products/eleven-100-arduino-uno-compatible" target="_blank">兼容的</a>控制板。大部分控制板都会附带一条USB数据线，记得在购买的时候确认一下。</li>
</ul>
<p>现在，先要准备一些东西 – 根据<span style="text-decoration:underline;"><a href="http://arduino.cc/en/Guide/HomePage">这里</a></span>的指导手册安装Arduino IDE软件。如果你使用的是Ubuntu操作系统，<a href="http://www.pluggy.me.uk/arduino-ubuntu/" target="_blank">这里有一份非常不错的安装手册</a>。</p>
<p>怎么样？你的Arduino上的LED闪烁了吗？你是不是茫然的盯着闪烁的LED，觉得要被它催眠了？没有问题，就是这样的，我们都是第一次接触它。</p>
<p>现在，我想让你意识到你的电脑的USB口能够为Arduino控制板供电。然而，如果你要让Arduino控制板在离开电脑后仍旧可以使用，你就必须要有一个变压<span style="text-decoration:underline;"><a href="http://www.littlebirdelectronics.com/products/Arduino-Power-Supply.html">电源</a></span>或者其他种类的电源输入。</p>
<p>还有一些非常基本的知识需要了解，带着对Arduino创造者的敬佩，请参考&nbsp;<em><a href="http://www.littlebirdelectronics.com/products/Getting-Started-with-Arduino.html" target="_blank">Getting Started with Arduino</a></em> 这本书的前38页，你应该能让你的Arduino的LED闪烁起来了！如果还是不行，可以在文章后的留言栏内留下你的问题，我会回答的。</p>
<p><em><strong>练习 0.1</strong></em></p>
<p>现在让我们把闪烁变得更有趣。你还记得<span style="text-decoration:underline;"><a href="http://en.wikipedia.org/wiki/Knight_Rider_%281982_TV_series%29"><em>霹雳游侠 (Knight Rider)</em></a></span>和 大卫·哈塞尔霍夫 (David Hasselhoff) 吗？霍夫开着一辆改装过的庞蒂亚克Trans Am汽车，引擎盖上装了一排非常酷的灯，会按照顺序从左闪到右再从右闪到左……</p>
<p>你的目标就是使用Arduino来非常简单的实现这个，使八个而不是一个LED按照顺序闪烁，不停的按照1-2-3-4-5-6-7-8-7-6-5-4-3-2-1-2-3-… 的顺序循环，每次闪烁保持亮灯一秒钟。</p>
<p><em>你需要准备：</em></p>
<ul>
	<li>标准的 Arduino 套件 (电脑, USB连接线, <a href="http://www.littlebirdelectronics.com/products/Arduino-Uno.html" target="_blank">Uno</a> 或者 <a href="http://www.littlebirdelectronics.com/products/Freetronics-TwentyTen.html" target="_blank">兼容</a>的Arduino控制板)。</li>
	<li>八个发光二极管 (<a href="http://www.littlebirdelectronics.com/categories/Components/LEDs/" target="_blank">LED</a>)。额定电流需要小于40mA。</li>
	<li>八个 560欧姆 0.25 瓦的电阻，用于限制电流来保护发光二极管。</li>
	<li>一块<a href="http://www.littlebirdelectronics.com/products/Basic-Breadboard.html" target="_blank">面包板</a>和一些<a href="http://www.littlebirdelectronics.com/products/Jumper-Wires-Premium-6%22-M%7B47%7DM-Pack-of-10.html" target="_blank">导线</a>。</li>
	<li>一台相机 (可选) 来记录你成功的实验！</li>
</ul>
<p><em>提示 – 把延时量定义成为一个变量的话，今后修改起来就会非常方便</em>。</p>
<p>在书中的LED闪烁的原始设计中，使用了数字端口13来作为输出。这一次，我们使用数字端口2到9来进行输出控制。在硬件连接方面非常简单 – 每个数字接口都使用一根导线连接到一个LED的正极，在负极连接一个560欧姆的电阻最后连接到接地线。请参考下面的电路图：</p>
<p align="center"><a href="http://arduino.osall.com/images/ch00/b_exercise0p1.jpg">
<img class="aligncenter size-medium wp-image-4172" title="click to enlarge" src="http://arduino.osall.com/images/ch00/exercise0p1.jpg" alt="" height="163" width="300"></a></p>
<p style="text-align:center;">我们期望的运行结果应该会是这样：</p>
<p align="center"><a href="http://arduino.osall.com/images/ch00/b_ex0_1photo_small.jpg">
<img class="aligncenter size-medium wp-image-212" title="Exercise 0.1 result" src="http://arduino.osall.com/images/ch00/ex0_1photo_small.jpg" alt="" height="225" width="300"></a></p>

<p>当然，还有运行结果的视频：</p>
<p align="center"><embed src="http://player.youku.com/player.php/sid/XMjg1NzkxMjky/v.swf" quality="high" allowscriptaccess="sameDomain" type="application/x-shockwave-flash" align="middle" height="400" width="480"></p>
<p>所以现在该轮到写代码的时候了！但是在开始之前，需要计划好什么是你想要先做的(这个计划也被称为 <em>算法</em>)。例如，在这个练习中，你也许会写下象下面这样的计划……</p>
<p style="padding-left:120px;"><em>练习 0.1 计划
</em></p>
<ul style="padding-left:120px;"><em>
</em>
	<li><em>将要使用的端口都设置成为输出模式；</em></li>
	<li><em>创建一个变量来存放以毫秒为单位的闪烁亮灯时长；</em></li>
	<li><em>开始一个无限循环；</em></li>
	<li><em>打开2号端口（译者注：输出高电平），等待亮灯时长，关闭端口（译者注：输出低电平）；</em></li>
	<li><em>打开3号端口（译者注：输出高电平），等待亮灯时长，关闭端口（译者注：输出低电平）；</em></li>
	<li><em>对4到9号端口重复以上操作；</em></li>
	<li><em>反过来由8号端口到3号端口做同样的操作；</em></li>
	<li><em>结束循环；</em></li><em></em>
</ul>
<em>
</em>

<p style="padding-left: 60px;">怎么样？你成功了吗？如果没有也没关系，你可以通过修正错误来加深学习。记住 - 如果你有任何问题，都可以在文章最后的留言栏内提出，我会进行回答。不过为了节省你的时间， <a href="https://sites.google.com/site/tronixstuff/home/arduino-tutorial-series-files/exercise_0point1.pde" target="_blank">这里提供了现成的<em>代码</em></a>：</p>

[code=C]
<br />/*<br />exercise 0.1 - KITT emulator!<br />Created 02/04/2010<br />By John Boxall<br />http://tronixstuff.wordpress.com...<br />http://wp.me/pQmjR-3i<br /><br />使用 2~9 输出端口来从前往后从后往前的依次循环闪烁LED<br /><br />电路:<br />端口2到9都连接了一个LED，然后都串联一个560欧姆的电阻，连接到地线(Arduino Duemilanove底部左侧的第四个插孔)。<br />代码基于 H. Barragan 为 Wiring i/o 板设计的程序开发<br />*/<br /><br />// setup() 方法只在代码开始时运行一次<br />int del=1000; // 设置默认的延时时间, 1000 毫秒 (一秒)<br /><br />void setup()<br />{<br />&nbsp;&nbsp;&nbsp; // 将数字端口初始化设置为输出端口：<br />&nbsp;&nbsp;&nbsp; // 以后还会有更方便的办法来做到这一点。<br /><br />&nbsp;&nbsp;&nbsp; pinMode(2, OUTPUT);<br />&nbsp;&nbsp;&nbsp; pinMode(3, OUTPUT);<br />&nbsp;&nbsp;&nbsp; pinMode(4, OUTPUT);<br />&nbsp;&nbsp;&nbsp; pinMode(5, OUTPUT);<br />&nbsp;&nbsp;&nbsp; pinMode(6, OUTPUT);<br />&nbsp;&nbsp;&nbsp; pinMode(7, OUTPUT);<br />&nbsp;&nbsp;&nbsp; pinMode(8, OUTPUT);<br />&nbsp;&nbsp;&nbsp; pinMode(9, OUTPUT);<br />}<br /><br />// loop() 方法会无限循环执行，直到你关掉Arduino的电源<br />void loop()<br />{<br />&nbsp; &nbsp; digitalWrite(2, HIGH);&nbsp;&nbsp; // 打开连接在端口2上的LED<br />&nbsp;&nbsp;&nbsp; delay(del);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 等待 (等待的时间由变量'del'决定)<br />&nbsp;&nbsp;&nbsp; digitalWrite(2, LOW);&nbsp;&nbsp;&nbsp; // 关闭LED<br /><br />&nbsp;&nbsp;&nbsp; digitalWrite(3, HIGH);&nbsp;&nbsp; // 打开连接在端口3上的LED<br />&nbsp;&nbsp;&nbsp; delay(del);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 等待<br />&nbsp;&nbsp;&nbsp; digitalWrite(3, LOW);&nbsp;&nbsp;&nbsp; // 关闭LED<br /><br />&nbsp;&nbsp;&nbsp; digitalWrite(4, HIGH);&nbsp;&nbsp; // 打开连接在端口4上的LED<br />&nbsp;&nbsp;&nbsp; delay(del);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 等待<br />&nbsp;&nbsp;&nbsp; digitalWrite(4, LOW);&nbsp;&nbsp;&nbsp; // 关闭LED<br /><br />&nbsp;&nbsp;&nbsp; digitalWrite(5, HIGH);&nbsp;&nbsp; // 打开连接在端口5上的LED<br />&nbsp;&nbsp;&nbsp; delay(del);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 等待<br />&nbsp;&nbsp;&nbsp; digitalWrite(5, LOW);&nbsp;&nbsp;&nbsp; // 关闭LED<br /><br />&nbsp;&nbsp;&nbsp; digitalWrite(6, HIGH);&nbsp;&nbsp; // 打开连接在端口6上的LED<br />&nbsp;&nbsp;&nbsp; delay(del);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 等待<br />&nbsp;&nbsp;&nbsp; digitalWrite(6, LOW);&nbsp;&nbsp;&nbsp; // 关闭LED<br /><br />&nbsp;&nbsp;&nbsp; digitalWrite(7, HIGH);&nbsp;&nbsp; // 打开连接在端口7上的LED<br />&nbsp;&nbsp;&nbsp; delay(del);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 等待<br />&nbsp;&nbsp;&nbsp; digitalWrite(7, LOW);&nbsp;&nbsp;&nbsp; // 关闭LED<br /><br />&nbsp;&nbsp;&nbsp; digitalWrite(8, HIGH);&nbsp;&nbsp; // 打开连接在端口8上的LED<br />&nbsp;&nbsp;&nbsp; delay(del);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 等待<br />&nbsp;&nbsp;&nbsp; digitalWrite(8, LOW);&nbsp;&nbsp;&nbsp; // 关闭LED<br /><br />&nbsp;&nbsp;&nbsp; digitalWrite(9, HIGH);&nbsp;&nbsp; // 打开连接在端口9上的LED<br />&nbsp;&nbsp;&nbsp; delay(del);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 等待<br />&nbsp;&nbsp;&nbsp; digitalWrite(9, LOW);&nbsp;&nbsp;&nbsp; // 关闭LED<br /><br />&nbsp;&nbsp;&nbsp; digitalWrite(8, HIGH);&nbsp;&nbsp; // 打开连接在端口8上的LED<br />&nbsp; &nbsp; delay(del);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 等待<br />&nbsp;&nbsp;&nbsp; digitalWrite(8, LOW);&nbsp;&nbsp;&nbsp; // 关闭LED<br /><br />&nbsp;&nbsp;&nbsp; digitalWrite(7, HIGH);&nbsp;&nbsp; // 打开连接在端口7上的LED<br />&nbsp;&nbsp;&nbsp; delay(del);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 等待<br />&nbsp;&nbsp;&nbsp; digitalWrite(7, LOW);&nbsp;&nbsp;&nbsp; // 关闭LED<br /><br />&nbsp;&nbsp;&nbsp; digitalWrite(6, HIGH);&nbsp;&nbsp; // 打开连接在端口6上的LED<br />&nbsp;&nbsp;&nbsp; delay(del);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 等待<br />&nbsp;&nbsp;&nbsp; digitalWrite(6, LOW);&nbsp;&nbsp;&nbsp; // 关闭LED<br /><br />&nbsp;&nbsp;&nbsp; digitalWrite(5, HIGH);&nbsp;&nbsp; // 打开连接在端口5上的LED<br />&nbsp;&nbsp;&nbsp; delay(del);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 等待<br />&nbsp;&nbsp;&nbsp; digitalWrite(5, LOW);&nbsp;&nbsp;&nbsp; // 关闭LED<br /><br />&nbsp;&nbsp;&nbsp; digitalWrite(4, HIGH);&nbsp;&nbsp; // 打开连接在端口4上的LED<br />&nbsp;&nbsp;&nbsp; delay(del);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 等待<br />&nbsp;&nbsp;&nbsp; digitalWrite(4, LOW);&nbsp;&nbsp;&nbsp; // 关闭LED<br /><br />&nbsp;&nbsp;&nbsp; digitalWrite(3, HIGH);&nbsp;&nbsp; // 打开连接在端口3上的LED<br />&nbsp;&nbsp;&nbsp; delay(del);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 等待<br />&nbsp;&nbsp;&nbsp; digitalWrite(3, LOW);&nbsp;&nbsp;&nbsp; // 关闭LED<br />}<br />[/code]<br /><br />好了，现在都完成了。今天你学习了如何设置一台电脑来编写Arduino的代码，以及编写一些代码来控制你设计的电路的输出。这就是关于Arduino连接外部设备的整个系列教程中的第一篇。
<p>您可以订阅或者在<a href="http://twitter.com/tronixstuff" target="_blank">twitter上关注我</a>来接收教程的更新通知。如果你有任何问题，可以在下面给我留言。如果你想给大家分享你的关于这篇文章的作品，请把你的照片给我email过来(john at tronixstuff
 dot com)。</p>
<p><strong><em>我们是在一起学习！请把你的建议或问题发给我们！</em></strong></p>
<p style="text-align:center;">不要忘记在<a href="http://www.littlebirdelectronics.com/categories/Development-Tools/Arduino/" target="_blank">Little Bird Electronics</a>有非常酷和有趣的Arduino套件。</p>
<p style="text-align:center;">那么，期待在 <strong><a href="http://arduino.osall.com/ch01.html" target="_self">下一和实验</a></strong>中再次和你相遇！</p>
<p style="padding-left:90px;">注解：</p>
<p style="padding-left:90px;">[1] 摘自 “<span style="color:#000080;"><span style="text-decoration:underline;"><a href="http://www.littlebirdelectronics.com/products/Getting-Started-with-Arduino.html">Getting Started with Arduino</a></span></span>” 作者：Massimo Banzi (O’Reilly)。</p>

<hr><strong>
在本教程中的所有材料，除非特别指出的，都基于 <a href="http://creativecommons.org/licenses/by-nc-sa/3.0/deed.zh_HK" target="_blank">Commons 的 姓名标示-非商业性-相同方式分享 v3.0 许可证</a>发
布。如果需要转发本作品，请按照相同的许可证发布，并注意发布页面不得有商业广告（包括但不限于Google 
Adsense等）。如果你想在其他场合使用本作品，请发邮件给 原作者 john (at) tronixstuff dot com 以及中文化作者
 wellswang (at) osall dot com 取得联系。我们非常欢迎任何的回馈、留言以及建设性的意见！
</strong><hr>

<p style="padding-left:30px;">
</p>
		
                <p class="meta">

               		<span class="date">
                                        原文撰写时间：<a href="http://tronixstuff.wordpress.com/2010/04/04/">April 4, 2010</a> <br />
										翻译时间：2011年7月10日
                  </span>

             		</p>]]></description>
         <category>Arduino</category>
         <pubDate>Mon, 11 Jul 2011 09:38:07 +0900</pubDate>
      </item>
      <item>
         <title>DIY Nikon D90的GPS模块</title>
         <link>http://wells.osall.com/blog/index.php?m=content&amp;p=1554&amp;uid=1</link>
         <description><![CDATA[最近从兔子那里收了一个几乎全新的Nikon D90单反，于是就把自己的D80出给了别人。一开始，用惯了D80的我对D90的成像风格很不习惯，总感觉颜色过于浓郁。后来想想，也许这就是D90的CMOS感光芯片和D80的CCD芯片之间的差别吧。还好D90还提供了自定义的色彩曲线来方便直接出片，调整了一下设置后，慢慢的，拍了几百张照片后，也就习惯了D90的色彩。<br /><br />D90除了大家都知道的比D80多了Live View和摄像功能外，我发现原来D200才支持的外接GPS模块的功能D90也可以支持了。不过D90的外接GPS的接口是和快门线共用的。在D80时代，我一直羡慕D200能够外接GPS，拍照的时候，相机就能自动将拍摄地点的GPS信息存入相片的EXIF信息中。这样在浏览照片时，就能准确定位到拍摄地点了，这个功能在旅游照片或风景照中非常实用。D90现在支持了这一功能，但是还得有个GPS模块才能够使用。<br /><br />Nikon原厂的GPS模块GP-1售价大约在1500RMB左右，再加上还要买接口转接线，加起来至少1700大洋。真是会抢钱-_-b！正好我上次在万能的淘宝花了60多卖了两个二手的SIRF2的GPS芯片模块，做arduino的GPS模块用掉了一个，还剩一个，所以就打算自己尝试着DIY一个D90的GPS模块。<br /><br />Nikon D90的GPS模块和快门线是共用一个插头的，这个插头是一个微型的10pin插头。这回，万能的淘宝上面没找到有单独卖这个插头的（所以淘宝只能是万能的，不是亿能的……），我只能找12元一根的兼容快门线买回来自己改线了……<br /><br />快门线买回来后，在插头处剪断，用刀片剥开橡胶拿出内芯后可以看到10pin的焊脚。我在网上查了这个插头的焊脚定义，顺便拍了照片标注在上面，大家可以参考下面的照片（注意插头的正反面）。<br /><br /><div align="center"><a href="javascript:showpic(this,'../upload/1/Images/1_1307347002/P_1307347217_0.jpg');">
<img src="../upload/1/Images/1_1307347002/P_1307347217_0.jpg" alt="GPS_plug" width="400" height="300"></a><br /></div><br /><br />快门线是三芯的，只用到了自动对焦、快门控制和接地线。快门线的原理是，半按快门按钮，自动对焦引脚和接地线导通，相机自动对焦；继续按下快门按钮，快门控制引脚和接地导通，相机完成快门动作。<br /><br />如果要使用GPS，则只要将GPS模块输出的GPS 4800bps NMEA数据，通过GPS数据引脚传入相机。传入的数据必须是4800bps的TTL信号。<br /><br />我在淘宝买到的SIRF2的GPS模块输出的信号是RS232串口的标准4800bps NMEA信号，同时工作电压是5V，而Nikon D90的插口输出电压是6V，如果直接使用会有烧掉GPS模块的风险。因此这个GPS模块需要做如下改动：<br /><ul>
	<li>串口信号转TTL信号：</li><ul>
	<li>使用ST232/MAX232等芯片将RS232信号转换成TTL信号。</li>
	<li>或者在GPS模块的电路板上找到TTL电平输出信号端。</li>
</ul>
<li>6V转5V工作电压:</li><ul>
	<li>串联电阻降压（这种方法非常不好）。</li>
	<li>串联一个二极管，使用二极管的压降来降压。</li>
	<li>使用DC-DC降压芯片来降压。</li>
</ul>
</ul>
在实际改造过程中，我仔细查看了我买来的GPS模块的电路，注意到其本身内部输出是TTL信号，然后通过一个ST232芯片最终将TTL转换成RS232信号。因此我不使用这个模块的信号输出端，而是直接在ST232芯片的 pin11 处导出了TTL电平信号。<br /><br />对于6v转5v的问题，使用降压芯片的话成本比较高，我使用了串联二极管并联一个电容来达到降压滤波的作用。<br /><br />另外，插上GPS模块后，就不能再插一根快门线了，因此我设计的模块中，将自动对焦、快门控制和接地线另外引出，接到一个标准的USB母口上，将刚才剪断的快门线接上一个USB公头，这样GPS模块和快门线可以同时使用了。<br /><br />在测试中发现，无论相机的电源是否关闭，插头的+6V电源始终是供电的，可能是为了保证GPS模块一直与卫星连接，避免开机后还需要寻星的过程。因此在GPS模块上我还安装了一个开关，当不使用GPS时可以关闭GPS电源，这样可以节省相机的电力。<br /><br /><div align="center"><a href="javascript:showpic(this,'../upload/1/Images/1_1307347002/P_1307347228_4.jpg');">
<img src="../upload/1/Images/1_1307347002/P_1307347228_4.jpg" alt="GPS_data" width="400" height="264"></a><br />接上模块后，成功搜星，D90正确显示GPS信息<br /><br /><a href="javascript:showpic(this,'../upload/1/Images/1_1307347002/P_1307347226_3.jpg');">
<img src="../upload/1/Images/1_1307347002/P_1307347226_3.jpg" alt="gps_info" width="400" height="264"></a><br />接上模块，肩屏显示有GPS信号<br /></div><br />经过这些设计和测试，发现我的DIY的GPS模块能够非常好的长时间工作，与相机间没有任何的兼容性问题，于是，就找了个小巧的塑料盒，根据尺寸，自己烂了个电路板，将元件都固定在盒内，最终做出了成品。<br /><br /><div align="center"><a href="javascript:showpic(this,'../upload/1/Images/1_1307347002/P_1307347223_2.jpg');">
<img src="../upload/1/Images/1_1307347002/P_1307347223_2.jpg" alt="gps_inner" width="400" height="264"></a><br />D90 DIY GPS模块内部<br /><br /><a href="javascript:showpic(this,'../upload/1/Images/1_1307347002/P_1307347220_1.jpg');">
<img src="../upload/1/Images/1_1307347002/P_1307347220_1.jpg" alt="gps_module" width="400" height="400"></a><br />D90 DIY GPS模块外观<br /><br /><a href="javascript:showpic(this,'../upload/1/Images/1_1307347002/P_1307347233_5.jpg');">
<img src="../upload/1/Images/1_1307347002/P_1307347233_5.jpg" alt="gps_connected" width="400" height="264"></a><br />模块底部的魔术粘布可以将模块很好的固定在相机背带上<br /></div><br />最终，完成这个DIY的D90 GPS模块的成本大约在60-70RMB，而网上一个原厂的模块是1500RMB左右，一个副厂的模块大约在300-400RMB。看来DIY真是很划算啊。<br /><br />看一下下面的这张我在青海拍摄的照片的EXIF信息吧，里面有完整的拍摄地点的GPS地理位置信息：）。<br /><br /><div align="center"><a href="javascript:showpic(this,'../upload/1/Images/1_1189873364/P_1307351881_0.jpg');">
<img src="../upload/1/Images/1_1189873364/P_1307351881_0.jpg" alt="青海湖-棕头鸥" width="252" height="400"></a></div>]]></description>
         <category>摄影</category>
         <pubDate>Mon, 06 Jun 2011 17:15:56 +0900</pubDate>
      </item>
      <item>
         <title>使用php_screw来加密PHP程序源代码</title>
         <link>http://wells.osall.com/blog/index.php?m=content&amp;p=1537&amp;uid=1</link>
         <description><![CDATA[虽然我一向讨厌闭源软件，但是不管怎样，还是有闭源的需求存在。昨天就有一个朋友问我，PHP代码怎样做到闭源，以便分发给不同的客户？由于PHP是一种解释性语言，并不需要编译，因此一般来说，将软件交付时，就等同于交付源代码。考虑到国内的版权方面的实际情况，仅仅使用许可证来约束是非常不现实的，因此，如果要交付一个闭源项目，如何对PHP软件的源代码进行加密就成了一个需要解决的问题。<br /><br />对于这个问题，市面上有一些商业软件可以提供很好的方案。例如，<a href="http://www.zend.com">Zend</a>公司的<a href="http://www.zend.com/en/products/guard/">Zend Guard</a>可以很好的将PHP源代码加密并优化，在运行时，只需要安装了<a href="http://www.zend.com/en/products/server-ce/index">Zend Optimizer</a>组件的PHP Web服务器支持就好了。可惜的是，虽然用来运行加密过的代码的Zend Optimizer组件是免费的，但是Zend Guard软件却要价不菲。<br /><br />另一个类似的商用解决方案是<a href="http://www.ioncube.com">ionCube</a>的<a href="http://www.ioncube.com/sa_encoder.php">ionCube Encoder</a>和<a href="http://www.ioncube.com/loaders.php">ionCube Loader</a>。同样的，ionCube Encoder需要付费购买，Loader则是免费。与Zend不同的是，ionCube还提供了<a href="http://www.ioncube.com/online_encoder.php">在线加密服务</a>，如果你需要加密的文件比较少的话，可以使用这个服务，而不需要购买Encoder软件，这样成本会下降不少，加密一个文件只需要支付0.5美元。<br /><br />当然免费的方案也是有的，而且还是一个开源软件（使用开源软件来制造闭源软件真是一个让人觉得有意思的话题……）—— <a href="http://sourceforge.net/projects/php-screw/">php_screw</a>。php_screw是一个轻量级的php源代码加密的开源软件。它的原理是，通过一个设定的密钥串对php源文件进行编码，使其变得不可阅读。在服务器端执行时，服务器端需要加载一个php_screw的扩展（extension），这个扩展将在Zend引擎解释PHP代码前进行判断，如果是已经加密过的代码，则进行解密后再传递给Zend引擎。原理非常简单，实现也不复杂。唯一需要做的就是，下载php_screw后针对你的php进行编译，并安装扩展。<br /><br />由于php_screw在2007年之后就没有进行更新过，而PHP以及Zend却一直在发展。因此，我在测试时，在为php5.3编译安装php_screw时，发现编译出错，报以下错误信息：<br /><br /><div class="blog_code">error: 'struct _zend_compiler_globals' has no member named 'extended_info'</div><br /><br />在google上搜索后，找到了<a href="http://lists.freebsd.org/pipermail/freebsd-ports/2010-April/060557.html">原因</a>，原来是Zend引擎在PHP 5.3后修改了API的接口，请参考如下的资料：<br /><br />
<div class="blog_quote">
<pre>A few thirdy party pecl extensions broke after the PHP update to 5.3.2<br />release. My apologies for it, but since PHP 5.3.0 was released 9 months<br />ago, this means that there is already a newer version of the extension<br />with PHP 5.3 support, or the extensions is unmaintained and perhaps<br />obsolete.<br /><br />If you are going to fix your port, here is a list of the most common<br />errors with proposed solutions:<br /><br />1) error: duplicate 'static'<br /><br />The macro ZEND_BEGIN_ARG_INFO_EX already includes 'static const'<br />keywords in the signature, so it's enough to remove the additional 'static'<br /><br /><br /><strong>2) error: 'struct _zend_compiler_globals' has no member named<br />'extended_info'<br /><br />The member has been renamed to 'compiler_options' to hold additional<br />variables. So, for example, if the code looks like:<br /><br /> CG(extended_info) = 1;<br /><br />you can modify it in this way:<br /><br /> CG(compiler_options) |= ZEND_COMPILE_EXTENDED_INFO;</strong><br /><br /><br />3) error: 'zval' has no member named 'is_ref'<br />   error: 'zval' has no member named 'refcount'<br /><br />The access to such members is wrapped by a few macros (look at zend.h<br />for a complete list). So for example, if the code looks like:<br /><br /> if (z-&gt;is_ref)<br />     z-&gt;refcount++;<br /><br />you can modify it in this way:<br /><br /> if (Z_ISREF_P(z))<br />     Z_ADDREF_P(z);<br /><br />-- <br />Alex Dupre</pre></div>

根据上面资料中的提示，对源代码进行修改后，顺利编译通过，安装测试也没有问题。<br /><br />对于php_screw，由于是开源软件，我想还可以进一步优化，例如使用服务器端的网卡的MAC地址来参与密钥的生成，由于网卡的MAC地址都是不同的，这样就可以给不同用户不同的许可证号码，使用MAC地址加上许可证号码来计算出密钥以实现闭源软件授权的功能。]]></description>
         <category>技术</category>
         <pubDate>Sun, 20 Mar 2011 16:49:06 +0900</pubDate>
      </item>
      <item>
         <title>最近折腾的一些玩意</title>
         <link>http://wells.osall.com/blog/index.php?m=content&amp;p=1519&amp;uid=1</link>
         <description><![CDATA[不写Blog可以有很多借口，诸如忙、没时间、没有心思、没有兴趣等等，但归根结底最终的原因其实就是人类的惰性。<br />
<br />
不写Blog不代表最近没有折腾，虽然最近的确忙了点，但是生命还在于折腾，而我又是个爱折腾新玩意的人，所以，这篇就简单介绍一下最近折腾的内容吧。<br />
<br />
<em><strong>Android</strong></em><br />
<br />
一直关注Android系统的发展，在2010年，Android系统发展尤其迅猛，不仅在手机市场靠着多机种的共同发力和Apple 
Inc.的iPhone系列产品分庭抗礼，现在也瞄准了平板电脑。虽然iOS平台是封闭的，但是靠着统一化、易用性的优势拿下了大半个市场，而
Android走的是一条几乎相反的路，虽然多样的界面和多种的终端设备导致开发上的困难，但是开放的平台吸引了更多的厂商来进行发展，再加上不错的易用
性，因此这个平台的未来注定也是光明的。<br />
<br />
对于Android终端，我把我之前买的智器 SmartQ5刷成Android 2.2版本了（感谢<a href="http://www.covia.net">covia</a>），装了iReader，没用几天，我爸说他的hp iPAQ h1940坏了（用了7年了……）。于是SmartQ5就成为我爸的电子书阅读器了……<br />
<br />
<div id="myTab0_Content0">
  <div align="center">

  </div>
  <div align="center">
<img alt="SmartQ5" src="http://www.smartdevices.com.cn/templets/product/images/SmartQ5.jpg"><br />
Smart Q5<br />
 

  </div>
</div>
<br />
<br />
接着，领导手机坏了，她对手机没啥要求，于是买了个G4 
Tattoo给她，一用，虽然是1.6的老系统，但还是觉得不错，挺方便的。当时我还在用着Treo 
680，可没几天，老天要我用Android……，我在客户那里打电话，黄油手一滑，Treo粉身碎骨，液晶屏也破相了（绝对不是故意的！！！）……于是
咬咬牙买了个G7 Desire，好歹咱也用了个上3000的手机了。拿回家就开始自己折腾root，刷Froyo 
2.2，装了一堆软件后，终于自己修改了一个合适稳定的ROM，前前后后的测试折腾了两个多星期。结论是，Android果然好用！咱就好这一口。<br />
<div align="center"><a href="javascript:showpic(this,'http%3A//www.zdor.cn/product/upload/p-big/1252655359_82xC.jpg');">
<img src="http://www.zdor.cn/product/upload/p-big/1252655359_82xC.jpg"></a><a href="javascript:showpic(this,'http%3A//www.zdor.cn/product/upload/p-big/1266983642_mAu9.jpg');">
<img src="http://www.zdor.cn/product/upload/p-big/1266983642_mAu9.jpg"></a><br />Tatto &amp; Desire</div><br />
用了Desire后，就准备自己开发些App，于是就开始折腾起Android SDK，写了个半吊子的油耗统计软件，还有待完成……<br />
<br /><br /><br />
<em><strong>Arduino</strong></em><br /><br />Arduino Team出了新版的<a href="http://www.arduino.cc">Arduino Uno</a>，主要改动是USB连接的芯片。不过我还在用Duemilanove，对于我来说，这绝对够用了，不必去追求新版。<br /><br /><div align="center"><a href="javascript:showpic(this,'http%3A//arduino.cc/en/uploads/Main/ArduinoUnoFront240.jpg');">
<img src="http://arduino.cc/en/uploads/Main/ArduinoUnoFront240.jpg"></a><br />Arduino UNO<br /></div><br />关于Arduino的开发，我做了如下几个项目：<br /><br /><ul>
	<li>EarthRunner v1.3 自动壁障监控小车，目前已经完成的功能有：自动壁障，遇到障碍自动避开，手动遥控控制，通过互联网的网页进行控制小车，车载摄像机角度可以通过控制二维云台来调整，车速控制，自动感应光线强度开关车灯。如果有钱换上五自由度机械臂的话，可以做个拆弹机器人原型出来，哈哈。</li>
	<li>Carduino v0.3 车辆行为探测系统，目前已经完成的功能有：通过LIS3LV02DQ三轴加速度感应芯片探测车辆加速、减速、左右转的运动行为，通过MAX7219级联控制多个8x8LED矩阵输出文字信息给后车提示，通过DS12B80检测温度。下一步是想办法自制超声波候车距离探测系统（就是倒车雷达），探测与后车的距离。</li>
	<li>自制了一些扩展功能板，买了不少覆铜板和贴片元件，低成本的做了些扩展功能板，成本和网上买现成的相比，只有30%或更低：</li>
</ul>
<blockquote><ul>
	<li>用ENC28J60芯片做了单片机使用的基于SPI的10M以太网网卡；</li>
	<li>用74LVC245和DS1302芯片做了SD卡、时钟模块；</li>
	<li>用32元买来的二手GPS芯片做了 GPS模块；</li>
	<li>用PCA9555芯片做了GPIO I2C扩展模块；</li>
	<li>用LIS3LV02DQ芯片做了三轴加速度感应芯片。</li>
</ul>
</blockquote><br />以上这些扩展板在以后的项目中将会逐渐用到，制作方法也会找时间写出来分享。<br /><br /><br /><em><strong>PlayStation 2</strong></em><br /><br />我的PS2（70002型）买了四五年了，买来是JS给装的垃圾直读，也不知道是啥型号，但是工作也算一直稳定，不过我打游戏也是难得打打，打起来也是三天晒网两天打渔，记得除了战神1/2我迅速爆机外，好像其他都没有始有终过。上次发现自己刻的游戏盘也读不太出来后，就一直担心光驱光头一坏就一个游戏都打不成了。于是最近就在taobao买了个盗版的盗版的MODBO 4直读（MODBO 盗 Infinity的版，现在市面上的又是翻MODBO的版），花了25元。MODBO 4是可以实现免光盘启动的直读芯片，各方面功能都不错。花了两个多小时，把机器拆开，把JS装的不知道啥直读卸了，然后用做arduino板子练出来的焊功，焊了21个跟针眼差不多大的焊脚，终于把MODBO 4给装上了。<br /><br /><div align="center"><a href="javascript:showpic(this,'http%3A//t0.gstatic.com/images%3Fq%3Dtbn%3AANd9GcRf5JVhBkzIxGz6HRmkrHvBT6NTTLFLl1TPVNQhgkkERDPjSFJR');">
<img src="http://t0.gstatic.com/images?q=tbn:ANd9GcRf5JVhBkzIxGz6HRmkrHvBT6NTTLFLl1TPVNQhgkkERDPjSFJR"></a><a href="javascript:showpic(this,'http%3A//t3.gstatic.com/images%3Fq%3Dtbn%3AANd9GcTljnmnSwDM49Ffe-LGMhaBrwc-ns1USTrV6uscW3JhWpVLAi9V6Ijp-F2sXA');">
<img src="http://t3.gstatic.com/images?q=tbn:ANd9GcTljnmnSwDM49Ffe-LGMhaBrwc-ns1USTrV6uscW3JhWpVLAi9V6Ijp-F2sXA"></a><br /><br />PlayStation 2 和 MODBO 4<br /></div><br />这机器我本来还想改HDL来着，网上一看，现在有个<a href="http://psx-scene.com/forums/f150/open-ps2-loader-project-v0-8-a-62141/index151.html">OpenPS2Loader</a>程序可以支持通过网络共享游戏。于是二话不说，在记忆卡里安装了最新的OpenPS2Loader 0.7版本，在我的atomsvr上创建了samba共享。使用USBUtil 2.0软件把游戏镜像灌到samba共享的目录，嘿嘿，果然可以免光盘启动游戏！这回省钱又省时间了！<br /><br />不过，默认的samba设置可能会导致游戏5分钟左右就死机，在遍寻网络，翻阅samba manual之后，终于修改设定后再也不死机了！现在PS2游戏机再也不需要光盘了！<br /><br />Samba的global设定需要修改如下：<br /><br /><br />
<div class="blog_code">
[global]<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; log level = 1<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; socket options = TCP_NODELAY IPTOS_LOWDELAY<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; read raw = yes<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; write raw = yes<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; oplocks = yes<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; max xmit = 65535<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dead time = 15<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; getwd cache = yes<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lpq cache = 30<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong> keep alive = 0</strong>
</div>
<br /><br />请特别注意加粗的 keep alive = 0，这是不死机的关键！<br /><br /><br /><br /><em><strong>Joggler</strong></em><br /><br />前两天刚收了一个<a href="http://yourfamily.o2.co.uk/o2familyjoggler/">Joggler</a>，500元。这个O2电信推出的基于x86架构的触摸终端，绝对值回票价，Intel Atom Z520的CPU，512M RAM, 内置1G闪存，可以扩展USB，GMA显示芯片，800x600电容触摸屏，默认跑OpenPeak Linux。我收了之后，在硬件方面还想做如下Mod：<br /><ul>
	<li>CPU和北桥芯片的散热片换成铝的，解决散热问题，O2太不厚道了，我第一次看到塑料散热片……</li>
	<li>在主板上做焊接手术，扩展出未用的USB口，解决内置闪存过小的问题。</li>
	<li>如果可能，加上蓝牙或GPS支持。</li>
	<li>通过USB和Arduino单片机连接。</li>
	<li>看看PATA口能不能用起来。</li>
</ul>
<div align="center"><a href="javascript:showpic(this,'http%3A//t1.gstatic.com/images%3Fq%3Dtbn%3AANd9GcRRL8vtdsWgj8fdGru4wfJ-EpHnuDYYg5bGBWu9qDqUSWYgKjT2');">
<img src="http://t1.gstatic.com/images?q=tbn:ANd9GcRRL8vtdsWgj8fdGru4wfJ-EpHnuDYYg5bGBWu9qDqUSWYgKjT2"></a><br />O2 Joggler<br /></div><br />对于应用方面，可能会有以下两个方向：<br /><ul>
	<li>Ubuntu Linux + 自制的Web界面做成家用信息终端，或者智能家居控制终端（通过Arduino控制家电）。</li>
	<li>车载电脑。</li>
</ul>
<br /><br /><em><strong>Amazon Kindle 3</strong></em><br /><br />我有个坏习惯，如果晚上睡觉前不看书，就会失眠……在我的SmartQ5被我爸征用后，我一直是用我的HTC Desire来看电子书的。可惜的是，电池实在不给力，我的Desire的ROM已经被优化到电力能够承受我两天的折磨，无奈每晚看一小时书的话，亮度调低，也会折腾掉至少半天待机的电量。所以买个专门看电子书的设备是势在必行，而手机看书，只能是应急而为了。<br /><br /><div align="center"><a href="javascript:showpic(this,'http%3A//g-ecx.images-amazon.com/images/G/01/kindle/shasta/photos/graphite-one-hand-300px._V186000090_.jpg');">
<img src="http://g-ecx.images-amazon.com/images/G/01/kindle/shasta/photos/graphite-one-hand-300px._V186000090_.jpg"></a><br />Amazon Kindle 3 Wifi<br /></div><br />平时从不纠结的我，由于经济压力对于买电子书一事变得非常纠结，虽然无奈囊中羞涩，但由于心中<a href="http://www.amazon.com/gp/product/B002Y27P3M/ref=s9_simh_gw_p349_d0_i1?pf_rd_m=ATVPDKIKX0DER&amp;pf_rd_s=center-2&amp;pf_rd_r=05XNC5V8N396M8D5RFZJ&amp;pf_rd_t=101&amp;pf_rd_p=470938631&amp;pf_rd_i=507846">Kindle</a>的草已经长得很茂盛了，以至于发展到最后每天上<a href="http://www.hi-pda.com/forum/forumdisplay.php?fid=6&amp;page=1">hi-pda论坛</a>YY一把kindle。这样的日子过了大半个月之后，终于有位兄弟要把自己买来不久的几乎全新的kindle 3 wifi出手卖掉。我终于忍不住了，二话不说，秒了～1050大洋收了一个几乎全新的Kindle 3外带一个高仿皮套。价格虽然依旧不给力，但是拿到手的Kindle那是非常的给力啊。有一次甚至于我认为是在看纸本的书，想去翻书页了……<br /><br />Kindle 3 也没摆脱折腾的命运，装了大家推荐的 <a href="http://www.duokan.com/">多看</a> 系统，果然看中文文档又给力不少，暂时的，其他就先不折腾了，看书先……<br /><br /><br /><br />以上，就是最近折腾的内容，如有变化，恕不另行通知……]]></description>
         <category>数码</category>
         <pubDate>Tue, 28 Dec 2010 23:03:04 +0900</pubDate>
      </item>
      <item>
         <title>Arduino笔记，数字/模拟输入</title>
         <link>http://wells.osall.com/blog/index.php?m=content&amp;p=1505&amp;uid=1</link>
         <description><![CDATA[在了解了如何通过arduino的数字端口来进行输出后，接着就该看看如何让arduino从外界获取信息，通过数字或模拟端口来进行输入了。<br /><br />arduino Duemilanove有14个数字端口（0-13），6个模拟端口(0-5)。所谓数字端口，其输入或输出的值只能是0和1也就是低电平和高电平两种；而模拟端口则能够输入10位的二进制值，也就是从0-1023，这是通过其端口的电压值与 0-5V （或AREF端口）之间进行比较得来的。<br /><br />在这篇文章中，将会通过两个实验来了解：<br /><ul>
	<li>如何制作/使用按钮输入数字信号</li>
	<li>如何读取模拟信号</li>
	<li>通过串口输出信息</li>
</ul>
<br />首先，第一个实验是按钮输入数字信号实验。需要如下实验器材：<br /><ul>
	<li>的确是个“好东西”的面包板</li>
	<li>轻触按钮</li>
	<li>1K欧姆电阻</li>
	<li>导线若干</li>
	<li>必不可少的arduino Duemilanove</li>
	<li>LED 发光二极管</li>
</ul>
<br />请按下图连接实验设备<br /><br />
<div class="blog_code">
*** 添加于2010-07-29<br /><strong><span style="color: rgb(255, 51, 51);">请接线前一定注意本注释。</span></strong><br />之前我一直有个误解，应该不止于我，很多很多使用arduino的人都有这样的误解，认为第13号数字端口在内部串联了一个限流电阻，因此可以直接将二极管插在13号数字端口和GND之间，不需要串联限流电阻。因为很多网上的教材都是这么写的。今天我仔细研究了Arduino Duemilanove的电路图之后发现我们大家<strong>都错了！</strong>在13号端口上连接的电阻是这样和L发光二极管连接的：<br /><br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; o 13号端口<br /> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; |<br /> GND--LED--/\/\/\-|<br /> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; |<br /> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; uC pin ATMEGA328引脚<br /><br />显而易见，这个电阻R7只是LED的上拉电阻，与13号端口上所外部连接的任何设备都没有关系。<strong><span style="color: rgb(255, 51, 51);">因此我建议所有在13号端口上连接的设备都必须串联限流电阻，否则如果长时间使用，将会有因为大电流而烧坏ATMega控制器的可能！！！</span></strong><br /><br /><strong>在本文以及后续的文章中，由于实验连接图提前画好，修改的话太过于麻烦，因此图上还是将发光二极管直插在13号数字端口，但是请实际操作的时候一定要串联限流电阻。<span style="color: rgb(255, 51, 51);">请一定注意！！！</span></strong><br /><br />关于造成误解的原因，据了解，应该来源于Arduino板子的一个早期版本Arduino-NG，这个版本的13号数字端口，的确有串联一个限流电阻，也许大家都是从那篇介绍NG的文章或书本学起，才导致了这样的一个普遍的误解。
</div><br /><div align="center"><a href="javascript:showpic(this,'../upload/1/Images/1_1275141510/P_1278856841_0.jpg');">
<img src="../upload/1/Images/1_1275141510/P_1278856841_0.jpg" alt="3_buttons" height="316" width="400"></a><br /></div><br />在图中可以看到，在13号数字端口连接了一个LED，而4/5/6三个数字端口则作为三个按钮的数字输入端。按钮模块是如何制作的？按钮其实就是一个接触开关，在开关的一端连接了+5V电源，另一端连接了一个1K欧的下拉电阻限流，在下拉电阻和开关之间，引出导线作为信号输入Arduino。电路图如下：<br />
<div class="blog_code">
<br />&nbsp;GND o-/\/\/-o---/ ---o +5V<br />&nbsp; &nbsp; &nbsp; &nbsp; 电阻&nbsp; |&nbsp; 开关<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; o <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 数据输入 <br /></div>
<br />不好意思，我懒得用图形软件画了，允许我偷个懒吧，用ASCII字符画电路图……能说明问题就好了<br /><br />这个实验的目的是按下连接端口4上的按钮，发光二极管闪一下，按下连接端口5的按钮，闪两下，按下连接端口6的按钮，闪三下。<br />实验代码如下：<br /><br />[code=c]<br />int LEDPin = 13;<br /><br />int Button_A = 4;<br />int Button_B = 5;<br />int Button_C = 6;<br /><br />void setup() {<br />&nbsp; pinMode(LEDPin, OUTPUT);<br />&nbsp; pinMode(Button_A, INPUT);<br />&nbsp; pinMode(Button_B, INPUT);<br />&nbsp; pinMode(Button_C, INPUT);<br />}<br /><br />void loop() {<br />&nbsp; <br />&nbsp; digitalWrite(LEDPin, LOW);<br />&nbsp; <br />&nbsp; if (digitalRead(Button_A)) {<br />&nbsp;&nbsp;&nbsp; digitalWrite(LEDPin, HIGH);<br />&nbsp;&nbsp;&nbsp; delay(100);<br />&nbsp;&nbsp;&nbsp; digitalWrite(LEDPin, LOW);<br />&nbsp;&nbsp;&nbsp; delay(2000);<br />&nbsp; }<br /><br />&nbsp; if (digitalRead(Button_B)) {<br />&nbsp;&nbsp;&nbsp; digitalWrite(LEDPin, HIGH);<br />&nbsp;&nbsp;&nbsp; delay(100);<br />&nbsp;&nbsp;&nbsp; digitalWrite(LEDPin, LOW);<br />&nbsp;&nbsp;&nbsp; delay(100);<br />&nbsp;&nbsp;&nbsp; digitalWrite(LEDPin, HIGH);<br />&nbsp;&nbsp;&nbsp; delay(100);<br />&nbsp;&nbsp;&nbsp; digitalWrite(LEDPin, LOW);<br />&nbsp;&nbsp;&nbsp; delay(2000);<br />&nbsp; }<br /><br />&nbsp; if (digitalRead(Button_C)) {<br />&nbsp;&nbsp;&nbsp; digitalWrite(LEDPin, HIGH);<br />&nbsp;&nbsp;&nbsp; delay(100);<br />&nbsp;&nbsp;&nbsp; digitalWrite(LEDPin, LOW);<br />&nbsp;&nbsp;&nbsp; delay(100);<br />&nbsp;&nbsp;&nbsp; digitalWrite(LEDPin, HIGH);<br />&nbsp;&nbsp;&nbsp; delay(100);<br />&nbsp;&nbsp;&nbsp; digitalWrite(LEDPin, LOW);<br />&nbsp;&nbsp;&nbsp; delay(100);<br />&nbsp;&nbsp;&nbsp; digitalWrite(LEDPin, HIGH);<br />&nbsp;&nbsp;&nbsp; delay(100);<br />&nbsp;&nbsp;&nbsp; digitalWrite(LEDPin, LOW);<br />&nbsp;&nbsp;&nbsp; delay(2000);<br />&nbsp; }<br />&nbsp;<br />&nbsp; delay(100); <br />}<br />[/code]<br /><br />代码非常容易理解，如果要使用数字输入，在代码中首先要在setup()函数中通过<em>pinMode(端口号, 模式)</em>函数将要输入的端口模式设置为INPUT。例如本例中的 <br /><em>pinMode(Button_A, INPUT);</em><br />在loop()函数中，通过<em>digitalRead(端口号)</em>函数来读取指定端口的电平值，返回值为HIGH或者LOW代表高电平或低电平，高电平HIGH的布尔值为true，低电平LOW的布尔值为false，因此可以用这个来进行判断是否按下按键。<br /><br />好了，运行一下试试:)<br /><br /><br /><br />第二个实验是通过模拟端口来读取信息。实验需要如下材料：<br /><ul>
	<li>手感不错的PS2摇杆模块</li>
	<li>真的真的非常好用的面包板</li>
	<li>导线若干</li>
	<li>少不了的Arduino Duemilanove</li>
</ul>
在这个实验中，将使用一个PS2手柄摇杆模块来进行输入。这个模块可以方便的从万能的淘宝买到。玩过PS2游戏机的人都知道，PS2手柄上的摇杆在X Y Z三个轴上都能够控制，在X和Y轴上是控制上下左右的方向，在游戏中还能通过控制摇杆的幅度来控制被控物体运行的速度，而在Z轴上，则是一个简单的类似按钮的输入，可以将摇杆按下，以触发一个事件。因此，这个PS2摇杆模块也一样，在X和Y轴上是模拟输入，能够获得摇杆被扳动的幅度值（0-1023），而在Z轴上则是一个数字输入，和前面实验中的按钮模块一样，通过高低电平来判断是否被按下。<br /><br />该模块的一共有五个针脚，分别是 GND接地(-)，+5V电源输入(+)，Z轴数字输出(B)，X轴模拟输出(X)和Y轴模拟输出(Y)。请按下图连接模块与Arduino Duemilanove。<br /><br /><div align="center"><a href="javascript:showpic(this,'../upload/1/Images/1_1275141510/P_1278856843_1.jpg');">
<img src="../upload/1/Images/1_1275141510/P_1278856843_1.jpg" alt="analog_Joystick" height="400" width="288"></a><br /></div><br />实验代码如下：<br /><br />[code=c]<br />int X = 0;&nbsp;&nbsp;&nbsp; // X axis<br />int Y = 1;&nbsp;&nbsp;&nbsp; // Y axis<br />int B = 12;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Button<br /><br />void setup() {<br />&nbsp; pinMode(B, INPUT);&nbsp; <br />&nbsp; Serial.begin(9600);<br />}<br /><br />void loop() {<br />&nbsp; int Xvalue=0;<br />&nbsp; int Yvalue=0;<br />&nbsp; int Bvalue=0;<br />&nbsp; <br />&nbsp; // read the value from the sensor:<br />&nbsp; Xvalue = analogRead(X);<br />&nbsp; Yvalue = analogRead(Y);<br />&nbsp; Bvalue = digitalRead(B);<br />&nbsp; <br />&nbsp; Serial.print("X: ");<br />&nbsp; Serial.println(Xvalue);<br />&nbsp; Serial.print("Y: ");<br />&nbsp; Serial.println(Yvalue);<br />&nbsp; Serial.print("Button: ");<br />&nbsp; Serial.println(Bvalue);<br />&nbsp; <br />&nbsp; delay(100);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />}<br />[/code]<br /><br />在代码开头还是按惯例定义引脚，模拟输入的0和1端口分别连接了X和Y轴的模拟输入，Z轴的数字输入被连接到了12号数字端口。<br />模拟端口与数字端口不同的是，不需要在setup()函数中声明输入输出，因为这六个端口仅仅是模拟输入端口，模拟输出则是使用方波的形式进行的，这个在谈及PWM驱动时会进一步说明。<br /><br />在setup()函数中，出现了一个新的语句，<em>Serial.begin(9600);</em> 。这一句表明以波特率9600打开了串口输入输出，Arduino可以通过RS232串口与其他设备，例如你的电脑，进行通讯。在arduino进行串口通讯时0和1数字端口将被占用，因为这两个端口正是串口通信所使用的Tx/Rx端口。如果你使用USB连接Arduino和你的电脑，那么设定好波特率后，可以使用串口软件与arduino进行通讯，看到它输出的值或者通过串口进行输入。这一切都是由Arduino板上的使USB转串口的FTDI232RL芯片完成的。在arduino IDE软件中，上传完代码后，只需要点击工具栏上最右面的串口图标就能打开串口通信界面查看Arduino的串口输出或者对其进行输入。<br /><br />在loop()函数中，可以很清晰地看到使用了<em>analogRead(模拟端口号)</em>这个函数来进行模拟端口信号的读取。这个函数将返回0到1023的整数型值。<br /><br />在接下来的语句中，可以看到使用了<em>Serial.print(值或字符串)</em>和<em>Serial.println(值或字符串)</em>两个函数来进行串口输出，这两个函数会将输入的值或字符串通过串口输出，如果你打开了串口软件，并且将arduino连接到电脑，你能够看到这些输出。这两个函数的区别是<em>Serial.print()</em>输出完后不会换行，下一次输出会紧接着输出，而<em>Serial.println()</em>函数在输出完后会输出一个换行符，下一次输出就会从新行开始。<br /><br />为了加深理解，还是建议大家上传代码到Arduino，打开Arduino IDE的串口调试窗口，拿起摇杆试一下手感吧:D]]></description>
         <category>Arduino</category>
         <pubDate>Thu, 29 Jul 2010 00:28:57 +0900</pubDate>
      </item>
      <item>
         <title>Arduino笔记，简单数字输出</title>
         <link>http://wells.osall.com/blog/index.php?m=content&amp;p=1498&amp;uid=1</link>
         <description><![CDATA[折腾<a href="http://www.arduino.cc">Arduino</a>也一个多月了，今天终于搞定了Arduino通过三个数字信号控制四个级联的<a href="http://pdfserv.maxim-ic.com/en/ds/MAX7219-MAX7221.pdf">MAX7219</a>芯片来驱动LED矩阵屏。想想从不知Arduino为何物到现在折腾它实现了各种各样的有趣的功能，有必要写点什么来记录学习的过程，免得以后又忘记。好记性不如烂笔头么:)。那么，作为第一篇笔记，我们不可免俗的从第13号数字端口的LED说起。<br /><br />在这篇笔记里，会通过实验说明如何使用数字端口进行输出。虽然说是从13号LED说起，但是我要更进一步，多了解一些，因此需要准备如下实验器材：<br /><ul>
	<li>Arduino Duemilanove 一块</li>
	<li>实验用面包板一块</li>
	<li>发光二极管（LED）两个</li>
	<li>1K欧电阻两个</li>
	<li>8欧姆扬声器一个</li>
	<li>导线若干</li>
</ul>
<br />以上器材请按下图（点击图片放大）来搭建实验环境（图片是我用开源软件<a href="http://fritzing.org/">Fritzing</a>画的，嘿嘿，很好用呢）。<br /><br /><div align="center"><a href="javascript:showpic(this,'../upload/1/Images/1_1275141510/P_1278856854_6.jpg');">
<img src="../upload/1/Images/1_1275141510/P_1278856854_6.jpg" alt="output_LED_speaker" height="336" width="400"></a><br /></div><br />这个实验环境，可以支持如下的两个实验：<br /><div align="left"><ul>
	<li>两个LED交替闪烁</li>
	<li>扬声器奏乐</li>
</ul>
</div><br />首先看第一个实验，两个LED交替闪烁。<br /><br />
<div class="blog_code">
*** 添加于2010-07-29<br /><strong><span style="color: rgb(255, 51, 51);">请一定注意本注释之后的段落中划线删减部分的修改。</span></strong><br />之前我一直有个误解，应该不止于我，很多很多使用arduino的人都有这样的误解，认为第13号数字端口在内部串联了一个限流电阻，因此可以直接将二极管插在13号数字端口和GND之间，不需要串联限流电阻。因为很多网上的教材都是这么写的。今天我仔细研究了Arduino Duemilanove的电路图之后发现我们大家<strong>都错了！</strong>在13号端口上连接的电阻是这样和L发光二极管连接的：<br /><br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; o 13号端口<br /> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; |<br /> GND--LED--/\/\/\-|<br /> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; |<br /> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; uC pin ATMEGA328引脚<br /><br />显而易见，这个电阻R7只是LED的上拉电阻，与13号端口上所外部连接的任何设备都没有关系。<strong><span style="color: rgb(255, 51, 51);">因此我建议所有在13号端口上连接的设备都必须串联限流电阻，否则如果长时间使用，将会有因为大电流而烧坏ATMega控制器的可能！！！</span></strong><br /><br /><strong>在本文以及后续的文章中，由于实验连接图提前画好，修改的话太过于麻烦，因此图上还是将发光二极管直插在13号数字端口，但是请实际操作的时候一定要串联限流电阻。<span style="color: rgb(255, 51, 51);">请一定注意！！！</span></strong><br /><br />关于造成误解的原因，据了解，应该来源于Arduino板子的一个早期版本Arduino-NG，这个版本的13号数字端口，的确有串联一个限流电阻，也许大家都是从那篇介绍NG的文章或书本学起，才导致了这样的一个普遍的误解。
</div>
<br /><br />两个LED分别接在Arduino的第9 和第13数字端口。不同的是，第9端口的LED还串联了一个1K欧的电阻，目的是限制最大电流，以免烧坏电路。<strike>而13号数字端口由于在Arduino内部已经串联了限流电阻，因此就不需要在连接电阻了（所有端口中，只有13号端口内部串联了限流电阻）</strike>。在接下来的实验中，对于13号端口上的LED，在闪烁的时候，Arduino板子上的L LED也会同时闪烁，这是因为L作为测试灯号是与13号数字端口并联了。另外需要注意的是在面包板接线时，注意LED的正负极，正极接数字端口，负极接地。<br /><br />实验代码如下：<br /><br />[code=c]<br />int ledPin1 =&nbsp; 9;&nbsp;&nbsp;&nbsp; // 数字端口9上连接的LED<br />int ledPin2 =&nbsp; 13;&nbsp;&nbsp;&nbsp; // 数字端口13上连接的LED<br /><br />void setup()&nbsp;&nbsp; {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp; // 将两个数字端口设置为输出模式<br />&nbsp; pinMode(ledPin1, OUTPUT);&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp; pinMode(ledPin2, OUTPUT);&nbsp;&nbsp;&nbsp;&nbsp; <br />}<br /><br />void loop()&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />{<br />&nbsp; digitalWrite(ledPin1, HIGH);&nbsp;&nbsp; // 数字端口9设置为高电平，点亮LED9<br />&nbsp; delay(1000);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 等待一秒<br />&nbsp; digitalWrite(ledPin1, LOW);&nbsp;&nbsp;&nbsp; // 数字端口9设置为低点平，关闭LED9<br />&nbsp; digitalWrite(ledPin2, HIGH);&nbsp;&nbsp; // 数字端口13设置为高电平，点亮LED13<br />&nbsp; delay(1000);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 等待一秒<br />&nbsp; digitalWrite(ledPin2, LOW);&nbsp;&nbsp;&nbsp; // 数字端口13设置为低电平，关闭LED13<br />}<br />[/code]<br /><br />在代码中，可以看到有两个函数，setup()和loop()，这是arduino执行代码所必需的两个函数。setup()函数是在代码一开始执行时被执行的，只会执行一次，一般来说在这个函数内，都会做一些初始化的动作。在这个例子中，执行的是将两个数字端口9和13都设置为输出模式。另一个函数loop()则是arduino执行时的主程序体，顾名思义，写在loop()函数内的动作，将被顺序的重复执行，直到arduino板子断电为止。在这个例子中，则是执行两个数字端口交替点亮LED的动作。<br /><br />这个例子改编自Arduino自带的Blink样例（增加了LED9）。在例子当中，使用了三个arduino函数。pinMode()，digitalWrite()和delay()。这三个函数的使用方法分别如下：<br /><ul>
	<li>pinMode(数字端口号, 模式)&nbsp; 数字端口号是arduino板上的端口号码，模式则有INPUT,OUTPUT两种（注意一定要大写），分别表示输入和输出。</li>
	<li>digitalWrite(数字端口号, 值)&nbsp; 数字端口号是arduino板上的端口号码，值则由于为数字端口，只有HIGH和LOW两种（注意一定要大写），分别表示高电平和低电平（1和0）。</li>
	<li>delay(毫秒数) 延时函数，毫秒数为需要等待的时间。</li>
</ul>
板子加电后，可以看到loop()函数内的语句控制两个LED灯交替闪烁，间隔为一秒。<br /><br />
第二个实验，则是通过Arduino控制的数字端口让扬声器奏乐。<br /><br />实验所需的扬声器通过数字端口4连接到了Arduino，同样的，串联了一个下拉电阻限流（理论上Arduino每个数字端口能输出的最大电流为40mA）。<br /><br />这个实验的代码来自于Arduino自带的toneMelody样例（将扬声器端口从8改为4了），可以在菜单中通过File &gt; Example &gt; Digital &gt; toneMelody来找到。代码如下。<br /><br />[code=c]<br />&nbsp;#include "pitches.h"<br /><br />// 旋律中的音符 C大调CDEFGAB=1234567，哈哈我音乐学的不错。<br />int melody[] = {<br />&nbsp; NOTE_C4, NOTE_G3,NOTE_G3, NOTE_A3, NOTE_G3,0, NOTE_B3, NOTE_C4};<br /><br />// 音符的节拍 4 = 四分之一拍, 8 = 八分之一拍, 等等<br />int noteDurations[] = {<br />&nbsp; 4, 8, 8, 4,4,4,4,4 };<br /><br />void setup() {<br />&nbsp; <br />&nbsp;&nbsp; for (int thisNote = 0; thisNote &lt; 8; thisNote++) {<br /><br />&nbsp;&nbsp;&nbsp; // 计算每个节拍的时间，以一个节拍一秒为例，四分之一拍就是1000/4毫秒，八分之一拍就是1000/8毫秒<br />&nbsp;&nbsp;&nbsp; int noteDuration = 1000/noteDurations[thisNote];<br />&nbsp;&nbsp;&nbsp; tone(4, melody[thisNote],noteDuration);<br /><br />&nbsp;&nbsp;&nbsp; // 每个音符间的停顿间隔，以该音符的130%为佳<br />&nbsp;&nbsp;&nbsp; int pauseBetweenNotes = noteDuration * 1.30;<br />&nbsp;&nbsp;&nbsp; delay(pauseBetweenNotes);<br />&nbsp; }<br />}<br /><br />void loop() {<br />&nbsp; // 不需要做任何事<br />}<br />[/code]<br /><br />这段代码一开头，便通过#include指令加载了pitches.h头文件，在这个文件里是对所有音符的频率进行了定义，在这里就不详细讲述了。<br />这段代码中有一个新的数字输出函数tone()。tone()函数有两种使用方法：<br /><ul>
	<li>tone(数字端口号, 频率)&nbsp; 这种使用方法，则是向指定的数字端口一直发送制定频率的方波，直到执行noTone()函数或者使用tone再次改变频率。</li>
	<li>tone(数字端口号, 频率, 发送时间）这种方法比上面的多了一个参数，指定了发送方波的时间，时间以毫秒为单位，到时自动停止发送信号，无需调用noTone()函数。</li>
</ul>
tone()函数能使用的数字端口号是有限制的，从3-13，其他有端口无法使用。<br /><br />另外，这段代码的特点是loop()函数为空，因为音乐只播放一次，因此在setup()函数中就完成了，loop()循环中就不需要做任何事情。<br /><br />板子加电后，Arduino会控制扬声器演奏一段音乐，只演奏一次。<br /><br />通过这两个例子，学习了数字端口的简单输出，现在想办法自己做个arduino电子版的hello world吧～]]></description>
         <category>Arduino</category>
         <pubDate>Mon, 12 Jul 2010 00:02:54 +0900</pubDate>
      </item>
      <item>
         <title>建立SmartQ5的编译环境</title>
         <link>http://wells.osall.com/blog/index.php?m=content&amp;p=1496&amp;uid=1</link>
         <description><![CDATA[其实这篇文章应该是在今年2月就要发表的，后来一偷懒就忘掉了。好记性不如烂笔头，幸亏当时记下来了，否则现在又忘得光光的了。现在贴在Blog上，以后万一想不起来，检索起来也就方便了。<br /><br />事情是这样开始的……（怎么跟说故事一样）话说SmartQ5这个玩意用起来还真不错，特别是做电子书。我这人有睡前看半小时书的习惯，之前的Zaurus现在的Q5，对于我来说，最喜欢的功能就是电子书了。可惜SmartQ5当时原系统的Firmware中带的<a href="http://www.fbreader.org">fbreader阅读器</a>的版本是0.8.17的，版本较低，虽然用着还算比较方便，但是和新的0.12.x的版本比起来，少了网络书屋等等功能，所以想自己编译一个新版本的。于是就自己费尽九牛二虎之力，用<a href="http://ymorin.is-a-geek.org/dokuwiki/projects/crosstool">crosstool-ng</a>搭建了一个交叉编译环境。不料某天在网上闲逛，看到了<a href="https://wiki.ubuntu.com/ARM/BuildEABIChroot">ubuntu的wiki上一篇文章</a>，发现原来使用EABIchroot来搭建编译环境要方便得多（虽然编译速度稍微慢一些）。<br /><br />在编译测试fbreader 0.12版本时，我发现fbreader在SmartQ5上的一些Bug，于是就与fbreader开发团队取得了联系，fbreader的Nikolay准备修复这些Bug，于是向我询问了为SmartQ5建立编译环境的方法，我就把我学来的使用EABI chroot建立编译环境的方法告诉了他。果然，没多久，<a href="http://www.fbreader.org/smartq/">为SmartQ5优化的fbreader</a>出炉了：）<br /><br />下面是使用linux创建SmartQ5编译环境的办法。<br /><br />如果要在你的x86电脑使用 eabi chroot 来编译软件，必须先从软件仓库安装 qemu-arm-static 包。<br /><br />
<div class="blog_code">
# sudo apt-get update<br />
# sudo apt-get install qemu-arm-static<br /><br />
</div>
然后使用内含的debootstrap包装脚本来创建 chroot 环境：<br /><br />
<div class="blog_code">
# build-arm-chroot karmic eabi-chroot<br />[sudo] password for ogra:<br />I: Retrieving Release<br />I: Retrieving Packages<br /><br />...<br /><br />I: Base system installed successfully.<br />arm-eabi chroot successfully created in eabi-chroot<br /># sudo chroot eabi-chroot<br />root@svr:/# uname -m<br />armv5tel<br />
</div><br />
安装qemu chroot之后，输入如下命令修改chroot环境的软件仓库的源到arm源：<br /><br />
<div class="blog_code">
# sudo chroot eabi-chroot<br /># sudo vi /etc/apt/sources.list<br />
</div><br />将文件修改成如下内容：<br /><br />
<div class="blog_code">
# karmic 9.10<br />deb http://ports.ubuntu.com/ karmic main restricted universe multiverse<br />deb-src http://ports.ubuntu.com/ karmic main restricted universe multiverse<br />
</div><br />
更新apt：<br /><br />
<div class="blog_code">
# sudo apt-get update<br />
</div>
<br />
安装编译所需的 build-essential等软件包：<br /><br />
<div class="blog_code"># sudo apt-get -y install build-essential libgtk2.0-dev <br />
</div><br />为了方便起见创建一个用于编译的环境变量文件 compile.env：<br /><br />
[code=bash]
############################################################<br />#&nbsp; Script to setup cross compile environment&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #<br />#&nbsp; for ARM-gnueabi cross compile environment&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #<br />############################################################<br />#&nbsp; Version&nbsp;&nbsp;&nbsp;&nbsp; : 0.3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #<br />#&nbsp; Author&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : Wells Wang &lt;wellswang(at)osall(dot)com&gt;&nbsp;&nbsp; #<br />#&nbsp; Date&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : 2009-11-13&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #<br />#&nbsp; Usage&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : source my.env&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #<br />############################################################<br /><br />export PREFIX=/usr/local<br />export LD_LIBRARY_PATH=${PREFIX}/lib:/usr/lib:/lib<br />export PKG_CONFIG_PATH=${PREFIX}/lib/pkgconfig:/usr/lib/pkgconfig<br />export LD_RUN_PATH=${LD_LIBRARY_PATH}<br />export CC=gcc<br />export CXX=g++<br />export AR=ar<br />export RANLIB=ranlib<br />export NM=nm<br />export AS=as<br />export LD=ld<br />export STRIP=strip<br />export READELF=readelf<br />export STRINGS=strings<br />export SIZE=size<br />export ADDR2LINE=addr2line<br />export GCJ=gcj<br />export CFLAGS="-O2 -mtune=arm1176jzf-s -mcpu=arm1176jzf-s -I${PREFIX}/include -I/usr/include -mfpu=vfp -mfloat-abi=softfp"<br />export CXXFLAGS=${CFLAGS}<br />export CPPFLAGS=${CFLAGS}<br />
[/code]
<br />以后如果要编译软件，在编译前可以使用如下命令导入编译环境参数：<br /><br />
<div class="blog_code"># source compile.env<br /></div><br />好啦，可以开始编译你要在Q5上使用的软件了。 Enjoy it~]]></description>
         <category>Zaurus / ARM</category>
         <pubDate>Sun, 20 Jun 2010 22:03:09 +0900</pubDate>
      </item>
      <item>
         <title>DIY，自制Arduino Duemilanove主控板</title>
         <link>http://wells.osall.com/blog/index.php?m=content&amp;p=1495&amp;uid=1</link>
         <description><![CDATA[EarthRunner项目已完成了大约1/3，机器人小车已经能自主避障运行，也能通过网页进行遥控动作。下一步的计划就是加上云台和无线摄像头，以便于能通过网页实时以小车的视野来观察环境。另外，还要打造一个遥控器，能够利用APC220来远程控制小车，让它能够脱离电脑进行远程的控制。<br /><br />为了打造遥控器，另外还需要再买一个Arduino主控板。不过看看淘宝的大多数卖家都卖100-160的价格，想想实在是不太值得。怎么说Arduino也是开源的硬件，那些拿着公板电路抄来的板子，怎么能够卖这么高呢。于是就想着自己买元件来DIY一个。从<a href="http://www.arduino.cc">Arduino网站</a>下载了<a href="http://arduino.cc/en/uploads/Main/arduino-duemilanove-reference-design.zip">Duemilanove的电路图和PCB版layout图</a>，把元件一个个列出来，就开始准备动工了。最难解决的是PCB问题，如果自己找人做的话，数量少成本会很高，还好淘宝上找到有同城卖家只卖5元一块。淘宝真是万能啊，于是找齐了其他元件，就准备开工啦。<br /><br /><div align="center"><a href="javascript:showpic(this,'../upload/1/Images/1_1275141510/P_1276527796_0.png');">
<img src="../upload/1/Images/1_1275141510/P_1276527796_0.png" height="259" width="400"></a><br /></div><br />元件清单：<br /><ul>
	<li>贴片电阻 1K： &nbsp;&nbsp; R4, R5, R6, R7, R8, R9</li>
	<li>贴片电阻 10K： &nbsp; R1, R10, R11</li>
	<li>贴片电容 22P： &nbsp; C2, C3</li>
	<li>贴片电容104M 0.1UF： &nbsp; C1, C4, C5, C8, C9, C10, C11, C12, C13</li>
	<li>贴片电解电容47uF,25V： &nbsp; C6, C7</li>
	<li>IC1 ATMEGA168 或 ATMEGA328</li>
	<li>IC2 FT232RL</li>
	<li>IC3 NDT2955</li>
	<li>IC4 MC33269D</li>
	<li>IC5 LM358D</li>
	<li>晶振 16MHz： Q2</li>
	<li>贴片保险丝 500mA： F1</li>
	<li>二极管： D1</li>
	<li>贴片发光二极管：绿色或红色共四个</li>
	<li>排针插座： 8P*2, 6P*2</li>
	<li>IC插座： 直列28针 一个</li>
	<li>按钮开关一个： S1</li>
	<li>2.1电源座一个</li>
	<li>方口USB 90度 插座一个</li>
</ul>
我从来没焊过贴片元件和集成块，焊这么精密的东西还是第一次，为了顺利焊接，还特地去买了0.8mm的焊锡丝。终于要动手了，决定把最困难的元件放在第一个焊接。实现USB转串口功能的FT232RL芯片是针脚最密集的IC，一旦挑战失败，剩下的工作也就不必进行了。<br /><br /><div align="center"><a href="javascript:showpic(this,'../upload/1/Images/1_1275141510/P_1276524235_0.jpg');">
<img src="../upload/1/Images/1_1275141510/P_1276524235_0.jpg" alt="P1000634" height="296" width="400"></a><br />5元买来的PCB空板<br /><br /><a href="javascript:showpic(this,'../upload/1/Images/1_1275141510/P_1276524254_1.jpg');">
<img src="../upload/1/Images/1_1275141510/P_1276524254_1.jpg" alt="P1000638" height="296" width="400"></a><br />在放大镜的帮助下，终于用一把尖头烙铁成功焊上FT232RL，这是我第一次焊接IC和贴片元件，不容易啊～～～<br /><br /><a href="javascript:showpic(this,'../upload/1/Images/1_1275141510/P_1276524292_2.jpg');">
<img src="../upload/1/Images/1_1275141510/P_1276524292_2.jpg" alt="P1000640" height="296" width="400"></a><br />有了前面的经验，后面就顺利多了，继续焊上了第二个IC<br /><br /><a href="javascript:showpic(this,'../upload/1/Images/1_1275141510/P_1276524309_3.jpg');">
<img src="../upload/1/Images/1_1275141510/P_1276524309_3.jpg" alt="P1000644" height="296" width="400"></a><br />虽然有点歪歪扭扭，但是终于所有贴片元件都基本焊接完成……<br /><br /><a href="javascript:showpic(this,'../upload/1/Images/1_1275141510/P_1276524326_4.jpg');">
<img src="../upload/1/Images/1_1275141510/P_1276524326_4.jpg" alt="P1000653" height="296" width="400"></a><br />全部焊接完成，电源插座我没有焊接，因为我不需要外接电源<br /><br /><a href="javascript:showpic(this,'../upload/1/Images/1_1275141510/P_1276524342_5.jpg');">
<img src="../upload/1/Images/1_1275141510/P_1276524342_5.jpg" alt="P1000655" height="296" width="400"></a><br />插上ATMEGA328PU 把这块板子作为 EarthRunner一号小车的主控板了:)<br /></div><br />在奋斗了2个半小时后，终于所有的焊接工作都全部完成，我把EarthRunner一号的程序刷进板子，安装在小车上，替换下淘宝买来的那块arduino主控板，经过测试，板子正常工作。终于，只花了67元的材料费用就DIY了一块Arduino Duemilanove主控板，虽然自己焊的有点歪歪扭扭（好歹是第一次焊贴片元件嘛～），但比起上次在淘宝花了159买的那块板子还是划算多了。<br /><br />另外，今天顺便改了下EarthRunner的代码，新增了一个扬声器。现在小车转弯时能够鸣笛了（左转、右转的笛声不同哦）。同时在小车上简单安装了无线摄像头，但是没有安装云台，视角只能是固定的。下一步就是要增加云台了，拭目以待吧。<br /><br /><div align="center"><a href="javascript:showpic(this,'../upload/1/Images/1_1275141510/P_1276524368_7.jpg');">
<img src="../upload/1/Images/1_1275141510/P_1276524368_7.jpg" alt="P1000658" height="400" width="248"></a><br />EarthRunner一号，v1.2<br /><br /><div align="left"><br />PS：有人反映说，没有详细介绍过Arduino Duemilanove，好吧，我就Copy/Paste一段吧：<br /><br />
<div class="blog_quote">
<h3>概述</h3>

<div align="center">
<img src="http://arduino.cc/en/uploads/Main/ArduinoDuemilanove.jpg" alt="" title=""></div><p>Arduino Duemilanove ("2009") 是一个基于ATmega168(<a linkindex="3" rel="nofollow" href="http://www.atmel.com/dyn/resources/prod_documents/doc2545.pdf" class="urllink">datasheet</a>)或者ATmega328(<a linkindex="3" rel="nofollow" href="http://www.atmel.com/dyn/resources/prod_documents/doc8161.pdf" class="urllink">datasheet</a>) 的微控制器板，有14路数字输入/输出,其中六路可作为PWM输出，6路模拟输入，一个16MHz晶振，一个USB连接器，一个电源插座，一个ICSP 座，和一个复位按钮。它已包括一个微控制器应有的一切，直接将它用USB线连上计算机或者用一个电源适配器给它供电，就可以开始使用了。</p>
<p>&nbsp;"Duemilanove" 在意大利语中是2009的意思，名字取自发布年份，Duemilanove目前是Arduino USB系列中的最新型号。</p>

<h3>电路设计参考</h3>
<ul>
	<li>EAGLE 文件: <a linkindex="3" rel="nofollow" href="http://arduino.cc/en/uploads/Main/arduino-duemilanove-reference-design.zip" class="urllink">arduino-duemilanove-reference-design.zip</a></li>
	<li>电路图: <a linkindex="4" rel="nofollow" href="http://arduino.cc/en/uploads/Main/arduino-duemilanove-schematic.pdf" class="urllink">arduino-duemilanove-schematic.pdf</a></li>
</ul>


<h3>总体参数</h3>
<table border="0">
<tbody>
<tr>
<td style="text-align: left;"><strong>微控制器</strong></td>
<td style="text-align: left;">ATmega168/ATmega328</td>
</tr>
<tr>
<td style="text-align: left;"><strong>操作电压</strong></td>
<td style="text-align: left;">5V</td>
</tr>
<tr>
<td style="text-align: left;"><strong>推荐输入电压</strong></td>
<td style="text-align: left;">7-12V</td>
</tr>
<tr>
<td style="text-align: left;"><strong>极限输入电压</strong></td>
<td style="text-align: left;">6-20V</td>
</tr>
<tr>
<td style="text-align: left;"><strong>数字I/O脚数</strong></td>
<td style="text-align: left;">14 ， 其中六路提供PWM输出</td>
</tr>
<tr>
<td style="text-align: left;"><strong>模拟输入脚数</strong></td>
<td style="text-align: left;">6</td>
</tr>
<tr>
<td style="text-align: left;"><strong>I/O脚直流电流</strong></td>
<td style="text-align: left;">40 mA</td>
</tr>
<tr>
<td style="text-align: left;"><strong>3.3伏脚的电流</strong></td>
<td style="text-align: left;">50 mA</td>
</tr>
<tr>
<td style="text-align: left;"><strong>闪存</strong></td>
<td style="text-align: left;">16 KB (ATmega168) or 32 KB (ATmega328) 
，其中2KB用于bootloader</td>
</tr>
<tr>
<td style="text-align: left;"><strong>SRAM</strong></td>
<td style="text-align: left;">1 KB (ATmega168) or 2 KB (ATmega328)</td>
</tr>
<tr>
<td style="text-align: left;"><strong>EEPROM</strong></td>
<td style="text-align: left;">512 bytes (ATmega168) or 1 KB (ATmega328)</td>
</tr>
<tr>
<td style="text-align: left;"><strong>时钟频率</strong></td>
<td style="text-align: left;">16 MHz</td>
</tr>
</tbody>
</table>

<h3></h3><h3><br />电源</h3>
<p>Arduino Duemilanove 可以由USB口或者外接电源供电，电源会自动切换。外部电源(非USB模式)可以是电源适配器或者电池，适配器可以用2.1毫米中心正极的插头接在Arduino板的电源插座上，由电池引出的电源线可以插在地（GND）脚和电源输入(POWER)的VIN脚。这块板子可以在外部电源6-20V之间工作，然而如果外部供电小于7V，那么5V的输出脚可能会达不到额定输出电压5V，如果输入电压超过12V，稳压器可能会过热，推荐的输入电压范围在7-12V.</p>
<p>电源针脚描述如下:</p>
<ul>
	<li><strong>VIN.</strong> Arduino板由外部供电时的电源输入脚（相对于USB供电），你可以经由此脚给Arduino供电，或者由外部电源适配器供电时，由此脚读取输入电压。<strong><br /></strong></li>
	<li><strong>5V.</strong> 经过稳压的电源，可以给微控制器或其它板上的器件供电，此电源可以来自VIN，或者来自USB电源或其他5V供电。</li>
	<li><strong>3V3.</strong> 由板上的FTDI芯片产生的3.3v电压，最大提供50ma电流。</li>
	<li><strong>GND.</strong> 接地. </li>
</ul>
<ul>
	
	
	
</ul>

<h3>存储</h3>
<p>ATmega168 有16K闪存来保存代码（其中2K用于BOOTLOADER），ATmega328有32K闪存，同样2K用于BOOTLOADER，ATmega168有 1K SRAM和512字节的EEPROM，可以由EEPROM库函数来读写，ATmega328有2K SRAM和1K EEPROM。</p>

<h3>输入输出</h3>
<p>14个数字脚每一个都可以用作输入输出，用pinMode(),digitalWrite和digitalRead()函数来操作。这些针脚的工作电压是5V，每一个都可以提供或者接受最大40mA的电流，并且有内置的上接电阻，默认处于断开状态，电阻值为20-50千欧，除此之外，一些脚有特别的用处：</p>

<ul>
	<li><strong>串口: 0 (RX) and 1 (TX).</strong> 用于接收（RX）和传送（TX）TTL串行数据，这两脚接在相应的FTDI芯片USB转到TTL串行芯片上。</li>
	
	<li><strong>外部中断: 2 and 3.</strong> 这两脚可以配置成中断触发，由外部低电平，上升和下降或者电平的变化，参见attachInterrupt函数。</li>
	<li><strong>PWM: 3, 5, 6, 9, 10和11.</strong> 
提供8位PWM输出，函数analogWrite()。&nbsp;
</li>
	<li><strong>SPI: 10 (SS), 11 (MOSI), 12 (MISO), 13 (SCK).</strong> 
这些脚用来支持SPI通信，虽然硬件支持这一特性，但目前在Arduino语言中无相应的函数提供这一操作。</li>
	<li><strong>LED: 13.</strong> 内置的LED，接在数字脚13上，此脚输出高电平时，LED点亮，否则熄灭。 </li>
</ul>
<p>Duemilanove 提供6路模拟输入，每一路输入解析值为10位（1024个可能值），默认的度量值从接地到5V，可以从AREF脚改变这一参考电压，通过函数analogReference()控制，并且其中某些脚有特殊用途。</p>

<ul>
	<li><strong>I<sup>2</sup>C: 4 (SDA) and 5 (SCL).</strong> 支持 I<sup>2</sup>C
 (TWI)通信，由库函数 <a linkindex="4" href="http://arduino.cc/en/Reference/Wire" class="wikilink">Wire library</a>提供支持。
 </li>
</ul>

<p>其它板上的针脚定义:</p>

<ul>
	<li><strong>AREF.</strong> 模拟输入的参考电压，能过analogReference()函数操作。&nbsp;
</li>
	<li><strong>Reset.</strong> 复位，将它设为低于电平来复位微控制器，典型应用是在模块将内部的复位键挡住后，在外部添加一个复位按钮连接到此脚。</li>
</ul>
<h3>通信</h3>
<p>Arduino Duemilanove 有大量的辅助程序来实现与计算机和其它Arduino板，或其它微控制器的通信，ATmega168和ATmega328提供UART TTL(5V)经针脚0（RX）和脚1（TX）的串行通信，板载的FT232RL将USB通信转换为串行通信，FTDI的驱动会在计算机上生成一个虚拟的串口。Arduino开发环境包括一个串口监视器，可以使简单的将数据发送到计算机，或者从计算机接受数据。当通过FTDI芯片进行串行通信时，Rx和Tx灯会闪烁。通过库函数 <a linkindex="5" rel="nofollow" href="http://www.arduino.cc/en/Reference/SoftwareSerial" class="urllink">SoftwareSerial
 </a>可以通过Deumilanove的任意数字I/O针脚进行串行通信。</p>

<p>ATmega168和ATmega328同样支持I2C和SPI协议，Arduino环境包含一个Wire库来简化I2C总线的使用，参见 <a linkindex="6" href="http://arduino.cc/en/Reference/Wire">相关文档</a> 。 如果想使用SPI协议，请参考ATmega168或者ATmega328的datasheet。</p>

<h3>编程</h3>
<p>Arduino Duemilanove 可以使用Arduino开发环境来编程(<a linkindex="7" href="http://arduino.cc/en/Main/Software">下载</a>) 在"工具&gt;板类型"菜单中选择相应的Arduino板。</p>
<p>ATmega168 或者 ATmega328 出厂时已烧录了bootloader，这样方便你上传新的代码而不必借用外部的编程器, 它使用STK500通讯协议 (<a linkindex="9" href="http://www.atmel.com/dyn/resources/prod_documents/doc2525.pdf">参考文
档</a>, <a linkindex="9" rel="nofollow" href="http://www.atmel.com/dyn/resources/prod_documents/avr061.zip" class="urllink">C</a><a linkindex="10" href="http://www.atmel.com/dyn/resources/prod_documents/avr061.zip">头文件</a>)。</p>

<p class="vspace">你也可以绕过bootload，直接使用ICSP来对微控制器编程，详细步骤请参考<a linkindex="11" href="http://arduino.cc/en/Hacking/Programmer">使用指南</a>。 </p>
<h3>自动（软件）复位</h3>
<p>在以前的版本中，上传程序前需要手工按一下复位按钮，而Duenilanove(2009)版本设计成可以通过计算机上的软件来进行复位。 FT232RL硬件上的一根控制线（DTR）已通过一个100NF的电容连接至ATmega168/ATmega328的复位脚，当此线电平下降，复位线电平下降足够的时间使得ATmega168或者ATmega328复位。Arduino环境使用这个特性简化了上传程序的过程，只需要点击“上传”按钮就可以了。这意味着由于DTR可以和上传动作很好的协调，从而使bootloader可以有比较短的超时时间。</p>

<p>这种设计还有其它的含义。当Duemilanove连接到运行MAC OS X或者 LINUX机器上的时候，在每次用软件连接到Arduino板时它都会自动复位.在此后的大约半秒内，bootloader是处于运行状态。bootloader虽然是设计成会自动忽略非法数据（除了上传代码之外的任意数据），在每次连接建立时，它还是会拦截送到板上的最初几个字节数据。因此如果一个在板上运行的小程序需要在第一次运行时接受配置数据，一定要保证和它通信的程序在连接建立后等待约一秒钟才开始发送数据。</p>

<p>Duemilanove 有一条特定的线路，可以被切断从而禁止自动复位。两面的焊点位置可以焊起来从而重新开启自动复位功能，这个点被标识为“RESET-EN”，你也可以用一个110欧的电阻连到5V电源来禁止自动复位，详情请见<a linkindex="12" href="http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1213719666/all">Arduino
论坛讨论区贴子</a> 。</p>

<h3>USB过流保护&nbsp;</h3>
<p>Arduino Duemilanove 有一个可复位的熔断器来保护计算机的USB口，防止短路或者过流。虽然大部分计算机都有它们内置的保护措施，熔断器还是可以提供额外的保护，如果连到USB口的电源超过500mA，它将自动断开，直到短路或者过流消除。</p>
<h3>物理参数</h3>
<p>PCB最大长度和宽度分别为2.7,2.1英寸（注：6.0cm,5.33cm）,包括USB座和电源插座可能会超过这个数值，三个螺丝孔用来将板子连接到机箱或者其它的表面，注意针脚7和8之间的距离是160mil，并不是其它针脚之间距离100mil的整数倍。</p>

<h3>如何念Duemilanove?</h3>
<p>下面是这块板子的名字的意大利语发音 <a linkindex="13" rel="nofollow" href="http://arduino.cc/en/uploads/Main/Arduino_Duemilanove.wav" class="urllink">WAV</a>, <a linkindex="14" rel="nofollow" href="http://arduino.cc/en/uploads/Main/Arduino_Duemilanove.ogg" class="urllink">OGG</a>, <a linkindex="15" rel="nofollow" href="http://arduino.cc/en/uploads/Main/Arduino_Duemilanove.mp3" class="urllink">MP3</a>, <a linkindex="16" rel="nofollow" href="http://arduino.cc/en/uploads/Main/Arduino_Duemilanove.flac" class="urllink">FLAC</a>, <a linkindex="17" rel="nofollow" href="http://arduino.cc/en/uploads/Main/Arduino_Duemilanove.wma" class="urllink">WMA <br /></a></p>
</div></div>
</div>]]></description>
         <category>Arduino</category>
         <pubDate>Mon, 14 Jun 2010 23:33:35 +0900</pubDate>
      </item>
      <item>
         <title>机器人EarthRunner一号开跑了～～～</title>
         <link>http://wells.osall.com/blog/index.php?m=content&amp;p=1493&amp;uid=1</link>
         <description><![CDATA[谭总最近搞了个自制直升飞机，虽然试飞以坠机收尾，但是足足成功升空20秒之多，总的来说第一步是非常成功的。谭总迈出第一步后，我也被这所谓的“电子艺术”所吸引，研究了三天，终于没能抵挡住诱惑，掉进了<a href="http://www.arduino.cc">arduino</a>的陷阱。<br /><br /><a href="http://www.arduino.cc">arduino</a>是一个开源的硬件平台，从硬件电路图到软件都是开源的。基于<a href="http://www.arduino.cc">arduino</a>，可以非常快速的开发出一系列的“电子艺术”交互产品，从感应输入器到自主机器人，到智能家电，真是无所不能。看了谭总的“<strong><em>谭氏四旋翼飞行器</em></strong>”（我命名的），再想到“坠机”的一刹那，想想飞机成本太高，风险太大，摔一次咱钱包里的花纸头就少几张，还是跟谭总配合，他搞空军我搞陆军吧。联合大作战，多么美好的童年时光啊。<br /><br />我比较懒，花了1000多买了现成的电路板，还有一个比赛用四驱机器人底盘，就不用自己烂电路板，用有机玻璃做外壳了……哈哈，淘宝真是好东西。<br /><br />过程以后慢慢说吧，还是看看今天一天的成果吧。整整一天，从硬件安装测试到代码设计，遇到了n个问题，解决了n个问题，终于我的机器人<strong><em> EarthRunner一号</em></strong> 能够自主运行啦，目前可以根据传感器来自主避开障碍前进，根据环境光线自主开灯，虽然功能不强，但基础已经打好，下一步就要加上无线遥控了。<br /><br /><div align="center"><a href="javascript:showpic(this,'../upload/1/Images/1_1275141510/P_1275141555_0.jpg');">
<img src="../upload/1/Images/1_1275141510/P_1275141555_0.jpg" alt="DSC_3897" height="296" width="400"></a><br /><a href="javascript:showpic(this,'../upload/1/Images/1_1275141510/P_1275141570_1.jpg');">
<img src="../upload/1/Images/1_1275141510/P_1275141570_1.jpg" alt="DSC_3898" height="296" width="400"></a><br />EarthRunner 一号<br /></div><br />
<div align="center">
<embed src="http://player.youku.com/player.php/sid/XMTc3Mjk4NjAw/v.swf" quality="high" allowscriptaccess="sameDomain" type="application/x-shockwave-flash" align="middle" height="400" width="480">
</div>
<br />自主避障代码如下：
<br /><br />[code=c]
<br /><br />int E1 = 5;<br />int M1 = 4;<br />int E2 = 6;<br />int M2 = 7;<br />int LightSensorPin = 0;<br />int LeftDistanceSensorPin = 9;<br />int RightDistanceSensorPin = 8;<br />int LEDPin = 13;<br />int spd = 200;<br /><br />void stop(void) {<br />&nbsp; analogWrite(E1,0);<br />&nbsp; analogWrite(E2,0);<br />}<br /><br />void forward(char a,char b) {<br />&nbsp; analogWrite (E1,a);<br />&nbsp; digitalWrite(M1,HIGH);<br />&nbsp; analogWrite (E2,b);<br />&nbsp; digitalWrite(M2,HIGH);<br />}<br /><br />void backward(char a,char b) {<br />&nbsp; analogWrite (E1,a);<br />&nbsp; digitalWrite(M1,LOW);<br />&nbsp; analogWrite (E2,b);<br />&nbsp; digitalWrite(M2,LOW);<br />}<br /><br />void turn_L(char a,char b) {<br />&nbsp; analogWrite (E1,a);<br />&nbsp; digitalWrite(M1,HIGH);<br />&nbsp; analogWrite (E2,b);<br />&nbsp; digitalWrite(M2,LOW);<br />}<br /><br />void turn_R(char a,char b) {<br />&nbsp; analogWrite (E1,a);<br />&nbsp; digitalWrite(M1,LOW);<br />&nbsp; analogWrite (E2,b);<br />&nbsp; digitalWrite(M2,HIGH);<br />}<br /><br />void checkEnv(){<br />&nbsp; int light,R_dist,L_dist;<br />&nbsp; <br />&nbsp; Serial.println("--- checkEnv ---");<br />&nbsp; <br />&nbsp; light=analogRead(LightSensorPin);&nbsp; //Read Light Sensor<br />&nbsp; Serial.print("Light Sensor: ");<br />&nbsp; Serial.println(light, DEC); //Print result to serial<br /><br />&nbsp; L_dist=digitalRead(LeftDistanceSensorPin); //Read Distance Sensor<br />&nbsp; Serial.print("LeftDistance Sensor: ");<br />&nbsp; Serial.println(L_dist, DEC); //Print result to serial<br /><br />&nbsp; R_dist=digitalRead(RightDistanceSensorPin); //Read Distance Sensor<br />&nbsp; Serial.print("RightDistance Sensor: ");<br />&nbsp; Serial.println(R_dist, DEC); //Print result to serial<br /><br />&nbsp; //If Light Sensor great than 400, light the LED<br />&nbsp; if (light &gt; 400) digitalWrite(LEDPin, HIGH);<br />&nbsp;&nbsp;&nbsp; else digitalWrite(LEDPin, LOW);<br />&nbsp;&nbsp;&nbsp; <br />&nbsp; if (!L_dist &amp;&amp; R_dist) // turn right<br />&nbsp;&nbsp;&nbsp; move(1);<br />&nbsp; else if (L_dist &amp;&amp; !R_dist) //turn left<br />&nbsp;&nbsp;&nbsp; move(0);<br />&nbsp; else if (!L_dist &amp;&amp; !R_dist) //random turn <br />&nbsp;&nbsp;&nbsp; move(random(2));<br />}<br /><br />int clearPath(){<br />&nbsp; int R_dist,L_dist;<br />&nbsp; Serial.println("--- clearPath ---");<br />&nbsp; L_dist=digitalRead(LeftDistanceSensorPin); //Read Distance Sensor<br />&nbsp; R_dist=digitalRead(RightDistanceSensorPin); //Read Distance Sensor<br />&nbsp; return (L_dist &amp;&amp; R_dist);<br />}<br /><br /><br />void move(int dir) {<br />&nbsp; int flag;<br /><br />&nbsp; Serial.println("--- move ---");<br />&nbsp; flag = clearPath();<br />&nbsp; while (!flag) {<br />&nbsp;&nbsp;&nbsp; if (dir) //right<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; turn_R(spd,spd);<br />&nbsp;&nbsp;&nbsp; else<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; turn_L(spd,spd);<br />&nbsp;&nbsp;&nbsp; delay (50);<br />&nbsp;&nbsp;&nbsp; flag=clearPath();<br />&nbsp; }<br />}<br /><br />void setup() {<br />&nbsp; pinMode(E1, OUTPUT);<br />&nbsp; pinMode(E2, OUTPUT);<br />&nbsp; pinMode(M1, OUTPUT);<br />&nbsp; pinMode(M2, OUTPUT);<br />&nbsp; pinMode(LeftDistanceSensorPin, INPUT);<br />&nbsp; pinMode(RightDistanceSensorPin, INPUT);<br />&nbsp; pinMode(LEDPin, OUTPUT);<br />&nbsp; Serial.begin(9600);<br />}<br /><br />void loop() {<br />&nbsp; Serial.println("*** Main ***");<br />&nbsp; forward(spd,spd);<br />&nbsp; checkEnv();<br />&nbsp; delay(100);<br />}<br />[/code]<br /><br />今天比较懒，下次再详细讲解机器人的设计和制作过程吧。<br /><br /><font class="C lh15"></font>]]></description>
         <category>Arduino</category>
         <pubDate>Sat, 29 May 2010 22:17:39 +0900</pubDate>
      </item>
      <item>
         <title>Forward: 爱国家不等于爱朝廷</title>
         <link>http://wells.osall.com/blog/index.php?m=content&amp;p=1486&amp;uid=1</link>
         <description><![CDATA[<a href="http://bbs.nfdaily.cn/forum-48-1.html" target="_blank">转自南方都市报</a><br /> 
2010-04-11 10:44<br /><br />

<div class="blog_quote">  
        
 <p style="margin: 0px 3px 15px;">　　<strong>■史鉴散照</strong></p>
<p style="margin: 0px 3px 15px;">　　据说法国波旁王朝的君主路易十四说过“朕即国家”的话，尽管全世界的君主都喜欢
专制，但很少有人会像路易十四那样露骨和无所顾忌。路易十四于1643—1715年在位，同时代的中国皇帝是康熙，康熙的心里想的未必不就是“朕即国
家”，但他显然比路易十四更具“中国特色”的“智慧”——— 经常作些仁君秀，既行专制之实，又享仁君之名。</p>
<p style="margin: 0px 3px 15px;">　　按照路易十四之后的法国启蒙思想家的“主权在民”思想，国家的主权属于人民，所
以不是“朕即国家”，而应该是法国人民说的“我们才是国家”。当然，这种思想观念是路易十四的时代之后才形成的。在路易十四的时代，世界上其实还没有多少
人能够区分君主、政府、国家的概念有什么不同。在中国，虽然先秦的孟子已有“民为贵，社稷次之，君为轻”的观念，但实际上秦汉以来的二千余年中，爱国即是
忠君，忠君亦即爱国，君主与国家在观念上还是混淆不清的。直到西方思想传入之后，中国人对国家、政府(朝廷)、君主的概念才逐渐形成清晰的现代认识，这其
中第一人当推梁启超，他是在经历戊戌变法失败流亡海外的痛苦之后，才获得这种认识的。</p>
<p style="margin: 0px 3px 15px;">　　梁启超指出，中国之所以积弱，根源之一就在于国人不能正确区分国家与朝廷的概
念，以致爱国心没有用在正确的地方。国家是什么？朝廷又是什么？“今夫国家者，全国人之公产也。朝廷者，一姓之私业也。国家之运祚甚长，而一姓之兴替甚
短。国家之面积甚大，而一姓之位置甚微。”中国有悠久的历史，唐虞夏商周、秦汉魏晋、宋齐梁陈隋唐、宋元明清，“此皆朝名也，而非国名也”。从殷族的商、
姬族的周，到嬴氏的秦、刘氏的汉、李氏的唐、赵氏的宋、朱氏的明，还有蒙古人的元、满人的清，它们都是一族一姓的朝廷，而不是国家，都是一族一姓的私业，
而非全体中国人的公产。然而，中国人常常将国家与朝廷混为一谈，梁启超认为，这是中国人的大患。</p>
<p style="margin: 0px 3px 15px;">　　国家和朝廷不分的不良后果，最明显的一点就是爱国变成爱朝廷，甚至变成爱领袖
——— 
君主。梁启超说：“试观二十四史所载，名臣名将，功业懿铄、声名彪炳者，舍翊助朝廷一姓之外，有所事事乎？其为我国民增一分之利益、完一分之义务乎？而全
国人民顾啧啧焉称之曰：此我国之英雄也。夫以一姓之家奴走狗，而冒一国英雄之名，国家之辱，莫此甚也！乃至舍家奴走狗之外，而数千年几无可称道之人，国民
之耻，更何如也！而我国四万万同胞，顾未尝以为辱焉，以为耻焉，则以误认朝廷为国家之理想，深入膏肓而不自知也。”二十四史中的那些将相们，他们为一姓之
功业杀人，以“万骨枯”换取自己的功名利禄，这本来与爱国无关，但却被各王朝树立为爱国的模范，而国人因不能正确区分爱国家与爱朝廷的差别而跟着礼敬之颂
扬之，实在是可悲可悯。</p>
<p style="margin: 0px 3px 15px;">　　比梁启超晚一些时候，陈独秀写过一篇题为《我们究竟应当不应当爱国？》的文章，
文中说：“要问我们应当不应当爱国，先要问国家是什么。原来国家不过是人民集合对外抵抗别人压迫的组织，对内调和人民纷争的机关。善人利用他可以抵抗异族
压迫，调和国内纷争；恶人利用他可以外而压迫异族，内而压迫人民。”所以，“若有人问：我们究竟应当不应当爱国？我们便大声答道：……我们爱的是国家为人
民谋幸福的国家，不是人民为国家做牺牲的国家。”</p>
<p style="margin: 0px 3px 15px;">　　国家的功能，如陈独秀所说，一是抵抗异族压迫，一是调和国内纷争，前者对外，后
者对内。调和国内纷争是就消极方面来说的，积极方面国家还需履行一定的公共职责，如救灾、赈济等。</p>
<p style="margin: 0px 3px 15px;">　　国家功能的实现，须通过政府去完成。如果政府能完成国家功能，国家就是“为人民
谋幸福的国家”；如果政府不能完成国家功能，国家则有可能成为“人民为国家做牺牲的国家”。人类历史实践中的普遍情况是，政府常常不能完成国家功能，或者
完成得很差，这样就有可能出现有政府等于无政府，甚至有政府还不如无政府的状况。</p>
<p style="margin: 0px 3px 15px;">　　地理环境决定了中国是一个水旱灾害频发的国家。有一项统计说，中国在民国前的
2270年中，见于官方报告的旱灾有1392次，水灾有1621次，可见年年有灾。因此，中国古代的政府最重要的一项公共职责便是领导抗灾，这可以说是政
府合法性的基础之一，灾异现象历来也是帝王们最关心的事。清代的皇帝还要求各省大员定时汇报雨水、收成、粮价等情况，以便随时了解各省灾情和民生，如出现
灾荒可以及时组织赈济、减免受灾地方的税赋。但是，从历史记载来看，受灾得不到及时救助的情况还是非常普遍。当大规模灾害出现而政府不能履行其职责时，灾
民为了生存就会铤而走险，如明末李自成等人领导的农民起义，其主要活动空间是在陕西、河南，原因即是两省大旱，而明政府却不能组织有效的赈济，使得灾民成
为流民，进而升级为暴民。</p>
<p style="margin: 0px 3px 15px;">　　一个社会，有许多涉及大范围、众多人群的公共事务是无法由其他社会组织去完成
的，而只能是由政府去完成。一旦政府不能履行其职责，社会就会无序，公共利益就会受到侵害。比如食品安全、公共卫生安全、环境保护之类的公共事务都要由政
府去完成。</p>
<p style="margin: 0px 3px 15px;">　　人类社会在发展过程中，曾经长期陷入一个难解的困境：即人们需要政府，但政府却
不能履行人们期待的外而抵抗异族压迫、内而提供公共服务的国家功能，在很多情况下还常常演化成一个与民争利、侵害民权的组织。要使政府尽职尽责，人民必须
有监督政府的权力，而最有效的监督方式是用投票的方式去选择政府的权力。人们有必要了解一个常识———即梁启超所说的国家不是朝廷(政府)，朝廷可换而国
家永存，人们应该爱的是国家而不是朝廷。</p>
<p style="margin: 0px 3px 15px;">　　◎ 洪振快 历史学者</p>
</div>]]></description>
         <category>生活</category>
         <pubDate>Wed, 14 Apr 2010 10:55:41 +0900</pubDate>
      </item>
      <item>
         <title>请大家学习中央的最新精神</title>
         <link>http://wells.osall.com/blog/index.php?m=content&amp;p=1483&amp;uid=1</link>
         <description><![CDATA[<span style="font-size: 10pt;" lang="ZH-CN">各位主编各位主管：</span> <br /><span style="font-size: 10pt;">&nbsp;</span> <br /><span style="font-size: 10pt;" lang="ZH-CN">谷</span><span style="font-size: 10pt; font-family: 'Verdana','sans-serif';">*</span><span style="font-size: 10pt;" lang="ZH-CN">歌已正式宣布退</span><span style="font-size: 10pt; font-family: 'Verdana','sans-serif';">*</span><span style="font-size: 10pt;" lang="ZH-CN">出中国市场，此事影响很大，由此引发的网友讨论也不仅仅限于商业层面，因此请各地近期严格注意以下内容管理要求：</span> 
<br /><span style="font-size: 10pt;">&nbsp;</span> <br /><span style="font-size: 10pt;" lang="ZH-CN">一、</span><span style="font-size: 10pt; font-family: 'verdana','sans-serif';" lang="ZH-CN"> </span><span style="font-size: 10pt;" lang="ZH-CN">新闻环节</span> <br /><span style="font-size: 10pt;">&nbsp;</span> <br /><span style="font-size: 10pt; font-family: 'Verdana','sans-serif';">1</span><span style="font-size: 10pt;" lang="ZH-CN">、</span><span style="font-size: 10pt; font-family: 'verdana','sans-serif';" lang="ZH-CN"> </span><span style="font-size: 10pt;" lang="ZH-CN">只能采用中央重点媒体（网站）的稿件，其他稿源不采用；</span> <br /><span style="font-size: 10pt;">&nbsp;</span> <br /><span style="font-size: 10pt; font-family: 'Verdana','sans-serif';">2</span><span style="font-size: 10pt;" lang="ZH-CN">、</span><span style="font-size: 10pt; font-family: 'verdana','sans-serif';" lang="ZH-CN"> </span><span style="font-size: 10pt;" lang="ZH-CN">转载不得修改标题；</span> <br /><span style="font-size: 10pt;">&nbsp;</span> <br /><span style="font-size: 10pt; font-family: 'Verdana','sans-serif';">3</span><span style="font-size: 10pt;" lang="ZH-CN">、</span><span style="font-size: 10pt; font-family: 'verdana','sans-serif';" lang="ZH-CN"> </span><span style="font-size: 10pt;" lang="ZH-CN">推荐新闻参考中央重点新闻网站；</span> <br /><span style="font-size: 10pt;">&nbsp;</span> <br /><span style="font-size: 10pt; font-family: 'Verdana','sans-serif';">4</span><span style="font-size: 10pt;" lang="ZH-CN">、</span><span style="font-size: 10pt; font-family: 'verdana','sans-serif';" lang="ZH-CN"> </span><span style="font-size: 10pt;" lang="ZH-CN">不做相关专题，不设置讨论议题，不展开相关调查；</span> <br /><span style="font-size: 10pt;">&nbsp;</span> <br /><span style="font-size: 10pt; font-family: 'Verdana','sans-serif';">5</span><span style="font-size: 10pt;" lang="ZH-CN">、</span><span style="font-size: 10pt; font-family: 'verdana','sans-serif';" lang="ZH-CN"> </span><span style="font-size: 10pt;" lang="ZH-CN">有关此事的专家学者访谈等节目必须事先报批，严禁擅自做此类节目；</span> 
<br /><span style="font-size: 10pt;">&nbsp;</span> <br /><span style="font-size: 10pt; font-family: 'Verdana','sans-serif';">6</span><span style="font-size: 10pt;" lang="ZH-CN">、</span><span style="font-size: 10pt; font-family: 'verdana','sans-serif';" lang="ZH-CN"> </span><span style="font-size: 10pt;" lang="ZH-CN">管理好新闻跟帖。</span> <br /><span style="font-size: 10pt;">&nbsp;</span> <br /><span style="font-size: 10pt;" lang="ZH-CN">二、</span><span style="font-size: 10pt; font-family: 'verdana','sans-serif';" lang="ZH-CN"> </span><span style="font-size: 10pt;" lang="ZH-CN">论坛博客等互动环节</span> <br /><span style="font-size: 10pt;">&nbsp;</span> <br /><span style="font-size: 10pt; font-family: 'Verdana','sans-serif';">1</span><span style="font-size: 10pt;" lang="ZH-CN">、</span><span style="font-size: 10pt; font-family: 'verdana','sans-serif';" lang="ZH-CN"> </span><span style="font-size: 10pt;" lang="ZH-CN">不得举办谷</span><span style="font-size: 10pt; font-family: 'Verdana','sans-serif';">*</span><span style="font-size: 10pt;" lang="ZH-CN">歌话题的讨论会、调查等；</span> <br /><span style="font-size: 10pt;">&nbsp;</span> <br /><span style="font-size: 10pt; font-family: 'Verdana','sans-serif';">2</span><span style="font-size: 10pt;" lang="ZH-CN">、</span><span style="font-size: 10pt; font-family: 'verdana','sans-serif';" lang="ZH-CN"> </span><span style="font-size: 10pt;" lang="ZH-CN">互动环节不推荐、不置顶相关议题和评论文章；</span> <br /><span style="font-size: 10pt;">&nbsp;</span> <br /><span style="font-size: 10pt; font-family: 'Verdana','sans-serif';">3</span><span style="font-size: 10pt;" lang="ZH-CN">、</span><span style="font-size: 10pt; font-family: 'verdana','sans-serif';" lang="ZH-CN"> </span><span style="font-size: 10pt;" lang="ZH-CN">请各地清理借此事攻击党、国家、政府部门、互联网相关政策的文字、图片和音视频等；</span> <br /><span style="font-size: 10pt;">&nbsp;</span> <br /><span style="font-size: 10pt; font-family: 'Verdana','sans-serif';">4</span><span style="font-size: 10pt;" lang="ZH-CN">、</span><span style="font-size: 10pt; font-family: 'verdana','sans-serif';" lang="ZH-CN"> </span><span style="font-size: 10pt;" lang="ZH-CN">请各地清理声援谷</span><span style="font-size: 10pt; font-family: 'Verdana','sans-serif';">*</span><span style="font-size: 10pt;" lang="ZH-CN">歌、给谷</span><span style="font-size: 10pt; font-family: 'Verdana','sans-serif';">*</span><span style="font-size: 10pt;" lang="ZH-CN">歌献花、挽留谷</span><span style="font-size: 10pt; font-family: 'Verdana','sans-serif';">*</span><span style="font-size: 10pt;" lang="ZH-CN">歌、为谷</span><span style="font-size: 10pt; font-family: 'Verdana','sans-serif';">*</span><span style="font-size: 10pt;" lang="ZH-CN">歌叫好等跟政府政策唱反调的文字、图片和音视频等；</span> <br /><span style="font-size: 10pt;">&nbsp;</span> <br /><span style="font-size: 10pt; font-family: 'Verdana','sans-serif';">5</span><span style="font-size: 10pt;" lang="ZH-CN">、</span><span style="font-size: 10pt; font-family: 'verdana','sans-serif';" lang="ZH-CN"> </span><span style="font-size: 10pt;" lang="ZH-CN">有关谷</span><span style="font-size: 10pt; font-family: 'Verdana','sans-serif';">*</span><span style="font-size: 10pt;" lang="ZH-CN">歌的话题要管理好跟帖、评论、留言等互动信息；</span> <br /><span style="font-size: 10pt;">&nbsp;</span> <br /><span style="font-size: 10pt; font-family: 'Verdana','sans-serif';">6</span><span style="font-size: 10pt;" lang="ZH-CN">、</span><span style="font-size: 10pt; font-family: 'verdana','sans-serif';" lang="ZH-CN"> </span><span style="font-size: 10pt;" lang="ZH-CN">请各地主管近期派专人监控谷</span><span style="font-size: 10pt; font-family: 'Verdana','sans-serif';">*</span><span style="font-size: 10pt;" lang="ZH-CN">歌相关信息，如有群体性事件信息，请及时上报；</span> <br /><span style="font-size: 10pt;">&nbsp;</span> <br /><span style="font-size: 10pt;" lang="ZH-CN">请监控组近期严格按照上述监控方向进行监控，发现问题及时跟各环节沟通</span>]]></description>
         <category>生活</category>
         <pubDate>Wed, 24 Mar 2010 14:41:12 +0900</pubDate>
      </item>
      <item>
         <title>Forward: 那些有中国特色的自创英文单词</title>
         <link>http://wells.osall.com/blog/index.php?m=content&amp;p=1481&amp;uid=1</link>
         <description><![CDATA[<p>
	网友群体创作<br />
	<span style="font-size: small;"><br />
	<span><span><strong>Smilence 笑而不语</strong></span></span></span></p>
<p><strong>	</strong>vi. When you are expecting some answers from your Chinese 
audience, you may just get a mysterious smile and their silence only. <br />
	动词 当你期望从中国听众那里获得一些回答的时候，你只得到了神秘的微笑和他们的沉默。 </p>
<p>	n. the facial expression with smile while keeping ones mouth shut. <br />
	名词 笑而不语的表情 </p>
<p>	ie. Once asked about what happened after July, 5th, 2009 in 
Xinjiang, the western province of China, many Uygurs smilenced. <br />
	例句：当被问及新疆七·五事件之后发生了什么，许多维族人笑而不语。 </p>
<p>	<strong>Democrazy 民主妄想</strong></p>
<p>	n. Democrazy <span>is an illusional system of government in which 
people choose their rulers by voting for them in elections, which only 
exists in few Chinese imagination.<br />
	名词 极少数中国人所想象的由人民通过投票来选择领导者的一种妄想中的制度。</span></p>
<p>	ie. In the mysterious land like China, the cure for democrazy, a 
dangerous sickness can be found in mental-illness hospitals or prisons.<br />
	例句：在中国这片神奇的土地上，要治疗民主妄想这种危险疾病的方法就是进精神病医院或监狱。<br />
	<br />
	<strong>Togayther 终成眷属</strong></p>
<p>	<span title="Part-of-speech">adverb</span>:be with each other no 
matter what<br />
	无论怎样在一起</p>
<p>	ie. They met each other in a Chinese university campus; they have 
been togayther finally after graduation and going abroad.<br />
	例句：他们在一所中国的大学校园里相遇，他们终于在毕业出国后终成眷属。</p>
<p>	<strong>Freedamn 自由 </strong></p>
<p>	n. <span>Once you think you can do what you want to do, you are also
 damned in Malegebi.<br />
	一旦你以为自己可以想做什么就做什么，你在马勒戈壁也就玩完了。</span></p>
<p>	ie. Life is dear, love is dearer. Both can be given up; then all you
 have is freedamn.<br />
	<span><span><span>例句：</span></span></span>生命诚可贵，爱情价更高，二者均已抛，自由也未到。<span id="more-1646"></span> <br />
	<br />
	<strong>Shitizen P民</strong></p>
<p>	n. <span>a shitizen of a particular country like China is legally 
accepted as belonging to that country without any right of citizen.<br />
	P民是在特定的国家，如中国，在法律上被认定属于这个国家但没有任何公民权利的“公民”。</span></p>
<p>	ie. "I'm a senior official as your mayor, and you are only a 
shitizen!"quote from a high-rank drunk Chinese official, Mr. Lin.<br />
	中国的林先生，一位高级官员在酒后说：“我和你们市长一个级别，你就是个P民！”</p>
<p>	<strong>Divoice 离婚宣言</strong></p>
<p>	n. an announcement made for divorce<br />
	为离婚而发表的声明</p>
<p>	ie. "I am so happy to divorce with you. And I wish you and your 
Xiaosan a merry marriage like ours."That's a divoice from a woman who 
managed to leave her ex-husband almost nothing.<br />
	例句：“我很高兴与你离婚。我祝你和你的小三的婚姻如我们曾经那样的幸福。”这是一位妇女成功地让她的前夫“净身出户”之后的离婚宣言。</p>
<p>	<strong>Animale 男人天性</strong></p>
<p>	n. the basic instinct of the species called "male"<br />
	被称为“男人”这一种群的本能</p>
<p>	ie. Tiger Woods didn't do anything wrong but showing his animale.<br />
	例句：老虎·伍兹除了展示了一下男人天性之外，什么也没做错。</p>
<p>	<strong>Amerryca 享乐国</strong></p>
<p>	<span><span>n. A country where people enjoy 70% energy supply and 
asking others to cut <span>carbon emission</span>.<br />
	一个自己享用了全球70%的能源供给却要求别的国家减少碳排放量的国家<br />
	</span></span><br />
	ie. If you were elected in Amerryca, you would be a war president and 
Nobel peace prize winner at the same time too.<br />
	例句：如果你在享乐国当选了，你也能同时成为战时总统和诺贝尔和平奖获得者。<br />
	<b><br />
	Innernet 内联网</b></p>
<p>	n. <span>a restricted computer network connecting other approved 
networks and computers in certain regions or countries like China, Iran,
 Vietnam etc.<br />
	在某些特定的地区或国家，如中国、伊朗、越南等，仅与被批准的通信网络和电脑相联的网络</span></p>
<p>	ie. "<span><span><span><span>What is <span><span><span>Yake Lizard</span></span></span>
 what is <span><span><span><span><span><span><span>Yake Lizard</span></span></span></span></span></span></span>,
 ah</span></span></span></span>? Innernet is Yake Lizard!" “什么亚克蜥？啊 
什么亚克蜥？内联网就是亚克蜥！”<br />
	Please refer to this article for more 
details:请阅读下文获得更多信息：本文中译译者即将推出《泰晤士报：中国的互联网被神秘动物作弄》</p>
<h2>
	<span style="font-size: small;"><span><span><span><a linkindex="63" href="http://www.timesonline.co.uk/tol/news/world/asia/article7035263.ece" target="_blank">Chinese censors tormented by mythical animal – Times 
Online </a></span></span></span></span></h2>
<p>
	<span style="font-size: small;"><span><span><span><span><strong>Yakshit 亚克蜥</strong></span></span></span></span></span></p>
<p>	n. abbreviation of Yake Lizard mentioned above<br />
	亚克蜥的缩写</p>
<p>	ie. "What is yakshit what is <span><span><span><span>yakshit</span></span></span></span>,
 ah<br />
	The CPC Central Committee’s policies are <span><span><span><span>yakshit</span></span></span></span>."<br />
	"什么亚克蜥？什么亚克蜥？啊<br />
	党的政策亚克蜥。"</p>
<p>	Translation of the full lyric of the hot song played on the show of 
Spring Festival for the year of tiger.<br />
	虎年春节联欢晚会上的热门歌曲《亚克蜥》全文歌词英译，by@ChinaGeeks见下：</p>
<h2>
	<span style="font-size: small;"><span><span><span><span><a linkindex="64" href="http://sun-zoo.com/chinageeks/2010/02/17/yakexi-the-new-years-hottest-internet-slang/" target="_blank">Yakshit: The New Year’s Hottest Internet Slang?</a></span></span></span></span></span></h2>
<p>
	<span style="font-size: small;"><span><span><strong>Departyment 有关部门</strong></span></span></span></p>
<p>	n. The most mysterious department in China, which is in charge of 
almost everything and you can never find it when needed.<br />
	最为神秘的中国部门，它主管几乎所有的事，但你永远无法找到它</p>
<p>	ie. When google said it wants to negotiate with Chinese departyment 
about its threat of pulling out of China, it found that there is no such
 a departyment.<br />
	当谷歌说要和中国的有关部门谈判撤出中国的威胁时，它发现它找不到这个“有关部门”。</p>
<p>	<strong>Suihide 躲猫猫</strong></p>
<p>	v. kill oneself by playing seek-and-hide game<br />
	躲猫猫式自杀</p>
<p>	ie. The word suihide is invented from the experience of Mr. Qiaoming
 Li ,who was found dead after he was put into custody more than 10 days 
for his cutting a tree on Kuming city, Yunnan province. The initial 
report issued by the police said he fell down when playing a 
hide-and-seek game during the custody along with other prisoners.</p>
<p>	
“躲猫猫”一词来源于李荞明的经历，他因涉嫌砍伐了一颗云南省昆明市的树木而被拘禁，在拘禁十天后他被发现死亡。警方出具的最早的报告称他是在拘留所里和
 其他犯人玩“躲猫猫”游戏时意外身亡。</p>
<p>	<strong>Don’train 动车</strong></p>
<p>	v. the advanced high-speed train which costs more than average 
Chinese can afford.<br />
	大多数的中国人乘不起的先进的高速列车</p>
<p>	ie. When they were told that most of migrant works cannot afford go 
back to their hometowns for the Spring Festival reunion by airplane, the
 officials responded, "Now they have the option to take Don'train."<br />
	当被告知多数的农民工没钱乘飞机回家过年时，官员们的回答是“现在他们可以乘动车嘛！”<br />
	<b><br />
	Corpspend 捞尸费 </b></p>
<p>	n. the fare you are supposed to pay for others to save your corpse 
after you die.<br />
	你在死后应付给捞尸者的费用</p>
<p>	ie. If you can avoid being fished when you are alive, and save most 
of the corpspend, you are definitely a successful shitizen!<br />
	如果活着的时候你能逃过被“钓鱼”，死后又能省下大部分的“捞尸费”，你绝对是一名成功的P民！</p>
<p>	Please refer to the following for details: 请点击下面的报道了解更多详情。<br />
	<span style="font-family: Verdana;"><br />
	<b><a linkindex="65" href="http://www.zonaeuropa.com/20091107_1.htm" target="_blank" title="Three Teens Drowned In Jingzhou">Three Teens 
Drowned In Jingzhou</a></b></span></p>
<p>	<strong>Jokarlist 妓者</strong></p>
<p>	n. <span>a person whose job is to collect and write false stories 
for newspapers, magazines, radio or television and make them not as much
 as jokes.<br />
	一名为报纸、杂志、广播或电视制造虚假消息，并使它们显得不那么象笑话并以此为职业的人</span></p>
<p>	ie. Every jokarlist make such statement when they start their 
professional life, "I swear that in my professional life, I will write 
only for those who give me tips and make sure nobody would be pissed off
 by my reports."<br />
	每位妓者在开始其职业生涯时都要做如下声明：“我宣誓，我仅为那些给我红包的人写作，并确保无人将因为我的报道而发怒。”<br />
	<br />
	<strong>Vegeteal 偷菜</strong></p>
<p>	v. the most popular on-line game in China which everyone with IQ 
above 30 can play.<br />
	任何智商在30以上的人都可以玩的中国最流行的网络游戏。</p>
<p>	ie. Netizens in Xinjiang have paid cash for friends out of the 
province to continue play vegeteal for over half a year, and the market 
demand even created related jobs.<br />
	新疆网民向外省的朋友付费来持续玩偷菜游戏超过半年，这种需求甚至创造出了相关的工作岗位。</p>
<p>	Related reports相关报道:</p>
<p>	<a linkindex="66" href="http://www.nytimes.com/2010/02/16/opinion/16iht-edmozur.html" target="_blank" title="NYT：China's Self-Defeating Censorship">NYT：China's
 Self-Defeating Censorship</a><br />
	全文中译：<a linkindex="67" href="http://docs.google.com/leaf?id=0AS6FTLgcweU5ZGNjODZ4cXJfOWNwZHdyNWcy&amp;sort=moddate&amp;layout=list&amp;num=50" target="_blank" title="纽约时报：中国的网络审查适得其反">纽约时报：中国的网络审查适得其反</a></p>
<p>	<span><span><span style="font-size: small;"><strong>Chinsumer 中国消费者 </strong></span></span></span></p>
<p>	n. Chinese people whose spending can save China, America, EU and 
Taiwan from financial crisis at same time<br />
	那些可以在金融危机中同时拉动中国、美国、欧盟和台湾内需的中国人</p>
<p>	ie. Why do we need to export any value to be a superpower? As long 
as we can export Chinsumers, nobody would look down upon us. <br />
	为什么我们需要输出价值观才能成为强国？只要我们能输出中国消费者，就没有人会小看我们。</p>
<p>	<span style="font-size: small;"><strong>Sexretary 秘书 </strong></span></p>
<p>	n. Assistant who helps her boss whenever and whatever he needs.<br />
	帮助老板满足任何时间任何需要的助手</p>
<p>	ie. Bill Clinton, as any successful animale, has a wonderful wife 
and a dozen sexretaries.<br />
	比尔·克林顿，作为一名成功的男人，有一名出色的太太和一打秘书。<br />
	<b><br />
	Canclensor 审查</b></p>
<p>	v. A protective action made by Big brother who always takes care of 
you with your own money, for example, they help delete inappropriate 
on-line content before you can get access.<br />
	一种由老大哥做出的保护性行动，由他代表你用你自己的钱来照顾你，比如说，删除不健康的网上内容。</p>
<p>	ie. <span><span><span><span>"What is yakshit what is <span><span><span><span>yakshit</span></span></span></span>,
 ah<br />
	The canclensor is <span><span><span><span>yakshit</span></span></span></span>."<br />
	<span><span><span>“什么亚克蜥？啊 什么亚克蜥？内容审查亚克蜥！”</span></span></span><br />
	</span></span></span></span><br />
	<span style="font-size: small;"><strong>Carass 轻拂菊花</strong></span></p>
<p>	v. the super treatment usually only available to high-rank officials
 in China<br />
	一种通常只有高级别“人民公仆”才能获得的超级待遇</p>
<p>	ie. Mr. Xilai Bo, the party boss of Chongqing city, was carassed 
because of his "Cracking-Organized-Crime" Campaign through a special 
song created and dedicated to him —— The Song of Xilai<br />
	薄熙来，重庆市的党领导，因轰轰烈烈的“打黑行动”而成为一首轻拂菊花的颂歌《熙来之歌》里的主角。</p>
<p>	<span style="font-size: small;"><strong><span><span>Emotionormal 情绪稳定</span></span></strong></span></p>
<p>	adj. being calm and reasonable, usually with the smilence expression<br />
	非常平静和讲理的心态，通常此时当事人会笑而不语。</p>
<p>	ie. After Yangjia's execution, his mother was reported emotionormal 
from the mental-illness hospital, according to state-owned media.<br />
	在杨佳被处决后，国营媒体说，他的妈妈在精神病院里情绪稳定。</p>
<p>	<span style="font-size: small;"><strong>Harmany 河蟹</strong></span></p>
<p>	adj. the stable situation where everybody is emotionormal and there 
is no sign of unrest at all<br />
	每个人都情绪稳定，没有任何群体性事件迹象的美好状态</p>
<p>	ie. We have been in a harmany society for too long to remember what 
is harmony.<br />
	我们在一个河蟹的社会呆得太久已经忘记了什么是真正的和谐。</p>
<p>	<span style="font-size: x-small;"><br />
	来源说明：本文1.0版本来源译者的志愿翻译者团队及网友。欢迎来信增加更多语种的翻译版本，或增加更多的“中国自创英文单词”。email2: 
xiaomi2020[at]gmail.com</span></p>
<p>	收录说明：本文已经收录到“译者文集”中，同时进入“<span style="font-size: x-small;">最新消息”、 “</span><span style="font-size: x-small;">译者频道—看中国”、</span><span style="font-size: x-small;">“零星其他”、“群体创作”索引。</span><br />
	&nbsp;<i>©译者遵守<a linkindex="68" href="http://creativecommons.org/licenses/by-nc-sa/2.5/cn/" target="_blank" title="CC协议2.5">CC协议2.5</a>您可以自由复制、发行、展览、表演、放映、广播或通过信息网络
传播，创作演绎本作品。惟须遵守下 列条件：署名，非商业性使用，相同方式共享。</i>
</p>
<div style="clear: both;">
<h3>著作权信息（站外使用本文请保留以下内容）</h3>
<hr size="2">
<table width="100%">
<tbody>
<tr>
<td>文章作者：<a linkindex="69" href="http://xirang.us/author/wknet1988">如影隨風
Ace</a><br />原始站点：<a linkindex="70" title="嘻来嚷往" href="http://xirang.us/" target="_self">嘻来嚷往 – IF YOU SEE SOMETHING, SAY SOMETHING.</a><br />原文标题：那
些有中国特色的自创英文单词<br />发表日期：2010年03月01日<br />原文链接：<a linkindex="71" href="http://xirang.us/2010/03/words">http://xirang.us/2010/03/words</a></td>
<td class="author_img"><center>
<img alt="" src="http://www.gravatar.com/avatar/cdb4e33b03a8154bfd7e6cd321fa959b?s=100&amp;d=http%3A%2F%2Fwww.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D100&amp;r=R" class="avatar avatar-100 photo" height="100" width="100"></center></td>
</tr>
<tr>
<td>版权协议：本作品采用<a linkindex="72" rel="license" href="http://creativecommons.org/licenses/by-nc-sa/2.5/cn/" target="_blank">知识共享署名-非商业性使用-相同方式共享 2.5 中国大陆许可协议</a>进行许可，作品中的文字和图像若非明确指
出著作权归属则均受到该协议<a linkindex="73" title="知识共享协议法律文本" href="http://creativecommons.org/licenses/by-nc-sa/2.5/cn/legalcode" target="_blank">法律文本</a>的保护。站外使用请严格遵守协议，<a linkindex="74" href="http://xirang.us/" target="_self">嘻来嚷往</a>站保留诉诸法律的权利！如有异议请与站长<a linkindex="75" title="联系我们" href="http://xirang.us/affairs" target="_self">联系</a>。</td>
<td><center>
<img src="http://i.creativecommons.org/l/by-nc-sa/2.5/cn/88x31.png" alt="BY-NC-SA"></center></td>
</tr>
</tbody>
</table>
<hr size="2"></div>]]></description>
         <category>生活</category>
         <pubDate>Wed, 03 Mar 2010 19:51:35 +0900</pubDate>
      </item>
      <item>
         <title>Seasonable Snow, 瑞雪兆丰年</title>
         <link>http://wells.osall.com/blog/index.php?m=content&amp;p=1479&amp;uid=1</link>
         <description><![CDATA[牛儿走了，虎子来了。我也不可免俗的来写个拜年贴。最近事情挺多，很久没有更新，被投诉了很多回，借这个机会也算挽回点面子。<br /><br /><div align="center"><a href="javascript:showpic(this,'../upload/1/Images/1_1189873388/P_1266160934_20.jpg');">
<img src="../upload/1/Images/1_1189873388/P_1266160934_20.jpg" alt="DSC_3602" height="120" width="400"></a></div><br />今年过年和往常一样，回无锡奶奶家去过年，可是，和往常不一样的是，奶奶的村子要拆迁了，也许过几个月，承载着我童年假期记忆的美丽的村庄将不复存在了。面对强势的非法拆迁，太多的故事发生了，而我们这些屁民还能怎样呢～想了很久，有些话还是不说的好……清澈的小河、健壮的榉树、沉甸甸的柿子树、金黄的稻穗、火红的土灶台，还是好好享受记忆和现在吧。<br /><br />影像是记忆最好的材料。<br /><br /><div align="center"><a href="javascript:showpic(this,'../upload/1/Images/1_1189873388/P_1266161315_2.jpg');">
<img src="../upload/1/Images/1_1189873388/P_1266161315_2.jpg" alt="DSC_3302" height="296" width="400"></a><br />后门的小河<br /><br /><a href="javascript:showpic(this,'../upload/1/Images/1_1189873388/P_1266161290_0.jpg');">
<img src="../upload/1/Images/1_1189873388/P_1266161290_0.jpg" alt="DSC_3198" height="400" width="248"></a><br /><br /><a href="javascript:showpic(this,'../upload/1/Images/1_1189873388/P_1266161304_1.jpg');">
<img src="../upload/1/Images/1_1189873388/P_1266161304_1.jpg" alt="DSC_3217" height="400" width="248"></a><br />灶膛的炉火，旺一年<br /><br /><a href="javascript:showpic(this,'../upload/1/Images/1_1189873388/P_1266160701_0.jpg');">
<img src="../upload/1/Images/1_1189873388/P_1266160701_0.jpg" alt="DSC_3533" height="296" width="400"></a><br /><a href="javascript:showpic(this,'../upload/1/Images/1_1189873388/P_1266160726_2.jpg');">
<img src="../upload/1/Images/1_1189873388/P_1266160726_2.jpg" alt="DSC_3540" height="296" width="400"></a><br />年夜饭，大碗喝酒，大块吃肉<br /><br /><div align="left">一觉醒来，整个世界都是白茫茫的一片了。虎年第一天一场大雪，预示着新的一年风调雨顺:)。下午拿着相机出去扫了街，还是照片说话吧。<br /></div><br /><a href="javascript:showpic(this,'../upload/1/Images/1_1189873388/P_1266160745_4.jpg');">
<img src="../upload/1/Images/1_1189873388/P_1266160745_4.jpg" alt="DSC_3545" height="400" width="248"></a><br /><br /><a href="javascript:showpic(this,'../upload/1/Images/1_1189873388/P_1266160768_6.jpg');">
<img src="../upload/1/Images/1_1189873388/P_1266160768_6.jpg" alt="DSC_3556" height="296" width="400"></a><br />崇安寺<br /><br /><a href="javascript:showpic(this,'../upload/1/Images/1_1189873388/P_1266160779_7.jpg');">
<img src="../upload/1/Images/1_1189873388/P_1266160779_7.jpg" alt="DSC_3565" height="296" width="400"></a><br />老图书馆<br /><br /><a href="javascript:showpic(this,'../upload/1/Images/1_1189873388/P_1266160787_8.jpg');">
<img src="../upload/1/Images/1_1189873388/P_1266160787_8.jpg" alt="DSC_3567" height="296" width="400"></a><br /><a href="javascript:showpic(this,'../upload/1/Images/1_1189873388/P_1266160796_9.jpg');">
<img src="../upload/1/Images/1_1189873388/P_1266160796_9.jpg" alt="DSC_3569" height="296" width="400"></a><br /><a href="javascript:showpic(this,'../upload/1/Images/1_1189873388/P_1266160812_11.jpg');">
<img src="../upload/1/Images/1_1189873388/P_1266160812_11.jpg" alt="DSC_3574" height="296" width="400"></a><br /><br /><a href="javascript:showpic(this,'../upload/1/Images/1_1189873388/P_1266160822_12.jpg');">
<img src="../upload/1/Images/1_1189873388/P_1266160822_12.jpg" alt="DSC_3575" height="400" width="248"></a><br /><br /><a href="javascript:showpic(this,'../upload/1/Images/1_1189873388/P_1266160851_14.jpg');">
<img src="../upload/1/Images/1_1189873388/P_1266160851_14.jpg" alt="DSC_3584" height="400" width="248"></a><br /><br /><a href="javascript:showpic(this,'../upload/1/Images/1_1189873388/P_1266160871_15.jpg');">
<img src="../upload/1/Images/1_1189873388/P_1266160871_15.jpg" alt="DSC_3588" height="296" width="400"></a><br /><a href="javascript:showpic(this,'../upload/1/Images/1_1189873388/P_1266160891_16.jpg');">
<img src="../upload/1/Images/1_1189873388/P_1266160891_16.jpg" alt="DSC_3589" height="296" width="400"></a><br /><a href="javascript:showpic(this,'../upload/1/Images/1_1189873388/P_1266160904_17.jpg');">
<img src="../upload/1/Images/1_1189873388/P_1266160904_17.jpg" alt="DSC_3593" height="296" width="400"></a><br /><a href="javascript:showpic(this,'../upload/1/Images/1_1189873388/P_1266160915_18.jpg');">
<img src="../upload/1/Images/1_1189873388/P_1266160915_18.jpg" alt="DSC_3596" height="296" width="400"></a><br /><br /><a href="javascript:showpic(this,'../upload/1/Images/1_1189873388/P_1266160947_21.jpg');">
<img src="../upload/1/Images/1_1189873388/P_1266160947_21.jpg" alt="DSC_3604" height="400" width="248"></a><br /><br /><div align="left">晚上的踏雪夜拍：<br /></div><br /><a href="javascript:showpic(this,'../upload/1/Images/1_1189873388/P_1266160955_22.jpg');">
<img src="../upload/1/Images/1_1189873388/P_1266160955_22.jpg" alt="DSC_3612" height="400" width="248"></a><br />蓉湖大桥<br /><br /><a href="javascript:showpic(this,'../upload/1/Images/1_1189873388/P_1266160964_23.jpg');">
<img src="../upload/1/Images/1_1189873388/P_1266160964_23.jpg" alt="DSC_3616" height="296" width="400"></a><br />京杭运河<br /><br /><a href="javascript:showpic(this,'../upload/1/Images/1_1189873388/P_1266160983_25.jpg');">
<img src="../upload/1/Images/1_1189873388/P_1266160983_25.jpg" alt="DSC_3627" height="296" width="400"></a><br /><a href="javascript:showpic(this,'../upload/1/Images/1_1189873388/P_1266160997_26.jpg');">
<img src="../upload/1/Images/1_1189873388/P_1266160997_26.jpg" alt="DSC_3628" height="296" width="400"></a><br />白色屋顶<br /><br /><div align="left">白色的新年，祝大家新年快乐，虎年吉祥！<br /></div></div>]]></description>
         <category>生活</category>
         <pubDate>Sun, 14 Feb 2010 23:47:33 +0900</pubDate>
      </item>
      <item>
         <title>Paper Model - 永远的勇者林克</title>
         <link>http://wells.osall.com/blog/index.php?m=content&amp;p=1471&amp;uid=1</link>
         <description><![CDATA[<p align="center"><a href="javascript:showpic(this,'http%3A//zelda.com/universe/_img/gameTop.gif');">
</a><a href="javascript:showpic(this,'http%3A//peanutmaster.files.wordpress.com/2008/08/zelda_phantom_hourglass.jpg');">
<img src="http://peanutmaster.files.wordpress.com/2008/08/zelda_phantom_hourglass.jpg"></a></p>
<p>终于，故事结束了，林克又一次战胜了邪恶的力量，正义永远是最后的胜利者……等待着林克下一个冒险是什么？</p>
<p>《塞尔达传说》系列是我最喜欢的游戏系列。在这个系列游戏中，故事总是发生于古老的海拉尔王国。海拉尔王国的人们生活安逸，与喜爱炸弹和石头的哥隆族以及索拉族和平共处。而黑暗势力为了破坏和平，统治世界，总会抓走海拉尔王国的塞尔达公主。万年不变的勇者林克，集正义、勇气、智慧于一身，面对强大的黑暗势力，总是能使用各种道具，巧妙的破解一个又一个的谜题，以一人之力扭转乾坤，救回塞尔达公主，拯救海拉尔王国。</p>
<p>整个系列到目前为止<a href="http://zh.wikipedia.org/zh-cn/%E8%96%A9%E7%88%BE%E9%81%94%E5%82%B3%E8%AA%AA%E7%B3%BB%E5%88%97">已经发行了14个游戏</a>，最近的几作，每一作都会有一个突出的特殊道具，在游戏中，主人公林克利用这个道具的各种功能，解开谜题，打败黑暗势力。例如，时之笛、风之杖、缩小帽、幻影沙漏等等……而游戏中的谜题设计，让我也不得不由衷的佩服游戏的设计人员。不愧是传奇的系列作品。</p>
<p>最近我打完了<a href="http://www.zelda.com/phantomhourglass/">《塞尔达传说——幻影沙漏》</a>，这一作发生于《风之杖》之后，也许是唯一的在海上发生的塞尔达故事，整个作品中也没有出现熟悉的海拉尔城。但是谜题的设计依然巧妙，沙漏的引入使得游戏多了一份紧张感。不过感觉制作水准还是没有之前的《时之笛》那样让人觉得惊艳。</p>
<p>爆机之后，无意间在网上看到了<a href="http://www.nintendopapercraft.com/labels/Zelda.html">任天堂的纸模网站</a>，里面用纸做的林克非常可爱，于是我也找了个比较简单的四支剑里面的林克打印后做了一下。整个制作过程大约在1-2小时，做完后效果还真的不错，看看吧。</p>
<p align="center"><a href="javascript:showpic(this,'../upload/1/Images/1_1187527469/P_1263038188_0.jpg');">
<img src="../upload/1/Images/1_1187527469/P_1263038188_0.jpg" alt="林克" height="400" width="248"></a></p>
<p align="center"><a href="javascript:showpic(this,'../upload/1/Images/1_1187527469/P_1263038249_1.jpg');">
<img src="../upload/1/Images/1_1187527469/P_1263038249_1.jpg" alt="林克" height="296" width="400"></a></p>
<p>您可以下载这两个文件打印后制作这个模型： <a href="http://i257.photobucket.com/albums/hh205/Papercraftbucket/Zelda/linkpc01.jpg">第一页</a> <a href="http://i257.photobucket.com/albums/hh205/Papercraftbucket/Zelda/linkpc02.jpg">第二页</a></p>
<p>试试吧？重温小时候的手工课:)</p>
<p>我要去玩《塞尔达传说——大地的汽笛》了，再见！</p>]]></description>
         <category>生活</category>
         <pubDate>Sat, 09 Jan 2010 21:20:36 +0900</pubDate>
      </item>
      <item>
         <title>再见我的Zaurus</title>
         <link>http://wells.osall.com/blog/index.php?m=content&amp;p=1459&amp;uid=1</link>
         <description><![CDATA[<p>这也许是我的最后一篇关于Zaurus的日志了。从SL7500C开始到2006年底兔子给我从日本带回来的SL-C3100，Zaurus陪我走过了整整三年的时间。</p>
<p>Zaurus对我来说，是一个神奇的小东西，平台的开放性使它几乎无所不能。可是对于普通用户，过于专业的操作方法也导致了他平庸的市场反应，这也是为什么Sharp不得已宣布Zaurus系列停产的原因。</p>
<p>借助于MID概念的兴起，ARM CPU的发展，ubuntu linux for ARM的风风火火，SHARP在这一市场领域又看到了曙光，于是，在一个月前SHARP PC-Z1 Netwalker戴着Zaurus后继者的光环诞生了。对于它的市场前景，我们需要冷静的判断，虽然硬件性能有了成倍的提升，但是应用环境也发生了巨大的改变，加上白微软所赐用户的使用习惯（尤其是国内用户）和几年前相比却没有大的变化。基于这样几方面的综合因素，加上高昂的售价，Z1的市场前景个人认为还是非常堪忧的，Z1还是一个小众MID。</p>
<p align="center"><a href="javascript:showpic(this,'http%3A//www.blogcdn.com/cn.engadget.com/media/2009/09/2009-09-03_13-30-51engadgetes.jpg');">
<img src="http://www.blogcdn.com/cn.engadget.com/media/2009/09/2009-09-03_13-30-51engadgetes.jpg" alt="Sharp PC-Z1"><br />Sharp PC-Z1<br /></a></p>
<p>由于个人对于PDAXROM系统的兴趣逐渐失去，加上业余时间也越来越少，所以在上个周末，将陪伴我近三年的Sharp Zaurus SL-C3100二手出了。Zaurus离开我手的一刹那，心里闪过一丝感伤。毕竟Zaurus给我带来很多快乐，让我认识了很多的朋友，地瓜、放总、CCPAGING、黑黑还有美女一万等等等等。没有Zaurus的第一个夜晚，用palm treo看电子书，好不习惯，我失眠了……</p>
<p>虽然没有Zaurus了，但是我不会离开Zaurus社区，如果大家还有什么问题需要我帮忙的话，我一样会尽力帮忙解决，因为，地瓜还有Z机可以被我强行征用，借给我使，哈哈。</p>
<p>下一个小玩意会是什么？我的目标是可以运行Ubuntu linux for ARM和Google Adorid的系统，也许，SmartQ5是个不错的选择。在这个平台上，我们的空间会比Zaurus更大，并且有个更充分的理由——支持国货！</p>
<p><br />这篇文章算是对Zaurus应用的一个总结吧。下面是一些我提供的Zaurus的信息链接汇总：</p>
<ul>
	<li>Zaurus是什么： <a href="http://zaurus.osall.com">http://zaurus.osall.com</a> ;</li>
	<li>中文Zaurus社区： <a href="http://zaurus.osall.com">http://z.osall.com</a> ;</li>
	<li>DBK镜像备份下载： <a href="http://zaurus.osall.com/DBK">http://zaurus.osall.com/DBK</a> ;</li>
	<li>我所编译移植的zaurus pdaxrom软件列表： <a href="http://z.osall.com/viewtopic.php?t=1578">http://z.osall.com/viewtopic.php?t=1578</a> ;</li>
	<li>Zaurus QQ群： 8505684 .</li>
</ul>
<p> </p>
<p> </p>]]></description>
         <category>Zaurus / ARM</category>
         <pubDate>Tue, 20 Oct 2009 16:10:27 +0900</pubDate>
      </item>
      <item>
         <title>大成功！柠檬葡式蛋挞！！！</title>
         <link>http://wells.osall.com/blog/index.php?m=content&amp;p=1447&amp;uid=1</link>
         <description><![CDATA[<p>自从做了戚风蛋糕以后，我就开始为蛋挞做准备了。这不，上个周末没事就在家折腾蛋挞了。还好，我心灵手巧，加上充足的学习准备，一次成功啊！做出来的蛋挞有模有样，皮酥馅滑，口感甚佳，大受好评啊！！！</p>
<p>为了折腾这个蛋挞，我从周五就开始准备了。从万能的淘宝买了缺少的原料，结果粗心的老板还是搞错了，高筋面粉给我发了低筋面粉……没办法，还是只能自己跑去超市买。</p>
<p>跟上次一样，介绍做法之前，先Copy一段蛋挞的介绍来普及美食知识吧。</p>
<div class="blog_quote">
<p><strong>蛋挞</strong>，<strong>挞</strong>为英文“tart”之音译，意指馅料外露的<a href="http://zh.wikipedia.org/zh-cn/%E9%A4%A1%E9%A4%85" title="馅饼">馅饼</a>（相对表面被饼皮覆盖馅料密封之批/派馅饼pie）；蛋挞即以<a href="http://zh.wikipedia.org/zh-cn/%E8%9B%8B%E6%BC%BF" title="蛋浆">蛋浆</a>为<a href="http://zh.wikipedia.org/w/index.php?title=%E9%A4%A1%E6%96%99&amp;action=edit&amp;redlink=1" class="new" title="馅料 (尚未撰写)">馅料</a>的“tart”。做法是把饼皮放进小圆盆状的饼模中，倒入由<a href="http://zh.wikipedia.org/zh-cn/%E7%A0%82%E7%B3%96" title="砂糖" class="mw-redirect">砂糖</a>及<a href="http://zh.wikipedia.org/zh-cn/%E9%9B%9E%E8%9B%8B" title="鸡蛋">鸡蛋</a>混合而成之蛋浆，然后放入<a href="http://zh.wikipedia.org/zh-cn/%E7%83%A4%E7%88%90" title="烤炉">烤炉</a>；烤出的<strong class="selflink">蛋挞</strong>外层为松脆之挞皮，内层则为<a href="http://zh.wikipedia.org/zh-cn/%E7%94%9C" title="甜" class="mw-redirect">香甜</a>的黄色凝固蛋浆。</p>
<p>Laura Mason在<em>Traditional Foods of Britain</em>提出，早在<a href="http://zh.wikipedia.org/zh-cn/%E4%B8%AD%E4%B8%96%E7%B4%80" title="中世纪" class="mw-redirect">中世纪</a>，<a href="http://zh.wikipedia.org/zh-cn/%E8%8B%B1%E5%9C%8B%E4%BA%BA" title="英国人" class="mw-redirect">英国人</a>已利用<a href="http://zh.wikipedia.org/zh-cn/%E5%A5%B6" title="奶" class="mw-redirect">奶</a>品、<a href="http://zh.wikipedia.org/zh-cn/%E7%B3%96" title="糖">糖</a>、<a href="http://zh.wikipedia.org/zh-cn/%E8%9B%8B" title="蛋">蛋</a>及不同<a href="http://zh.wikipedia.org/zh-cn/%E9%A6%99%E6%96%99" title="香料">香料</a>，制作类似蛋挞的食品。<a href="http://zh.wikipedia.org/zh-cn/1399%E5%B9%B4" title="1399年">1399年</a><a href="http://zh.wikipedia.org/zh-cn/%E8%8B%B1%E6%A0%BC%E5%85%B0%E5%9B%BD%E7%8E%8B" title="英格兰国王" class="mw-redirect">英格兰国王</a><a href="http://zh.wikipedia.org/zh-cn/%E4%BA%A8%E5%88%A9%E5%9B%9B%E4%B8%96" title="亨利四世">亨利四世</a>的一次宴会便有食用蛋挞的记载<sup id="_ref-icons_0-0" class="reference"><a href="http://zh.wikipedia.org/zh-cn/%E8%9B%8B%E6%8C%9E#_note-icons-0">[1]</a></sup>。直到现在，蛋挞仍可在<a href="http://zh.wikipedia.org/zh-cn/%E8%8B%B1%E5%9C%8B" title="英国" class="mw-redirect">英国</a>见到。</p>
<p>纵然<strong class="selflink">蛋挞</strong>深受<a href="http://zh.wikipedia.org/zh-cn/%E9%A6%99%E6%B8%AF%E4%BA%BA" title="香港人">香港人</a>欢迎，但其在<a href="http://zh.wikipedia.org/zh-cn/%E9%A6%99%E6%B8%AF%E6%AD%B7%E5%8F%B2" title="香港历史">香港历史</a>尚短。据业余<a href="http://zh.wikipedia.org/zh-cn/%E9%A6%99%E6%B8%AF" title="香港">香港</a><a href="http://zh.wikipedia.org/zh-cn/%E5%8E%86%E5%8F%B2%E5%AD%A6%E8%80%85" title="历史学者" class="mw-redirect">历史学者</a><a href="http://zh.wikipedia.org/zh-cn/%E5%90%B3%E6%98%8A" title="吴昊" class="mw-redirect">吴昊</a>考证，<a href="http://zh.wikipedia.org/zh-cn/1920%E5%B9%B4" title="1920年">1920年</a>的<a href="http://zh.wikipedia.org/zh-cn/%E5%BB%A3%E5%B7%9E" title="广州" class="mw-redirect">广州</a>，各大<a href="http://zh.wikipedia.org/zh-cn/%E7%99%BE%E8%B2%A8%E5%85%AC%E5%8F%B8" title="百货公司">百货公司</a>竞争激烈，为了吸引顾客，百货公司的<a href="http://zh.wikipedia.org/zh-cn/%E5%BB%9A%E5%B8%AB" title="厨师">厨师</a>每周都会设计一款“星期美点”作招徕，<strong class="selflink">蛋挞</strong>正是这时候在<a href="http://zh.wikipedia.org/zh-cn/%E5%BB%A3%E5%B7%9E" title="广州" class="mw-redirect">广州</a>出现。</p>
<p><a href="http://zh.wikipedia.org/zh-cn/%E9%A6%99%E6%B8%AF" title="香港">香港</a>引入<strong class="selflink">蛋挞</strong>的时代，现未有准确年份，有说自<a href="http://zh.wikipedia.org/zh-cn/1940%E5%B9%B4" title="1940年">1940年</a>起，<a href="http://zh.wikipedia.org/zh-cn/%E9%A6%99%E6%B8%AF" title="香港">香港</a>饼店已出现<strong class="selflink">蛋挞</strong>，<a href="http://zh.wikipedia.org/zh-cn/1950%E5%B9%B4" title="1950年">1950年</a>至<a href="http://zh.wikipedia.org/zh-cn/1980%E5%B9%B4" title="1980年">1980年</a>打入多数<a href="http://zh.wikipedia.org/zh-cn/%E8%8C%B6%E9%A4%90%E5%BB%B3" title="茶餐厅">茶餐厅</a>。初时<a href="http://zh.wikipedia.org/zh-cn/%E8%8C%B6%E9%A4%90%E5%BB%B3" title="茶餐厅">茶餐厅</a>的<strong class="selflink">蛋挞</strong>都比较大，一个蛋挞便可以成为一个<a href="http://zh.wikipedia.org/zh-cn/%E4%B8%8B%E5%8D%88%E8%8C%B6" title="下午茶">下午茶</a>餐。<a href="http://zh.wikipedia.org/zh-cn/1990%E5%B9%B4" title="1990年">1990年</a>起，兼营包饼之<a href="http://zh.wikipedia.org/zh-cn/%E8%8C%B6%E9%A4%90%E5%BB%B3" title="茶餐厅">茶餐厅</a>逐渐减少，故现只在旧式<a href="http://zh.wikipedia.org/zh-cn/%E8%8C%B6%E9%A4%90%E5%BB%B3" title="茶餐厅">茶餐厅</a>方有自家烤制的蛋挞，其他<a href="http://zh.wikipedia.org/zh-cn/%E8%8C%B6%E9%A4%90%E5%BB%B3" title="茶餐厅">茶餐厅</a>则从<a href="http://zh.wikipedia.org/zh-cn/%E9%BA%B5%E5%8C%85" title="面包">面包</a>工场订购<strong class="selflink">蛋挞</strong>飨客。另一方面，香港不少<a href="http://zh.wikipedia.org/zh-cn/%E9%85%92%E6%A8%93" title="酒楼">酒楼</a>的<a href="http://zh.wikipedia.org/zh-cn/%E9%BB%9E%E5%BF%83" title="点心">点心</a>中也包括<strong>蛋挞仔</strong>（小型蛋挞）。</p>
<p>蛋挞在<a href="http://zh.wikipedia.org/zh-cn/%E5%8F%B0%E7%81%A3" title="台湾">台湾</a>并不是非常热门的<a href="http://zh.wikipedia.org/zh-cn/%E7%94%9C%E9%BB%9E" title="甜点" class="mw-redirect">甜点</a>，但是长期以来，一直是大街小巷的各家面包店必备产品。<a href="http://zh.wikipedia.org/zh-cn/%E6%BE%B3%E9%96%80" title="澳门">澳门</a><a href="http://zh.wikipedia.org/w/index.php?title=%E7%91%AA%E5%98%89%E7%83%88%E9%A4%85%E5%BA%97&amp;action=edit&amp;redlink=1" class="new" title="玛嘉烈饼店 (尚未撰写)">玛嘉烈饼店</a>的<a href="http://zh.wikipedia.org/zh-cn/%E8%91%A1%E5%BC%8F%E8%9B%8B%E6%92%BB" title="葡式蛋挞" class="mw-redirect">葡挞</a>则在<a href="http://zh.wikipedia.org/zh-cn/1990%E5%B9%B4%E4%BB%A3" title="1990年代">1990年代</a>为台湾掀起一股<strong class="selflink">蛋挞</strong>热潮，不仅玛嘉烈饼店大受欢迎，模仿该饼店的葡式蛋挞店也纷纷出现，一般面包店也加入贩卖<a href="http://zh.wikipedia.org/zh-cn/%E8%91%A1%E8%90%84%E7%89%99%E5%BC%8F%E5%A5%B6%E6%B2%B9%E6%92%BB" title="葡萄牙式奶油挞">葡挞</a>的行列。但是<a href="http://zh.wikipedia.org/zh-cn/%E5%8F%B0%E7%81%A3" title="台湾">台湾</a>的<a href="http://zh.wikipedia.org/zh-cn/%E8%91%A1%E8%90%84%E7%89%99%E5%BC%8F%E5%A5%B6%E6%B2%B9%E6%92%BB" title="葡萄牙式奶油挞">葡挞</a>热至<a href="http://zh.wikipedia.org/zh-cn/%E5%8D%83%E7%A6%A7%E5%B9%B4" title="千禧年" class="mw-redirect">千禧年</a>后便衰退，只剩<a href="http://zh.wikipedia.org/zh-cn/%E8%82%AF%E5%BE%B7%E5%9F%BA" title="肯德基">肯德基</a>持续在贩卖葡式蛋挞，而一般面包店则不再制作<a href="http://zh.wikipedia.org/zh-cn/%E8%91%A1%E8%90%84%E7%89%99%E5%BC%8F%E5%A5%B6%E6%B2%B9%E6%92%BB" title="葡萄牙式奶油挞">葡挞</a>，但一般蛋挞仍是长期产品。</p>
<p>香港地道的蛋挞以挞皮分类，主要分为<strong><a href="http://zh.wikipedia.org/zh-cn/%E7%89%9B%E6%B2%B9" title="牛油" class="mw-redirect">牛油</a>蛋挞</strong>和<strong>酥皮蛋挞</strong>两种：</p>
<ul>
	<li><strong>牛油蛋挞</strong>的挞皮比较光滑和完整，好像一块盆状的<a href="http://zh.wikipedia.org/zh-cn/%E9%A4%85%E4%B9%BE" title="饼干">饼干</a>，有一阵<a href="http://zh.wikipedia.org/zh-cn/%E7%89%9B%E6%B2%B9" title="牛油" class="mw-redirect">牛油</a>香味，类似西点常用之馅批底皮（Pie Crust），口感像<a href="http://zh.wikipedia.org/zh-cn/%E6%9B%B2%E5%A5%87" title="曲奇">曲奇</a>一样，所以又有曲奇皮之称。</li>
	<li><strong>酥皮蛋挞</strong>挞皮的为一层层薄酥皮，近似西点的牛油酥皮（Puff Pastry）；但因使用<a href="http://zh.wikipedia.org/zh-cn/%E8%B1%AC%E6%B2%B9" title="猪油">猪油</a>（Lard），口感较<a href="http://zh.wikipedia.org/zh-cn/%E7%89%9B%E6%B2%B9" title="牛油" class="mw-redirect">牛油</a>酥皮粗糙。另因挞皮较厚，故酥皮蛋挞的馅料量较<a href="http://zh.wikipedia.org/zh-cn/%E7%89%9B%E6%B2%B9" title="牛油" class="mw-redirect">牛油</a>蛋挞为少。</li>
</ul>
<p>除以<a href="http://zh.wikipedia.org/zh-cn/%E7%A0%82%E7%B3%96" title="砂糖" class="mw-redirect">砂糖</a>及<a href="http://zh.wikipedia.org/zh-cn/%E9%9B%9E%E8%9B%8B" title="鸡蛋">鸡蛋</a>为蛋浆的主流<strong>蛋挞</strong>外，亦有在蛋浆内混入其他材料的变种蛋挞，如<a href="http://zh.wikipedia.org/zh-cn/%E7%89%9B%E5%A5%B6" title="牛奶">鲜奶</a>挞、<a href="http://zh.wikipedia.org/zh-cn/%E8%96%91" title="姜">姜</a>汁蛋挞、<a href="http://zh.wikipedia.org/zh-cn/%E8%9B%8B%E7%99%BD" title="蛋白">蛋白</a>蛋挞、<a href="http://zh.wikipedia.org/zh-cn/%E5%B7%A7%E5%85%8B%E5%8A%9B" title="巧克力">巧克力</a>蛋挞及<a href="http://zh.wikipedia.org/zh-cn/%E7%87%95%E7%AA%A9" title="燕窝">燕窝</a>蛋挞等等。</p>
</div>
<p><em>注：以上段落引用自<a href="http://wikipedia.com">Wikipedia</a>。</em></p>
<p>再一次感叹，抄的感觉真是非常的爽啊。</p>
<p>好了废话不多说了，就直接介绍我的蛋挞的制作过程吧。我这次的蛋挞是柠檬味的酥皮蛋挞，制作时挞皮和馅料是要分开做的。下面就先看看原料吧（约12只蛋挞的分量）。</p>
<ul>
	<li>挞皮原料：</li><ul>
	<li>低筋粉220克</li>
	<li>高筋粉30克</li>
	<li>黄油40克</li>
	<li>片状马琪琳180克  </li>
	<li>细砂糖5克</li>
	<li>盐1.5克</li>
	<li>水125克</li>
</ul>
<li>馅料原料：</li><ul>
	<li>淡奶油180克</li>
	<li>牛奶140克</li>
	<li>细砂糖80克</li>
	<li>蛋黄4个</li>
	<li>低筋面粉15克</li>
	<li>炼乳15克（可选，加了之后奶味十足）</li>
	<li>新鲜柠檬一只（可选，取柠檬汁用，制作柠檬口味的）</li>
</ul>
</ul>
<p>原料准备好就可以开始制作过程了。首先看挞皮的制作过程。对于酥皮蛋挞来说，挞皮最关键的就是要做出千层酥的效果。千层挞皮的制作原理就是用面皮包裹马琪琳，通过反复折叠，形成很多层面皮-马琪琳-面皮的分层。在烘焙的时候，面皮中的水分受高温汽化，面皮在水蒸气的冲击作用下膨胀开来，形成层次分明的酥皮。要是千层挞皮做好了，这蛋挞就成功了一大半。</p>
<p align="center"><a href="javascript:showpic(this,'../upload/1/Images/1_1249567140/P_1251901678_0.jpg');">
<img src="../upload/1/Images/1_1249567140/P_1251901678_0.jpg" alt="tart1" height="268" width="400"></a></p>
<p>1. 将220克低筋面粉、30克高筋面粉、砂糖和盐搅拌均匀，然后放入40克黄油，不停搅拌混合的同时，将大约125克水分几次加入，和成面团。当面团被揉到表面光滑不粘手时，放入冰箱冷却松弛20分钟左右。</p>
<p>2. 将面团从冰箱中取出后，在砧板上先撒点面粉，以免粘皮，然后用擀面棍将面团在砧板上擀成厚度约为0.3厘米的矩形面皮。接着将180克片状马琪琳用保鲜膜包好，用擀面棍擀成宽度为面皮宽度约1/3大小，从保鲜膜中取出马琪琳片后放在面皮中央。</p>
<p>3. 将马琪琳两边的面皮翻折过来，盖在马琪琳上面包起来，然后纵向将包好马琪琳的面皮擀薄，再次擀成0.3厘米左右的厚度的矩形面皮。</p>
<p align="center"><a href="javascript:showpic(this,'../upload/1/Images/1_1249567140/P_1251901680_1.jpg');">
<img src="../upload/1/Images/1_1249567140/P_1251901680_1.jpg" alt="tart2" height="294" width="600"></a></p>
<p>4. 像我们叠被子一样，将擀好的面皮两头叠过来。</p>
<p>5. 中间再翻折，叠成被子状。</p>
<p>6. 纵向再次将叠好的“被子”擀成厚度约0.3厘米的矩形面皮。</p>
<p>4-6的步骤需反复共做3次左右，以形成千层酥的面皮。</p>
<p align="center"><a href="javascript:showpic(this,'../upload/1/Images/1_1249567140/P_1251901681_2.jpg');">
<img src="../upload/1/Images/1_1249567140/P_1251901681_2.jpg" alt="tart3" height="268" width="400"></a></p>
<p>7. 最后将擀成0.3厘米左右厚度的矩形挞皮从一端卷起来（卷紧一些），然后用放在冰箱冷藏约20分钟冷却和松弛面皮。</p>
<p>8. 冷却后取出，按照你的蛋挞模具的大小，将挞皮卷心切成大约1-2cm长度的面皮段。</p>
<p>9. 将面皮段的一端站上面粉，防止沾手，放在蛋挞模具中，粘粉的一端朝上放置。</p>
<p>10. 用大拇指按压面皮段，把它在模子中按出蛋挞外皮的形状后，将其放置20分钟松弛面粉后使用（蛋挞底部的皮要按薄一些，口味会比较好）。</p>
<p>至此，挞皮就算做完了。</p>
<p> </p>
<p> </p>
<p>蛋挞的馅料制作比较简单，下面说明一下过程，我就懒得配图了。</p>
<p>将淡奶油、牛奶和砂糖放在小锅里，加热并慢慢搅拌至砂糖完全融化，稍微冷却一下后，放入4个鸡蛋黄（只用蛋黄不要蛋清）、低筋面粉并搅拌均匀就好了。如果有炼乳和柠檬汁的话，也在这时加入。加入柠檬口味的方法是，将柠檬洗净后切开，按照你需要的口味挤入适量的柠檬汁就好，喜欢酸点的多加些，我加了大约3/4只柠檬的汁水。</p>
<p> </p>
<p> </p>
<p>挞皮和馅料都制作完成后，就开始最终的合成烘焙动作啦。</p>
<p align="center"><a href="javascript:showpic(this,'../upload/1/Images/1_1249567140/P_1251901683_3.jpg');">
<img src="../upload/1/Images/1_1249567140/P_1251901683_3.jpg" alt="tart4" height="400" width="296"></a></p>
<p>1. 待捏好的挞皮松驰20分钟后，将馅料用勺子加入到捏好的挞皮中，因为在烘焙的时候挞皮会膨胀，所以为了防止馅料过多流出，在挞皮中加馅料只需要加到7成满就好了，不用加满。</p>
<p>2. 全部搞定后放入预热好的烤箱，220度15-18分钟左右就搞定啦！</p>
<p>看看我的最终成品，色香味一应俱全，千层酥也特别棒啊！哈哈！大成功！</p>
<p align="center"><a href="javascript:showpic(this,'../upload/1/Images/1_1249567140/P_1251901689_4.jpg');">
<img src="../upload/1/Images/1_1249567140/P_1251901689_4.jpg" alt="tart5" height="296" width="400"></a><br />
刚出炉的蛋挞，看着很有食欲吧</p>
<p align="center"><a href="javascript:showpic(this,'../upload/1/Images/1_1249567140/P_1251901697_5.jpg');">
<img src="../upload/1/Images/1_1249567140/P_1251901697_5.jpg" alt="tart6" height="296" width="400"></a><br />
挞皮是千层酥啊，很成功呢</p>
<hr>
<p>最后附赠一个自制小甜点——红豆牛奶豆腐。是我为了用掉剩下的一点点淡奶油做的。</p>
<p>原料（分量根据口味和你做的多少自己定吧）：</p>
<ul>
	<li>豆沙若干</li>
	<li>牛奶</li>
	<li>淡奶油</li>
	<li>砂糖</li>
	<li>琼脂（500g水需要5-10g，也可用吉利丁片代替）</li>
</ul>
<p>首先将琼脂在少量温水中加热搅拌化开（把琼脂剪成细小碎片后搅拌可加速溶解），待没有沉淀物后加入豆沙，打散豆沙不结块后加入牛奶、淡奶油砂糖，搅拌均匀砂糖融化后静置（原料放入多少的量可以一边放入一边尝口味来控制）。待稍微冷却后放入冰箱，凝固后即可食用。</p>
<p align="center"><a href="javascript:showpic(this,'../upload/1/Images/1_1249567140/P_1251901705_6.jpg');">
<img src="../upload/1/Images/1_1249567140/P_1251901705_6.jpg" alt="DSC_1322" height="296" width="400"></a><br />
清凉消暑的牛奶豆腐</p>]]></description>
         <category>美食</category>
         <pubDate>Thu, 03 Sep 2009 00:17:23 +0900</pubDate>
      </item>
      <item>
         <title>第一次，有点小失败的戚风蛋糕～</title>
         <link>http://wells.osall.com/blog/index.php?m=content&amp;p=1437&amp;uid=1</link>
         <description><![CDATA[<p>这个周末在家无聊，就实验了一下戚风蛋糕。戚风蛋糕应该是最简单的入门级西点了，可以作为其他高级西点的基础原料来使用。下面抄一段戚风蛋糕的介绍作为开始吧。</p>
<p>戚风蛋糕是英文Chiffon Cake的音译，属<a target="_blank" href="http://baike.baidu.com/view/3857.htm">海绵蛋糕</a>这
一基本类型。1927年由加利福尼亚的一个名叫哈里.贝克的保险经纪发明，直到1948年，贝克把蛋糕店卖了，配方才公诸于世。戚风蛋糕质地非常轻，用菜油、鸡蛋、糖、面粉、发粉为基本材料。由于菜油不像牛油（传统蛋糕都是用牛油的）那样容易打泡，因此需要靠把鸡蛋清打成泡沫状，来提供足够的空气以支撑蛋糕的体积。戚风蛋糕含足量的菜油和鸡蛋，因此质地非常的湿润，不像传统牛油蛋糕那样容易变硬。因此更适合有冷藏需要的蛋糕。戚风蛋糕也含<span style="text-decoration: underline;">较少的饱和脂肪</span>（是不是不会发胖啊，如果是，某人最愿意看到了，嘿嘿）。戚风蛋糕组织膨松，水分含量高，味道清淡不腻，口感滋润嫩爽，是目前最受欢迎的蛋糕之一。这里要说明的是，戚风蛋糕的质地异常松软，若是将同样重量的全蛋搅拌式海绵蛋糕面糊与戚风蛋糕的面糊同时烘烤，那么戚风蛋糕的体积可能是前者的两倍。虽然戚风蛋糕非常松软，但它却带有弹性，且无软烂的感觉，吃时淋各种酱汁很可口。另外，戚风蛋糕还可做成各种蛋糕卷、波士顿派等。</p>
<p>抄真的是很爽的一件事，一共按了四个按键，就多出来这么一长段话。爽啊～～～</p>
<p>制作戚风蛋糕，需要分蛋搅拌，也就是说，要把蛋黄和蛋白分开，分别搅拌后，再予以混合制作成成品蛋糕。下面就介绍一下做法吧。</p>
<p>制作戚风蛋糕的原料如下（我的蛋糕模是8寸的，如果是6寸的，数量减半）：</p>
<ul>
	<li>鸡蛋4个</li>
	<li>砂糖90g</li>
	<li>低筋面粉100g</li>
	<li>牛奶100ml</li>
	<li>食用油三大勺</li>
	<li>泡打粉一小勺</li>
	<li>塔塔粉一小勺</li>
</ul>
<p>制作戚风蛋糕需要用到的工具如下：</p>
<ul>
	<li>必不可少的烤箱一个</li>
	<li>用来打蛋搅拌的大碗若干个</li>
	<li>量杯、量勺</li>
	<li>天平秤</li>
	<li>细面粉筛</li>
	<li>8寸/6寸蛋糕模</li>
	<li>打蛋/搅拌器</li>
	<li>锡纸（可选）</li>
	<li>分蛋器（可选）</li>
</ul>
<p>好啦言归正传，开始干活。</p>
<p>首先将4枚鸡蛋敲开，用分蛋器过滤蛋黄蛋清，将蛋黄和蛋清分别放在两个碗中备用。注意蛋清碗里千万不能混有油、水及任何一丝蛋黄，否则在蛋白打发那一步将彻底失败。我有惨痛教训，我敲蛋时过于刚猛，把蛋黄敲破了，流了一丝蛋黄到蛋清中，结果，蛋白打发的时候，根本没法打发，只能重新取了另外四个鸡蛋的蛋清。唉～切记蛋清一旦混有油性物质，将无法打发！</p>
<p>好了，刚才前面说过制作戚风蛋糕，需要分蛋搅拌，要把蛋黄和蛋白分开，分别搅拌后，再予以混合制作成成品蛋糕。所以，首先我们来制作蛋黄糊的部分。</p>
<p align="center"><a href="javascript:showpic(this,'../upload/1/Images/1_1249567140/P_1250519125_1.jpg');">
<img src="../upload/1/Images/1_1249567140/P_1250519125_1.jpg" alt="dg1" height="268" width="400"></a>
<br />
<a href="javascript:showpic(this,'../upload/1/Images/1_1249567140/P_1250519126_2.jpg');">
<img src="../upload/1/Images/1_1249567140/P_1250519126_2.jpg" alt="dg2" height="268" width="400"></a></p>
<ol>
	<li>取出准备好的4个蛋黄（不好意思，我敲蛋过于刚猛，敲破了一个啊）。</li>
	<li>加入砂糖30g后用打蛋器搅拌使糖溶解。</li>
	<li>加入三大勺食用油。</li>
	<li>加入100ml牛奶，并用打蛋器搅拌均匀。</li>
	<li>准备面粉，将100g低筋面粉和一小勺泡打粉混合均匀。</li>
	<li>将混合好的低筋面粉和泡打粉用细筛筛入第4步搅拌好的蛋黄。</li>
	<li>用筷子轻轻搅拌，一边搅拌一边转动容器。</li>
	<li>将面粉和蛋黄搅拌均匀形成半成品A——蛋黄糊，备用。</li>
</ol>
<p>接下来就是蛋白打发的部分。</p>
<p align="center"><a href="javascript:showpic(this,'../upload/1/Images/1_1249567140/P_1250519126_3.jpg');">
<img src="../upload/1/Images/1_1249567140/P_1250519126_3.jpg" alt="dg3" height="268" width="400"></a><br />
<a href="javascript:showpic(this,'../upload/1/Images/1_1249567140/P_1250519127_4.jpg');">
<img src="../upload/1/Images/1_1249567140/P_1250519127_4.jpg" alt="dg4" height="172" width="400"></a></p>
<ol>
	<li>取出准备好的蛋清。</li>
	<li>用打蛋器的低速档打到蛋清出现粗泡。</li>
	<li>加入一小勺塔塔粉。</li>
	<li>继续用打蛋器打发蛋白，等到泡沫比较细腻之后一边用高速档打一边分三次加入剩余的60g砂糖。</li>
	<li>继续用高速档打发蛋白，直到打到硬性发泡。所谓硬性发泡就是将打蛋器从蛋白取出后，拖出来的“小尾巴”是直挺挺的样子。</li>
	<li>或者也可以用一根筷子进行判断，将筷子垂直插入打发的蛋白，筷子不会倒下就证明蛋白打发的差不多了。这就做成了半成品B——打发蛋白，备用。</li>
</ol>
<p>最后就是混合和烘烤的过程啦。</p>
<p align="center"><a href="javascript:showpic(this,'../upload/1/Images/1_1249567140/P_1250519128_5.jpg');">
<img src="../upload/1/Images/1_1249567140/P_1250519128_5.jpg" alt="dg5" height="268" width="400"></a><br />
<a href="javascript:showpic(this,'../upload/1/Images/1_1249567140/P_1250519129_6.jpg');">
<img src="../upload/1/Images/1_1249567140/P_1250519129_6.jpg" alt="dg6" height="268" width="400"></a></p>
<ol>
	<li>取1/3的半成品B打发蛋白，放入半成品A蛋黄糊，并搅拌均匀，搅拌的动作要轻柔。</li>
	<li>将搅拌好的蛋黄糊倒入剩下的2/3的半成品B打发蛋白中。</li>
	<li>将混合物从上至下的进行搅拌，动作一定要轻柔。</li>
	<li>搅拌均匀后倒入蛋糕模中。</li>
	<li>将装好蛋糊的蛋糕模轻轻震动几下，使大气泡泡出来。</li>
	<li>将蛋糕模放入烤箱烘烤。160度20分钟左右蛋糕就会上色，等蛋糕表皮一上色就用锡纸盖住蛋糕，以免蛋糕表皮被烤糊。然后继续烘烤20分钟左右（我后一部分只烤了10分钟多一点，发现蛋糕下半部分还是有一点湿湿的，不是特别松软，因此说有点小失败啊）。关于火候，因为每个烤箱的火力都不太一样，因此我的温度和时间仅供参考啊，还需呀大家自己琢磨。</li>
	<li>等蛋糕烤好取出，冷却（可以用牙签插进去，拔出来如果牙签有些湿湿的则证明还需要再烤一会）。</li>
	<li>取出蛋糕的窍门是，将蛋糕倒扣，待蛋糕稍微冷却后，用刮刀沿蛋糕周围刮一圈，然后将活底模的底往上一推，蛋糕就出来了。</li>
</ol>
<p>看吧，虽然经历了一些小的失败，但是我的第一个蛋糕作品还是出炉了。第一口给老爸吃了，口感很不错啊，细腻柔软，一点也不比买来的差:)，可惜外观实在很一般……</p>
<p align="center"><a href="javascript:showpic(this,'../upload/1/Images/1_1249567140/P_1250519124_0.jpg');">
<img src="../upload/1/Images/1_1249567140/P_1250519124_0.jpg" alt="戚风蛋糕" height="296" width="400"></a></p>
<p>下次继续改进啊～～～</p>]]></description>
         <category>美食</category>
         <pubDate>Tue, 18 Aug 2009 00:01:08 +0900</pubDate>
      </item>
      <item>
         <title>Ubuntu 9.04上的XEN虚拟服务器（二） 安装虚拟机</title>
         <link>http://wells.osall.com/blog/index.php?m=content&amp;p=1436&amp;uid=1</link>
         <description><![CDATA[<p>搞定XEN的安装之后，看着孤孤单单的Domain-0是不是想要给他找个伴呢？一步一步慢慢来嘛，接下来就新增一个虚拟机，跟Domain-0做个伴。</p>
<p>在XEN下新增虚拟机有各种各样的方法：从Domain-0文件直接复制可以；新建配置文件指向安装程序，用xm命令启动虚拟机安装也可以；用virt-inst脚本进行安装也行。条条大路通罗马呗。第一个虚拟机，就用最简单的virt-install脚本来安装吧。</p>
<p>在安装之前还要考虑的一点就是虚拟机的磁盘使用哪种方式。在前一篇文章里说过，可以用镜像文件来虚拟成磁盘或者直接给虚拟机一个LVM逻辑卷虚拟成磁盘。我个人比较偏向于使用LVM逻辑卷，因为一是在Domain-0的主机上无法看到Domain-U的文件，相对独立，可以避免一些误操作导致的虚拟机资料的丢失问题；二是个人认为直接给虚拟机使用LVM性能会较好。</p>
<p>所以，首先要做的就是划一个逻辑卷给虚拟机使用。</p>
<div class="blog_code"># sudo lvcreate -L 20G -n xenvm1 /dev/atomsvr<br /></div>
<p>在这个例子里，我在/dev/atomsvr逻辑卷组里新建了一个20G的名为xenvm1的逻辑卷供虚拟机使用（新建逻辑卷前要确保逻辑卷组中有足够的未用空间）。新建完成后，可以使用lvdisplay来验证。</p>
<div class="blog_code"># sudo lvdisplay /dev/atomsvr/xenvm1<br />&nbsp; --- Logical volume ---<br />&nbsp; LV Name&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /dev/atomsvr/xenvm1<br />&nbsp; VG Name&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; atomsvr<br />&nbsp; LV UUID&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; GI5MqK-yc8l-0Zcf-EnFA-KwfQ-YEsV-EBlpCa<br />&nbsp; LV Write Access&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; read/write<br />&nbsp; LV Status&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; available<br />&nbsp; # open&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2<br />&nbsp; LV Size&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 20.00 GB<br />&nbsp; Current LE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5120<br />&nbsp; Segments&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1<br />&nbsp; Allocation&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; inherit<br />&nbsp; Read ahead sectors&nbsp;&nbsp;&nbsp;&nbsp; auto<br />&nbsp; - currently set to&nbsp;&nbsp;&nbsp;&nbsp; 256<br />&nbsp; Block device&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 252:2<br />
</div>
<p>LV创建完成了，因为是给虚拟机虚拟成磁盘使用，而不是给Domain-0当文件系统挂载，因此我们不需要用mkfs来格式化文件系统。下一步就是安装virt-install和virsh等脚本。这些脚本是为了方便虚拟机的安装管理，使用python写的。</p>
<div class="blog_code"># sudo apt-get install python-virtinst libvirt-bin<br />
</div>
<p>在使用virt-install安装虚拟机前还需要打开xend服务的http服务模式，修改/etc/xen/xend-config.sxp。</p>
<div class="blog_code"># sudo vi /etc/xen/xend-config.sxp<br /><br />找到 # (xend-http-server no)，去掉注释符#修改为<br />(xend-http-server yes)<br /><br />找到 # (xend-port&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 8000)，去掉注释符#修改为<br />(xend-port&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 8000)<br />
</div>

<p>保存后重启xend服务。</p>
<div class="blog_code"># sudo /etc/init.d/xend restart<br />
</div>

<p>服务重启完成后，就开始正式安装操作系统了。安装操作系统也可以有很多方式，使用镜像文件中提取出来的文件安装，通过网络安装，等等。因为我要安装的操作系统是<a href="http://www.centos.org/">CentOS</a>，所以使用最简单的通过网络安装。在国内CentOS 5.3 64位版本的网络安装源的地址在 http://centos.ustc.edu.cn/centos/5.3/os/x86_64/ ，因此使用virt-install创建虚拟机的参数如下： </p>
<div class="blog_code"># sudo virt-install -p --name=atom1 -l http://centos.ustc.edu.cn/centos/5.3/os/x86_64/ --file=/dev/atomsvr/xenvm1 --ram=512 --nographic --prompt<br />
</div>

<p>其中</p>
<ul>
	<li>-p 指定XEN虚拟为半虚拟模式（使用支持XEN的内核的虚拟模式）</li>
	<li>-name=atom1 指定虚拟机的名称为atom1</li>
	<li>-l http://centos.ustc.edu.cn/centos/5.3/os/x86_64/ 指定安装源地址</li>
	<li>--file=/dev/atomsvr/xenvm1 指定虚拟成磁盘的设备或文件名，如果使用镜像文件虚拟成磁盘，就直接写上文件名</li>
	<li> --ram=512 指定虚拟机内存为512M</li>
	<li>--nographic 以文本方式执行安装</li>
	<li>--prompt 如有交互问题则显示</li>
</ul>
<p>如果不出意外的话，在下载了OS Kernel和ramfs文件后就顺利进行操作系统的安装了。安装系统前首先会询问网络的配置，请根据实际情况配置，如果不正确，将无法通过网络获取安装文件。在安装过程中，虚拟机会把我们提供的 /dev/atomsvr/xenvm1 逻辑卷虚拟成一个物理磁盘，因此在上面划分文件系统的时候就可以不必使用LVM了。</p>
<p>安装CentOS的步骤就不多说了，跟普通安装一样。安装完成后，系统会重启。但是这时候可能会发现virt-install脚本报错，虚拟机的系统也无法正常重启。</p>
<p>检查/etc/xen目录，发现virt-install没有成功创建名为atom1的虚拟机的配置文件。所以需要手工配置一个。首先使用xm list来查看虚拟机，如果atom1还存在（系统重启时未正常关闭，有残留），就需要先手动把它移除。</p>
<div class="blog_code"># sudo xm list<br />如果发现有atom1虚拟机，则进行下面的移除动作。<br /># sudo xm shutdown atom1<br /># sudo xm delete atom1<br />
</div>

<p>然后在/etc/xen下手工创建该虚拟机的配置文件。</p>
<div class="blog_code"># sudo vi /etc/xen/atom1<br />name&nbsp;&nbsp;&nbsp; = "atom1"<br />memory&nbsp; = "512"<br />disk&nbsp;&nbsp;&nbsp; = [ 'phy:/dev/atomsvr/xenvm1,xvda,w', ]<br />vif&nbsp;&nbsp;&nbsp;&nbsp; = [ 'mac=00:00:00:00:01:01, bridge=eth0', ]<br />vcpus&nbsp;&nbsp; = 1<br />vfb = [ 'type=vnc,vncdisplay=10' ]<br />on_reboot = 'restart'<br />on_crash&nbsp; = 'restart'<br />bootloader = "/usr/bin/pygrub"</div>

<p>非常简单，要说明的是： </p>
<ul>
	<li>disk 参数，phy:指的是使用设备，xvda则是将前面的LVM虚拟成的目标也就是虚拟磁盘xvda（类似于真实的物理硬盘sda）。如果使用的是镜像文件，就需要把phy:改成file:，后面跟上镜像文件的完整路径和文件名。</li>
	<li>vif参数，设定了虚拟机的网络部分设置，mac则是虚拟机的虚拟网卡的mac地址，我随便写了一个假的，只要不和环境中的其他网卡有冲突就好，bridge则说明使用哪块真实网卡来桥接。</li>
	<li>vcpus参数，说明了虚拟的CPU个数。</li>
	<li>vfb参数，虚拟的显示设备（Frame Buffer），我使用了vnc作为输出，vncdisplay则间接的指定了vnc监听端口。设定完成后，我们可以用vnc客户端连接到Domain-0来查看Domain-U的图形界面。很拗口吧，的确是这样的，所有的虚拟机的vnc监听都是由Domain-0来完成的，在这里我们连接到Domain-0的5910端口就能看到atom1这个Domain的图形界面。为什么是5910呢，因为我们在这里设置了vncdisplay=10，每个Domain-U在Domain-0上的监听端口都是5900+vncdisplay的值。举例说明也许可以看得更清楚些：Domain-0的IP是192.168.1.20；atom1 (Domain-1) 的IP是192.168.1.21，vncdisplay=10；假设还有atom2 (Domain-2) IP为 192.168.1.22，vncdisplay=11。那么我们的VNC客户端连接到 192.168.1.20:5910 看到的是atom1的图形界面，连接到 192.168.1.20:5911就是atom2的图形界面。没错，VNC客户端永远是连接到Domain-0的IP，只是端口不同罢了。</li>
	<li>on_reboot和on_crash指定了当系统发生相应事件时的动作。</li>
	<li>bootloader，指定了pygrub等引导程序的路径。</li>
</ul>
<p>保存这个文件后，我们使用如下命令就可以顺利启动虚拟机atom1了。</p>
<div class="blog_code"># sudo xm create atom1<br />
</div>
<p>使用 xm console 可以连接到虚拟机的console终端。</p>
<div class="blog_code"># sudo xm console atom1<br />
</div>
<p>不知道为什么，我尝试了很多次，都无法使用 xm create -c atom1 命令来在启动时自动连接console终端，系统总是报 pygrub未返回任何信息的错误。</p>
<p>对于关闭系统，可以使用终端或用ssh/telnet等软件连入虚拟机的系统使用shutdown命令正常关闭，也可以使用xm命令来关闭。</p>
<div class="blog_code"># sudo xm shutdown atom1<br />
</div>
<p>虚拟机可以正常使用了，但是要在Domain-0之外的主机通过VNC客户端来连接虚拟机还需要修改一下配置。因为xend的默认设置是只在Domain-0的localhost（127.0.0.1）监听vnc连接的，因此其他IP是无法接受VNC客户端的请求的。修改/etc/xen/xend-config.sxp文件。</p>
<div class="blog_code"># sudo vi /etc/xen/xend-config.sxp<br />找到# (vnc-listen '127.0.0.1')，去掉注释符#，并修改为<br />(vnc-listen '0.0.0.0')<br />
</div>
<p>保存后关闭所有虚拟机，重新启动xend服务，然后再打开虚拟机即可。</p>
<div class="blog_code"># sudo xm shutdown atom1<br /># sudo /etc/init.d/xend restart<br /># sudo xm create atom1<br />
</div>
<p>接着我们先在虚拟机上使用startx命令进入图形界面（如果有安装图形界面的话），然后就能用VNC客户端软件在其他主机连接Domain-0的5910端口来查看虚拟机上的图形界面啦。</p>
<p align="center"><a href="javascript:showpic(this,'../upload/1/Images/1_1158418578/P_1250437421_0.jpg');">
<img src="../upload/1/Images/1_1158418578/P_1250437421_0.jpg" height="395" width="400"></a><br />使用VNC客户端连接到Domain-0的5910端口</p>
<p align="center"><a href="javascript:showpic(this,'../upload/1/Images/1_1158418578/P_1250437655_0.jpg');">
<img src="../upload/1/Images/1_1158418578/P_1250437655_0.jpg" height="327" width="400"></a><br />透过VNC看到 atom1 虚拟机的桌面环境启动了</p>
<p align="center"><a href="javascript:showpic(this,'../upload/1/Images/1_1158418578/P_1250437876_0.jpg');">
<img src="../upload/1/Images/1_1158418578/P_1250437876_0.jpg" height="250" width="400"></a><br />XEN的性能很不错，虚拟机开图形界面Domain-0性能不受任何影响</p>
<p>关于安装Domain-U虚拟机的这一部分就先写到这里，其他的方法和关于XEN的其他技巧等我实验过后慢慢再讲吧。以免又要被人说“天书”写太多……囧一个。</p>
<hr>
<p>参考文档：</p>
<ul>
	<li><a href="https://help.ubuntu.com/community/Xen#Installation">Ubuntu Community Documentation - Xen</a></li>
	<li><a href="http://linux.vbird.org/linux_enterprise/xen.php">鳥哥的 Linux 私房菜：利用 Xen 設計虛擬機器</a> （该文章某些观点并不是很正确，请选择性学习）</li>
	<li><a href="http://wiki.xensource.com/xenwiki/InstallationNotes">Xen Installation Support</a></li>
	<li><a href="http://wiki.xensource.com/xenwiki/HowTos">Xen Mini-HOWTOs</a></li>
	<li><a href="http://www.howtoforge.com/installing-xen-3.3-with-kernel-2.6.27-on-ubuntu-8.10-x86_64">Installing Xen 3.3 With Kernel 2.6.27 On Ubuntu 8.10 (x86_64)</a></li>
	<li><a href="http://www.howtoforge.com/xen_tools_xen_shell_argo">Managing Xen With Xen-Tools, Xen-Shell, And Argo</a></li>
	<li><a href="http://www.linux4beginners.info/node/xen-LVM-PVM-install">Use virt-install to install LVM based virtual machines (PVM)</a></li>
	<li><a href="http://www.virtuatopia.com/index.php/Configuring_a_VNC_based_Graphical_Console_for_a_Xen_Paravirtualized_domainU_Guest">Configuring a VNC based Graphical Console for a Xen Paravirtualized domainU Guest</a></li>
	<li><a href="http://www.xen.org/files/Support/XenConfigurationDetails.pdf">Xen Domain Configuration File Overview</a></li>
</ul>





<p> </p>]]></description>
         <category>开源</category>
         <pubDate>Mon, 17 Aug 2009 00:09:59 +0900</pubDate>
      </item>
      <item>
         <title>Ubuntu 9.04上的XEN虚拟服务器（一） 安装XEN</title>
         <link>http://wells.osall.com/blog/index.php?m=content&amp;p=1434&amp;uid=1</link>
         <description><![CDATA[<p>前两天买了个Seagate的320G的2.5寸SATA硬盘，真便宜，300多元，差不多每G一元钱了。于是就把原来移动硬盘里的160G的硬盘装在那台ATOM小PC上了。如果大家还没忘记的话，应该还记得<a href="index.php?uid=1&amp;m=content&amp;p=1417">我的那个ATOM小PC里面是用的8G的CF转IDE作为硬盘</a>的。现在突然存储设备容量大了20倍，那就让它干更多的活吧。兔子老是跟我说他在他的服务器上装了<a href="http://blog.lalacafe.com/category/xen/">n多虚拟机</a>，充分利用硬件资源，那我也来试一下吧。</p>
<p>Linux上有很多虚拟机软件，<a href="http://www.xen.org/">XEN</a>、<a href="http://www.linux-kvm.org/page/Main_Page">KVM</a>、<a href="http://www.vmware.com">VMWare</a>、<a href="http://www.virtualbox.org/">VirtualBox</a>，从开源角度和性能角度来考量，当然选XEN啦。XEN性能非常优异，虚拟的主机的性能几乎和原生主机一致，如果主机硬件支持<a href="http://www.intel.com/technology/virtualization/">VT (intel)</a>或者<a href="http://www.amd.com/us/products/technologies/virtualization/Pages/virtualization.aspx">SVM (AMD)</a>的技术的话，则可以虚拟任何能在x86架构上运行的操作系统。可惜我的ATOM 330 CPU不支持VT技术，因此只能玩半虚拟模式，虚拟出内核支持XEN的操作系统了。</p>
<p>换上新硬盘，首先就是安装新的操作系统。我一直用惯了Ubuntu，因此就安装了<a href="http://www.ubuntu.com/products/WhatIsUbuntu/serveredition">Ubuntu 9.04 Server Edition 64位</a>版本。安装OS的过程就不多说了，直接说XEN的安装配置吧。</p>
<p>在XEN虚拟机环境上第一个被启动的操作系统被称为Domain-0，而之后启动的其他虚拟操作系统则被称为Domain-U，每一个Domain就是一台虚拟机。Domain-0除了可以运行应用程序外，还担负着XEN的控制功能，所以也被称为XEN Hypervisor。在Domain-0上启动了XEN服务后，最重要的一个进程就是xend，这就是XEN的服务进程。</p>
<p>我们新安装的操作系统如果没有安装XEN软件，则就相当于普通的一个单机使用。如果安装了XEN软件，并且以XEN化的内核启动，则这个操作系统环境就变成了Domain-0，而后在这个环境下安装的其他操作系统则就是Domain-U了，都可以通过Domain-0来进行控制。</p>
<p align="center"><a href="javascript:showpic(this,'http%3A//linux.vbird.org/linux_enterprise/xen/hypervisor_01.png');">
<img src="http://linux.vbird.org/linux_enterprise/xen/hypervisor_01.png"></a></p>
<p>要安装并使用XEN，首先更新软件源的信息。</p>
<div class="blog_code"># sudo apt-get update<br /></div>
<p>然后安装xen服务器软件和工具。</p>
<div class="blog_code"># sudo aptitude install ubuntu-xen-server<br /># sudo aptitude install ubuntu-xen-desktop<br /></div>

<p>这时候我们去/boot目录看，可以看到一个xen3.3.gz文件，但是没有供操作系统使用的XEN化的内核，因此此时的操作系统还不是Doamin-0。我找了好久都没找到现成的XEN化内核，于是就只能根据XEN手册自己编译一个内核了。</p>
<p>下载安装最新的kernel文件。</p>
<div class="blog_code"># sudo apt-get install linux-image-server linux-server<br /></div>

<p>安装编译所需要的一些工具包。</p>
<div class="blog_code"># sudo apt-get install build-essential libncurses5-dev gawk mercurial<br /></div>

<p>接下来下载XEN所提供的XEN化的内核的源代码。</p>
<div class="blog_code"># mkdir -p ~/build/linux-2.6.27-xen<br /># cd /usr/src/<br /># sudo hg clone http://xenbits.xensource.com/ext/linux-2.6.27-xen.hg<br /></div>
<p>配置内核选项。</p>
<div class="blog_code"># cd /usr/src/linux-2.6.27-xen.hg<br />
# sudo make O=~/build/linux-2.6.27-xen/ menuconfig</div>

<p>出现内核参数的配置菜单后，根据如下的选项修改配置。</p>
<div class="blog_code">General setup ---&gt; Choose SLAB allocator (SLUB (Unqueued Allocator)) ---&gt; (X) SLAB<br /><br />Processor type and features ---&gt; Subarchitecture Type (PC-compatible) ---&gt; (X) Enable Xen compatible kernel<br /><br />Bus options (PCI etc.)&nbsp; ---&gt; [*] PCI support<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [*]&nbsp;&nbsp; Xen PCI Frontend<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [ ]&nbsp;&nbsp;&nbsp;&nbsp; Xen PCI Frontend Debugging (NEW)<br /><br />将 &lt;M&gt; 802.1d Ethernet Bridging 修改为 &lt;*&gt; 802.1d Ethernet Bridging:<br /><br />Networking support ---&gt; Networking options ---&gt; &lt;*&gt; 802.1d Ethernet Bridging<br /><br />关闭 10000 Mbit Ethernet 支持（否则可能编译失败）：<br /><br />Device Drivers ---&gt; [*] Network device support ---&gt; [ ] Ethernet (10000 Mbit) ---&gt;<br /><br />在 XEN 选项区中，按照下面选择选项（确认选择 Xen version compatibility (3.0.4 and later) 来取代原来的 Xen version compatibility (3.0.2 and later)）：<br /><br />Device Drivers&nbsp; ---&gt; XEN&nbsp; ---&gt; [*] Privileged Guest (domain 0)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;*&gt; Backend driver support (NEW)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;*&gt;&nbsp;&nbsp; Block-device backend driver (NEW)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;*&gt;&nbsp;&nbsp; Block-device tap backend driver (NEW)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;*&gt;&nbsp;&nbsp; Network-device backend driver (NEW)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (8)&nbsp;&nbsp;&nbsp;&nbsp; Maximum simultaneous transmit requests (as a power of 2) (NEW)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [ ]&nbsp;&nbsp;&nbsp;&nbsp; Pipelined transmitter (DANGEROUS) (NEW)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt; &gt;&nbsp;&nbsp;&nbsp;&nbsp; Network-device loopback driver (NEW)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;*&gt;&nbsp;&nbsp; PCI-device backend driver (NEW)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PCI Backend Mode (Virtual PCI)&nbsp; ---&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [ ]&nbsp;&nbsp;&nbsp;&nbsp; PCI Backend Debugging (NEW)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt; &gt;&nbsp;&nbsp; TPM-device backend driver (NEW)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;M&gt;&nbsp;&nbsp; SCSI backend driver (NEW)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;M&gt; Block-device frontend driver<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;M&gt; Network-device frontend driver<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;M&gt;&nbsp;&nbsp; Network-device frontend driver acceleration for Solarflare NICs (NEW)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;M&gt; SCSI frontend driver (NEW)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;*&gt; User-space granted page access driver (NEW)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;*&gt; Framebuffer-device frontend driver (NEW)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;*&gt;&nbsp;&nbsp; Keyboard-device frontend driver (NEW)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [*] Disable serial port drivers (NEW)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;*&gt; Export Xen attributes in sysfs (NEW)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (256) Number of guest devices (NEW)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Xen version compatibility (3.0.4 and later)&nbsp; ---&gt;<br /></div>

<p>保存完配置后就可以开始编译内核了。</p>
<div class="blog_code"># sudo make O=~/build/linux-2.6.27-xen/<br /># sudo make O=~/build/linux-2.6.27-xen/ modules_install install</div>

<p>通过漫长的等待（我的Atom 330 CPU花了大约3个小时），终于编译完内核了。编译安装完成后，去/boot目录检查，应该可以看到生成了支持xen的2.6.27.5的内核了。</p>
<div class="blog_code"># ls -l /boot<br />total 72697<br />-rw-r--r-- 1 root root&nbsp;&nbsp; 525592 2009-04-17 12:05 abi-2.6.28-11-server<br />-rw-r--r-- 1 root root&nbsp;&nbsp; 524602 2009-07-25 11:14 abi-2.6.28-14-server<br />-rw-r--r-- 1 root root&nbsp;&nbsp;&nbsp; 87448 2009-08-13 19:50 config-2.6.27.5<br />-rw-r--r-- 1 root root&nbsp;&nbsp;&nbsp; 90587 2009-04-17 12:05 config-2.6.28-11-server<br />-rw-r--r-- 1 root root&nbsp;&nbsp;&nbsp; 90560 2009-07-25 11:14 config-2.6.28-14-server<br />drwxr-xr-x 2 root root&nbsp;&nbsp;&nbsp;&nbsp; 1024 2009-08-13 20:04 grub<br />-rw-r--r-- 1 root root&nbsp; 8259056 2009-08-14 03:31 initrd.img-2.6.28-11-server<br />-rw-r--r-- 1 root root&nbsp; 8272673 2009-08-13 15:02 initrd.img-2.6.28-14-server<br />drwxr-xr-x 2 root root&nbsp;&nbsp;&nbsp; 12288 2009-08-14 03:17 lost+found<br />-rw-r--r-- 1 root root&nbsp;&nbsp; 128796 2009-03-28 04:12 memtest86+.bin<br />-rw-r--r-- 1 root root&nbsp; 1651431 2009-08-13 19:50 System.map-2.6.27.5<br />-rw-r--r-- 1 root root&nbsp; 1871187 2009-04-17 12:05 System.map-2.6.28-11-server<br />-rw-r--r-- 1 root root&nbsp; 1863183 2009-07-25 11:14 System.map-2.6.28-14-server<br />-rw-r--r-- 1 root root&nbsp;&nbsp;&nbsp;&nbsp; 1169 2009-04-17 12:09 vmcoreinfo-2.6.28-11-server<br />-rw-r--r-- 1 root root&nbsp;&nbsp;&nbsp;&nbsp; 1169 2009-07-25 11:16 vmcoreinfo-2.6.28-14-server<br />-rw-r--r-- 1 root root&nbsp; 3145318 2009-08-13 19:50 vmlinuz-2.6.27.5<br />-rw-r--r-- 1 root root&nbsp; 3520832 2009-04-17 12:05 vmlinuz-2.6.28-11-server<br />-rw-r--r-- 1 root root&nbsp; 3510496 2009-07-25 11:14 vmlinuz-2.6.28-14-server<br />-rw-r--r-- 1 root root&nbsp;&nbsp; 470084 2009-06-18 16:16 xen-3.3.gz</div>

<p>内核有了，但是还没有initrd.img也就是启动时所需的ramdisk文件，手动来生成一个。</p>
<div class="blog_code"># sudo depmod 2.6.27.5<br /># sudo update-initramfs -c -k 2.6.27.5</div>

<p>更新grub引导程序。</p>
<div class="blog_code"># update-grub</div>


<p>现在XEN的环境基本上都建好了，我们需要来修改一下配置文件了。</p>
<p>XEN服务的配置文件都在/etc/xen目录下。XEN服务的主配置文件是 /etc/xen/xend-config.sxp。打开这个文件，我们要确认的是XEN虚拟服务器的网络连接方式，这是相当重要的。我选择了桥接模式，也就是说，Domain-U虚拟机和Domain-0在同一子网，用Domain-0的物理网卡来进行桥接到虚拟机的虚拟网卡。</p>
<div class="blog_code"># sudo vi /etc/xen/xend-config.sxp<br /><br />确认网络部分是这样配置的：<br />(network-script network-bridge)<br /></div>



<p>下一步要根据你的习惯来修改。你喜欢将虚拟机安装在哪里？是用一个镜像文件来虚拟成磁盘，还是将一个LVM逻辑卷虚拟成磁盘，或者干脆就是将物理磁盘给虚拟机使用？</p>
<p>对于后两种选择，你可以跳过这一步。但如果你选择了在现有的文件系统中建立一个镜像文件来虚拟成一个虚拟机的物理磁盘，那就要按照下面修改默认配置了。</p>
<p> 由于镜像文件在加载的时候是作为回圈设备（loop device），因此要将操作系统的默认最大回圈设备数量调大，以免出现不必要的问题。</p>
<div class="blog_code"># sudo vi /etc/modules<br /><br />将loop这一行修改为：<br />loop max_loop=64<br /></div>



<p>好啦，重启主机，进入Domain-0的世界！！！</p>
<div class="blog_code"># sudo shutdown -r now<br /></div>




<p>重启完成后检查一下kernel版本，是不是XEN化的那个2.6.27.5？</p>
<div class="blog_code"># uname -r<br />2.6.27.5<br /></div>





<p>现在可以使用XEN的管理命令xm，来看看虚拟机运行状况啦！</p>
<div class="blog_code"># sudo xm list<br />Name&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ID&nbsp;&nbsp; Mem VCPUs&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; State&nbsp;&nbsp; Time(s)<br />Domain-0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp; 1473&nbsp;&nbsp;&nbsp;&nbsp; 4&nbsp;&nbsp;&nbsp;&nbsp; r-----&nbsp;&nbsp;&nbsp; 479.8<br /></div>






<p>哈哈，可以看到Domain-0正常运行！！！你可以使用xm help来学习如何通过xm来管理虚拟机。</p>
<p>在State列，看到Domain-0是r的状态，也就是说，这个Domain正在运行中，并有任务在该Domain上运行。虚拟机还有如下几种状态：</p>
<ul>
	<li>r ：该domain正在消耗CPU资源，任务运行中；</li>
	<li>b ：该domain正被暂时搁置(blockded)，一般来说是因为这个domain在闲置中，等待输入或输出(I/O)；</li>
	<li>p ：该domain处于暂停状态，通常是因为管理员使用 xm pause 暂停了这个domain。当domain至于暂停状态时，Xen的管理器将不会处理这个domain的任何动作；</li>
	<li>s ：该domain正在关机；</li>
	<li>c ：该domain已经crash了，但是没有关机。一般来说是因为domain的配置文件没有设置 on_crash 动作所致；</li>
	<li>d ：该domain正在死机中，一般来说是因为这个domain无法正确 shutdown/crashed 之故。</li>
</ul>
<p>先到这里吧，总算是把XEN安装上了，而且也把Domain-0给顺利启动了，安装Domain-U的其他虚拟机就留给下一篇吧～～～</p>]]></description>
         <category>技术</category>
         <pubDate>Sat, 15 Aug 2009 23:25:02 +0900</pubDate>
      </item>
      <item>
         <title>烘焙时间开始！</title>
         <link>http://wells.osall.com/blog/index.php?m=content&amp;p=1430&amp;uid=1</link>
         <description><![CDATA[<p>一直就想买个烤炉，在家烤肉烤鱼烤鸡腿烤面包烤蛋糕，让舌头过过瘾。不过想想配方、调料，一个比一个复杂，总是下不了决心。自从最近在网上看到别人做出的美味的各式蛋糕西点、中式烤菜，我的心终于开始长草……终于，这回下定决心，把烤炉买回了家。</p>
<p>我买的是国内用的比较多的长帝烤炉，便宜啊，比进口货便宜多了（有个ACA经我研究是假洋鬼子牌子）。果然一分钱一分货，这玩意做工非常一般，而且我是网购的，可能是运输过程中野蛮搬运，我拿到的时候下方的石英管已经给震坏了（短路，一用下方的管子就跳闸）。唉，人品有问题，只能找卖家更换了。</p>
<p>虽然下管不能用，但上管还是可以的，哈哈，所以，先烤个美味五香鸡翅试试看。</p>
<p>配方是参考了网上的方子自己根据口味调整改进的，反正差不多就这味。</p>
<ul>
	<li>五香粉5克（10克一包，我用了一半）</li>
	<li>孜然粉3克</li>
	<li>姜粉1克</li>
	<li>黄酒半勺</li>
	<li>调味酱油1勺半</li>
	<li>鸡翅中11个（超市买的，大概350克左右）</li>
</ul>
<div align="center"><a href="javascript:showpic(this,'../upload/1/Images/1_1249567140/P_1249568115_0.jpg');">
<img src="../upload/1/Images/1_1249567140/P_1249568115_0.jpg" alt="01烤鸡翅原料" height="296" width="400"></a><br /><br /><a href="javascript:showpic(this,'../upload/1/Images/1_1249567140/P_1249568136_1.jpg');">
<img src="../upload/1/Images/1_1249567140/P_1249568136_1.jpg" alt="02烤鸡翅原料" height="296" width="400"></a><br /><br /><a href="javascript:showpic(this,'../upload/1/Images/1_1249567140/P_1249568145_2.jpg');">
<img src="../upload/1/Images/1_1249567140/P_1249568145_2.jpg" alt="03烤鸡翅原料" height="400" width="248"></a><br /></div><p>首先把调料加大约半杯水调匀，然后腌制鸡翅中，给鸡翅按摩，让它吸收汁水。把鸡翅放在冰箱等待12小时左右，让汁水被鸡翅吸收入味。最好过几小时把鸡翅翻一下，让他能充分吸收。</p>
<p align="center"><a href="javascript:showpic(this,'../upload/1/Images/1_1249567140/P_1249568156_3.jpg');">
<img src="../upload/1/Images/1_1249567140/P_1249568156_3.jpg" alt="04烤鸡翅腌制" height="296" width="400"></a><br />腌制</p>
<p>漫长的等待过后，把鸡翅摆放在烤盘里，用刷子给鸡翅刷上一层蜂蜜。烤箱设定180度，预热完毕后，把鸡翅放入烤箱进行烘烤。10分钟后取出，再刷一层蜂蜜，顺便把鸡翅翻个身，然后再烤10分钟，取出再刷一层蜂蜜，翻身。最后再烤5分钟等鸡翅变成诱人的金黄色就OK啦。看，口水出来了吧。</p>
<p align="center"><a href="javascript:showpic(this,'../upload/1/Images/1_1249567140/P_1249568169_4.jpg');">
<img src="../upload/1/Images/1_1249567140/P_1249568169_4.jpg" alt="05烤鸡翅开烤" height="296" width="400"></a><br />排排坐，烤鸡翅</p>
<p align="center"><a href="javascript:showpic(this,'../upload/1/Images/1_1249567140/P_1249568178_5.jpg');"><br />
<img src="../upload/1/Images/1_1249567140/P_1249568178_5.jpg" alt="06烤鸡翅刷蜜" height="296" width="400"></a><br />烤了10分钟了，颜色已经有点漂亮了</p>
<p align="center"><a href="javascript:showpic(this,'../upload/1/Images/1_1249567140/P_1249568220_6.jpg');">
<img src="../upload/1/Images/1_1249567140/P_1249568220_6.jpg" alt="07烤鸡翅烤ing" height="296" width="400"></a><br />烤ing</p>
<p align="center"><a href="javascript:showpic(this,'../upload/1/Images/1_1249567140/P_1249568951_2.jpg');">
<img src="../upload/1/Images/1_1249567140/P_1249568951_2.jpg" alt="08烤鸡翅完工" height="296" width="400"></a><br />完工啦，诱人不？口水……</p>
<p>还没等鸡翅凉一点，我就迫不及待抓了一只往嘴里塞。哇，成功了，这鸡翅烤得我外焦里嫩 :)。鸡肉的汁水和着蜂蜜的口感有些偏甜却又非常绵柔，真是非常成功啊～:D</p>
<p>下一次，就要挑战面点了～嘿嘿，努力～</p>]]></description>
         <category>美食</category>
         <pubDate>Thu, 06 Aug 2009 23:23:22 +0900</pubDate>
      </item>
      <item>
         <title>衰神附体，宣告追日彻底失败～</title>
         <link>http://wells.osall.com/blog/index.php?m=content&amp;p=1427&amp;uid=1</link>
         <description><![CDATA[<p>很兴奋的，号称500年一遇的日全食（凤凰卫视说的，另一说是300年一遇）来了；很兴奋的，从去年年底就开始炒作苏州是最佳观测点；很兴奋的，所
谓的“专家”一致在说从历年的数据来看，7月22日应该会是晴好少云天气；很兴奋的，我有了全套拍摄观察装备——天文望远镜、观鸟望远镜、两个数码相机、
一个胶片单反、巴德膜滤镜；很兴奋的，我住顶楼，还有一个大阳台，观测不求人，家里就是最佳观测点。</p>
<p>可惜，事情从一开始就不顺利。</p>
<p>两周前就在<a href="http://www.weather.com">weather.com</a>查到了这一周几乎天天是Thunder
Storm的天气，心中不免担心了起来。但是上一周天天万里无云，加上我们的所谓“专家”还在鼓吹历史数据论，侥幸心理就不免膨胀起来——
<a href="http://www.weather.com">weather.com</a>也该不准一次了吧，虽然我查的时候每次都十有八九被它说中……</p>
<p>在<a href="http://www.taobao.com">万能的淘宝</a>买巴德膜的时候也衰了一把。本来准备买零散的巴德膜回来自制滤镜的（降低成本啊），买的时候说的好好的，钱都付了，结果卖家发货的时候居然跟我说缺货了。退款，重新找卖家。唉～问遍所有零售卖家，全部缺货……只能咬牙买了个进口的现成的80mm巴德膜滤镜……</p>
<p align="center"><a href="javascript:showpic(this,'../upload/1/Images/1_1248228659/P_1248228953_3.jpg');">
<img src="../upload/1/Images/1_1248228659/P_1248228953_3.jpg" alt="DSC_1035" height="400" width="268"></a><br />我的acuter 80望远镜</p>
<div align="center">
</div>
<p align="center"><a href="javascript:showpic(this,'../upload/1/Images/1_1248228659/P_1248228867_0.jpg');">
<img src="../upload/1/Images/1_1248228659/P_1248228867_0.jpg" alt="PICT4121" height="264" width="400"></a><br />acuter 80接单反</p>
<p>在<a href="http://www.google.com">google</a>找了这次日全食在苏州的准确时间点，提前做好了拍摄计划，准备用acuter 80望远镜接单反相机进行拍摄，另一个相机作为备用。</p>
<table border="0" cellspacing="1" width="100%"><tbody><tr align="center" bgcolor="#cfcfcf"><th title="使用谷歌搜索查看解释"><a href="http://www.google.cn/search?hl=zh-CN&amp;q=%E9%A3%9F%E8%B1%A1" target="_blank">食象</a><span style="font-size: 0.8em; font-weight: normal;"> (ΔT=66.2s)</span></th><th>北京时间</th><th title="使用谷歌搜索查看解释"><a href="http://www.google.cn/search?hl=zh-CN&amp;q=%E9%AB%98%E5%BA%A6%E8%A7%92" target="_blank">高度角</a></th><th title="使用谷歌搜索查看解释"><a href="http://www.google.cn/search?hl=zh-CN&amp;q=%E6%96%B9%E4%BD%8D%E8%A7%92" target="_blank">方位角</a></th><th>P</th><th>V</th></tr><tr align="center" bgcolor="#efefef"><td title="日偏食开始" align="center"><strong>初亏</strong>
<img src="http://i1.sinaimg.cn/IT/subject/2009/0720/ri/C1.jpg" onmouseover="eclipse2009.showImg('C1', 'largeimg')" onmouseout="document.getElementById('largeImg').style.display='none';"></td><td>08:22:18.9</td><td title="39.4°已含折射率">+39.4°</td><td>088.5°</td><td>286°</td><td>12.3</td></tr><tr align="center" bgcolor="#efefef"><td title="日全食开始" align="center"><strong>食既</strong>
<img src="http://i2.sinaimg.cn/IT/subject/2009/0720/ri/C2.jpg" onmouseover="eclipse2009.showImg('C2', 'largeimg')" onmouseout="document.getElementById('largeImg').style.display='none';"></td><td>09:35:10.9</td><td title="54.9°已含折射率">+54.9°</td><td>099.2°</td><td>077°</td><td>07.3</td></tr><tr align="center" bgcolor="#efefef"><td title="日月中心基本重叠" align="center"><strong>食甚</strong>
<img src="http://i3.sinaimg.cn/IT/subject/2009/0720/ri/MID.jpg" onmouseover="eclipse2009.showImg('MID', 'largeimg')" onmouseout="document.getElementById('largeImg').style.display='none';"></td><td>09:37:38.4</td><td title="55.4°已含折射率">+55.4°</td><td>099.6°</td><td>199°</td><td>03.1</td></tr><tr align="center" bgcolor="#efefef"><td title="日全食结束" align="center"><strong>生光</strong>
<img src="http://i3.sinaimg.cn/IT/subject/2009/0720/ri/C3.jpg" onmouseover="eclipse2009.showImg('C3', 'largeimg')" onmouseout="document.getElementById('largeImg').style.display='none';"></td><td>09:40:06.8</td><td title="55.9°已含折射率">+55.9°</td><td>100.1°</td><td>322°</td><td>11.2</td></tr><tr align="center" bgcolor="#efefef"><td title="日偏食结束" align="center"><strong>复圆</strong>
<img src="http://i0.sinaimg.cn/IT/subject/2009/0720/ri/C4.jpg" onmouseover="eclipse2009.showImg('C4', 'largeimg')" onmouseout="document.getElementById('largeImg').style.display='none';"></td><td>10:59:38.1</td><td title="71.8°已含折射率">+71.8°</td><td>123.5°</td><td>113°</td><td>06.6</td></tr></tbody></table><div style="position: relative; margin-left: 20px;">
<img src="http://i3.sinaimg.cn/IT/subject/2009/0720/ri/large-C1.jpg" id="largeImg" style="position: absolute; display: none; top: 0pt; left: 0pt; z-index: 100;"></div>
<p>其他日食参数 <br />
全食时间：4分55.9秒 本影深度：46.4% 食分(日食程度):100.00% 星等(食甚)：1.01779</p>
<p>7月21日晨，天空万里无云，由于我之前没有拍摄日全食的经验，为了保证正式拍摄时万无一失，开始根据拍摄计划做演练。这次rehearsal的目的是：</p>
<ul>
	<li>追踪确认8:00 - 10:00左右的太阳的运行轨迹，选择好三脚架摆放的位置。</li>
	<li>测试单反连接acuter 80望远镜的拍摄参数，主要是放大倍数、快门和ISO值的组合（望远镜的光圈是固定的）。</li>
	<li>感觉对焦位置。</li>
</ul>
<p>拍摄很顺利，只要日全食发生时天气良好，拍摄应该不成问题。</p>
<p align="center"><a href="javascript:showpic(this,'../upload/1/Images/1_1248228659/P_1248228876_1.jpg');">
<img src="../upload/1/Images/1_1248228659/P_1248228876_1.jpg" alt="DSC_0985" height="304" width="400"></a><br />演练时拍摄的太阳，7月21日，acuter 80/Nikon D80/巴德膜</p>

<p>可惜的是，终于知道了什么叫人算不如天算，计划不如变化……从21日晚9:00开始就下起了两个星期都没见过的雨……衰神来了……这只是前兆。</p>
<p>22日晨7:00，起床看天，太阳露了一小脸，心里面不禁开心的想，风儿吹呀吹，或许一会就云消雾散了。把设备都搬到露台上，逐个安装架设完毕，等待8:22的来临。等待时，顺便找了胖灰测试了下设备。200米外的胖灰，一打一个准，又被我抓到了，嘿嘿。</p>
<p align="center">&nbsp;<a href="javascript:showpic(this,'../upload/1/Images/1_1248228659/P_1248228924_2.jpg');">
<img src="../upload/1/Images/1_1248228659/P_1248228924_2.jpg" alt="DSC_1010" height="304" width="400"></a><br />200米外的胖灰，光线不好，ISO800</p>
<p>还没高兴太久，8:13，天空突然乌云密布，瞬间豆大的雨点就下来了，赶忙把设备搬回家里……衰神准点到达……</p>
<p>雨一直下，气氛不算融洽，是非常不融洽，我准备了那么久，就被这一场雨给搅黄了……郁闷难以言表……</p>
<p>回到家里，看凤凰卫视，这次居然跟垃圾的苏州电视台合作，看着那个傻B的苏州电视台主持人在东吴塔上啥也没看到就看着天慢慢暗下来还在那里很二的瞎激动的喊“非常震撼啊，我生平以来第一次看到”，我简直想抽他丫的。虽然下雨不是他的错，但是我得找个出气筒发泄啊～</p>
<p>9:35天黑了，9:40天慢慢亮了。我在阳台上自制的监视器忠实的记录下这一切（每分钟自动拍摄一张画面）。</p>
<p>感谢衰神，这次日食，我啥都没拍到，也只有这监视器的画面能告诉我“天黑了，天又亮了”……</p>
<p align="center"><a href="javascript:showpic(this,'../upload/1/Images/1_1248228659/P_1248231466_0.gif');">
<img src="../upload/1/Images/1_1248228659/P_1248231466_0.gif" alt="eclipse.2009.07.22"></a><br />监视器画面，每分钟一张，天黑了，天又亮了……</p>
<p>唉，500年（300年）后我们再见吧。</p>]]></description>
         <category>摄影</category>
         <pubDate>Wed, 22 Jul 2009 11:46:32 +0900</pubDate>
      </item>
      <item>
         <title>使用GnuPG来加密/解密文件</title>
         <link>http://wells.osall.com/blog/index.php?m=content&amp;p=1423&amp;uid=1</link>
         <description><![CDATA[<p>最近想通过HTTP来传送备份的数据文件，但又担心被无耻之徒中途截获导致数据泄漏。于是就静下心来研究了一下<a href="http://www.gnupg.org/">GnuPG</a>的使用。</p>
<p>以前也曾经了解过gpg签名的用途，但自己从来没有用过，在Google和gpg --help的帮助下，找了几篇文档，终于测试成功，把过程记下来，以免自己以后用脑过度导致中老年痴呆，记忆力下降，忘记了。</p>
<p>在两台主机间通过gpg加密传送信息，说的简单点，一般来说，就是在接收方的主机上生成一对密钥：一个公钥(public key)，一个私钥(private key)，然后将公钥(public key)发送给信息发送方，发送方使用这个公钥(public key)将信息加密编码(encrypt)，然后将加密过的信息传送给接收方，最后接收方再利用自己的私钥(private key)将加密编码过的信息解码(decrypt)还原。在这个过程中，如果加密过的信息在传输过程中被第三方截取，则他们获取的信息只是加密过的乱码，如果他们没有私钥(private key)，那就没有办法解码还原该信息（公钥是无法被用作解码的）。</p>
<p>下面就看看实际过程吧。我的接收端是Ubuntu Linux 9.04 （主机名atomsvr），发送端是FreeBSD 6.2（主机名monster）。</p>
<p>首先，在接收端运行GnuPG，使用 gpg --gen-key 命令生成密钥对（以下粗体文字是需要您输入的）。</p>
<div class="blog_code"><br />wells@atomsvr:~$ <strong>gpg --gen-key</strong><br />gpg (GnuPG) 1.4.9; Copyright (C) 2008 Free Software Foundation, Inc.<br />This is free software: you are free to change and redistribute it.<br />There is NO WARRANTY, to the extent permitted by law.<br /><br />Please select what kind of key you want:<br />&nbsp;&nbsp; (1) DSA and Elgamal (default)<br />&nbsp;&nbsp; (2) DSA (sign only)<br />&nbsp;&nbsp; (5) RSA (sign only)<br />Your selection? <strong>1</strong><br />DSA keypair will have 1024 bits.<br />ELG-E keys may be between 1024 and 4096 bits long.<br />What keysize do you want? (2048)<br />Requested keysize is 2048 bits<br />Please specify how long the key should be valid.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0 = key does not expire<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;n&gt;&nbsp; = key expires in n days<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;n&gt;w = key expires in n weeks<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;n&gt;m = key expires in n months<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;n&gt;y = key expires in n years<br />Key is valid for? (0) <strong>0</strong><br />Key does not expire at all<br />Is this correct? (y/N)<strong> y</strong><br /><br />You need a user ID to identify your key; the software constructs the user ID<br />from the Real Name, Comment and Email Address in this form:<br />&nbsp;&nbsp;&nbsp; "Heinrich Heine (Der Dichter) &lt;heinrichh@duesseldorf.de&gt;"<br /><br />Real name: <strong>Wells Wang</strong><br />Email address: <strong>wellswang@********.com</strong><br />Comment:<br />You selected this USER-ID:<br />&nbsp;&nbsp;&nbsp; "Wells Wang &lt;wellswang@********.com&gt;"<br /><br />Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? <strong>o</strong><br />You need a Passphrase to protect your secret key.<br /><br />gpg: gpg-agent is not available in this session<br />We need to generate a lot of random bytes. It is a good idea to perform<br />some other action (type on the keyboard, move the mouse, utilize the<br />disks) during the prime generation; this gives the random number<br />generator a better chance to gain enough entropy.<br />+++++..++++++++++..++++++++++++++++++++++++++++++.+++++.<br />+++++++++++++++++++++++++++++++++++++++++++++.+++++.+<br />+++++++++..+++++.+++++++++++++++&gt;+++++.+++++..........+++++<br /><br />Not enough random bytes available.&nbsp; Please do some other work to give<br />the OS a chance to collect more entropy! (Need 271 more bytes)</div>
<p>这时候，主机需要一些随机数来生成密钥，所以你可以在这台主机上随便敲些其他命令，执行下别的应用程序，读写下磁盘，让操作系统生成足够多的随机数来满足密钥的生成。在这个例子中，我们选择了默认的DSA和Elgamal编解码算法，DSA的密钥（用于签名）长度1024，ELG-E密钥（用于解码）长度2048，密钥永不过期，你也可以根据自己的需求改变这些选择。在生成密钥的过程中，会让你输入一个Passphrase（密码短语）来保护私钥(private key)，请牢记这个密码，在使用私钥来解密文件的过程中，需要用到这个密码。</p>
<p>完成后，我们可以通过 gpg -vk 命令来查看生成的密钥。</p>
<div class="blog_code">wells@atomsvr:~$ <strong>gpg -vk</strong><br />/home/wells/.gnupg/pubring.gpg<br />------------------------------<br />pub&nbsp;&nbsp; 1024D/41532C13 2009-07-08<br />uid&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Wells Wang &lt;wellswang@********.com&gt;<br />sub&nbsp;&nbsp; 2048g/7A849913 2009-07-08 <br /></div>
<p>通过上面的命令我们可以看到生成的两个密钥，pub表示公钥，ID为41532C13。我们就是要把这个公钥导出，然后在要发送消息的服务器monster上导入使用该公钥加密信息。</p>
<p>下面，我们就使用gpg --armor --export 命令在atomsvr上导出公钥。</p>
<div class="blog_code">wells@atomsvr:~$ <strong>gpg --armor --export 41532C13 &gt;backup.key</strong><br />wells@atomsvr:~$<br />wells@atomsvr:~$ cat backup.key<br />-----BEGIN PGP PUBLIC KEY BLOCK-----<br />Version: GnuPG v1.4.9 (GNU/Linux)<br /><br />mQGiBEpUuEwRBADJawj29f6y7r4Z+u98k40lzfn5Y0H3wiEWYZCnHMcZi4yqYfOC<br />deHaQrlbdEJ1V2R4BLqh32fqnjuAUYljtLj6k6icyUYF1URtVdgQGudmDIVcSkPl<br />4dbkoMyaaUCBbc8n6+UfppG4jRxMVas0PoHIy4Ntk4zD/sZ4RQs8zt76ewCgmcOK<br />czoMCLee15yIPPg+BYwfUvkD/0w6HXy5HpLNa290WerjtLqaac5nPFhQh/IwcEJw<br />OL3OQ5xx57BL1WULugTHQuPl2Vv+dWULsHCXNxdqL4jpZZ0JjpVZG9yJk20GndqW<br />Xy+SGvaAHgpL6SuUimpXxWf+x0LMY8q433FqSnkOWMAz/ICYm6kNxM2TTzwAvayv<br />i3EpA/oCTRQNpucrznxShJhAsYrYxoin904pZ+Iash3SExlIPk/IUqXR6iwAb71k<br />Kj0HhqxQpdfmaI61bJ/9MwUEZmTgWh07vvADmqb5PpyqsXFOqZYC0uM/SB9WGsV3<br />FdzBN19vh/EDiNtnkspSLhTxwCep7Fx7Iv84+CLjiYc6j9ZzLrQgV2VsbHMgV2Fu<br />ZyA8d2VsbHN3YW5nQG9zYWxsLmNvbT6IYAQTEQIAIAUCSlS4TAIbAwYLCQgHAwIE<br />FQIIAwQWAgMBAh4BAheAAAoJEBjRqcVBUywTWQgAniWYds4YNgbDOGX/tc4a1WrC<br />n2qHAJ4hvWEwSI/VXIVyAv9dclUbZ1HF8rkCDQRKVLhMEAgAlNwwyR5avmy9DHL4<br />GK40JJeL/tpryn8BPV/3ruIxkMivC/Zpj6FhxKwMjhp7BksH8BxA59qqZG2iojsl<br />FKG60IbyMy0ccjcG0UUPgRcg2FN6BFCwF3wpeiakcP/F2GaBHC5M2vz1BMW1GG+j<br />yaMwOGrci4Gjx29kkhB5e7YkznHXv9rbLTMNkF3UKu/C6IWlgAWt+tvKr8qy4l0g<br />xsLq4ttoBq0r/+vrsVgrr10FABi0NQD2fO1xolGXZDRJrulbhNg/WM6dQxwotRHp<br />fy82scniejYx06WeAYOeSRMyCAkEsbf5gD56ymqodifSm/VtG7tB4g0chxxm16fC<br />urSmzwADBQf+Jpj4jH28+sd+Ow5X/DpC8A9JLbsPDOkjGBv+tcN2Wtv9ZwdpUWd/<br />qVTfKYD8hhT2q2B5Tu0RBxyNLRCwS7tvFxjqFXnVJu0uLIMS8WFW63xLRGHCceQz<br />V4qALbHtyW+i1KYdXBD4qIVsp6Xyx0PlTArkJgyH5rDDQsBAFhAlONpwxbZglY1p<br />/C9PVfk2ywZhaK3K1p4bePvJhVpZiAYbDcUH5ilateGl4sX3cIul2U1KY+fWOB2d<br />RttHTMk++aAV57eKeta/hcFSTWYl97YVabf1Gosz7RY+sY3R26MWp1qy6HQIgo02<br />7yGqTbQskUfoLS5BgY68n6Bf61blF5wj8ohJBBgRAgAJBQJKVLhMAhsMAAoJEBjR<br />qcVBUywTbVkAoJiFA5OfaC5igDqqiOlFxuuTTxQVAJ9kq64oTeMVQbQ1SLcgKXl2<br />jeQyXA==<br />=Ptu/<br />-----END PGP PUBLIC KEY BLOCK-----<br /><br /></div>
<p>在上面的例子我们指定将ID为41532C13的导出到backup.key文件，然后查看该文件，可以看到，该文件内是一个长度为1024字节的密钥串。</p>
<p>接着，我们将这个backup.key文件用FTP或其他方法传送到要发送信息的monster服务器上，并使用gpg -import命令导入。</p>
<div class="blog_code">[wells@monster ~]$ <strong>gpg --import backup.key</strong><br />Warning: using insecure memory!<br />gpg: keyring `/home/wells/.gnupg/secring.gpg' created<br />gpg: key 41532C13: public key "Wells Wang &lt;wellswang@********.com&gt;" imported<br />gpg: Total number processed: 1<br />gpg:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; imported: 1<br /></div>
<p>导入后，我们同样可以在这台服务器上使用gpg -vk命令来看一下导入的密钥。</p>
<div class="blog_code">[wells@monster ~]$ <strong>gpg -vk</strong><br />Warning: using insecure memory!<br />gpg: using PGP trust model<br />/home/wells/.gnupg/pubring.gpg<br />------------------------------<br />pub&nbsp;&nbsp; 1024D/41532C13 2009-07-08<br />uid&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Wells Wang &lt;wellswang@********.com&gt;<br />sub&nbsp;&nbsp; 2048g/7A849913 2009-07-08</div>
<p>接着我们就可以用这个公钥来加密一个文本文件sylvan.sql。使用gpg -ea -r命令来加密。-ea是加密，-r是指定加密要使用的接收方的公钥的ID。</p>
<div class="blog_code">[wells@monster backup]$ <strong>gpg -ea -r 41532C13 sylvan.sql</strong><br />Warning: using insecure memory!<br />gpg: 7A849913: There is no assurance this key belongs to the named user<br /><br />pub&nbsp; 2048g/7A849913 2009-07-08 Wells Wang &lt;wellswang@********.com&gt;<br />&nbsp;Primary key fingerprint: 88CF 12D6 7CB4 DBF9 DC3B&nbsp; 3312 18D1 A9C5 4153 2C13<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Subkey fingerprint: 57EE 4248 51C4 4FE7 400F&nbsp; 9318 0AEC FA41 7A84 9913<br /><br />It is NOT certain that the key belongs to the person named<br />in the user ID.&nbsp; If you *really* know what you are doing,<br />you may answer the next question with yes.<br /><br />Use this key anyway? (y/N) y <strong>n</strong><br />gpg: sylvan.sql: encryption failed: Unusable public key</div>
<p>不过出现了些意外，在加密时，系统认为我们刚才导入的公钥不受信任，因此发出了提示信息，要求确认该公钥是可信任的。这时候，输入y可以完成加密。但是我想要将该公钥状态更改为被信任，这样以后再使用加密命令就不必要每次都做确认了。</p>
<p>因此，在这台服务器上运行 gpg --edit-key 命令来编辑密钥状态。在编辑模式，使用trust命令来信任密钥。</p>
<div class="blog_code">[wells@monster backup]$ <strong>gpg --edit-key 41532C13</strong><br />gpg (GnuPG) 2.0.11; Copyright (C) 2009 Free Software Foundation, Inc.<br />This is free software: you are free to change and redistribute it.<br />There is NO WARRANTY, to the extent permitted by law.<br /><br />Warning: using insecure memory!<br /><br />pub&nbsp; 1024D/41532C13&nbsp; created: 2009-07-08&nbsp; expires: never&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; usage: SC &nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; trust: unknown&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; validity: unknown<br />sub&nbsp; 2048g/7A849913&nbsp; created: 2009-07-08&nbsp; expires: never&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; usage: E&nbsp; &nbsp;<br />[ unknown] (1). Wells Wang &lt;wellswang@********.com&gt;<br /><br />Command&gt; <strong>trust</strong><br />pub&nbsp; 1024D/41532C13&nbsp; created: 2009-07-08&nbsp; expires: never&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; usage: SC &nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; trust: unknown&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; validity: unknown<br />sub&nbsp; 2048g/7A849913&nbsp; created: 2009-07-08&nbsp; expires: never&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; usage: E&nbsp; &nbsp;<br />[ unknown] (1). Wells Wang &lt;wellswang@********.com&gt;<br /><br />Please decide how far you trust this user to correctly verify other users' keys<br />(by looking at passports, checking fingerprints from different sources, etc.)<br /><br />&nbsp; 1 = I don't know or won't say<br />&nbsp; 2 = I do NOT trust<br />&nbsp; 3 = I trust marginally<br />&nbsp; 4 = I trust fully<br />&nbsp; 5 = I trust ultimately<br />&nbsp; m = back to the main menu<br /><br />Your decision? <strong>5</strong><br />Do you really want to set this key to ultimate trust? (y/N) <strong>y</strong><br /><br />pub&nbsp; 1024D/41532C13&nbsp; created: 2009-07-08&nbsp; expires: never&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; usage: SC &nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; trust: ultimate&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; validity: unknown<br />sub&nbsp; 2048g/7A849913&nbsp; created: 2009-07-08&nbsp; expires: never&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; usage: E&nbsp; &nbsp;<br />[ unknown] (1). Wells Wang &lt;wellswang@********.com&gt;<br />Please note that the shown key validity is not necessarily correct<br />unless you restart the program.<br /><br />Command&gt; <strong>quit</strong></div>
<p>在以上的例子中，我们可以看到，在trust之前，密钥的trust状态是Unkown，当我们选择 5 无限信任(trust ultimately)之后，密钥状态变为ultimate。</p>
<p>再次尝试加密文本文件sylvan.sql，这一回，我们就不需要确认是否信任公钥了。</p>
<div class="blog_code">[wells@monster backup]$ gpg -ea -r 41532C13 sylvan.sql<br />Warning: using insecure memory!<br />gpg: checking the trustdb<br />gpg: 3 marginal(s) needed, 1 complete(s) needed, PGP trust model<br />gpg: depth: 0&nbsp; valid:&nbsp;&nbsp; 1&nbsp; signed:&nbsp;&nbsp; 0&nbsp; trust: 0-, 0q, 0n, 0m, 0f, 1u<br /><br /></div>
<p>在加密完成后，会自动生成一个.asc文件 sylvan.sql.asc。该文件就是加密过后的文件，现在就可以把它传送给接收方服务器了。在传送的过程中，无需担心它会被第三方截获。因为即使第三方截获了该文件，他们没有私钥和保护私钥的密码短语，也只能看到类似这样的内容：</p>
<div class="blog_code">[wells@monster backup]$ more&nbsp; sylvan.sql.asc <br />-----BEGIN PGP MESSAGE-----<br />Version: GnuPG v2.0.11 (FreeBSD)<br /><br />hQIOAwrs+kF6hJkTEAf+OiN69pKvJTDojT1cY+zK7ZiCCCYoWWEzY0j3TSyfjyVC<br />Sqr2uPwUht3eNEUTEwpa87wNlcgsunbSJImI0CwekDQgyXX/BOFsQayQG/kFQOUw<br />P44P/vftcRlIEB+3lHVoi651mvLOTkWHhFsfYCjkgcnzRi/TwHwzaXnEaTZTeQnf<br />gRPcQdNXo9go1IPVVjkxhycOTOYBOcqYroDuqPBFXBXsXqhr7hwUVW+Ifak5l8jd<br />Mo/90EEm6v7PVO/fW9aejqA1myEA93OU0lQhT3sEhM1dmP5dBS7QHpUf/MQQOkXW<br />j6MhtZypcCr36dOl7DijaUKEzgZf/wCDq4t+Mlo4eQf/alUBu0SJs9fLzTyLHnC3<br />vrvVF2lGdVS+OlQSWNnOkHzfRQFrUk337fQ9Xl9Rq96ETp2ZeZpweWYATLb1Audb<br />HrdXMN1gDgeXCKn8aFaFm8UZ13jRzlt4erMnVrYdvXRr8BlnJAC1CxYMF19EhZL5<br />Kw3GbybaJhuy5JWJHnz66luUo6yacAGNYggXScsLGJR53pZcO9txZwODOpkNENAx<br />CRQwJvJHm1k3IJVMjFecmP8TUOo/yfm2MmjvqgMCmi47mjp2FQ3yIzos4yJE897a<br />2wwNRNCa4pqs4CpFL3p0KHxWb9UL0E3Qr640VJi2aWXzbUWPg80GcfeijX1BIw5W<br />MtLtAUMdfBHXXDt+iarTCiY14u7Lv0ZIigD1fSNBcheJUpR9ZGK+Ywq3KKK6q5Br<br />C1nqRHoye0WYQjAcy9NosZYsycWZJspuCyHrty9Ka175e9LYEn/DFIPSa2mS9b8H<br />mQzzpTBldJuZ6rJWc1mzVVpFchNKAx6rOsFi7mLacrZwe/BifAAP9G7PyqoeRxY5<br />E7Ip4stoMGZeSh1UZGcrvH+Ym0FrQpGRFsu37Owy4niSGj01u3e1ao/z2543XGvt<br />EFQBZgb0uiSMgY59Qbu9WAg7Vr0+P+H3cDm9PSH66EQx8MWyfhW3WEGViS3nSith<br />EG1gFWcL/Oj/1V53lFDKTgYLK0PBgoin/Jc+l8wD3hT9R2M4ZYv4WhtQTDFzv2MZ<br />zLckaUh7Sx/bTryC9JBvIoEHjoMYOz3SoJCK+zIZxL+CGA05SXD9UywVTzmed7sM<br />kJ9c+M0A1IZJnNlwum0qwqwG4jKrIzmqB3vcXLAXUW001FWo4uCzfVANdjClvFt8<br />lCSUaxNTzcSV60Xi5FvydkPKCpMxnoF6swtlPLV+BNJwoqcFtt/1Ov1zWjJErgmB<br />vXx2BjOZOn6aSMCG6QT2vAWKVZsviAUT4IIethtKwfIgx0XZY9CJYkDXHX923VTp<br />4SzwrliEt9RQMxEaI2wOR0VjQKqBP+BcZ6ZisZdFvs/GFaYBSDL0hSuZbQQXBjWl<br />tFYL9Rie9mNvnJ4BlXn2qYnM0631EZ8NJ5ZIi6wd0kWG5f1pKj+dEnrX75l+cpaH<br />zE+WGpRY1N0TI7mP7Lgi6qcOD3wubpkB2LdKlXIces9hkXaxNr+pZM0LFvriF+MI<br />L2Mk2ok4XqPCU8P4Io9xrXJ2vR5huVbTPnnPf6tYwikh7BfVP+Oz6xDe31jeXKkM<br />YUb9h73CR49s5TMDOZ66pdkqaDwNahJUuml2cLFU7sZ2gl41Ua+/tiThW1oG5jFx<br />tppJYRgyytp3T5xJdeniduccOjO9I7iELx29vwg33EgCR+gyn/p3UXk557hovIBW<br />4lyJOEo6nJ0zUigzuEn068Fr//xftn7MLQJ0IuB8wgPTx0mPYGDqGPRhfiDEW3fa<br />s30X52Ju6Xgyw4DrFFY6eWF2ZkxsP4CiH8fLWzfAHYEC/rQLmGI70SlRPmTmtaqX<br />Hp8Nd7vT/nJkdS3av5HzuD3gvHcetmbD7QeCFe2EWVyvQQlUYx/kUYZCppqmPV5A<br />awGoGQhqQ9L+xKl80wziVSuSa6rV6fyhNxRbyVKuaGbvWTde/ZXiFk9rRWJQsTt7</div>
<p>在接受方atomsvr服务器上收到这个加密后的文件sylvan.sql.asc后，就可以用gpg -o -d命令来使用注册过的私钥解密该文件了。-o参数指定了解密过后的文件名，-d参数指定了要被解密的文件名。</p>
<div class="blog_code">wells@atomsvr:~/backup$ gpg -o sylvan.sql -d sylvan.sql.asc<br /><br />You need a passphrase to unlock the secret key for<br />user: "Wells Wang &lt;wellswang@********.com&gt;"<br />2048-bit ELG-E key, ID 7A849913, created 2009-07-08 (main key ID 41532C13)<br /><br />gpg: gpg-agent is not available in this session<br />Enter passphrase:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; gpg: encrypted with 2048-bit ELG-E key, ID 7A849913, created 2009-07-08<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "Wells Wang &lt;wellswang@*******.com&gt;"<br /><br /></div>
<p>解密过程中系统会提示你输入保护私钥的密码短语（在生成密钥时输入的那个Passphrase），输入后，解密成功，生成了sylvan.sql文件。看一下，内容还原啦：</p>
<div class="blog_code">wells@atomsvr:~/backup$ more sylvan.sql<br />-- MySQL dump 10.9<br />--<br />-- Host: localhost&nbsp;&nbsp;&nbsp; Database: sylvan<br />-- ------------------------------------------------------<br />-- Server version&nbsp;&nbsp; &nbsp;4.1.21<br />/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;<br />/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;<br />/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO,MYSQL323' */;<br />/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;<br /><br />--<br />-- Table structure for table `adv_user_advertisements`<br />--<br /><br />DROP TABLE IF EXISTS `adv_user_advertisements`;<br />CREATE TABLE `adv_user_advertisements` (<br />&nbsp; `userid` int(10) unsigned NOT NULL default '0',<br />&nbsp; `type` varchar(2) NOT NULL default '',<br />&nbsp; `script` text NOT NULL,<br />&nbsp; `description` varchar(255) NOT NULL default '',<br />&nbsp; `desc_pos` enum('A1','A2','A3','B1','B2','B3') NOT NULL default 'A1',<br />&nbsp; `isactive` enum('Y','N') NOT NULL default 'Y',<br />&nbsp; PRIMARY KEY&nbsp; (`userid`,`type`)<br />) TYPE=MyISAM;<br /><br />--<br />-- Dumping data for table `adv_user_advertisements`<br />--<br /><br /></div>
<p>就这样，<a href="http://www.gnupg.org/">GnuPG</a>用起来还是非常方便安全的。可以更进一步，写个脚本自动加密传输，用的时候再解密，这样就完美了。呵呵。</p>
<p>硬着头皮，申请了Quota，又写了篇技术的。主要是怕自己忘记……Sorry...</p>]]></description>
         <category>开源</category>
         <pubDate>Wed, 15 Jul 2009 21:53:02 +0900</pubDate>
      </item>
      <pubDate>Mon, 28 Nov 2011 16:06:21 +0900</pubDate>
   </channel>
</rss>

