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

<channel>

<title>Nonfinishism studious, заметки с тегом: ServoMotor</title>
<link>http://www.medinskiy.net/nfss/tags/servomotor/</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/ispolzovanie-servoprivoda/</guid><link>http://www.medinskiy.net/nfss/all/ispolzovanie-servoprivoda/</link><description>&lt;p&gt;&lt;a href="http://wiki.amperka.ru/робототехника:сервоприводы" target="_blank"&gt;Сервопривод&lt;/a&gt;  — это такие типы двигателей, которые не крутятся все время по кругу, а поворачиваются на определённый угол и останавливаются до тех пор, пока им не поступит другая команда повернуться. Сервопривод обычно поворачиваются только на 180 градусов (половина круга). &lt;!—more—&gt;Если присоединить  к такому мотору вырезанную из картона шкалу, можно использовать его в качестве указателя чего-нибудь, например, настроения.&lt;/p&gt;
&lt;div class="tiles"&gt;
            &lt;a href="pictures/IMG_0179.jpg" rel="lightbox"&gt;
                &lt;img src="pictures/IMG_0179.jpg" /&gt;
            &lt;/a&gt;
&lt;a href="pictures/empty.jpg" &gt;
                &lt;img src="pictures/empty.jpg" /&gt;
            &lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;Аналогично тому, как мы использовали &lt;a href="http://ru.wikipedia.org/wiki/Широтно-импульсная_модуляция" target="_blank"&gt;ШИМ&lt;/a&gt; для управления светодиодами в опыте с &lt;a href="http://medinskiy.net/nfss/all/lampa-hameleon-color-mixing-lamp/" target="_blank"&gt;«лампой-хамелеоном»&lt;/a&gt;, сервопривод ожидает поступления определенного количества импульсов, чтобы понять, на какой угол ему надо повернуться. С аналогового выхода Arduino импульсы всегда поступают через один и тот же временной интервал, но продолжительность их меняется от 1000 до 2000 микросекунд. Программу, которая генерирует такие импульсы написать не очень сложно самим, но среда разработки Arduino уже включает в себя специальную библиотеку для управления моторами. Поскольку сообщество разработчиков для Arduino достаточно велико, существует великое множество дополнительных программ и библиотек для разных сенсоров, актуаторов и прочих устройств, которые могут взаимодействовать с Arduino. И мы этим тоже будем пользоваться.&lt;/p&gt;
&lt;p&gt;Схема, которую мы будем собирать выглядит так:&lt;/p&gt;
&lt;div class="tiles"&gt;
            &lt;a href="pictures/ServoMoto.jpg " rel="lightbox"&gt;
                &lt;img src="pictures/ServoMoto.jpg " /&gt;
            &lt;/a&gt;
&lt;a href="pictures/empty.jpg" &gt;
                &lt;img src="pictures/empty.jpg" /&gt;
            &lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;Один контакт потенциометр подсоединяем на плюс, второй — на минус, подвижный контакт  — к аналоговому входу Arduino. При вращении ручки потенциометр, напряжение между подвижным контактом (входом Arduino) и минусом будет изменяться, это изменение мы будем «читать» и управлять вращением сервопривод.&lt;/p&gt;
&lt;p&gt;Сервопривод  тоже имеет три контакта: два — питание (плюс и минус), третий для управления, его подсоединяем с выходу Arduino.&lt;/p&gt;
&lt;p&gt;Когда сервопривод начинает движение, ток, проходящий через него, значительно больше, чем во время самого движения, из-за этого происходить сильное падение напряжения во всей схеме. Если подключить два конденсатора параллельно сервопривод и потенциометр, можно это сгладить. Такие конденсаторы называют «развязывающие» или разделяющие, так как они отделяют изменения, произведенные какими-либо компонентами, от остальной схемы.&lt;/p&gt;
&lt;p&gt;Итак, макет готов:&lt;/p&gt;
&lt;div class="tiles"&gt;
            &lt;a href="pictures/IMG_0184.jpg" rel="lightbox"&gt;
                &lt;img src="pictures/IMG_0184.jpg" /&gt;
            &lt;/a&gt;
&lt;a href="pictures/empty.jpg" &gt;
                &lt;img src="pictures/empty.jpg" /&gt;
            &lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;Теперь пишем программу:&lt;/p&gt;
