<?xml version="1.0" encoding="utf-8"?> 
<rss version="2.0">

<channel>

<title>Nonfinishism studious, заметки с тегом: Ultrasonic Sensor</title>
<link>http://www.medinskiy.net/nfss/tags/ultrasonic-sensor/</link>
<description></description>
<generator>E2 (v2842; Aegea)</generator>

<item><title>Учим робота ориентироваться в пространстве. Робот, объезжающий препятствия.</title><guid isPermaLink="true">http://www.medinskiy.net/nfss/all/trackbotfinal/</guid><link>http://www.medinskiy.net/nfss/all/trackbotfinal/</link><description>&lt;p&gt;Обычно говорят «Скоро сказка сказывается, да не скоро дело делается». В нашем случае все с точностью до наоборот. Этого робота мы закончили (ну или почти закончили) делать в мае, а «сказка» появляется только сейчас, почти через три месяца.&lt;br /&gt;
Долго ли, коротко ли, пришло время научить робота принимать какие-то осмысленные решения самостоятельно. Пока робот умеет только обнаруживать препятствия и объезжать их слева. Необходимо, чтобы он объезжал препятствие либо слева, либо справа, в зависимости от того, с какой стороны больше места для маневра. Если же робот заезжает в тупик (т. е. невозможно проехать ни вперед, ни вправо, ни влево), он должен задним ходом выехать из тупика.&lt;/p&gt;
&lt;p&gt;Из всего вышеописанного следует, что нам необходимо не только контролировать расстояние до препятствия впереди, но и расстояние до препятствия слева и справа.&lt;br /&gt;
Вариантов несколько:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;установить ультразвуковые сенсоры впереди, слева и справа,&lt;/li&gt;
&lt;li&gt;сделать так, чтобы сеносор мог вращаться и смотреть в разные стороны.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Второй вариант немного сложнее, но кажется более правильным.&lt;br /&gt;
Для того, чтобы сенсор мог смотреть в разные стороны мы использовали сервопривод вот &lt;a href="http://dx.com/p/towerpro-sg90-9g-mini-servo-with-accessories-12859"&gt;такой&lt;/a&gt;.&lt;/p&gt;
&lt;div class="tiles"&gt;
            &lt;a href="pictures/IMG_0394.jpg" rel="lightbox"&gt;
                &lt;img src="pictures/IMG_0394.jpg" /&gt;
            &lt;/a&gt;
&lt;a href="pictures/empty.png" &gt;
                &lt;img src="pictures/empty.jpg" /&gt;
            &lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;Сервопривод закрепили в передней части робота, на него поставили сенсор. Таким образом сенсор может смотреть вперед, поворачиваться на 90 градусов направо и налево.&lt;/p&gt;
&lt;div class="tiles"&gt;
     &lt;a href="pictures/IMG_0402.jpg" rel="lightbox[01]"&gt;
                &lt;img src="pictures/IMG_0402.jpg" /&gt;
        &lt;/a&gt;
  &lt;a href="pictures/IMG_0401.jpg" rel="lightbox[01]"&gt;
                &lt;img src="pictures/IMG_0401.jpg" /&gt;
           &lt;/a&gt;
  &lt;a href="pictures/IMG_0403.jpg" rel="lightbox[01]"&gt;
                &lt;img src="pictures/IMG_0403.jpg" /&gt;
           &lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;Для подсоединения сервопривода используется трехконтактная колодка, как и для сенсора (плюс, минус и сигнал). Для подключения использовали Sensor Shield (на фотографии это хорошо видно).&lt;/p&gt;
