<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>robot on I Code It</title>
    <link>https://icodeit.org/categories/robot/</link>
    <description>Recent content in robot on I Code It</description>
    <generator>Hugo -- gohugo.io</generator>
    <lastBuildDate>Sun, 01 Jun 2014 00:00:00 +0000</lastBuildDate><atom:link href="https://icodeit.org/categories/robot/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>我的第一个四驱机器人 - Arduino</title>
      <link>https://icodeit.org/2014/06/my-4w-robot-built-on-top-of-arduino/</link>
      <pubDate>Sun, 01 Jun 2014 00:00:00 +0000</pubDate>
      
      <guid>https://icodeit.org/2014/06/my-4w-robot-built-on-top-of-arduino/</guid>
      <description>我的第一个机器人 以我的视角拍摄的机器人

以机器人自身的视角拍摄的

虽然迟了4年，但是我终于完成了我的第一台机器人的安装和配置。
 基于Arduino的Duemilanove开发板 可以躲开障碍物继续前进（有距离探测器，与障碍物的距离小于20cm时会自动转向） 4轮驱动  我回忆了一下，这块板子和外设是我2010年3月在昆明的时候买的，那段时间对硬件突然有了极高的热情，但是买了之后准备开始之际，发现了几点困难：
 当时航空管制，电池不能空运，因此网购的小车没有电池 缺乏基本的硬件常识，四个电机如何接在两个电机端口上 不会焊接电机 没有买杜邦线，没有测试用的面包板  基于这些困难，又加上我当时在找工作，准备面试之类，机器人的制造就放了下来。结果一放就是4年，中途从昆明搬家回到西安，不过细心的孙曼思将那一大包的零部件都打包好带了回来，多亏她认真负责的态度，才让这个机器人的产生有了可能。
ThoughtWorks西安硬件小组 2013年，在ThoughtWorks的西安Office有了硬件小组，他们研究开源硬件，以及这些小芯片在实际环境中的应用。比如RCA的高亮，做出了一个“半自动”地移动上的story的产品。2014年Hackday的时候，CASA团队又做出了一个看房机器人Dora，dora可以在房间中移动，由于装置了一个摄像头，因此可以实时的看到它看到的东西，而且Dora有安装了无线模块，你可以在远程操控它并得到实时图像。
好了，这么多铺垫事实上是有意义的，如果没有西安Office的硬件小组，我的这个机器人的诞生可能又需要若干年。它给我提供了丰富的资源，比如：
 有丰富硬件经验的张新宇，高亮，王超，可以让我很容易问问题并得到答案 张新宇帮我焊了一个电源的接头 王超提供了一个7.2V的电池 高亮的百宝箱中有一个9V电池盒 CASA团队桌子上开发Dora的一些下脚料 杜邦线，热缩管，电烙铁，松香，镊子，钳子，各种螺丝刀等等  4年 vs 4天 虽然拖的时间很长（4年），但是事实上加起来搭建它的所有时间差不多是4天。
 单独测试URM模块 单独测试电机驱动L298N模块  我发现，其实硬件开发和软件一样，化分模块，小步前进，测试，持续集成等等概念可以很好的运用其中，而且效果极好，比如我的小车基本上可以划分为这样几个小功能的逐步实现：
 测距模块的单独启动 测距模块控制一个LED（距离小于5cm，点亮一个LED） 电机的单独启动（正转，反转） 测距模块控制电机（距离小于5cm，转动电机） 多个电机联合（如何联线） 测距模块控制多个电机  当到达最后一步时，基本上所有要验证的功能都已经就绪了，只需要拼装在小车的底座上，进行集成测试即可。其实，当划分好任务之后，每一个小的任务都不会花费很多时间。