&lt;pre&gt;#include&amp;lt;&lt;span style="color: #cc6600;"&gt;Servo&lt;/span&gt;.h&amp;gt; &lt;span style="color: #7e7e7e;"&gt;//используем библиотеку для управления сервоприводом&lt;/span&gt;
&lt;span style="color: #cc6600;"&gt;Servo&lt;/span&gt; motor;      &lt;span style="color: #7e7e7e;"&gt;//наш мотор&lt;/span&gt;
&lt;span style="color: #cc6600;"&gt;int&lt;/span&gt; potens=A0;    &lt;span style="color: #7e7e7e;"&gt;//пин потенциометра &lt;/span&gt;
&lt;span style="color: #cc6600;"&gt;int&lt;/span&gt; motorpin=9;   &lt;span style="color: #7e7e7e;"&gt;//пин мотора&lt;/span&gt;
&lt;span style="color: #cc6600;"&gt;int&lt;/span&gt; potensVal=0;  &lt;span style="color: #7e7e7e;"&gt;//значение потенциометра&lt;/span&gt;
&lt;span style="color: #cc6600;"&gt;int&lt;/span&gt; angle;        &lt;span style="color: #7e7e7e;"&gt;//угол поворота сервопривода&lt;/span&gt;

&lt;span style="color: #cc6600;"&gt;void&lt;/span&gt; &lt;span style="color: #cc6600;"&gt;&lt;b&gt;setup&lt;/b&gt;&lt;/span&gt;(){ 
  motor.&lt;span style="color: #cc6600;"&gt;attach&lt;/span&gt;(motorpin); &lt;span style="color: #7e7e7e;"&gt;//подключаем мотор&lt;/span&gt;
  &lt;span style="color: #cc6600;"&gt;&lt;b&gt;Serial&lt;/b&gt;&lt;/span&gt;.&lt;span style="color: #cc6600;"&gt;begin&lt;/span&gt;(9600);
}