&lt;p&gt;Для того, чтобы робот смог объезжать препятствия был придуман такой алгоритм:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Робот все время мониторит свободное пространство перед собой.&lt;/li&gt;
&lt;li&gt;Как только расстояние до препятствия становится меньше &lt;i&gt;определенного минимального значения&lt;/i&gt;, робот останавливается.&lt;/li&gt;
&lt;li&gt;Сенсор поворачивается на 90 градусов налево и измеряется расстояние до препятствия, затем на 90 градусов направо и тоже измеряет расстояние.&lt;/li&gt;
&lt;li&gt;Робот должен повернуться в том направлении, где расстояние до ближайшего препятствия больше, при этом оно должно быть больше &lt;i&gt;определенного минимального значения&lt;/i&gt;.&lt;/li&gt;
&lt;li&gt;После завершения маневра поворота робот продолжает движение прямо, и алгоритм исполняется с пункта 1.&lt;/li&gt;
&lt;li&gt;В случае если и справа и слева расстояние до препятствия меньше &lt;i&gt;определенного минимального значения&lt;/i&gt;, робот включается задний ход. Алгоритм исполняется с пункта 3.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Для управления сервоприводом мы использовали стандартную  &lt;a href="http://medinskiy.net/nfss/all/ispolzovanie-servoprivoda/"&gt;библиотеку&lt;/a&gt;  Arduino. В этом месте выяснился непрятный момент, что стандартная библиотека для сервопривода конфликтует с библиотекой IRremote.h, которую мы использовали для работы с инфракрасным приемником. Они обе используют один таймер (9-й пин), а второй подключить не прадставляется возможным (так как 3-й пин занят двигателем). В общем испробовали разные библиотеки для сервопривода, которые не используют таймер, но как-то нормально ни одна не заработала. В результате поисков мы набрели на очень интересную библиотеку, которая позволяет работать с разными устройствами, в т.ч. и с ИК приемником (&lt;a href="http://www.zbotic.com"&gt;&lt;a href="http://www.zbotic.com"&gt;http://www.zbotic.com&lt;/a&gt;&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;Вот так это работает:&lt;/p&gt;
&lt;div class="e2-text-video"&gt;
&lt;iframe width="768" height="480" src="http://www.youtube.com/embed/lI6gei6xXW0" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;p&gt;Здесь уже робота поджидают испытания по сложнее:&lt;/p&gt;
&lt;div class="e2-text-video"&gt;
&lt;iframe width="768" height="480" src="http://www.youtube.com/embed/0EQM6TLIwNk" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;p&gt;Программа:&lt;/p&gt;
&lt;div class="highlight" style="background: #f8f8f8"&gt;&lt;pre style="line-height: 125%"&gt;&lt;span style="color: #BC7A00"&gt;#include &amp;quot;Device.h&amp;quot;&lt;/span&gt;
&lt;span style="color: #BC7A00"&gt;#include &amp;quot;PCInterrupt.h&amp;quot;&lt;/span&gt;
&lt;span style="color: #BC7A00"&gt;#include &amp;quot;irController.h&amp;quot;&lt;/span&gt;
&lt;span style="color: #BC7A00"&gt;#include &amp;quot;myHardware.h&amp;quot;&lt;/span&gt;

&lt;span style="color: #BC7A00"&gt;#include &amp;lt;Servo.h&amp;gt; &lt;/span&gt;
&lt;span style="color: #BC7A00"&gt;#include &amp;lt;ArduMoto.h&amp;gt;&lt;/span&gt;
&lt;span style="color: #BC7A00"&gt;#include &amp;lt;NewPing.h&amp;gt;&lt;/span&gt;
&lt;span style="color: #B00040"&gt;int&lt;/span&gt; key;
IRController controller;

&lt;span style="color: #008000; font-weight: bold"&gt;const&lt;/span&gt; &lt;span style="color: #B00040"&gt;int&lt;/span&gt; mindist&lt;span style="color: #666666"&gt;=15&lt;/span&gt;;
&lt;span style="color: #008000; font-weight: bold"&gt;const&lt;/span&gt; &lt;span style="color: #B00040"&gt;int&lt;/span&gt; pingpin&lt;span style="color: #666666"&gt;=4&lt;/span&gt;;  &lt;span style="color: #408080; font-style: italic"&gt;// Arduino pin tied to trigger pin on the ultrasonic sensor.&lt;/span&gt;
&lt;span style="color: #008000; font-weight: bold"&gt;const&lt;/span&gt; &lt;span style="color: #B00040"&gt;int&lt;/span&gt; maxdist&lt;span style="color: #666666"&gt;=400&lt;/span&gt; ;&lt;span style="color: #408080; font-style: italic"&gt;// Maximum distance we want to ping for (in centimeters). Maximum sensor distance is rated at 400-500cm.&lt;/span&gt;
Servo servoping;
NewPing &lt;span style="color: #0000FF"&gt;sonar&lt;/span&gt;(pingpin, pingpin, maxdist); &lt;span style="color: #408080; font-style: italic"&gt;// NewPing setup of pins and maximum distance.&lt;/span&gt;

ArduMoto Moto;  &lt;span style="color: #408080; font-style: italic"&gt;//создаем объект для работы с моторами&lt;/span&gt;

&lt;span style="color: #008000; font-weight: bold"&gt;const&lt;/span&gt; &lt;span style="color: #B00040"&gt;float&lt;/span&gt; kB&lt;span style="color: #666666"&gt;=0.55&lt;/span&gt; ; &lt;span style="color: #408080; font-style: italic"&gt;//коэффициент для мотора B, так как он крутится быстрее&lt;/span&gt;
&lt;span style="color: #008000; font-weight: bold"&gt;const&lt;/span&gt; &lt;span style="color: #B00040"&gt;float&lt;/span&gt; kA&lt;span style="color: #666666"&gt;=1&lt;/span&gt;;
&lt;span style="color: #008000; font-weight: bold"&gt;const&lt;/span&gt; &lt;span style="color: #B00040"&gt;float&lt;/span&gt; kAll&lt;span style="color: #666666"&gt;=0.7&lt;/span&gt;;&lt;span style="color: #408080; font-style: italic"&gt;//общий коэффициент&lt;/span&gt;
&lt;span style="color: #008000; font-weight: bold"&gt;const&lt;/span&gt; &lt;span style="color: #B00040"&gt;int&lt;/span&gt; delayServo&lt;span style="color: #666666"&gt;=200&lt;/span&gt;;
&lt;span style="color: #B00040"&gt;int&lt;/span&gt; distcmAhead;
&lt;span style="color: #B00040"&gt;int&lt;/span&gt; distcmRight;
&lt;span style="color: #B00040"&gt;int&lt;/span&gt; distcmLeft;


&lt;span style="color: #B00040"&gt;void&lt;/span&gt; &lt;span style="color: #0000FF"&gt;setup&lt;/span&gt;()
{

  servoping.attach(A0);
  Moto.begin();&lt;span style="color: #408080; font-style: italic"&gt;//подключаем моторы&lt;/span&gt;
  Moto.setSpeed(&lt;span style="color: #BA2121"&gt;&amp;#39;A&amp;#39;&lt;/span&gt;,&lt;span style="color: #666666"&gt;0&lt;/span&gt;);&lt;span style="color: #408080; font-style: italic"&gt;//останавливаем моторы на всякий случай&lt;/span&gt;
  Moto.setSpeed(&lt;span style="color: #BA2121"&gt;&amp;#39;B&amp;#39;&lt;/span&gt;,&lt;span style="color: #666666"&gt;0&lt;/span&gt;);
  servoping.write(&lt;span style="color: #666666"&gt;90&lt;/span&gt;);
  Serial.begin(&lt;span style="color: #666666"&gt;9600&lt;/span&gt;);
  &lt;span style="color: #B00040"&gt;int&lt;/span&gt; res &lt;span style="color: #666666"&gt;=&lt;/span&gt; controller.begin(IR_PIN, OTHER_DEVICE);
  forward(&lt;span style="color: #666666"&gt;0&lt;/span&gt;);
}

&lt;span style="color: #B00040"&gt;void&lt;/span&gt; &lt;span style="color: #0000FF"&gt;stopall&lt;/span&gt;(){
  forward(&lt;span style="color: #666666"&gt;0&lt;/span&gt;);
}

&lt;span style="color: #B00040"&gt;int&lt;/span&gt; &lt;span style="color: #0000FF"&gt;wheretogo&lt;/span&gt;()
{
  &lt;span style="color: #008000; font-weight: bold"&gt;if&lt;/span&gt;( (distcmLeft&lt;span style="color: #666666"&gt;&amp;gt;=&lt;/span&gt;distcmRight)&lt;span style="color: #666666"&gt;&amp;amp;&amp;amp;&lt;/span&gt;(distcmLeft&lt;span style="color: #666666"&gt;&amp;gt;&lt;/span&gt;mindist)&lt;span style="color: #666666"&gt;||&lt;/span&gt;(distcmLeft&lt;span style="color: #666666"&gt;=0&lt;/span&gt;))&lt;span style="color: #408080; font-style: italic"&gt;//можем ли мы ехать налево&lt;/span&gt;
  {
    &lt;span style="color: #008000; font-weight: bold"&gt;return&lt;/span&gt; &lt;span style="color: #666666"&gt;1&lt;/span&gt;;&lt;span style="color: #408080; font-style: italic"&gt;//go left     &lt;/span&gt;
  }

  &lt;span style="color: #008000; font-weight: bold"&gt;else&lt;/span&gt; {
    &lt;span style="color: #008000; font-weight: bold"&gt;if&lt;/span&gt;( (distcmLeft&lt;span style="color: #666666"&gt;&amp;lt;&lt;/span&gt;distcmRight)&lt;span style="color: #666666"&gt;&amp;amp;&amp;amp;&lt;/span&gt;(distcmRight&lt;span style="color: #666666"&gt;&amp;gt;&lt;/span&gt;mindist)&lt;span style="color: #666666"&gt;||&lt;/span&gt;(distcmRight&lt;span style="color: #666666"&gt;=0&lt;/span&gt;))&lt;span style="color: #408080; font-style: italic"&gt;////можем ли мы ехать направо&lt;/span&gt;
    {
      &lt;span style="color: #008000; font-weight: bold"&gt;return&lt;/span&gt; &lt;span style="color: #666666"&gt;2&lt;/span&gt;;&lt;span style="color: #408080; font-style: italic"&gt;//go right&lt;/span&gt;
    }
    &lt;span style="color: #008000; font-weight: bold"&gt;else&lt;/span&gt;{
      &lt;span style="color: #008000; font-weight: bold"&gt;return&lt;/span&gt; &lt;span style="color: #666666"&gt;3&lt;/span&gt;;&lt;span style="color: #408080; font-style: italic"&gt;//go back&lt;/span&gt;
    }
  }
}

&lt;span style="color: #B00040"&gt;int&lt;/span&gt; &lt;span style="color: #0000FF"&gt;lookahead&lt;/span&gt;()
{
  servoping.write(&lt;span style="color: #666666"&gt;90&lt;/span&gt;);
  delay(delayServo);
  &lt;span style="color: #B00040"&gt;int&lt;/span&gt; distcm&lt;span style="color: #666666"&gt;=&lt;/span&gt;sonar.ping_cm();
  &lt;span style="color: #008000; font-weight: bold"&gt;return&lt;/span&gt; distcm;
}

&lt;span style="color: #B00040"&gt;int&lt;/span&gt; &lt;span style="color: #0000FF"&gt;lookleft&lt;/span&gt;(){
  servoping.write(&lt;span style="color: #666666"&gt;180&lt;/span&gt;);
  delay(delayServo&lt;span style="color: #666666"&gt;*2&lt;/span&gt;);
  &lt;span style="color: #B00040"&gt;int&lt;/span&gt; distcm&lt;span style="color: #666666"&gt;=&lt;/span&gt;sonar.ping_cm();
  &lt;span style="color: #008000; font-weight: bold"&gt;return&lt;/span&gt; distcm;

}
&lt;span style="color: #B00040"&gt;int&lt;/span&gt; &lt;span style="color: #0000FF"&gt;lookright&lt;/span&gt;(){
  servoping.write(&lt;span style="color: #666666"&gt;0&lt;/span&gt;);
  &lt;span style="color: #408080; font-style: italic"&gt;//SoftwareServo::refresh();&lt;/span&gt;
  delay(delayServo&lt;span style="color: #666666"&gt;*2&lt;/span&gt;);
  &lt;span style="color: #B00040"&gt;int&lt;/span&gt; distcm&lt;span style="color: #666666"&gt;=&lt;/span&gt;sonar.ping_cm();
  &lt;span style="color: #008000; font-weight: bold"&gt;return&lt;/span&gt; distcm;
}

&lt;span style="color: #B00040"&gt;void&lt;/span&gt; &lt;span style="color: #0000FF"&gt;left&lt;/span&gt;(&lt;span style="color: #B00040"&gt;int&lt;/span&gt; velocity)
{
  Moto.setSpeed(&lt;span style="color: #BA2121"&gt;&amp;#39;A&amp;#39;&lt;/span&gt;,velocity&lt;span style="color: #666666"&gt;*&lt;/span&gt;kAll&lt;span style="color: #666666"&gt;*&lt;/span&gt;kA);
  Moto.setSpeed(&lt;span style="color: #BA2121"&gt;&amp;#39;B&amp;#39;&lt;/span&gt;,&lt;span style="color: #666666"&gt;-&lt;/span&gt;velocity&lt;span style="color: #666666"&gt;*&lt;/span&gt;kAll&lt;span style="color: #666666"&gt;*&lt;/span&gt;kB);
}

&lt;span style="color: #B00040"&gt;void&lt;/span&gt; &lt;span style="color: #0000FF"&gt;right&lt;/span&gt;(&lt;span style="color: #B00040"&gt;int&lt;/span&gt; velocity)
{
  Moto.setSpeed(&lt;span style="color: #BA2121"&gt;&amp;#39;A&amp;#39;&lt;/span&gt;,&lt;span style="color: #666666"&gt;-&lt;/span&gt;velocity&lt;span style="color: #666666"&gt;*&lt;/span&gt;kAll&lt;span style="color: #666666"&gt;*&lt;/span&gt;kA);
  Moto.setSpeed(&lt;span style="color: #BA2121"&gt;&amp;#39;B&amp;#39;&lt;/span&gt;,velocity&lt;span style="color: #666666"&gt;*&lt;/span&gt;kAll&lt;span style="color: #666666"&gt;*&lt;/span&gt;kB);
}


&lt;span style="color: #B00040"&gt;void&lt;/span&gt; &lt;span style="color: #0000FF"&gt;forward&lt;/span&gt;(&lt;span style="color: #B00040"&gt;int&lt;/span&gt; velocity)
{
  Serial.println(&lt;span style="border: 1px solid #FF0000"&gt;&amp;#39;&lt;/span&gt;go forward&lt;span style="border: 1px solid #FF0000"&gt;&amp;#39;&lt;/span&gt;);
  Moto.setSpeed(&lt;span style="color: #BA2121"&gt;&amp;#39;A&amp;#39;&lt;/span&gt;,velocity&lt;span style="color: #666666"&gt;*&lt;/span&gt;kAll&lt;span style="color: #666666"&gt;*&lt;/span&gt;kA);
  Moto.setSpeed(&lt;span style="color: #BA2121"&gt;&amp;#39;B&amp;#39;&lt;/span&gt;,velocity&lt;span style="color: #666666"&gt;*&lt;/span&gt;kAll&lt;span style="color: #666666"&gt;*&lt;/span&gt;kB);
}

&lt;span style="color: #B00040"&gt;void&lt;/span&gt; &lt;span style="color: #0000FF"&gt;backward&lt;/span&gt;(&lt;span style="color: #B00040"&gt;int&lt;/span&gt; velocity)
{
  Moto.setSpeed(&lt;span style="color: #BA2121"&gt;&amp;#39;A&amp;#39;&lt;/span&gt;,&lt;span style="color: #666666"&gt;-&lt;/span&gt;velocity&lt;span style="color: #666666"&gt;*&lt;/span&gt;kAll&lt;span style="color: #666666"&gt;*&lt;/span&gt;kA);
  Moto.setSpeed(&lt;span style="color: #BA2121"&gt;&amp;#39;B&amp;#39;&lt;/span&gt;,&lt;span style="color: #666666"&gt;-&lt;/span&gt;velocity&lt;span style="color: #666666"&gt;*&lt;/span&gt;kAll&lt;span style="color: #666666"&gt;*&lt;/span&gt;kB);
}
&lt;span style="color: #B00040"&gt;void&lt;/span&gt; &lt;span style="color: #0000FF"&gt;forwardleft&lt;/span&gt;(&lt;span style="color: #B00040"&gt;int&lt;/span&gt; velocity)
{
  Moto.setSpeed(&lt;span style="color: #BA2121"&gt;&amp;#39;A&amp;#39;&lt;/span&gt;,velocity&lt;span style="color: #666666"&gt;*&lt;/span&gt;kAll&lt;span style="color: #666666"&gt;*&lt;/span&gt;kA);
  Moto.setSpeed(&lt;span style="color: #BA2121"&gt;&amp;#39;B&amp;#39;&lt;/span&gt;,&lt;span style="color: #666666"&gt;0.4*&lt;/span&gt;velocity&lt;span style="color: #666666"&gt;*&lt;/span&gt;kAll&lt;span style="color: #666666"&gt;*&lt;/span&gt;kB);
}
&lt;span style="color: #B00040"&gt;void&lt;/span&gt; &lt;span style="color: #0000FF"&gt;forwardright&lt;/span&gt;(&lt;span style="color: #B00040"&gt;int&lt;/span&gt; velocity)
{
  Moto.setSpeed(&lt;span style="color: #BA2121"&gt;&amp;#39;B&amp;#39;&lt;/span&gt;,velocity&lt;span style="color: #666666"&gt;*&lt;/span&gt;kAll&lt;span style="color: #666666"&gt;*&lt;/span&gt;kB);
  Moto.setSpeed(&lt;span style="color: #BA2121"&gt;&amp;#39;A&amp;#39;&lt;/span&gt;,&lt;span style="color: #666666"&gt;0.4*&lt;/span&gt;velocity&lt;span style="color: #666666"&gt;*&lt;/span&gt;kAll&lt;span style="color: #666666"&gt;*&lt;/span&gt;kA);
}
&lt;span style="color: #B00040"&gt;void&lt;/span&gt; &lt;span style="color: #0000FF"&gt;backwardright&lt;/span&gt;(&lt;span style="color: #B00040"&gt;int&lt;/span&gt; velocity){
  Moto.setSpeed(&lt;span style="color: #BA2121"&gt;&amp;#39;B&amp;#39;&lt;/span&gt;,&lt;span style="color: #666666"&gt;-&lt;/span&gt;velocity&lt;span style="color: #666666"&gt;*&lt;/span&gt;kAll&lt;span style="color: #666666"&gt;*&lt;/span&gt;kB);
  Moto.setSpeed(&lt;span style="color: #BA2121"&gt;&amp;#39;A&amp;#39;&lt;/span&gt;,&lt;span style="color: #666666"&gt;-0.4*&lt;/span&gt;velocity&lt;span style="color: #666666"&gt;*&lt;/span&gt;kAll&lt;span style="color: #666666"&gt;*&lt;/span&gt;kA);
}
&lt;span style="color: #B00040"&gt;void&lt;/span&gt; &lt;span style="color: #0000FF"&gt;backwardleft&lt;/span&gt;(&lt;span style="color: #B00040"&gt;int&lt;/span&gt; velocity){
  Moto.setSpeed(&lt;span style="color: #BA2121"&gt;&amp;#39;A&amp;#39;&lt;/span&gt;,&lt;span style="color: #666666"&gt;-&lt;/span&gt;velocity&lt;span style="color: #666666"&gt;*&lt;/span&gt;kAll&lt;span style="color: #666666"&gt;*&lt;/span&gt;kA);
  Moto.setSpeed(&lt;span style="color: #BA2121"&gt;&amp;#39;B&amp;#39;&lt;/span&gt;,&lt;span style="color: #666666"&gt;-0.4*&lt;/span&gt;velocity&lt;span style="color: #666666"&gt;*&lt;/span&gt;kAll&lt;span style="color: #666666"&gt;*&lt;/span&gt;kB);
}

&lt;span style="color: #B00040"&gt;void&lt;/span&gt; &lt;span style="color: #0000FF"&gt;loop&lt;/span&gt;() {     
  &lt;span style="color: #B00040"&gt;int&lt;/span&gt; dir;
  distcmAhead&lt;span style="color: #666666"&gt;=&lt;/span&gt;lookahead();
  &lt;span style="color: #008000; font-weight: bold"&gt;if&lt;/span&gt;( (distcmAhead&lt;span style="color: #666666"&gt;&amp;lt;=&lt;/span&gt;mindist)&lt;span style="color: #666666"&gt;&amp;amp;&amp;amp;&lt;/span&gt;(distcmAhead&lt;span style="color: #666666"&gt;&amp;gt;0&lt;/span&gt;)){
    stopall();
&lt;span style="color: #A0A000"&gt;label1:&lt;/span&gt;   
    distcmLeft&lt;span style="color: #666666"&gt;=&lt;/span&gt;lookleft();
    distcmRight&lt;span style="color: #666666"&gt;=&lt;/span&gt;lookright();
    dir&lt;span style="color: #666666"&gt;=&lt;/span&gt;wheretogo();
    &lt;span style="color: #008000; font-weight: bold"&gt;switch&lt;/span&gt; (dir){
    &lt;span style="color: #008000; font-weight: bold"&gt;case&lt;/span&gt; &lt;span style="color: #666666"&gt;1&lt;/span&gt;:&lt;span style="color: #408080; font-style: italic"&gt;//едем налево&lt;/span&gt;
      left(&lt;span style="color: #666666"&gt;100&lt;/span&gt;);
      delay(&lt;span style="color: #666666"&gt;500&lt;/span&gt;);
      forward(&lt;span style="color: #666666"&gt;100&lt;/span&gt;);
      &lt;span style="color: #008000; font-weight: bold"&gt;break&lt;/span&gt;;
    &lt;span style="color: #008000; font-weight: bold"&gt;case&lt;/span&gt; &lt;span style="color: #666666"&gt;2&lt;/span&gt;:&lt;span style="color: #408080; font-style: italic"&gt;//едем направо&lt;/span&gt;
      right(&lt;span style="color: #666666"&gt;100&lt;/span&gt;);
      delay(&lt;span style="color: #666666"&gt;500&lt;/span&gt;);
      forward(&lt;span style="color: #666666"&gt;100&lt;/span&gt;);
      &lt;span style="color: #008000; font-weight: bold"&gt;break&lt;/span&gt;;
    &lt;span style="color: #008000; font-weight: bold"&gt;case&lt;/span&gt; &lt;span style="color: #666666"&gt;3&lt;/span&gt;:
      backward(&lt;span style="color: #666666"&gt;100&lt;/span&gt;);  
      &lt;span style="color: #008000; font-weight: bold"&gt;do&lt;/span&gt;{
        distcmLeft&lt;span style="color: #666666"&gt;=&lt;/span&gt;lookleft();
        distcmRight&lt;span style="color: #666666"&gt;=&lt;/span&gt;lookright();
      }
      &lt;span style="color: #008000; font-weight: bold"&gt;while&lt;/span&gt;( (distcmLeft&lt;span style="color: #666666"&gt;&amp;lt;&lt;/span&gt;mindist)&lt;span style="color: #666666"&gt;&amp;amp;&amp;amp;&lt;/span&gt;(distcmRight&lt;span style="color: #666666"&gt;&amp;lt;&lt;/span&gt;mindist)&lt;span style="color: #666666"&gt;&amp;amp;&amp;amp;&lt;/span&gt;(distcmRight&lt;span style="color: #666666"&gt;&amp;gt;0&lt;/span&gt;)&lt;span style="color: #666666"&gt;&amp;amp;&amp;amp;&lt;/span&gt;(distcmLeft&lt;span style="color: #666666"&gt;&amp;gt;0&lt;/span&gt;));
      &lt;span style="color: #008000; font-weight: bold"&gt;goto&lt;/span&gt; label1; 
    }
  } 


  key &lt;span style="color: #666666"&gt;=&lt;/span&gt; controller.read();
  &lt;span style="color: #008000; font-weight: bold"&gt;if&lt;/span&gt; (key&lt;span style="color: #666666"&gt;&amp;gt;=0&lt;/span&gt;){&lt;span style="color: #408080; font-style: italic"&gt;//если получили сигнал то надо что-то сделать&lt;/span&gt;
    &lt;span style="color: #008000; font-weight: bold"&gt;switch&lt;/span&gt; (key){
    &lt;span style="color: #008000; font-weight: bold"&gt;case&lt;/span&gt;  &lt;span style="color: #666666"&gt;16128&lt;/span&gt;:&lt;span style="color: #408080; font-style: italic"&gt;//едем вперед&lt;/span&gt;
      forward(&lt;span style="color: #666666"&gt;100&lt;/span&gt;);
      &lt;span style="color: #008000; font-weight: bold"&gt;break&lt;/span&gt;;
    &lt;span style="color: #008000; font-weight: bold"&gt;case&lt;/span&gt; &lt;span style="color: #666666"&gt;16192&lt;/span&gt;:
      backward(&lt;span style="color: #666666"&gt;100&lt;/span&gt;);
      &lt;span style="color: #008000; font-weight: bold"&gt;break&lt;/span&gt;;
    &lt;span style="color: #008000; font-weight: bold"&gt;case&lt;/span&gt;   &lt;span style="color: #666666"&gt;14726&lt;/span&gt;:
      forward(&lt;span style="color: #666666"&gt;0&lt;/span&gt;);
      &lt;span style="color: #008000; font-weight: bold"&gt;break&lt;/span&gt;;
    &lt;span style="color: #008000; font-weight: bold"&gt;case&lt;/span&gt;  &lt;span style="color: #666666"&gt;15427&lt;/span&gt; :
      forwardleft(&lt;span style="color: #666666"&gt;100&lt;/span&gt;);
      &lt;span style="color: #008000; font-weight: bold"&gt;break&lt;/span&gt;;
    &lt;span style="color: #008000; font-weight: bold"&gt;case&lt;/span&gt;   &lt;span style="color: #666666"&gt;14662&lt;/span&gt;:
      forwardright(&lt;span style="color: #666666"&gt;100&lt;/span&gt;);
      &lt;span style="color: #008000; font-weight: bold"&gt;break&lt;/span&gt;;
    &lt;span style="color: #008000; font-weight: bold"&gt;case&lt;/span&gt;   &lt;span style="color: #666666"&gt;16256&lt;/span&gt;:
      backwardright(&lt;span style="color: #666666"&gt;100&lt;/span&gt;);
      &lt;span style="color: #008000; font-weight: bold"&gt;break&lt;/span&gt;;
    &lt;span style="color: #008000; font-weight: bold"&gt;case&lt;/span&gt;  &lt;span style="color: #666666"&gt;10200&lt;/span&gt;   :
      backwardleft(&lt;span style="color: #666666"&gt;100&lt;/span&gt;);
      &lt;span style="color: #008000; font-weight: bold"&gt;break&lt;/span&gt;;
    &lt;span style="color: #008000; font-weight: bold"&gt;case&lt;/span&gt;  &lt;span style="color: #666666"&gt;15746&lt;/span&gt; :
      left(&lt;span style="color: #666666"&gt;100&lt;/span&gt;);
      &lt;span style="color: #008000; font-weight: bold"&gt;break&lt;/span&gt;;
    &lt;span style="color: #008000; font-weight: bold"&gt;case&lt;/span&gt;  &lt;span style="color: #666666"&gt;14471&lt;/span&gt;  :
      right(&lt;span style="color: #666666"&gt;100&lt;/span&gt;);
      &lt;span style="color: #008000; font-weight: bold"&gt;break&lt;/span&gt;;
    }
  }
}
&lt;/pre&gt;&lt;/div&gt;
&lt;div class="tiles"&gt;
     &lt;a href="pictures/IMG_0394.jpg" rel="lightbox[02]"&gt;
                &lt;img src="pictures/IMG_0394.jpg" /&gt;
        &lt;/a&gt;
  &lt;a href="pictures/IMG_0401.jpg" rel="lightbox[02]"&gt;
                &lt;img src="pictures/IMG_0401.jpg" /&gt;
           &lt;/a&gt;
  &lt;a href="pictures/IMG_0402.jpg" rel="lightbox[02]"&gt;
                &lt;img src="pictures/IMG_0402.jpg" /&gt;
           &lt;/a&gt;
  &lt;a href="pictures/IMG_0403.jpg" rel="lightbox[02]"&gt;
                &lt;img src="pictures/IMG_0403.jpg" /&gt;
        &lt;/a&gt;
  &lt;a href="pictures/IMG_0404.jpg" rel="lightbox[02]"&gt;
                &lt;img src="pictures/IMG_0404.jpg" /&gt;
           &lt;/a&gt;
  &lt;a href="pictures/IMG_0405.jpg" rel="lightbox[02]"&gt;
                &lt;img src="pictures/IMG_0405.jpg" /&gt;
           &lt;/a&gt;
  &lt;a href="pictures/IMG_0406.jpg" rel="lightbox[02]"&gt;
                &lt;img src="pictures/IMG_0406.jpg" /&gt;
        &lt;/a&gt;
  &lt;a href="pictures/IMG_0412.jpg" rel="lightbox[02]"&gt;
                &lt;img src="pictures/IMG_0412.jpg" /&gt;
           &lt;/a&gt;
  &lt;a href="pictures/IMG_0413.jpg" rel="lightbox[02]"&gt;
                &lt;img src="pictures/IMG_0413.jpg" /&gt;
           &lt;/a&gt;
  &lt;a href="pictures/IMG_0414.jpg" rel="lightbox[02]"&gt;
                &lt;img src="pictures/IMG_0406.jpg" /&gt;
        &lt;/a&gt;
  &lt;a href="pictures/IMG_0415.jpg" rel="lightbox[02]"&gt;
                &lt;img src="pictures/IMG_0412.jpg" /&gt;
           &lt;/a&gt;
  &lt;a href="pictures/IMG_0416.jpg" rel="lightbox[02]"&gt;
                &lt;img src="pictures/IMG_0413.jpg" /&gt;
           &lt;/a&gt;
&lt;/div&gt;
</description><pubDate>Fri, 30 Aug 2013 11:26:52 +0300</pubDate></item><item><title>Добавляем к роботу сенсоров</title><guid isPermaLink="true">http://www.medinskiy.net/nfss/all/dobavlyaem-k-robotu-sensorov/</guid><link>http://www.medinskiy.net/nfss/all/dobavlyaem-k-robotu-sensorov/</link><description>&lt;p&gt;Для того, чтобы робот мог объезжать препятствия, необходим специальный сенсор. Мы использовали ультразвуковой датчик расстояния. Под названием &lt;a href="http://www.parallax.com/Store/Sensors/ObjectDetection/tabid/176/ProductID/92/List/0/Default.aspx?SortField=ProductName,ProductName" target="_blank"&gt; PING))) Ultrasonic Distance Sensor&lt;/a&gt;.&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="http://www.medinskiy.net/nfss/pictures/parallax-ping-ultrasonic-sensor-B.jpg" width="400" height="400" alt="" /&gt;
&lt;/div&gt;
&lt;p&gt;Принцип работы этого сенсора следующий: cенсор излучает короткий ультразвуковой импульс (в момент времени 0), который отражается от объекта и принимается сенсором. Расстояние рассчитывается исходя из времени до получения эха и скорости звука в воздухе.&lt;br /&gt;
Для подключения сенсора к Arduino мы использовали расширение Sensor Shield:&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="http://www.medinskiy.net/nfss/pictures/20111021105722_3.jpg" width="460" height="345" alt="" /&gt;
&lt;/div&gt;
&lt;p&gt;C помощью этого расширения очень удобно подключать к Arduino разные сенсоры и актуаторы (например сервомоторы).  Кроме того, что на расширении есть все пины Arduino в обычном виде, как на самой плате, все они дополнительно выведены дополнительно и каждый пин дополнен двумя выводами питания «плюс» и «минус». Это позволят очень легко подключать сенсоры. Как правило все сенсоры имеют для подключения штекеры с тремя выводами «плюс»-«минус»-«сигнал»&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;a href="http://www.medinskiy.net/nfss/pictures/SensorShieldV4-TK1-crop-1024.jpg" class="e2-text-picture-zoom-link" width="1024"&gt;
&lt;div class="e2-text-picture-zoom-icon"&gt;&lt;div class="e2-text-picture-zoomable"&gt;&lt;/div&gt;&lt;div class="e2-text-picture-zoom-in"&gt;&lt;/div&gt;&lt;/div&gt;
&lt;img src="http://www.medinskiy.net/nfss/?go=@scale-image:SensorShieldV4-TK1-crop-1024.jpg" width="768" height="510.75" alt="" /&gt;
&lt;/a&gt;&lt;/div&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="http://www.medinskiy.net/nfss/pictures/IMG_0392.jpg" width="640" height="480" alt="" /&gt;
&lt;/div&gt;
&lt;p&gt;На этой фотографии видно, как мы подсоединили к одной группе контактов ультразвуковой сенсор. Сам сенсор мы неподвижно закрепили в передней части робота.&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="http://www.medinskiy.net/nfss/pictures/IMG_0388.jpg" width="640" height="480" alt="" /&gt;
&lt;/div&gt;
&lt;p&gt;Первая задача, которую необходимо решить — объезжать препятствия, встречающиеся роботу на пути, объезжая их либо справа, либо слева (без какой-либо логики).&lt;br /&gt;
Для получения сигналов с сенсора мы использовали библиотеку &lt;a href="http://playground.arduino.cc/Code/NewPing" target="_blank"&gt;NewPing&lt;/a&gt;. Если расстояние до препятствия 10  сантиметров или меньше, робот пытается объехать его слева. При этом остается возможность управлять роботом с пульта.&lt;/p&gt;
&lt;p&gt;Программа:&lt;/p&gt;
&lt;div class="highlight" style="background: #f8f8f8"&gt;&lt;pre style="line-height: 125%"&gt;&lt;span style="color: #BC7A00"&gt;#include &amp;lt;IRremote.h&amp;gt;&lt;/span&gt;
&lt;span style="color: #BC7A00"&gt;#include &amp;lt;ArduMoto.h&amp;gt;&lt;/span&gt;
&lt;span style="color: #BC7A00"&gt;#include &amp;lt;NewPing.h&amp;gt;&lt;/span&gt;

&lt;span style="color: #B00040"&gt;int&lt;/span&gt; pingpin&lt;span style="color: #666666"&gt;=4&lt;/span&gt;;  &lt;span style="color: #408080; font-style: italic"&gt;// Arduino pin tied to trigger pin on the ultrasonic sensor.&lt;/span&gt;
&lt;span style="color: #B00040"&gt;int&lt;/span&gt; maxdist&lt;span style="color: #666666"&gt;=200&lt;/span&gt; ;&lt;span style="color: #408080; font-style: italic"&gt;// Maximum distance we want to ping for (in centimeters). Maximum sensor distance is rated at 400-500cm.&lt;/span&gt;

NewPing &lt;span style="color: #0000FF"&gt;sonar&lt;/span&gt;(pingpin, pingpin, maxdist); &lt;span style="color: #408080; font-style: italic"&gt;// NewPing setup of pins and maximum distance.&lt;/span&gt;

ArduMoto Moto;  &lt;span style="color: #408080; font-style: italic"&gt;//Object to work with motors&lt;/span&gt;


&lt;span style="color: #B00040"&gt;int&lt;/span&gt; RECV_PIN &lt;span style="color: #666666"&gt;=&lt;/span&gt; &lt;span style="color: #666666"&gt;7&lt;/span&gt;; &lt;span style="color: #408080; font-style: italic"&gt;//Pin with IR sensor&lt;/span&gt;

IRrecv &lt;span style="color: #0000FF"&gt;irrecv&lt;/span&gt;(RECV_PIN); &lt;span style="color: #408080; font-style: italic"&gt;//object to work with IR sensor&lt;/span&gt;

decode_results results; &lt;span style="color: #408080; font-style: italic"&gt;//object to work with results of IR sensor &lt;/span&gt;
&lt;span style="color: #008000; font-weight: bold"&gt;const&lt;/span&gt; &lt;span style="color: #B00040"&gt;float&lt;/span&gt; kB&lt;span style="color: #666666"&gt;=0.74&lt;/span&gt; ; &lt;span style="color: #408080; font-style: italic"&gt;//коэффициент для мотора B, так как он крутится быстрее&lt;/span&gt;
&lt;span style="color: #008000; font-weight: bold"&gt;const&lt;/span&gt; &lt;span style="color: #B00040"&gt;float&lt;/span&gt; kA&lt;span style="color: #666666"&gt;=1&lt;/span&gt;;
&lt;span style="color: #008000; font-weight: bold"&gt;const&lt;/span&gt; &lt;span style="color: #B00040"&gt;float&lt;/span&gt; kAll&lt;span style="color: #666666"&gt;=0.7&lt;/span&gt;;&lt;span style="color: #408080; font-style: italic"&gt;//общий коэффициент&lt;/span&gt;

&lt;span style="color: #B00040"&gt;void&lt;/span&gt; &lt;span style="color: #0000FF"&gt;setup&lt;/span&gt;()
{
  &lt;span style="color: #408080; font-style: italic"&gt;//Serial.begin(9600);&lt;/span&gt;
  irrecv.enableIRIn(); &lt;span style="color: #408080; font-style: italic"&gt;// подключаем ИК приемник&lt;/span&gt;
  Moto.begin();&lt;span style="color: #408080; font-style: italic"&gt;//подключаем моторы&lt;/span&gt;
  Moto.setSpeed(&lt;span style="color: #BA2121"&gt;&amp;#39;A&amp;#39;&lt;/span&gt;,&lt;span style="color: #666666"&gt;0&lt;/span&gt;);&lt;span style="color: #408080; font-style: italic"&gt;//останавливаем моторы на всякий случай&lt;/span&gt;
  Moto.setSpeed(&lt;span style="color: #BA2121"&gt;&amp;#39;B&amp;#39;&lt;/span&gt;,&lt;span style="color: #666666"&gt;0&lt;/span&gt;);

}
&lt;span style="color: #B00040"&gt;void&lt;/span&gt; &lt;span style="color: #0000FF"&gt;left&lt;/span&gt;(&lt;span style="color: #B00040"&gt;int&lt;/span&gt; velocity)
{
  Moto.setSpeed(&lt;span style="color: #BA2121"&gt;&amp;#39;A&amp;#39;&lt;/span&gt;,velocity&lt;span style="color: #666666"&gt;*&lt;/span&gt;kAll&lt;span style="color: #666666"&gt;*&lt;/span&gt;kA);
  Moto.setSpeed(&lt;span style="color: #BA2121"&gt;&amp;#39;B&amp;#39;&lt;/span&gt;,&lt;span style="color: #666666"&gt;-&lt;/span&gt;velocity&lt;span style="color: #666666"&gt;*&lt;/span&gt;kAll&lt;span style="color: #666666"&gt;*&lt;/span&gt;kB);
}

&lt;span style="color: #B00040"&gt;void&lt;/span&gt; &lt;span style="color: #0000FF"&gt;right&lt;/span&gt;(&lt;span style="color: #B00040"&gt;int&lt;/span&gt; velocity)
{
  Moto.setSpeed(&lt;span style="color: #BA2121"&gt;&amp;#39;A&amp;#39;&lt;/span&gt;,&lt;span style="color: #666666"&gt;-&lt;/span&gt;velocity&lt;span style="color: #666666"&gt;*&lt;/span&gt;kAll&lt;span style="color: #666666"&gt;*&lt;/span&gt;kA);
  Moto.setSpeed(&lt;span style="color: #BA2121"&gt;&amp;#39;B&amp;#39;&lt;/span&gt;,velocity&lt;span style="color: #666666"&gt;*&lt;/span&gt;kAll&lt;span style="color: #666666"&gt;*&lt;/span&gt;kB);
}


&lt;span style="color: #B00040"&gt;void&lt;/span&gt; &lt;span style="color: #0000FF"&gt;forward&lt;/span&gt;(&lt;span style="color: #B00040"&gt;int&lt;/span&gt; velocity)
{
  Moto.setSpeed(&lt;span style="color: #BA2121"&gt;&amp;#39;A&amp;#39;&lt;/span&gt;,velocity&lt;span style="color: #666666"&gt;*&lt;/span&gt;kAll&lt;span style="color: #666666"&gt;*&lt;/span&gt;kA);
  Moto.setSpeed(&lt;span style="color: #BA2121"&gt;&amp;#39;B&amp;#39;&lt;/span&gt;,velocity&lt;span style="color: #666666"&gt;*&lt;/span&gt;kAll&lt;span style="color: #666666"&gt;*&lt;/span&gt;kB);
}

&lt;span style="color: #B00040"&gt;void&lt;/span&gt; &lt;span style="color: #0000FF"&gt;backward&lt;/span&gt;(&lt;span style="color: #B00040"&gt;int&lt;/span&gt; velocity)
{
  Moto.setSpeed(&lt;span style="color: #BA2121"&gt;&amp;#39;A&amp;#39;&lt;/span&gt;,&lt;span style="color: #666666"&gt;-&lt;/span&gt;velocity&lt;span style="color: #666666"&gt;*&lt;/span&gt;kAll&lt;span style="color: #666666"&gt;*&lt;/span&gt;kA);
  Moto.setSpeed(&lt;span style="color: #BA2121"&gt;&amp;#39;B&amp;#39;&lt;/span&gt;,&lt;span style="color: #666666"&gt;-&lt;/span&gt;velocity&lt;span style="color: #666666"&gt;*&lt;/span&gt;kAll&lt;span style="color: #666666"&gt;*&lt;/span&gt;kB);
}
&lt;span style="color: #B00040"&gt;void&lt;/span&gt; &lt;span style="color: #0000FF"&gt;forwardleft&lt;/span&gt;(&lt;span style="color: #B00040"&gt;int&lt;/span&gt; velocity)
{
  Moto.setSpeed(&lt;span style="color: #BA2121"&gt;&amp;#39;A&amp;#39;&lt;/span&gt;,velocity&lt;span style="color: #666666"&gt;*&lt;/span&gt;kAll&lt;span style="color: #666666"&gt;*&lt;/span&gt;kA);
  Moto.setSpeed(&lt;span style="color: #BA2121"&gt;&amp;#39;B&amp;#39;&lt;/span&gt;,&lt;span style="color: #666666"&gt;0.4*&lt;/span&gt;velocity&lt;span style="color: #666666"&gt;*&lt;/span&gt;kAll&lt;span style="color: #666666"&gt;*&lt;/span&gt;kB);
}
&lt;span style="color: #B00040"&gt;void&lt;/span&gt; &lt;span style="color: #0000FF"&gt;forwardright&lt;/span&gt;(&lt;span style="color: #B00040"&gt;int&lt;/span&gt; velocity)
{
  Moto.setSpeed(&lt;span style="color: #BA2121"&gt;&amp;#39;B&amp;#39;&lt;/span&gt;,velocity&lt;span style="color: #666666"&gt;*&lt;/span&gt;kAll&lt;span style="color: #666666"&gt;*&lt;/span&gt;kB);
  Moto.setSpeed(&lt;span style="color: #BA2121"&gt;&amp;#39;A&amp;#39;&lt;/span&gt;,&lt;span style="color: #666666"&gt;0.4*&lt;/span&gt;velocity&lt;span style="color: #666666"&gt;*&lt;/span&gt;kAll&lt;span style="color: #666666"&gt;*&lt;/span&gt;kA);
}
&lt;span style="color: #B00040"&gt;void&lt;/span&gt; &lt;span style="color: #0000FF"&gt;backwardright&lt;/span&gt;(&lt;span style="color: #B00040"&gt;int&lt;/span&gt; velocity){
  Moto.setSpeed(&lt;span style="color: #BA2121"&gt;&amp;#39;B&amp;#39;&lt;/span&gt;,&lt;span style="color: #666666"&gt;-&lt;/span&gt;velocity&lt;span style="color: #666666"&gt;*&lt;/span&gt;kAll&lt;span style="color: #666666"&gt;*&lt;/span&gt;kB);
  Moto.setSpeed(&lt;span style="color: #BA2121"&gt;&amp;#39;A&amp;#39;&lt;/span&gt;,&lt;span style="color: #666666"&gt;-0.4*&lt;/span&gt;velocity&lt;span style="color: #666666"&gt;*&lt;/span&gt;kAll&lt;span style="color: #666666"&gt;*&lt;/span&gt;kA);
}
&lt;span style="color: #B00040"&gt;void&lt;/span&gt; &lt;span style="color: #0000FF"&gt;backwardleft&lt;/span&gt;(&lt;span style="color: #B00040"&gt;int&lt;/span&gt; velocity){
  Moto.setSpeed(&lt;span style="color: #BA2121"&gt;&amp;#39;A&amp;#39;&lt;/span&gt;,&lt;span style="color: #666666"&gt;-&lt;/span&gt;velocity&lt;span style="color: #666666"&gt;*&lt;/span&gt;kAll&lt;span style="color: #666666"&gt;*&lt;/span&gt;kA);
  Moto.setSpeed(&lt;span style="color: #BA2121"&gt;&amp;#39;B&amp;#39;&lt;/span&gt;,&lt;span style="color: #666666"&gt;-0.4*&lt;/span&gt;velocity&lt;span style="color: #666666"&gt;*&lt;/span&gt;kAll&lt;span style="color: #666666"&gt;*&lt;/span&gt;kB);
}

&lt;span style="color: #B00040"&gt;void&lt;/span&gt; &lt;span style="color: #0000FF"&gt;loop&lt;/span&gt;() {      
  &lt;span style="color: #B00040"&gt;int&lt;/span&gt; distcm;
  distcm&lt;span style="color: #666666"&gt;=&lt;/span&gt;sonar.ping_cm();&lt;span style="color: #408080; font-style: italic"&gt;//измеряем расстояние  в см.&lt;/span&gt;
  &lt;span style="color: #008000; font-weight: bold"&gt;if&lt;/span&gt;( (distcm&lt;span style="color: #666666"&gt;&amp;lt;=10&lt;/span&gt;)&lt;span style="color: #666666"&gt;&amp;amp;&amp;amp;&lt;/span&gt;(distcm&lt;span style="color: #666666"&gt;&amp;gt;0&lt;/span&gt;) ){&lt;span style="color: #408080; font-style: italic"&gt;//если до препятствия менее 10 см.&lt;/span&gt;
    forward(&lt;span style="color: #666666"&gt;0&lt;/span&gt;);
    delay(&lt;span style="color: #666666"&gt;50&lt;/span&gt;);
    backward(&lt;span style="color: #666666"&gt;100&lt;/span&gt;);
    delay(&lt;span style="color: #666666"&gt;100&lt;/span&gt;);
    left(&lt;span style="color: #666666"&gt;100&lt;/span&gt;);
    delay(&lt;span style="color: #666666"&gt;100&lt;/span&gt;);
    forward(&lt;span style="color: #666666"&gt;100&lt;/span&gt;); 

  }
  &lt;span style="color: #008000; font-weight: bold"&gt;if&lt;/span&gt; (irrecv.decode(&lt;span style="color: #666666"&gt;&amp;amp;&lt;/span&gt;results)) {&lt;span style="color: #408080; font-style: italic"&gt;//если получили сигнал то надо что-то сделать&lt;/span&gt;
    &lt;span style="color: #008000; font-weight: bold"&gt;switch&lt;/span&gt; (results.value){
    &lt;span style="color: #008000; font-weight: bold"&gt;case&lt;/span&gt; &lt;span style="color: #666666"&gt;0x807fc03f&lt;/span&gt;:&lt;span style="color: #408080; font-style: italic"&gt;//едем вперед&lt;/span&gt;
      forward(&lt;span style="color: #666666"&gt;100&lt;/span&gt;);
      &lt;span style="color: #008000; font-weight: bold"&gt;break&lt;/span&gt;;
    &lt;span style="color: #008000; font-weight: bold"&gt;case&lt;/span&gt; &lt;span style="color: #666666"&gt;0x807f40bf&lt;/span&gt;:
      backward(&lt;span style="color: #666666"&gt;100&lt;/span&gt;);
      &lt;span style="color: #008000; font-weight: bold"&gt;break&lt;/span&gt;;
    &lt;span style="color: #008000; font-weight: bold"&gt;case&lt;/span&gt; &lt;span style="color: #666666"&gt;0x807f9867&lt;/span&gt;:
      forward(&lt;span style="color: #666666"&gt;0&lt;/span&gt;);
      &lt;span style="color: #008000; font-weight: bold"&gt;break&lt;/span&gt;;
    &lt;span style="color: #008000; font-weight: bold"&gt;case&lt;/span&gt; &lt;span style="color: #666666"&gt;0x807f708f&lt;/span&gt;:
      forwardleft(&lt;span style="color: #666666"&gt;100&lt;/span&gt;);
      &lt;span style="color: #008000; font-weight: bold"&gt;break&lt;/span&gt;;
    &lt;span style="color: #008000; font-weight: bold"&gt;case&lt;/span&gt;  &lt;span style="color: #666666"&gt;0x807f58a7&lt;/span&gt;:
      forwardright(&lt;span style="color: #666666"&gt;100&lt;/span&gt;);
      &lt;span style="color: #008000; font-weight: bold"&gt;break&lt;/span&gt;;
    &lt;span style="color: #008000; font-weight: bold"&gt;case&lt;/span&gt;  &lt;span style="color: #666666"&gt;0x807f807f&lt;/span&gt;:
      backwardright(&lt;span style="color: #666666"&gt;100&lt;/span&gt;);
      &lt;span style="color: #008000; font-weight: bold"&gt;break&lt;/span&gt;;
    &lt;span style="color: #008000; font-weight: bold"&gt;case&lt;/span&gt; &lt;span style="color: #666666"&gt;0x807f06f9&lt;/span&gt;  :
      backwardleft(&lt;span style="color: #666666"&gt;100&lt;/span&gt;);
      &lt;span style="color: #008000; font-weight: bold"&gt;break&lt;/span&gt;;
    &lt;span style="color: #008000; font-weight: bold"&gt;case&lt;/span&gt; &lt;span style="color: #666666"&gt;0x807f906f&lt;/span&gt;  :
      left(&lt;span style="color: #666666"&gt;100&lt;/span&gt;);
      &lt;span style="color: #008000; font-weight: bold"&gt;break&lt;/span&gt;;
    &lt;span style="color: #008000; font-weight: bold"&gt;case&lt;/span&gt; &lt;span style="color: #666666"&gt;0x807fb847&lt;/span&gt;  :
      right(&lt;span style="color: #666666"&gt;100&lt;/span&gt;);
      &lt;span style="color: #008000; font-weight: bold"&gt;break&lt;/span&gt;;
    }
    irrecv.resume();
  }
}
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Теперь робот умеет объезжать препятствия:&lt;/p&gt;
&lt;div class="e2-text-video"&gt;
&lt;iframe width="768" height="480" src="http://www.youtube.com/embed/mFwMY_m4Zn8" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;p&gt;Небольшая фотосессия на вкусное:&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;div class="fotorama" data-width="640" data-ratio="1.3333333333333"&gt;
&lt;img src="http://www.medinskiy.net/nfss/pictures/IMG_0388.jpg" width="640" height="480" data-caption="" alt="" /&gt;
&lt;img src="http://www.medinskiy.net/nfss/pictures/IMG_0390.jpg" width="640" height="480" data-caption="" alt="" /&gt;
&lt;img src="http://www.medinskiy.net/nfss/pictures/IMG_0391.jpg" width="640" height="480" data-caption="" alt="" /&gt;
&lt;img src="http://www.medinskiy.net/nfss/pictures/IMG_0392.jpg" width="640" height="480" data-caption="" alt="" /&gt;
&lt;img src="http://www.medinskiy.net/nfss/pictures/IMG_0393.jpg" width="640" height="480" data-caption="" alt="" /&gt;
&lt;/div&gt;
</description><pubDate>Fri, 14 Jun 2013 11:40:02 +0300</pubDate></item>
</channel>

</rss>