故障 当我兴高采烈的去掉USB线，加上一个7.2V的电池给整个系统时，URM37测距模块伴随着浓郁的电器焦味中烧坏了，就是因为一个跳线的连接不当。这个系统中，电机需要单独加电，但是由于我自己电气知识的匮乏，导致了这个悲剧的发生。
不过，我又在Office的CASA团队的桌子上发现了另外一个测距模块，不过这次只经过了15分钟就完成了替换掉了老板子，换上了新的测距模块。
#include &amp;lt;NewPing.h&amp;gt; #define TRIGGER_PIN 12 // 12端口 #define ECHO_PIN 11 // 11端口 #define MAX_DISTANCE 400  int ledpin = 13; NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE); void setup() { Serial.</description>
      <content:encoded><![CDATA[<h3 id="我的第一个机器人">我的第一个机器人</h3>
<p>以我的视角拍摄的机器人</p>
<p><embed src="http://player.youku.com/player.php/sid/XNzIwNzE4NjYw/v.swf" allowFullScreen="true" quality="high" width="480" height="400" align="middle" allowScriptAccess="always" type="application/x-shockwave-flash"></embed></p>
<p>以机器人自身的视角拍摄的</p>
<p><embed src="http://player.youku.com/player.php/sid/XNzIwNzI4NDQw/v.swf" allowFullScreen="true" quality="high" width="480" height="400" align="middle" allowScriptAccess="always" type="application/x-shockwave-flash"></embed></p>
<p>虽然迟了4年，但是我终于完成了我的第一台机器人的安装和配置。</p>
<ol>
<li>基于Arduino的<a href="http://arduino.cc/en/Main/arduinoBoard">Duemilanove开发板</a></li>
<li>可以躲开障碍物继续前进（有距离探测器，与障碍物的距离小于20cm时会自动转向）</li>
<li>4轮驱动</li>
</ol>
<p>我回忆了一下，这块板子和外设是我2010年3月在昆明的时候买的，那段时间对硬件突然有了极高的热情，但是买了之后准备开始之际，发现了几点困难：</p>
<ol>
<li>当时航空管制，电池不能空运，因此网购的小车没有电池</li>
<li>缺乏基本的硬件常识，四个电机如何接在两个电机端口上</li>
<li>不会焊接电机</li>
<li>没有买杜邦线，没有测试用的面包板</li>
</ol>
<p>基于这些困难，又加上我当时在找工作，准备面试之类，机器人的制造就放了下来。结果一放就是4年，中途从昆明搬家回到西安，不过细心的孙曼思将那一大包的零部件都打包好带了回来，多亏她认真负责的态度，才让这个机器人的产生有了可能。</p>
<h4 id="thoughtworks西安硬件小组">ThoughtWorks西安硬件小组</h4>
<p>2013年，在ThoughtWorks的西安Office有了硬件小组，他们研究开源硬件，以及这些小芯片在实际环境中的应用。比如RCA的高亮，做出了一个“半自动”地移动上的story的产品。2014年Hackday的时候，CASA团队又做出了一个看房机器人Dora，dora可以在房间中移动，由于装置了一个摄像头，因此可以实时的看到它看到的东西，而且Dora有安装了无线模块，你可以在远程操控它并得到实时图像。</p>
<p>好了，这么多铺垫事实上是有意义的，如果没有西安Office的硬件小组，我的这个机器人的诞生可能又需要若干年。它给我提供了丰富的资源，比如：</p>
<ol>
<li>有丰富硬件经验的张新宇，高亮，王超，可以让我很容易问问题并得到答案</li>
<li>张新宇帮我焊了一个电源的接头</li>
<li>王超提供了一个7.2V的电池</li>
<li>高亮的百宝箱中有一个9V电池盒</li>
<li>CASA团队桌子上开发Dora的一些下脚料</li>
<li>杜邦线，热缩管，电烙铁，松香，镊子，钳子，各种螺丝刀等等</li>
</ol>
<h4 id="4年-vs-4天">4年 vs 4天</h4>
<p>虽然拖的时间很长（4年），但是事实上加起来搭建它的所有时间差不多是4天。</p>
<ol>
<li>单独测试URM模块</li>
<li>单独测试电机驱动L298N模块</li>
</ol>
<p>我发现，其实硬件开发和软件一样，化分模块，小步前进，测试，持续集成等等概念可以很好的运用其中，而且效果极好，比如我的小车基本上可以划分为这样几个小功能的逐步实现：</p>
<ol>
<li>测距模块的单独启动</li>
<li>测距模块控制一个LED（距离小于5cm，点亮一个LED）</li>
<li>电机的单独启动（正转，反转）</li>
<li>测距模块控制电机（距离小于5cm，转动电机）</li>
<li>多个电机联合（如何联线）</li>
<li>测距模块控制多个电机</li>
</ol>
<p>当到达最后一步时，基本上所有要验证的功能都已经就绪了，只需要拼装在小车的底座上，进行集成测试即可。其实，当划分好任务之后，每一个小的任务都不会花费很多时间。</p>
<h4 id="故障">故障</h4>
<p>当我兴高采烈的去掉USB线，加上一个7.2V的电池给整个系统时，URM37测距模块伴随着浓郁的电器焦味中烧坏了，就是因为一个跳线的连接不当。这个系统中，电机需要单独加电，但是由于我自己电气知识的匮乏，导致了这个悲剧的发生。</p>
<p>不过，我又在Office的CASA团队的桌子上发现了另外一个测距模块，不过这次只经过了15分钟就完成了替换掉了老板子，换上了新的测距模块。</p>
<div class="highlight"><pre class="chroma"><code class="language-c" data-lang="c"><span class="cp">#include</span> <span class="cpf">&lt;NewPing.h&gt;</span><span class="cp">
</span><span class="cp"></span>
<span class="cp">#define TRIGGER_PIN  12  </span><span class="c1">// 12端口
</span><span class="c1"></span><span class="cp">#define ECHO_PIN     11  </span><span class="c1">// 11端口
</span><span class="c1"></span><span class="cp">#define MAX_DISTANCE 400
</span><span class="cp"></span>
<span class="kt">int</span> <span class="n">ledpin</span> <span class="o">=</span> <span class="mi">13</span><span class="p">;</span>

<span class="n">NewPing</span> <span class="nf">sonar</span><span class="p">(</span><span class="n">TRIGGER_PIN</span><span class="p">,</span> <span class="n">ECHO_PIN</span><span class="p">,</span> <span class="n">MAX_DISTANCE</span><span class="p">);</span>

<span class="kt">void</span> <span class="nf">setup</span><span class="p">()</span> <span class="p">{</span>
  <span class="n">Serial</span><span class="p">.</span><span class="n">begin</span><span class="p">(</span><span class="mi">9600</span><span class="p">);</span> <span class="c1">// Sets the baud rate to 9600
</span><span class="c1"></span>  <span class="n">pinMode</span><span class="p">(</span><span class="n">ledpin</span><span class="p">,</span> <span class="n">OUTPUT</span><span class="p">);</span>   <span class="c1">//设置13号口为输出
</span><span class="c1"></span><span class="p">}</span>

<span class="kt">void</span> <span class="nf">loop</span><span class="p">()</span>
<span class="p">{</span>
  <span class="kt">unsigned</span> <span class="kt">int</span> <span class="n">uS</span> <span class="o">=</span> <span class="n">sonar</span><span class="p">.</span><span class="n">ping</span><span class="p">();</span> <span class="c1">// 把扫描时间转化成us
</span><span class="c1"></span>  <span class="kt">int</span> <span class="n">dis</span> <span class="o">=</span> <span class="n">uS</span> <span class="o">/</span> <span class="n">US_ROUNDTRIP_CM</span><span class="p">;</span> <span class="c1">//转成距离
</span><span class="c1"></span>  
  <span class="k">if</span> <span class="p">(</span><span class="n">dis</span> <span class="o">&lt;=</span> <span class="mi">20</span><span class="p">)</span> <span class="p">{</span>
    <span class="n">digitalWrite</span><span class="p">(</span><span class="n">ledpin</span><span class="p">,</span> <span class="n">HIGH</span><span class="p">);</span>    
  <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
    <span class="n">digitalWrite</span><span class="p">(</span><span class="n">ledpin</span><span class="p">,</span> <span class="n">LOW</span><span class="p">);</span>  
  <span class="p">}</span>
  

  <span class="n">Serial</span><span class="p">.</span><span class="n">print</span><span class="p">(</span><span class="s">&#34;Distance = &#34;</span><span class="p">);</span>
  <span class="n">Serial</span><span class="p">.</span><span class="n">println</span><span class="p">(</span><span class="n">dis</span><span class="p">);</span>
  
  <span class="n">delay</span><span class="p">(</span><span class="mi">150</span><span class="p">);</span>
<span class="p">}</span>
</code></pre></div><h4 id="安装过程">安装过程</h4>
<p>测距模块很早之前就<a href="http://icodeit.org/2012/01/arduino%E8%B6%85%E5%A3%B0%E6%B3%A2%E6%B5%8B%E8%B7%9D%E6%A8%A1%E5%9D%97%E4%BD%BF%E7%94%A8/">已经整理过</a>了，可以看看这里。不过我最后的成品已经没有使用URM37了，取而代之的是HC-SR04。</p>
<p>连接电机与电机驱动模块：</p>
<p><img loading="lazy" src="/images/2014/06/motor-resized.png" type="" alt="image"  /></p>
<p>第一次焊接电机，话说这种电机的触头也太粗糙了吧，不自己焊接的话，根本就用不成，完全没有进入模块化世界。</p>
<p><img loading="lazy" src="/images/2014/06/motor-repaired-resized.png" type="" alt="image"  /></p>
<p>连接之后
<img loading="lazy" src="/images/2014/06/motors-connected-resized.png" type="" alt="image"  /></p>
<p>装车
<img loading="lazy" src="/images/2014/06/4w-car-resized.png" type="" alt="image"  /></p>
<p><img loading="lazy" src="/images/2014/06/debug-car-resized.png" type="" alt="image"  /></p>
<h4 id="最终的代码">最终的代码</h4>
<div class="highlight"><pre class="chroma"><code class="language-c" data-lang="c"><span class="cp">#include</span> <span class="cpf">&lt;NewPing.h&gt;</span><span class="cp">
</span><span class="cp"></span>
<span class="cp">#define TRIGGER_PIN  12  </span><span class="c1">// 12端口
</span><span class="c1"></span><span class="cp">#define ECHO_PIN     11  </span><span class="c1">// 11端口
</span><span class="c1"></span><span class="cp">#define MAX_DISTANCE 400
</span><span class="cp"></span>
<span class="kt">int</span> <span class="n">E1</span> <span class="o">=</span> <span class="mi">6</span><span class="p">;</span>
<span class="kt">int</span> <span class="n">M1</span> <span class="o">=</span> <span class="mi">7</span><span class="p">;</span>

<span class="kt">int</span> <span class="n">E2</span> <span class="o">=</span> <span class="mi">5</span><span class="p">;</span>                         
<span class="kt">int</span> <span class="n">M2</span> <span class="o">=</span> <span class="mi">4</span><span class="p">;</span>                           

<span class="kt">int</span> <span class="n">ledpin</span> <span class="o">=</span> <span class="mi">13</span><span class="p">;</span>

<span class="kt">void</span> <span class="nf">setup</span><span class="p">()</span> <span class="p">{</span>
  <span class="n">Serial</span><span class="p">.</span><span class="n">begin</span><span class="p">(</span><span class="mi">9600</span><span class="p">);</span>                  <span class="c1">// Sets the baud rate to 9600
</span><span class="c1"></span>  <span class="n">pinMode</span><span class="p">(</span><span class="n">ledpin</span><span class="p">,</span> <span class="n">OUTPUT</span><span class="p">);</span>   <span class="c1">//设置13号口为输出
</span><span class="c1"></span>  
  <span class="n">pinMode</span><span class="p">(</span><span class="n">M1</span><span class="p">,</span> <span class="n">OUTPUT</span><span class="p">);</span>
  <span class="n">pinMode</span><span class="p">(</span><span class="n">M2</span><span class="p">,</span> <span class="n">OUTPUT</span><span class="p">);</span>
  
  <span class="n">digitalWrite</span><span class="p">(</span><span class="n">ledpin</span><span class="p">,</span> <span class="n">LOW</span><span class="p">);</span> <span class="c1">//灭掉LED  
</span><span class="c1"></span>
  <span class="n">delay</span><span class="p">(</span><span class="mi">200</span><span class="p">);</span> <span class="c1">//Give sensor some time to start up --Added By crystal  from Singapo, Thanks Crystal.
</span><span class="c1"></span><span class="p">}</span>


<span class="kt">void</span> <span class="nf">advance</span><span class="p">()</span> <span class="p">{</span>
    <span class="n">digitalWrite</span><span class="p">(</span><span class="n">M1</span><span class="p">,</span><span class="n">HIGH</span><span class="p">);</span>          
    <span class="n">digitalWrite</span><span class="p">(</span><span class="n">M2</span><span class="p">,</span><span class="n">HIGH</span><span class="p">);</span>
    <span class="n">analogWrite</span><span class="p">(</span><span class="n">E1</span><span class="p">,</span> <span class="mi">200</span><span class="p">);</span>
    <span class="n">analogWrite</span><span class="p">(</span><span class="n">E2</span><span class="p">,</span> <span class="mi">200</span><span class="p">);</span>
<span class="p">}</span>

<span class="kt">void</span> <span class="nf">backoff</span><span class="p">()</span> <span class="p">{</span>
    <span class="n">digitalWrite</span><span class="p">(</span><span class="n">M1</span><span class="p">,</span><span class="n">LOW</span><span class="p">);</span>          
    <span class="n">digitalWrite</span><span class="p">(</span><span class="n">M2</span><span class="p">,</span><span class="n">LOW</span><span class="p">);</span>
    <span class="n">analogWrite</span><span class="p">(</span><span class="n">E1</span><span class="p">,</span> <span class="mi">200</span><span class="p">);</span>
    <span class="n">analogWrite</span><span class="p">(</span><span class="n">E2</span><span class="p">,</span> <span class="mi">200</span><span class="p">);</span>
<span class="p">}</span>

<span class="kt">void</span> <span class="nf">left</span><span class="p">()</span> <span class="p">{</span>
    <span class="n">digitalWrite</span><span class="p">(</span><span class="n">M1</span><span class="p">,</span><span class="n">LOW</span><span class="p">);</span>
    <span class="n">digitalWrite</span><span class="p">(</span><span class="n">M2</span><span class="p">,</span><span class="n">HIGH</span><span class="p">);</span>
    <span class="n">analogWrite</span><span class="p">(</span><span class="n">E1</span><span class="p">,</span> <span class="mi">150</span><span class="p">);</span>
    <span class="n">analogWrite</span><span class="p">(</span><span class="n">E2</span><span class="p">,</span> <span class="mi">150</span><span class="p">);</span>
    <span class="n">delay</span><span class="p">(</span><span class="mi">1000</span><span class="p">);</span>
<span class="p">}</span>

<span class="kt">void</span> <span class="nf">right</span><span class="p">()</span> <span class="p">{</span>
    <span class="n">digitalWrite</span><span class="p">(</span><span class="n">M1</span><span class="p">,</span><span class="n">HIGH</span><span class="p">);</span>
    <span class="n">digitalWrite</span><span class="p">(</span><span class="n">M2</span><span class="p">,</span><span class="n">LOW</span><span class="p">);</span>
    <span class="n">analogWrite</span><span class="p">(</span><span class="n">E1</span><span class="p">,</span> <span class="mi">150</span><span class="p">);</span>
    <span class="n">analogWrite</span><span class="p">(</span><span class="n">E2</span><span class="p">,</span> <span class="mi">150</span><span class="p">);</span>
    <span class="n">delay</span><span class="p">(</span><span class="mi">1000</span><span class="p">);</span>
<span class="p">}</span>

<span class="kt">void</span> <span class="nf">stop</span><span class="p">()</span> <span class="p">{</span>
    <span class="n">analogWrite</span><span class="p">(</span><span class="n">E1</span><span class="p">,</span> <span class="mi">0</span><span class="p">);</span>
    <span class="n">analogWrite</span><span class="p">(</span><span class="n">E2</span><span class="p">,</span> <span class="mi">0</span><span class="p">);</span>
<span class="p">}</span>

<span class="n">NewPing</span> <span class="nf">sonar</span><span class="p">(</span><span class="n">TRIGGER_PIN</span><span class="p">,</span> <span class="n">ECHO_PIN</span><span class="p">,</span> <span class="n">MAX_DISTANCE</span><span class="p">);</span>

<span class="kt">void</span> <span class="nf">loop</span><span class="p">()</span>
<span class="p">{</span>
  <span class="kt">unsigned</span> <span class="kt">int</span> <span class="n">uS</span> <span class="o">=</span> <span class="n">sonar</span><span class="p">.</span><span class="n">ping</span><span class="p">();</span> <span class="c1">// 把扫描时间转化成us
</span><span class="c1"></span>  <span class="kt">int</span> <span class="n">dis</span> <span class="o">=</span> <span class="n">uS</span> <span class="o">/</span> <span class="n">US_ROUNDTRIP_CM</span><span class="p">;</span> <span class="c1">//转成距离
</span><span class="c1"></span>  
  <span class="k">if</span> <span class="p">(</span><span class="n">dis</span> <span class="o">&lt;=</span> <span class="mi">20</span><span class="p">)</span> <span class="p">{</span>
    <span class="n">stop</span><span class="p">();</span>
    <span class="n">left</span><span class="p">();</span>
    <span class="n">delay</span><span class="p">(</span><span class="mi">30</span><span class="p">);</span>
    <span class="n">digitalWrite</span><span class="p">(</span><span class="n">ledpin</span><span class="p">,</span> <span class="n">HIGH</span><span class="p">);</span>    
  <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
    <span class="n">advance</span><span class="p">();</span>
    <span class="n">delay</span><span class="p">(</span><span class="mi">30</span><span class="p">);</span>
    <span class="n">digitalWrite</span><span class="p">(</span><span class="n">ledpin</span><span class="p">,</span> <span class="n">LOW</span><span class="p">);</span>  
  <span class="p">}</span>
  

  <span class="n">Serial</span><span class="p">.</span><span class="n">print</span><span class="p">(</span><span class="s">&#34;Distance = &#34;</span><span class="p">);</span>
  <span class="n">Serial</span><span class="p">.</span><span class="n">println</span><span class="p">(</span><span class="n">dis</span><span class="p">);</span>
  
  <span class="n">delay</span><span class="p">(</span><span class="mi">150</span><span class="p">);</span>
<span class="p">}</span>

</code></pre></div><h4 id="体会">体会</h4>
<ol>
<li>和开发软件一样，硬件开发也可以使用“敏捷开发”</li>
<li>实用主义，比如bluetip的使用，杜邦线拼接等</li>
<li>迭代开发，小步快跑</li>
</ol>
]]></content:encoded>
    </item>
    
  </channel>
</rss>