&lt;span style="color: #cc6600;"&gt;void&lt;/span&gt; &lt;span style="color: #cc6600;"&gt;&lt;b&gt;loop&lt;/b&gt;&lt;/span&gt;(){
  potensVal=&lt;span style="color: #cc6600;"&gt;analogRead&lt;/span&gt;(potens);&lt;span style="color: #7e7e7e;"&gt;//читаем положение потенциометра&lt;/span&gt;
  &lt;span style="color: #cc6600;"&gt;&lt;b&gt;Serial&lt;/b&gt;&lt;/span&gt;.&lt;span style="color: #cc6600;"&gt;print&lt;/span&gt;(&lt;span style="color: #006699;"&gt;«potensVal: „&lt;/span&gt;);
  &lt;span style="color: #cc6600;"&gt;&lt;b&gt;Serial&lt;/b&gt;&lt;/span&gt;.&lt;span style="color: #cc6600;"&gt;print&lt;/span&gt;(potensVal);
  angle=&lt;span style="color: #cc6600;"&gt;map&lt;/span&gt;(potensVal,0,1023,0,179);&lt;span style="color: #7e7e7e;"&gt;//преобразуем в градусы&lt;/span&gt;
  &lt;span style="color: #cc6600;"&gt;&lt;b&gt;Serial&lt;/b&gt;&lt;/span&gt;.&lt;span style="color: #cc6600;"&gt;print&lt;/span&gt;(&lt;span style="color: #006699;"&gt;“, angle: „&lt;/span&gt;);
  &lt;span style="color: #cc6600;"&gt;&lt;b&gt;Serial&lt;/b&gt;&lt;/span&gt;.&lt;span style="color: #cc6600;"&gt;println&lt;/span&gt;(angle);
  motor.&lt;span style="color: #cc6600;"&gt;write&lt;/span&gt;(angle);&lt;span style="color: #7e7e7e;"&gt;//поворачиваем мотор&lt;/span&gt;
  &lt;span style="color: #cc6600;"&gt;delay&lt;/span&gt;(15);
}&lt;/pre&gt;
&lt;p&gt;Небольшой комментарий по преобразованию значения, считанного с потенциометр, в градусы. С аналогового входа Arduino можно считать значение от 0 до 1023, в зависимости от напряжения на нем. В случае с потенциометром мы задействует все эти значения. На аналоговый выход Arduino мы может подать значение от 0 до 254, а в случае с сервоприводом, в команду движения мы вообще можем передавать значения только до 179. То есть нам надо пропорционально преобразовать значения из интервала [0;1023] в интервал [0;179]. У Arduino для этого есть специальная функция map(), в качестве первого параметра мы передаем значение, которое надо преобразовать, в качестве второго и третьего — границы первого интервала, четвертое и пятое — границы второго  интервала. В результате функция возвращает преобразованное значение, которое уже можно использовать. После команды поворота добавлена небольшая пауза, чтобы сервопривод успел повернуться. Фу… вроде все.&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/IxFyYS32zqM" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;p&gt;Теперь мы решили вместо потенциометр поставить в схему термосенсор, и поворачивать сервопривод в зависимости от внешней температуры. Немного изменили программу:&lt;/p&gt;
&lt;pre&gt;&lt;span style="color: #cc6600;"&gt;void&lt;/span&gt; &lt;span style="color: #cc6600;"&gt;&lt;b&gt;loop&lt;/b&gt;&lt;/span&gt;(){
  tempVal=&lt;span style="color: #cc6600;"&gt;analogRead&lt;/span&gt;(tempPin);
  &lt;span style="color: #cc6600;"&gt;float&lt;/span&gt; v=(tempVal/1024.0)*5.0;
  &lt;span style="color: #cc6600;"&gt;float&lt;/span&gt; t=(v-0.5)*100;
  &lt;span style="color: #cc6600;"&gt;&lt;b&gt;Serial&lt;/b&gt;&lt;/span&gt;.&lt;span style="color: #cc6600;"&gt;print&lt;/span&gt;(&lt;span style="color: #006699;"&gt;» temperature: «&lt;/span&gt;);
  &lt;span style="color: #cc6600;"&gt;&lt;b&gt;Serial&lt;/b&gt;&lt;/span&gt;.&lt;span style="color: #cc6600;"&gt;print&lt;/span&gt;(t);
  angle=&lt;span style="color: #cc6600;"&gt;map&lt;/span&gt;( t, 15, 35,0,179);
  &lt;span style="color: #cc6600;"&gt;&lt;b&gt;Serial&lt;/b&gt;&lt;/span&gt;.&lt;span style="color: #cc6600;"&gt;print&lt;/span&gt;(&lt;span style="color: #006699;"&gt;«, angle: „&lt;/span&gt;);
  &lt;span style="color: #cc6600;"&gt;&lt;b&gt;Serial&lt;/b&gt;&lt;/span&gt;.&lt;span style="color: #cc6600;"&gt;println&lt;/span&gt;(angle);
  motor.&lt;span style="color: #cc6600;"&gt;write&lt;/span&gt;(angle);
  &lt;span style="color: #cc6600;"&gt;delay&lt;/span&gt;(1000);
}&lt;/pre&gt;
&lt;p&gt;Преобразовываем значение, считанное с термосенсор, в градусы, как мы это уже &lt;a href="http://medinskiy.net/nfss/all/heat-o-meter-izmerenie-temperatury/" target="_blank"&gt;делали&lt;/a&gt;. В функции map() мы указали интервал от 15 до 35, потому что именно в этих пределах будет меняться температура в нашем опыте, и сервопривод будет поворачиваться на все 180 градусов при изменении температуры.&lt;/p&gt;
&lt;div class="e2-text-video"&gt;
&lt;iframe width="768" height="480" src="http://www.youtube.com/embed/lPtEp3FOx5o" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;div class="tiles"&gt;
     &lt;a href="pictures/IMG_0179.jpg" rel="lightbox[01]"&gt;
                &lt;img src="pictures/IMG_0179.jpg" /&gt;
        &lt;/a&gt;
  &lt;a href="pictures/IMG_0180.jpg" rel="lightbox[01]"&gt;
                &lt;img src="pictures/IMG_0180.jpg" /&gt;
           &lt;/a&gt;
  &lt;a href="pictures/IMG_0184.jpg" rel="lightbox[01]"&gt;
                &lt;img src="pictures/IMG_0184.jpg" /&gt;
           &lt;/a&gt;
  &lt;a href="pictures/IMG_0186.jpg" rel="lightbox[01]"&gt;
                &lt;img src="pictures/IMG_0186.jpg" /&gt;
           &lt;/a&gt;
  &lt;a href="pictures/ServoMoto.jpg" rel="lightbox[01]"&gt;
                &lt;img src="pictures/ServoMoto.jpg" /&gt;
           &lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;angle&lt;/p&gt;
</description><pubDate>Sun, 10 Mar 2013 13:24:38 +0300</pubDate></item>
</channel>

</rss>