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

<channel>

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

<item><title>Фестиваль в ПолигонПРО</title><guid isPermaLink="true">http://medinskiy.net/nfss/all/festival-v-poligonpro/</guid><link>http://medinskiy.net/nfss/all/festival-v-poligonpro/</link><description>&lt;p&gt;В мае этого года в &lt;a href="http://www.polygon-pro.ru"&gt; доме детского творчества ПолигонПРО&lt;/a&gt; прошел &lt;a href="http://www.polygon-pro.ru/index.php/novosti/item/145-fest-itog"&gt;1-й Российский фестиваль «Мир глазами юного исследователя»&lt;/a&gt;.&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;a href="http://medinskiy.net/nfss/pictures/fest-02.jpg-2013-09-06-17-24-53.jpg" class="e2-text-picture-zoom-link" width="800"&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://medinskiy.net/nfss/?go=@scale-image:fest-02.jpg-2013-09-06-17-24-53.jpg" width="768" height="511.68" alt="" /&gt;
&lt;/a&gt;&lt;p&gt;фото с сайта &lt;a href="http://www.polygon-pro.ru"&gt;&lt;a href="http://www.polygon-pro.ru"&gt;http://www.polygon-pro.ru&lt;/a&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;На этом фестивале дети от 6-ти до 16-ти лет представляли свои проекты. Было очень много интересных.&lt;br /&gt;
Понравился проект «Управление роботизированой рукой с помощью биотоков».&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;a href="http://medinskiy.net/nfss/pictures/fest-22.jpg" class="e2-text-picture-zoom-link" width="800"&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://medinskiy.net/nfss/?go=@scale-image:fest-22.jpg" width="768" height="511.68" alt="" /&gt;
&lt;/a&gt;&lt;p&gt;фото с сайта &lt;a href="http://www.polygon-pro.ru"&gt;&lt;a href="http://www.polygon-pro.ru"&gt;http://www.polygon-pro.ru&lt;/a&gt;&lt;/a&gt;&lt;/p&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://medinskiy.net/nfss/pictures/IMG_0458.jpg" width="640" height="480" data-caption="" alt="" /&gt;
&lt;img src="http://medinskiy.net/nfss/pictures/IMG_0455.jpg" width="640" height="480" data-caption="" alt="" /&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/pwcxE8m3-zA" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;p&gt;Поскольку фестиваль всероссийский, в нем участвовали юные исследователи из разных городов, некоторые заочно. В ними была организована видеосвязь, Арсений принимал участие в одном из «сеансов»&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="http://medinskiy.net/nfss/pictures/IMG_0460.jpg" width="640" height="480" alt="" /&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://medinskiy.net/nfss/pictures/IMG_0461.jpg" width="640" height="480" data-caption="" alt="" /&gt;
&lt;img src="http://medinskiy.net/nfss/pictures/IMG_0462.jpg" width="640" height="480" data-caption="" alt="" /&gt;
&lt;img src="http://medinskiy.net/nfss/pictures/IMG_0463.jpg" width="640" height="480" data-caption="" alt="" /&gt;
&lt;img src="http://medinskiy.net/nfss/pictures/IMG_0465.jpg" width="640" height="480" data-caption="" alt="" /&gt;
&lt;/div&gt;
&lt;p&gt;По окончании мероприятия состоялось награждение непричастных, Арсений получил диплом первой степени.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="e2-text-picture"&gt;
&lt;a href="http://medinskiy.net/nfss/pictures/180513---22-.-2013-.,-23-03.jpg" class="e2-text-picture-zoom-link" width="1992"&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://medinskiy.net/nfss/pictures/scaled/180513---22-.-2013-.,-23-03.scaled.jpg" width="768" height="1062" alt="" /&gt;
&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Довольные и уставшие все разъехались по домам :)&lt;br /&gt;
P.S. &lt;a href="http://medinskiy.net/nfss/attachments/RobotLittleOne.pdf"&gt;Листовка про нашего робота&lt;/a&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://medinskiy.net/nfss/pictures/IMG_0450.jpg" width="640" height="480" data-caption="" alt="" /&gt;
&lt;img src="http://medinskiy.net/nfss/pictures/IMG_0455.jpg" width="640" height="480" data-caption="" alt="" /&gt;
&lt;img src="http://medinskiy.net/nfss/pictures/IMG_0458.jpg" width="640" height="480" data-caption="" alt="" /&gt;
&lt;img src="http://medinskiy.net/nfss/pictures/IMG_0460.jpg" width="640" height="480" data-caption="" alt="" /&gt;
&lt;img src="http://medinskiy.net/nfss/pictures/IMG_0461.jpg" width="640" height="480" data-caption="" alt="" /&gt;
&lt;img src="http://medinskiy.net/nfss/pictures/IMG_0462.jpg" width="640" height="480" data-caption="" alt="" /&gt;
&lt;img src="http://medinskiy.net/nfss/pictures/IMG_0463.jpg" width="640" height="480" data-caption="" alt="" /&gt;
&lt;img src="http://medinskiy.net/nfss/pictures/IMG_0465.jpg" width="640" height="480" data-caption="" alt="" /&gt;
&lt;/div&gt;
</description><pubDate>Wed, 02 Oct 2013 16:18:06 +0300</pubDate></item><item><title>Учим робота ориентироваться в пространстве. Робот, объезжающий препятствия.</title><guid isPermaLink="true">http://medinskiy.net/nfss/all/trackbotfinal/</guid><link>http://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://medinskiy.net/nfss/all/dobavlyaem-k-robotu-sensorov/</guid><link>http://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://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://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://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://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://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://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://medinskiy.net/nfss/pictures/IMG_0388.jpg" width="640" height="480" data-caption="" alt="" /&gt;
&lt;img src="http://medinskiy.net/nfss/pictures/IMG_0390.jpg" width="640" height="480" data-caption="" alt="" /&gt;
&lt;img src="http://medinskiy.net/nfss/pictures/IMG_0391.jpg" width="640" height="480" data-caption="" alt="" /&gt;
&lt;img src="http://medinskiy.net/nfss/pictures/IMG_0392.jpg" width="640" height="480" data-caption="" alt="" /&gt;
&lt;img src="http://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><item><title>Продолжаем строить робота</title><guid isPermaLink="true">http://medinskiy.net/nfss/all/prodolzhaem-stroit-robota/</guid><link>http://medinskiy.net/nfss/all/prodolzhaem-stroit-robota/</link><description>&lt;p&gt;Строим дальше нашего &lt;a href="http://medinskiy.net/nfss/all/stroim-robota/" target="_blank"&gt;робота&lt;/a&gt;.&lt;br /&gt;
После того как собрано шасси, мы начали собирать «корпус» робота. Для этого использовали детали из обычного металлического конструктора.&lt;/p&gt;
&lt;div class="tiles"&gt;
     &lt;a href="pictures/IMG_0350.jpg" rel="lightbox[01]"&gt;
                &lt;img src="pictures/IMG_0350.jpg" /&gt;
        &lt;/a&gt;
  &lt;a href="pictures/IMG_0351.jpg" rel="lightbox[01]"&gt;
                &lt;img src="pictures/IMG_0351.jpg" /&gt;
           &lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;Для скрепления деталей использовали пластиковые стяжки. Для питания робота сначала мы использовали батарейки на 9В (типа «Крона»), но они достаточно быстро разряжались, поэтому использовали аккумулятор от гоночной машинки, тоже на 9В. Для включения/выключения использовали ... выключатель:&lt;/p&gt;
&lt;div class="tiles"&gt;
     &lt;a href="pictures/IMG_0352.jpg" rel="lightbox[02]"&gt;
                &lt;img src="pictures/IMG_0352.jpg" /&gt;
        &lt;/a&gt;
  &lt;a href="pictures/IMG_0353.jpg" rel="lightbox[02]"&gt;
                &lt;img src="pictures/IMG_0353.jpg" /&gt;
           &lt;/a&gt;
  &lt;a href="pictures/IMG_0354.jpg" rel="lightbox[02]"&gt;
                &lt;img src="pictures/IMG_0354.jpg" /&gt;
           &lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;Сейчас немного отвлечемся от сборки робота. Для дистанционного управления роботом на первом этапе мы решили использовать пульт от медиа плеера. Для получения сигнала мы будем использовать ИК приемник VS1838B.  Прежде чем включать ИК приемник в общую схему робота и писать программу управления, необходимо уточнить каким кнопкам пульта какое действие робота будет соответствовать, и какие коды, полученные Arduino, соответствуют этим кнопкам. Для выяснения этого мы собрали небольшую схему с ИК приемником и подключили его к Arduino:&lt;/p&gt;
&lt;div class="tiles"&gt;
     &lt;a href="pictures/irrecieve__1.jpg" rel="lightbox[03]"&gt;
                &lt;img src="pictures/irrecieve__1.jpg" /&gt;
        &lt;/a&gt;
  &lt;a href="pictures/IMG_0355.jpg" rel="lightbox[03]"&gt;
                &lt;img src="pictures/IMG_0355.jpg" /&gt;
           &lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;Как водится, для общения с ИК приемником взяли одну из имеющихся в открытом доступе &lt;a href="https://github.com/shirriff/Arduino-IRremote" target="_blank"&gt;библиотек&lt;/a&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: #B00040"&gt;int&lt;/span&gt; RECV_PIN &lt;span style="color: #666666"&gt;=&lt;/span&gt; &lt;span style="color: #666666"&gt;11&lt;/span&gt;;
IRrecv &lt;span style="color: #0000FF"&gt;irrecv&lt;/span&gt;(RECV_PIN);
decode_results results;

&lt;span style="color: #B00040"&gt;void&lt;/span&gt; &lt;span style="color: #0000FF"&gt;setup&lt;/span&gt;()
{
  Serial.begin(&lt;span style="color: #666666"&gt;9600&lt;/span&gt;);
  irrecv.enableIRIn(); &lt;span style="color: #408080; font-style: italic"&gt;// Start the receiver&lt;/span&gt;
}

&lt;span style="color: #B00040"&gt;void&lt;/span&gt; &lt;span style="color: #0000FF"&gt;loop&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)) {
    Serial.println(results.value, HEX);
    irrecv.resume(); &lt;span style="color: #408080; font-style: italic"&gt;// Receive the next value&lt;/span&gt;
  }
}
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Дальше  дело не хитрое — нажимай кнопки и записывай коды:&lt;/p&gt;
&lt;div class="tiles"&gt;
            &lt;a href="pictures/IMG_0361.jpg" rel="lightbox"&gt;
                &lt;img src="pictures/IMG_0361.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;Продолжаем собирать управляющую часть робота. Для управления двигателями нам нужен H-bridge, таким мы уже пользовались в проекте &lt;a href="http://medinskiy.net/nfss/all/zootrop-zoetrope/" target="_blank"&gt;Зоотроп&lt;/a&gt;. Но здесь мы не будем использовать непосредственно саму микросхему и пучок проводов к ней. Умные люди придумаю расширения к Arduino, называются они Shield, или по-русски шилды. Представляют собой эти шилды платы размером с Arduino или чуть больше, на этих платах реализуется какая-то функциональность, но самое главное, что подсоединяется она к Arduino с использованием установленных на них штыревых разъёмов. Получается такой бутерброд из плат. На основе H-bridge делают разные MotorShield'ы, как следует из названия, предназначены для управления моторами. Мы взяли &lt;a href="http://dx.com/p/ardumoto-l298p-motor-driver-shield-for-arduino-163089" target="_blank"&gt;Ardumoto L298P Motor Driver Shield&lt;/a&gt;. Как я уже говорил, шилд легко подсоединяется к Arduino, имеет удобные клеммы для подключения двигателей и питания (от них же питается и сам Arduino).&lt;/p&gt;
&lt;div class="tiles"&gt;
     &lt;a href="pictures/IMG_0349.jpg" rel="lightbox[04]"&gt;
                &lt;img src="pictures/IMG_0349.jpg" /&gt;
        &lt;/a&gt;
  &lt;a href="pictures/IMG_0356.jpg" rel="lightbox[04]"&gt;
                &lt;img src="pictures/IMG_0356.jpg" /&gt;
           &lt;/a&gt;
  &lt;a href="pictures/IMG_0358.jpg" rel="lightbox[04]"&gt;
                &lt;img src="pictures/IMG_0358.jpg" /&gt;
           &lt;/a&gt;
  &lt;a href="pictures/IMG_0360.jpg" rel="lightbox[04]"&gt;
                &lt;img src="pictures/IMG_0360.jpg" /&gt;
           &lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;Шилд использует пины 12 и 13 для включения/выключения двигателей, и пины 3 и 11 для управления скоростью вращения двигателей. Специально для этого шилда уже есть куча библиотек с полезными функциями, мы выбрали &lt;a href="https://github.com/jeroendoggen/arduino-ardumotor-library/tree/master/ArduMoto" target="_blank"&gt;первую попавшуюся&lt;/a&gt;, и она заработала. Вроде бы все готово для программирования первой версии дистанционно управляемого робота. Но в процессе отладки программы мы столкнулись с неожиданной проблемой. Начали появляться странности: после выполнения нескольких команд, робот отказывался реагировать на поступающие сигналы, в некоторых случаях отказывался работать один из двигателей (исправный). По отдельности оба компонента работали хорошо, ИК исправно принимал команды, двигатели крутились в разные стороны. При объединении схем, опять появлялись проблемы. Логика подсказывала, что проблема появляется из библиотек, поскольку программа на тот момент была простейшая. При более детальном изучении библиотеки был обнаружен следующий текст&lt;/p&gt;
&lt;div class="highlight" style="background: #f8f8f8"&gt;&lt;pre style="line-height: 125%"&gt;&lt;span style="color: #408080; font-style: italic"&gt;// define which timer to use&lt;/span&gt;
&lt;span style="color: #408080; font-style: italic"&gt;//&lt;/span&gt;
&lt;span style="color: #408080; font-style: italic"&gt;// Uncomment the timer you wish to use on your board.  If you&lt;/span&gt;
&lt;span style="color: #408080; font-style: italic"&gt;// are using another library which uses timer2, you have options&lt;/span&gt;
&lt;span style="color: #408080; font-style: italic"&gt;// to switch IRremote to use a different timer.&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;a name="Interruption"&gt;&lt;/a&gt;И в частности следующее:&lt;/p&gt;
&lt;div class="highlight" style="background: #f8f8f8"&gt;&lt;pre style="line-height: 125%"&gt;&lt;span style="color: #408080; font-style: italic"&gt;// Arduino Duemilanove, Diecimila, LilyPad, Mini, Fio, etc&lt;/span&gt;
&lt;span style="color: #BC7A00"&gt;#else&lt;/span&gt;
  &lt;span style="color: #408080; font-style: italic"&gt; // #define IR_USE_TIMER1   // tx = pin 9&lt;/span&gt;
  #define IR_USE_TIMER2     &lt;span style="color: #408080; font-style: italic"&gt;// tx = pin 3&lt;/span&gt;
&lt;span style="color: #BC7A00"&gt;#endif&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Спинным мозгом получилось догадаться, что если двигатель использует третий пин, то, наверное, не совсем правильно использовать тот же пин в таймере для IR приемника. По поводу таймеров в Arduino это отдельная большая тема, сейчас главное то, что если используется таймер (а их в Arduino uno два), то на этот же пин лучше ничего не вешать. Вобщем, следуя велению того же спинного мозга первая строчка была раскомментирована, вторая наоборот. Вот так выглядит финальная версия программы робота версии 1.2:&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;

ArduMoto Moto;  &lt;span style="color: #408080; font-style: italic"&gt;//создаем объект для работы с моторами&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;//пин где сидит ИК приемник&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;//создаем объект для работы с ИК приемником&lt;/span&gt;
decode_results results; &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.85&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;()
{
  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: #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;И все стало работать, как предполагалось. В этом ролике робот еще не умеет делать команды поворотов направо и налево c одновременным движением назад, а так же повоторы на месте. Работает на аккумуляторе от гоночной машинки.&lt;/p&gt;
&lt;div class="e2-text-video"&gt;
&lt;iframe width="768" height="480" src="http://www.youtube.com/embed/iQ7WstnV44M" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;p&gt;После робот был немного усовершествован. Мы установили на него более емкий &lt;a href="http://www.hobbyking.com/hobbyking/store/uh_viewItem.asp?idProduct=14075" target="_blank"&gt;аккумулятор&lt;/a&gt;, при этом меньших размеров:&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="http://medinskiy.net/nfss/pictures/14075.jpg" width="565" height="414" alt="" /&gt;
&lt;/div&gt;
&lt;p&gt;Для зарядки мы используем &lt;a href="http://www.hobbyking.com/hobbyking/store/uh_viewItem.asp?idProduct=12105" target="_blank"&gt;«умное» зарядное устройство&lt;/a&gt;:&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="http://medinskiy.net/nfss/pictures/ECO6-10.jpg" width="565" height="395" alt="" /&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/yVfxE4NI-xU" 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://medinskiy.net/nfss/pictures/IMG_0349.jpg" width="640" height="480" data-caption="" alt="" /&gt;
&lt;img src="http://medinskiy.net/nfss/pictures/IMG_0350.jpg" width="640" height="480" data-caption="" alt="" /&gt;
&lt;img src="http://medinskiy.net/nfss/pictures/IMG_0351.jpg" width="640" height="480" data-caption="" alt="" /&gt;
&lt;img src="http://medinskiy.net/nfss/pictures/IMG_0352.jpg" width="640" height="480" data-caption="" alt="" /&gt;
&lt;img src="http://medinskiy.net/nfss/pictures/IMG_0353.jpg" width="640" height="480" data-caption="" alt="" /&gt;
&lt;img src="http://medinskiy.net/nfss/pictures/IMG_0354.jpg" width="640" height="480" data-caption="" alt="" /&gt;
&lt;img src="http://medinskiy.net/nfss/pictures/IMG_0355.jpg" width="640" height="480" data-caption="" alt="" /&gt;
&lt;img src="http://medinskiy.net/nfss/pictures/IMG_0356.jpg" width="640" height="480" data-caption="" alt="" /&gt;
&lt;img src="http://medinskiy.net/nfss/pictures/IMG_0357.jpg" width="640" height="480" data-caption="" alt="" /&gt;
&lt;img src="http://medinskiy.net/nfss/pictures/IMG_0358.jpg" width="640" height="480" data-caption="" alt="" /&gt;
&lt;img src="http://medinskiy.net/nfss/pictures/IMG_0360.jpg" width="640" height="480" data-caption="" alt="" /&gt;
&lt;img src="http://medinskiy.net/nfss/pictures/IMG_0361.jpg" width="640" height="853" data-caption="" alt="" /&gt;
&lt;img src="http://medinskiy.net/nfss/pictures/IMG_0364.jpg" width="640" height="480" data-caption="" alt="" /&gt;
&lt;img src="http://medinskiy.net/nfss/pictures/14075.jpg" width="565" height="414" data-caption="" alt="" /&gt;
&lt;img src="http://medinskiy.net/nfss/pictures/ECO6-10.jpg" width="565" height="395" data-caption="" alt="" /&gt;
&lt;/div&gt;
</description><pubDate>Thu, 16 May 2013 00:12:06 +0300</pubDate></item><item><title>Строим робота</title><guid isPermaLink="true">http://medinskiy.net/nfss/all/stroim-robota/</guid><link>http://medinskiy.net/nfss/all/stroim-robota/</link><description>&lt;p&gt;Мы строим робота.&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="http://medinskiy.net/nfss/pictures/IMG_0347.jpg" width="640" height="480" alt="" /&gt;
&lt;/div&gt;
&lt;p&gt;Идея робота такая:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Робот должен быть более-менее автономным;&lt;/li&gt;
&lt;li&gt;Необходима возможность дистанционного управления роботом (в идеале напрямую с телефона);&lt;/li&gt;
&lt;li&gt;Робот должен самостоятельно объезжать препятствия;&lt;/li&gt;
&lt;li&gt;Хочется иметь на борту видеокамеру, которая тоже должна дистанционно управляться и передавать изображение в режиме реального времени (хотя, опцию записи видео тоже можно предусмотреть);&lt;/li&gt;
&lt;li&gt;Изображение желательно получать также на телефон (но это, наверное, мечты).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Работы по созданию робота мы разделили на следующие этапы:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Сборка движущего механизма.&lt;/li&gt;
&lt;li&gt;Установка «доп. оборудования» (сенсоры и актуаторы).&lt;/li&gt;
&lt;li&gt;Программирование микроконтроллера&lt;/li&gt;
&lt;li&gt;Программирование внешних устройств (телефона или компьютера) для управления роботом и получения и обработки информации, поступающей с сенсоров робота.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;В процессе сборки и совершенствования робота пункты 2 и 3 будут выполнятся в цикле.&lt;br /&gt;
В принципе, можно купить уже готового робота или готовый комплект для сборки и программировать уже его. Но, во-первых, это не так интересно. Процесс проектирования и создания робота своими руками сам по себе затягивает. Во-вторых, при самостоятельном проектировании робота можно предусмотреть какие-то конструктивные особенности, чтобы робот удовлетворял потребностям его создателя. Правда, с точки зрения затрат, этот способ может выйти дороже.&lt;/p&gt;
&lt;p&gt;Мы выбрали средний путь — узловая сборка, приобрели  узлы и из них сделали робота. Решили делать гусеничного, поскольку проще в управлении, ну и «внедорожные» качества имеются. Для сборки использовали следующие компоненты:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Редукторная коробка для двух моторов, и сами моторы. &lt;a href="http://www.philshobbyshop.com/catalog/viewsku?sku=TAM70097&amp;q=TAM70097" target="_blank"&gt;Tamiya Twin Motor Gearbox (TAM70097).&lt;/a&gt;
&lt;div class="tiles"&gt;
     &lt;a href="pictures/IMG_0310.jpg" rel="lightbox[01]"&gt;
                &lt;img src="pictures/IMG_0310.jpg" /&gt;
        &lt;/a&gt;
  &lt;a href="pictures/IMG_0311.jpg" rel="lightbox[01]"&gt;
                &lt;img src="pictures/IMG_0311.jpg" /&gt;
           &lt;/a&gt;
&lt;/div&gt;
&lt;li&gt;Платформа для крепления и крепеж. — &lt;a href="http://www.philshobbyshop.com/catalog/viewsku?sku=TAM70157&amp;itemname=universal_plate_set_2_" target="_blank"&gt;Tamiya Universal Plate Set (TAM70157).&lt;/a&gt;
&lt;div class="tiles"&gt;
     &lt;a href="pictures/IMG_0330.jpg" rel="lightbox[02]"&gt;
                &lt;img src="pictures/IMG_0330.jpg" /&gt;
        &lt;/a&gt;
  &lt;a href="pictures/18750e4c.jpg" rel="lightbox[02]"&gt;
                &lt;img src="pictures/18750e4c.jpg" /&gt;
           &lt;/a&gt;
&lt;/div&gt;
&lt;li&gt;Гусеницы и колеса с осями. — &lt;a href="http://www.philshobbyshop.com/catalog/viewsku?sku=TAM70100&amp;itemname=track_and_wheel_set" target="_blank"&gt;Tamiya Track and Wheel Set (TAM70100)&lt;/a&gt;
&lt;div class="tiles"&gt;
     &lt;a href="pictures/IMG_0343.jpg" rel="lightbox[03]"&gt;
                &lt;img src="pictures/IMG_0343.jpg" /&gt;
        &lt;/a&gt;
  &lt;a href="pictures/18a6dc0b.jpg" rel="lightbox[03]"&gt;
                &lt;img src="pictures/18a6dc0b.jpg" /&gt;
           &lt;/a&gt;
&lt;/div&gt;
&lt;li&gt;Металлический конструктор.
&lt;div&gt;
     &lt;a href="pictures/konstruktor_metallicheskij_nabor.jpg" rel="lightbox"&gt;
                &lt;img src="pictures/konstruktor_metallicheskij_nabor.jpg" /&gt;
        &lt;/a&gt;
&lt;/div&gt;
&lt;/ol&gt;
&lt;p&gt;Приступаем к сборке. Все узлы комплектуются очень подробными инструкция по сборке, написанные мелким японским шрифтом с картинками.&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="http://medinskiy.net/nfss/pictures/IMG_0317.jpg" width="640" height="853" alt="" /&gt;
&lt;/div&gt;
&lt;p&gt;Редукторную коробку можно собрать с разным передаточным числом: 58:1 или 203:1. Мы собрали 203:1, чтобы нагрузка на моторы была меньше, да и с учетом груза, который мы хотим запихать в тележку, тяга у шасси должна быть побольше. Коробка состоит из двух симметричных блоков шестеренок.&lt;/p&gt;
&lt;div class="tiles"&gt;
     &lt;a href="pictures/IMG_0318.jpg" rel="lightbox[04]"&gt;
                &lt;img src="pictures/IMG_0318.jpg" /&gt;
        &lt;/a&gt;
  &lt;a href="pictures/IMG_0320.jpg" rel="lightbox[04]"&gt;
                &lt;img src="pictures/IMG_0320.jpg" /&gt;
           &lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;После сборки коробки в нее вставляются моторчики. К моторам надо не забыть припаять провода.&lt;/p&gt;
&lt;div class="tiles"&gt;
  &lt;a href="pictures/IMG_0324.jpg" rel="lightbox[05]"&gt;
                &lt;img src="pictures/IMG_0324.jpg" /&gt;
           &lt;/a&gt;
  &lt;a href="pictures/IMG_0321.jpg" rel="lightbox[05]"&gt;
                &lt;img src="pictures/IMG_0321.jpg" /&gt;
           &lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;Блок устанавливается на платформу. После этого к валам, идущим от редуктора, крепятся ведущие колеса, остальные колеса крепятся на платформу.&lt;/p&gt;
&lt;div class="tiles"&gt;
     &lt;a href="pictures/IMG_0332.jpg" rel="lightbox[06]"&gt;
                &lt;img src="pictures/IMG_0332.jpg" /&gt;
        &lt;/a&gt;
  &lt;a href="pictures/IMG_0335.jpg" rel="lightbox[06]"&gt;
                &lt;img src="pictures/IMG_0335.jpg" /&gt;
           &lt;/a&gt;
  &lt;a href="pictures/IMG_0341.jpg" rel="lightbox[06]"&gt;
                &lt;img src="pictures/IMG_0341.jpg" /&gt;
           &lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;После сборки подсоединили к проводам для проверки батарейку, использовали обычную крону на 9В — ездит.&lt;br /&gt;
На этом сборка шасси окончена, дальше будем собирать управляющие конструкции.&lt;/p&gt;
&lt;p&gt;В процессе эксплуатации выяснилось, что моторы — это самое слабое звено этой конструкции. Пришлось несколько раз их разбирать для очистки нагара со счеток, в итоге, на одном из них щётки сгорели окончательно. Пришлось взять такой же из комплекта одномоторного редуктора (типа &lt;a href="https://www.philshobbyshop.com/catalog/viewsku?sku=TAM70167&amp;itemname=single_gearbox_4-speed" target="_blank"&gt;такого&lt;/a&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://medinskiy.net/nfss/pictures/IMG_0310.jpg" width="640" height="480" data-caption="" alt="" /&gt;
&lt;img src="http://medinskiy.net/nfss/pictures/IMG_0311.jpg" width="640" height="480" data-caption="" alt="" /&gt;
&lt;img src="http://medinskiy.net/nfss/pictures/IMG_0314.jpg" width="640" height="480" data-caption="" alt="" /&gt;
&lt;img src="http://medinskiy.net/nfss/pictures/IMG_0315.jpg" width="640" height="480" data-caption="" alt="" /&gt;
&lt;img src="http://medinskiy.net/nfss/pictures/IMG_0318.jpg" width="640" height="480" data-caption="" alt="" /&gt;
&lt;img src="http://medinskiy.net/nfss/pictures/IMG_0317.jpg" width="640" height="853" data-caption="" alt="" /&gt;
&lt;img src="http://medinskiy.net/nfss/pictures/IMG_0320.jpg" width="640" height="480" data-caption="" alt="" /&gt;
&lt;/div&gt;
&lt;p&gt;IMG_0321.jpg&lt;/p&gt;
&lt;/div&gt;
&lt;div class="e2-text-picture"&gt;
&lt;div class="fotorama" data-width="640" data-ratio="1.3333333333333"&gt;
&lt;img src="http://medinskiy.net/nfss/pictures/IMG_0324.jpg" width="640" height="480" data-caption="" alt="" /&gt;
&lt;img src="http://medinskiy.net/nfss/pictures/IMG_0329.jpg" width="640" height="480" data-caption="" alt="" /&gt;
&lt;img src="http://medinskiy.net/nfss/pictures/IMG_0330.jpg" width="640" height="480" data-caption="" alt="" /&gt;
&lt;img src="http://medinskiy.net/nfss/pictures/IMG_0332.jpg" width="640" height="480" data-caption="" alt="" /&gt;
&lt;img src="http://medinskiy.net/nfss/pictures/IMG_0335.jpg" width="640" height="480" data-caption="" alt="" /&gt;
&lt;img src="http://medinskiy.net/nfss/pictures/IMG_0341.jpg" width="640" height="480" data-caption="" alt="" /&gt;
&lt;img src="http://medinskiy.net/nfss/pictures/IMG_0343.jpg" width="640" height="480" data-caption="" alt="" /&gt;
&lt;img src="http://medinskiy.net/nfss/pictures/IMG_0347.jpg" width="640" height="480" data-caption="" alt="" /&gt;
&lt;/div&gt;
</description><pubDate>Tue, 07 May 2013 13:40:24 +0300</pubDate></item><item><title>Зоотроп (Zoetrope)</title><guid isPermaLink="true">http://medinskiy.net/nfss/all/zootrop-zoetrope/</guid><link>http://medinskiy.net/nfss/all/zootrop-zoetrope/</link><description>&lt;p&gt;В этом проекте мы будет делать «движущиеся картинки». Они будут двигаться вперед и назад с помощью Arduino, к которому мы подключим электромотор, H-bridge и ... неподвижные картинки.&lt;/p&gt;
&lt;p&gt;До того, как появилось кино, движущиеся картинки создавались с помощью прибора, называемого &lt;a href="http://ru.wikipedia.org/wiki/Зоотроп" target="_blank"&gt;зоотроп&lt;/a&gt;. Зоотроп создает иллюзию движения из статических картинок, которые немного отличаются друго от друга.&lt;/p&gt;
&lt;!--more--&gt;&lt;p&gt;Конструкция его довольно простая. Это цилиндр, в верхней части цилинда делаются небольшие прямоугольные отвестия-прорези. В нижней части цилиндра (там где прорезей нет) на внутренней его стороне закрепляется полоска с картинками, которые будут «двигаться». Надо смотреть на картинки через прорези. Когда цилиндр начинает вращаться картинки начинают «оживать». Выглядит вот так:&lt;/p&gt;
&lt;div class="tiles"&gt;
            &lt;a href="pictures/IMG_0339.jpg" rel="lightbox"&gt;
                &lt;img src="pictures/IMG_0339.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;p&gt;В нашем проекте «&lt;a href="http://medinskiy.net/nfss/all/vertushka-s-motorchikom/" target="_blank"&gt;Вертушка с моторчиком&lt;/a&gt;» мотор вращался только в одном направлении. Если поменять полярность питания, подаваемого на двигатель, то он начнет вращаться в противоположную сторону. Не очень практично каждый раз, когда нам требутся поменять направление вращения двигателя, переключать проводки двигателя. Для автоматизации этой задачи придумали специальный компонент, который называется &lt;a href="http://ru.wikipedia.org/wiki/H_мост" target="_blank"&gt;H-bridge&lt;/a&gt;. H-bridge — это интегральная микросхема, схема, которая содержит множество элементов, плотно «упакованных» в  в один комнонент. С помощью интегральных микросхем можно составлять достаточно сложные схемы, состоящие из легко заменяемых компонентов. Например, H-bridge, который мы будем использовать в этом проекте, содержит внутри несколько транзисторов. Чтобы собрать его, может понадобится еще одна макетная плата.&lt;br /&gt;
Для доступа к «внутренностям» интегральной схемы используются пины (выходы), расположенные по ее бокам. Разные компоненты имеют разное количество выходов, и не все из них используются в конкретной схеме. Для удобства выходы интегральных схем нумеруются, нумерация выводов ведется против часовой стрелки, начиная от первой ножки, находящейся под ключом, который может иметь вид засечки или углубления.&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="http://medinskiy.net/nfss/pictures/h-bridge.png" width="120" height="259" alt="" /&gt;
&lt;/div&gt;
&lt;p&gt;В нашем проекте мы используем микросхему L293D. Назначение пинов можно посмотреть на схеме. С ее помощью можно управлять двумя двигателями, каждый из которых можно будет вращать либо в одну, либо в другую сторону. Можно также подключить четыре двигателя, тогда каждый из них можно будет вращать только в одну сторону. Мы будем вращать двигатель в две стороны, поэтому используем схему подключения для двух двигателей.&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="http://medinskiy.net/nfss/pictures/h-bridge_2.png" width="518" height="613" alt="" /&gt;
&lt;/div&gt;
&lt;p&gt;Выходы 1 и 9  предназначены для включения и выключения двигателей, если их подключить к  выходам Arduino с &lt;a href="http://ru.wikipedia.org/wiki/Широтно-импульсная_модуляция" target="_blank"&gt;ШИМ&lt;/a&gt;, то можно управлять скоростью вращения двигателей.  Выходы 2 и 7, и 10 и 15 управляют направлением вращения двигателей, первого и второго соответственно (парами). Если на выход 2 подать HIGH, а на выход 7 LOW, то мотор будет вращаться в одну сторону, наоборот — в другую сторону. Если на эти выходы подать одинаковый сигнал (LOW или HIGH) то мотор вращаться не будет. То же и для второго двигателя. К выходам 3 и 6 подключается один мотор (напряжением на этих выходах управляют 2-й и 7-й), к выходам 10 и 15 — второй мотор. Выход 8 соединяют с положительным полюсом источника питания двигателей. Выход 16 — с положительным полюсом источника питания микросхемы (5В). Выходы 4, 5, 12, 13 подключаются на «землю», они же используются для теплоотвода от схемы (в нашем случае нагрев был небольшой, так как подлючили только один двигатель и не надолго, а вообще греется она хорошо, может понадобиться радиатор).&lt;/p&gt;
&lt;p&gt;Схема, которую мы будет собирать с использованием H-Bridge L293D:&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="http://medinskiy.net/nfss/pictures/Zoetrope_схема.jpg" width="640" height="348" alt="" /&gt;
&lt;/div&gt;
&lt;p&gt;В схеме присутствуют два выключателя. Один для включения и выключения моторчика (если мотор включен, то нажатием на кнопку он выключается, если выключен, то нажатием включается). Второй — для изменения направления вращения двигателя. Потенциометр используется для регулировки скорости двигателя.&lt;/p&gt;
&lt;p&gt;Собираем схему&lt;/p&gt;
&lt;div class="tiles"&gt;
     &lt;a href="pictures/IMG_0290.jpg" rel="lightbox[01]"&gt;
                &lt;img src="pictures/IMG_0290.jpg" /&gt;
        &lt;/a&gt;
  &lt;a href="pictures/IMG_0289.jpg" rel="lightbox[01]"&gt;
                &lt;img src="pictures/IMG_0289.jpg" /&gt;
           &lt;/a&gt;
  &lt;a href="pictures/IMG_0293.jpg" rel="lightbox[01]"&gt;
                &lt;img src="pictures/IMG_0293.jpg" /&gt;
           &lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;Собрать такую схему было, конечно, не очень просто. Но написать программу, оказалось труднее, и заняло это гораздо больше времени.&lt;/p&gt;
&lt;pre&gt;
&lt;span style="color: #CC6600;"&gt;const&lt;/span&gt; &lt;span style="color: #CC6600;"&gt;int&lt;/span&gt; motorenablepin=9;&lt;span style="color: #7E7E7E;"&gt;//&amp;#1087;&amp;#1080;&amp;#1085; &amp;#1076;&amp;#1083;&amp;#1103; &amp;#1087;&amp;#1091;&amp;#1089;&amp;#1082;&amp;#1072; &amp;#1084;&amp;#1086;&amp;#1090;&amp;#1086;&amp;#1088;&amp;#1072;&lt;/span&gt;
&lt;span style="color: #CC6600;"&gt;const&lt;/span&gt; &lt;span style="color: #CC6600;"&gt;int&lt;/span&gt; directionpin1=3;&lt;span style="color: #7E7E7E;"&gt;//&amp;#1087;&amp;#1077;&amp;#1088;&amp;#1074;&amp;#1099;&amp;#1081; &amp;#1087;&amp;#1080;&amp;#1085; &amp;#1076;&amp;#1083;&amp;#1103; &amp;#1085;&amp;#1072;&amp;#1087;&amp;#1088;&amp;#1072;&amp;#1074;&amp;#1083;&amp;#1077;&amp;#1085;&amp;#1080;&amp;#1103; &amp;#1084;&amp;#1086;&amp;#1090;&amp;#1086;&amp;#1088;&amp;#1072;&lt;/span&gt;
&lt;span style="color: #CC6600;"&gt;const&lt;/span&gt; &lt;span style="color: #CC6600;"&gt;int&lt;/span&gt; directionpin2=2;&lt;span style="color: #7E7E7E;"&gt;//&amp;#1074;&amp;#1090;&amp;#1086;&amp;#1088;&amp;#1086;&amp;#1081; &amp;#1087;&amp;#1080;&amp;#1085; &amp;#1076;&amp;#1083;&amp;#1103; &amp;#1085;&amp;#1072;&amp;#1087;&amp;#1088;&amp;#1072;&amp;#1074;&amp;#1083;&amp;#1077;&amp;#1085;&amp;#1080;&amp;#1103; &amp;#1084;&amp;#1086;&amp;#1090;&amp;#1086;&amp;#1088;&amp;#1072;&lt;/span&gt;
&lt;span style="color: #CC6600;"&gt;const&lt;/span&gt; &lt;span style="color: #CC6600;"&gt;int&lt;/span&gt; onoffswitchpin=5;&lt;span style="color: #7E7E7E;"&gt;//&amp;#1087;&amp;#1080;&amp;#1085; &amp;#1089; &amp;#1082;&amp;#1085;&amp;#1086;&amp;#1087;&amp;#1082;&amp;#1086;&amp;#1081; &amp;#1076;&amp;#1083;&amp;#1103; &amp;#1087;&amp;#1091;&amp;#1089;&amp;#1082;&amp;#1072;/&amp;#1086;&amp;#1089;&amp;#1090;&amp;#1072;&amp;#1085;&amp;#1086;&amp;#1074;&amp;#1072; &amp;#1084;&amp;#1086;&amp;#1090;&amp;#1086;&amp;#1088;&amp;#1072;&lt;/span&gt;
&lt;span style="color: #CC6600;"&gt;const&lt;/span&gt; &lt;span style="color: #CC6600;"&gt;int&lt;/span&gt; directionswitchpin=4;&lt;span style="color: #7E7E7E;"&gt;//&amp;#1087;&amp;#1080;&amp;#1085; &amp;#1089; &amp;#1082;&amp;#1085;&amp;#1086;&amp;#1087;&amp;#1082;&amp;#1086;&amp;#1081; &amp;#1076;&amp;#1083;&amp;#1103; &amp;#1089;&amp;#1084;&amp;#1077;&amp;#1085;&amp;#1099; &amp;#1085;&amp;#1072;&amp;#1087;&amp;#1088;&amp;#1072;&amp;#1074;&amp;#1083;&amp;#1077;&amp;#1085;&amp;#1080;&amp;#1103; &amp;#1084;&amp;#1086;&amp;#1090;&amp;#1086;&amp;#1088;&amp;#1072;&lt;/span&gt;
&lt;span style="color: #CC6600;"&gt;const&lt;/span&gt; &lt;span style="color: #CC6600;"&gt;int&lt;/span&gt; potens=A0;&lt;span style="color: #7E7E7E;"&gt;//&amp;#1087;&amp;#1080;&amp;#1085; &amp;#1089; &amp;#1087;&amp;#1086;&amp;#1090;&amp;#1077;&amp;#1085;&amp;#1094;&amp;#1080;&amp;#1086;&amp;#1084;&amp;#1077;&amp;#1090;&amp;#1088;&amp;#1086;&amp;#1084;&lt;/span&gt;
&lt;span style="color: #CC6600;"&gt;int&lt;/span&gt; potensVal=0;&lt;span style="color: #7E7E7E;"&gt;//&amp;#1079;&amp;#1085;&amp;#1072;&amp;#1095;&amp;#1077;&amp;#1085;&amp;#1080;&amp;#1077; &amp;#1089; &amp;#1087;&amp;#1086;&amp;#1090;&amp;#1077;&amp;#1085;&amp;#1094;&amp;#1080;&amp;#1086;&amp;#1084;&amp;#1077;&amp;#1090;&amp;#1088;&amp;#1072;&lt;/span&gt;

&lt;span style="color: #7E7E7E;"&gt;//&amp;#1087;&amp;#1077;&amp;#1088;&amp;#1077;&amp;#1084;&amp;#1077;&amp;#1085;&amp;#1085;&amp;#1099;&amp;#1077; &amp;#1076;&amp;#1083;&amp;#1103; &amp;#1086;&amp;#1090;&amp;#1088;&amp;#1072;&amp;#1078;&amp;#1077;&amp;#1085;&amp;#1080;&amp;#1103; &amp;#1090;&amp;#1077;&amp;#1082;&amp;#1091;&amp;#1097;&amp;#1077;&amp;#1075;&amp;#1086; &amp;#1089;&amp;#1086;&amp;#1089;&amp;#1090;&amp;#1086;&amp;#1103;&amp;#1085;&amp;#1080;&amp;#1103; &amp;#1084;&amp;#1086;&amp;#1090;&amp;#1086;&amp;#1088;&amp;#1072;&lt;/span&gt;
&lt;span style="color: #CC6600;"&gt;int&lt;/span&gt; onoffswitchSt=0;&lt;span style="color: #7E7E7E;"&gt;//&amp;#1090;&amp;#1077;&amp;#1082;&amp;#1091;&amp;#1097;&amp;#1077;&amp;#1077; &amp;#1089;&amp;#1086;&amp;#1089;&amp;#1090;&amp;#1086;&amp;#1103;&amp;#1085;&amp;#1080;&amp;#1077; &amp;#1082;&amp;#1085;&amp;#1086;&amp;#1087;&amp;#1082;&amp;#1080; &amp;#1076;&amp;#1083;&amp;#1103; &amp;#1087;&amp;#1091;&amp;#1089;&amp;#1082;&amp;#1072; &amp;#1084;&amp;#1086;&amp;#1090;&amp;#1086;&amp;#1088;&amp;#1072;&lt;/span&gt;
&lt;span style="color: #CC6600;"&gt;int&lt;/span&gt; directionswitchSt=0;&lt;span style="color: #7E7E7E;"&gt;//&amp;#1090;&amp;#1077;&amp;#1082;&amp;#1091;&amp;#1097;&amp;#1077;&amp;#1077; &amp;#1089;&amp;#1086;&amp;#1089;&amp;#1090;&amp;#1086;&amp;#1103;&amp;#1085;&amp;#1080;&amp;#1077; &amp;#1082;&amp;#1085;&amp;#1086;&amp;#1087;&amp;#1082;&amp;#1080; &amp;#1076;&amp;#1083;&amp;#1103; &amp;#1089;&amp;#1084;&amp;#1077;&amp;#1085;&amp;#1099; &amp;#1085;&amp;#1072;&amp;#1087;&amp;#1088;&amp;#1072;&amp;#1074;&amp;#1083;&amp;#1077;&amp;#1085;&amp;#1080;&amp;#1103; &amp;#1084;&amp;#1086;&amp;#1090;&amp;#1086;&amp;#1088;&amp;#1072;&lt;/span&gt;
&lt;span style="color: #CC6600;"&gt;int&lt;/span&gt; previosonoffswitchst=0;&lt;span style="color: #7E7E7E;"&gt;//&amp;#1087;&amp;#1088;&amp;#1077;&amp;#1076;&amp;#1099;&amp;#1076;&amp;#1091;&amp;#1097;&amp;#1077;&amp;#1077; &amp;#1089;&amp;#1086;&amp;#1089;&amp;#1090;&amp;#1086;&amp;#1103;&amp;#1085;&amp;#1080;&amp;#1077; &amp;#1082;&amp;#1085;&amp;#1086;&amp;#1087;&amp;#1082;&amp;#1080; &amp;#1079;&amp;#1072;&amp;#1087;&amp;#1091;&amp;#1089;&amp;#1082;&amp;#1072; &amp;#1084;&amp;#1086;&amp;#1090;&amp;#1086;&amp;#1088;&amp;#1072; (&amp;#1085;&amp;#1072;&amp;#1076;&amp;#1086; &amp;#1076;&amp;#1083;&amp;#1103; &amp;#1086;&amp;#1087;&amp;#1088;&amp;#1077;&amp;#1076;&amp;#1077;&amp;#1083;&amp;#1077;&amp;#1085;&amp;#1080;&amp;#1103; &amp;#1089;&amp;#1084;&amp;#1077;&amp;#1085;&amp;#1099; &amp;#1089;&amp;#1086;&amp;#1089;&amp;#1090;&amp;#1086;&amp;#1103;&amp;#1085;&amp;#1080;&amp;#1103; &amp;#1082;&amp;#1085;&amp;#1086;&amp;#1087;&amp;#1082;&amp;#1080;&lt;/span&gt;
&lt;span style="color: #CC6600;"&gt;int&lt;/span&gt; motorenabled=0;&lt;span style="color: #7E7E7E;"&gt;//&amp;#1079;&amp;#1072;&amp;#1087;&amp;#1091;&amp;#1097;&amp;#1077;&amp;#1085; &amp;#1083;&amp;#1080; &amp;#1074; &amp;#1090;&amp;#1077;&amp;#1082;&amp;#1091;&amp;#1097;&amp;#1080;&amp;#1081; &amp;#1084;&amp;#1086;&amp;#1084;&amp;#1077;&amp;#1085;&amp;#1090; &amp;#1084;&amp;#1086;&amp;#1090;&amp;#1086;&amp;#1088;&lt;/span&gt;
&lt;span style="color: #CC6600;"&gt;int&lt;/span&gt; motorSp=0;&lt;span style="color: #7E7E7E;"&gt;//&amp;#1089;&amp;#1082;&amp;#1086;&amp;#1088;&amp;#1086;&amp;#1089;&amp;#1090;&amp;#1100; &amp;#1084;&amp;#1086;&amp;#1090;&amp;#1086;&amp;#1088;&amp;#1072;&lt;/span&gt;
&lt;span style="color: #CC6600;"&gt;int&lt;/span&gt; motordirection=1;&lt;span style="color: #7E7E7E;"&gt;//&amp;#1085;&amp;#1072;&amp;#1087;&amp;#1088;&amp;#1072;&amp;#1074;&amp;#1083;&amp;#1077;&amp;#1085;&amp;#1080;&amp;#1077; &amp;#1084;&amp;#1086;&amp;#1090;&amp;#1086;&amp;#1088;&amp;#1072;&lt;/span&gt;
&lt;span style="color: #CC6600;"&gt;int&lt;/span&gt; prevdirectionswitchpinst=0;&lt;span style="color: #7E7E7E;"&gt;//&amp;#1087;&amp;#1088;&amp;#1077;&amp;#1076;&amp;#1099;&amp;#1076;&amp;#1091;&amp;#1097;&amp;#1077;&amp;#1077; &amp;#1089;&amp;#1086;&amp;#1089;&amp;#1090;&amp;#1086;&amp;#1103;&amp;#1085;&amp;#1080;&amp;#1077; &amp;#1082;&amp;#1085;&amp;#1086;&amp;#1087;&amp;#1082;&amp;#1080; &amp;#1089;&amp;#1084;&amp;#1077;&amp;#1085;&amp;#1099; &amp;#1085;&amp;#1072;&amp;#1087;&amp;#1088;&amp;#1072;&amp;#1074;&amp;#1083;&amp;#1077;&amp;#1085;&amp;#1080;&amp;#1103; &lt;/span&gt;
&lt;span style="color: #7E7E7E;"&gt;//&amp;#1084;&amp;#1086;&amp;#1090;&amp;#1086;&amp;#1088;&amp;#1072; (&amp;#1085;&amp;#1072;&amp;#1076;&amp;#1086; &amp;#1076;&amp;#1083;&amp;#1103; &amp;#1086;&amp;#1087;&amp;#1088;&amp;#1077;&amp;#1076;&amp;#1077;&amp;#1083;&amp;#1077;&amp;#1085;&amp;#1080;&amp;#1103; &amp;#1089;&amp;#1084;&amp;#1077;&amp;#1085;&amp;#1099; &amp;#1089;&amp;#1086;&amp;#1089;&amp;#1090;&amp;#1086;&amp;#1103;&amp;#1085;&amp;#1080;&amp;#1103; &amp;#1082;&amp;#1085;&amp;#1086;&amp;#1087;&amp;#1082;&amp;#1080;&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;(){
  &lt;span style="color: #CC6600;"&gt;pinMode&lt;/span&gt; (motorenablepin,&lt;span style="color: #006699;"&gt;OUTPUT&lt;/span&gt;);&lt;span style="color: #7E7E7E;"&gt;//&amp;#1080;&amp;#1085;&amp;#1080;&amp;#1094;&amp;#1080;&amp;#1072;&amp;#1083;&amp;#1080;&amp;#1079;&amp;#1072;&amp;#1094;&amp;#1080;&amp;#1103; &amp;#1087;&amp;#1080;&amp;#1085;&amp;#1086;&amp;#1074;&lt;/span&gt;
  &lt;span style="color: #CC6600;"&gt;pinMode&lt;/span&gt; (directionpin1, &lt;span style="color: #006699;"&gt;OUTPUT&lt;/span&gt;);
  &lt;span style="color: #CC6600;"&gt;pinMode&lt;/span&gt; (directionpin2,&lt;span style="color: #006699;"&gt;OUTPUT&lt;/span&gt;);
  &lt;span style="color: #CC6600;"&gt;pinMode&lt;/span&gt; (onoffswitchpin,&lt;span style="color: #006699;"&gt;INPUT&lt;/span&gt;);
  &lt;span style="color: #CC6600;"&gt;pinMode&lt;/span&gt; (directionswitchpin,&lt;span style="color: #006699;"&gt;INPUT&lt;/span&gt;);
  &lt;span style="color: #CC6600;"&gt;digitalWrite&lt;/span&gt;(motorenablepin,&lt;span style="color: #006699;"&gt;LOW&lt;/span&gt;);&lt;span style="color: #7E7E7E;"&gt;//&amp;#1074;&amp;#1099;&amp;#1082;&amp;#1083;&amp;#1102;&amp;#1095;&amp;#1072;&amp;#1077;&amp;#1084; &amp;#1084;&amp;#1086;&amp;#1090;&amp;#1086;&amp;#1088; &amp;#1085;&amp;#1072; &amp;#1074;&amp;#1089;&amp;#1103;&amp;#1082;&amp;#1080;&amp;#1081; &amp;#1089;&amp;#1083;&amp;#1091;&amp;#1095;&amp;#1072;&amp;#1081;&lt;/span&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; (){

  onoffswitchSt=&lt;span style="color: #CC6600;"&gt;digitalRead&lt;/span&gt;(onoffswitchpin);&lt;span style="color: #7E7E7E;"&gt;//&amp;#1090;&amp;#1077;&amp;#1082;&amp;#1091;&amp;#1097;&amp;#1077;&amp;#1077; &amp;#1089;&amp;#1086;&amp;#1089;&amp;#1090;&amp;#1086;&amp;#1103;&amp;#1085;&amp;#1080;&amp;#1077; &amp;#1082;&amp;#1085;&amp;#1086;&amp;#1087;&amp;#1082;&amp;#1080; &amp;#1079;&amp;#1072;&amp;#1087;&amp;#1091;&amp;#1089;&amp;#1082;&amp;#1072; &amp;#1084;&amp;#1086;&amp;#1090;&amp;#1086;&amp;#1088;&amp;#1072;&lt;/span&gt;
  &lt;span style="color: #CC6600;"&gt;delay&lt;/span&gt;(1);
  directionswitchSt=&lt;span style="color: #CC6600;"&gt;digitalRead&lt;/span&gt;(directionswitchpin );&lt;span style="color: #7E7E7E;"&gt;//&amp;#1090;&amp;#1077;&amp;#1082;&amp;#1091;&amp;#1097;&amp;#1077;&amp;#1077; &amp;#1089;&amp;#1086;&amp;#1089;&amp;#1090;&amp;#1086;&amp;#1103;&amp;#1085;&amp;#1080;&amp;#1077; &amp;#1082;&amp;#1085;&amp;#1086;&amp;#1087;&amp;#1082;&amp;#1080; &amp;#1089;&amp;#1084;&amp;#1077;&amp;#1085;&amp;#1099; &amp;#1085;&amp;#1072;&amp;#1087;&amp;#1088;&amp;#1072;&amp;#1074;&amp;#1083;&amp;#1077;&amp;#1085;&amp;#1080;&amp;#1103; &amp;#1084;&amp;#1086;&amp;#1090;&amp;#1086;&amp;#1088;&amp;#1072;&lt;/span&gt;
  potensVal= &lt;span style="color: #CC6600;"&gt;analogRead&lt;/span&gt;(potens);&lt;span style="color: #7E7E7E;"&gt;//&amp;#1089;&amp;#1095;&amp;#1080;&amp;#1090;&amp;#1099;&amp;#1074;&amp;#1072;&amp;#1077;&amp;#1084; &amp;#1079;&amp;#1085;&amp;#1072;&amp;#1095;&amp;#1077;&amp;#1085;&amp;#1080;&amp;#1077; &amp;#1087;&amp;#1086;&amp;#1090;&amp;#1077;&amp;#1085;&amp;#1094;&amp;#1080;&amp;#1086;&amp;#1084;&amp;#1077;&amp;#1090;&amp;#1088;&amp;#1072;&lt;/span&gt;
  motorSp=&lt;span style="color: #CC6600;"&gt;map&lt;/span&gt;(potensVal,0,1023,0,254);&lt;span style="color: #7E7E7E;"&gt;//&amp;#1087;&amp;#1088;&amp;#1077;&amp;#1086;&amp;#1073;&amp;#1088;&amp;#1072;&amp;#1079;&amp;#1091;&amp;#1077;&amp;#1084; &amp;#1079;&amp;#1085;&amp;#1072;&amp;#1095;&amp;#1077;&amp;#1085;&amp;#1080;&amp;#1077; &amp;#1074; &amp;#1089;&amp;#1082;&amp;#1086;&amp;#1088;&amp;#1086;&amp;#1089;&amp;#1090;&amp;#1100; &amp;#1084;&amp;#1086;&amp;#1090;&amp;#1086;&amp;#1088;&amp;#1072;&lt;/span&gt;

  &lt;span style="color: #CC6600;"&gt;if&lt;/span&gt; (onoffswitchSt != previosonoffswitchst){&lt;span style="color: #7E7E7E;"&gt;//&amp;#1077;&amp;#1089;&amp;#1083;&amp;#1080; &amp;#1089;&amp;#1086;&amp;#1089;&amp;#1090;&amp;#1086;&amp;#1103;&amp;#1085;&amp;#1080;&amp;#1077; &amp;#1082;&amp;#1085;&amp;#1086;&amp;#1087;&amp;#1082;&amp;#1080; &amp;#1087;&amp;#1086;&amp;#1084;&amp;#1077;&amp;#1085;&amp;#1103;&amp;#1083;&amp;#1086;&amp;#1089;&amp;#1100;&lt;/span&gt;
    &lt;span style="color: #CC6600;"&gt;if&lt;/span&gt;(onoffswitchSt==&lt;span style="color: #006699;"&gt;HIGH&lt;/span&gt;){&lt;span style="color: #7E7E7E;"&gt;//&amp;#1080; &amp;#1086;&amp;#1085;&amp;#1072; &amp;#1085;&amp;#1072;&amp;#1078;&amp;#1072;&amp;#1090;&amp;#1072;&lt;/span&gt;
      motorenabled=!motorenabled;&lt;span style="color: #7E7E7E;"&gt;//&amp;#1084;&amp;#1077;&amp;#1085;&amp;#1103;&amp;#1077;&amp;#1084; &amp;#1089;&amp;#1086;&amp;#1089;&amp;#1090;&amp;#1086;&amp;#1103;&amp;#1085;&amp;#1080;&amp;#1077; &amp;#1084;&amp;#1086;&amp;#1090;&amp;#1086;&amp;#1088;&amp;#1072; &amp;#1085;&amp;#1072; &amp;#1087;&amp;#1088;&amp;#1086;&amp;#1090;&amp;#1080;&amp;#1074;&amp;#1086;&amp;#1087;&amp;#1086;&amp;#1083;&amp;#1086;&amp;#1078;&amp;#1085;&amp;#1086;&amp;#1077;&lt;/span&gt;
    }
    previosonoffswitchst=!previosonoffswitchst;&lt;span style="color: #7E7E7E;"&gt;//&amp;#1084;&amp;#1077;&amp;#1085;&amp;#1103;&amp;#1077;&amp;#1084; &amp;#1087;&amp;#1088;&amp;#1077;&amp;#1076;&amp;#1099;&amp;#1076;&amp;#1091;&amp;#1097;&amp;#1077;&amp;#1077; &amp;#1089;&amp;#1086;&amp;#1089;&amp;#1090;&amp;#1086;&amp;#1103;&amp;#1085;&amp;#1080;&amp;#1077; &amp;#1082;&amp;#1085;&amp;#1086;&amp;#1087;&amp;#1082;&amp;#1080; &amp;#1085;&amp;#1072; &amp;#1087;&amp;#1088;&amp;#1086;&amp;#1090;&amp;#1080;&amp;#1074;&amp;#1086;&amp;#1087;&amp;#1086;&amp;#1083;&amp;#1086;&amp;#1078;&amp;#1085;&amp;#1086;&amp;#1077;&lt;/span&gt;
  }
  &lt;span style="color: #CC6600;"&gt;if&lt;/span&gt; (directionswitchSt != prevdirectionswitchpinst){&lt;span style="color: #7E7E7E;"&gt;//&amp;#1072;&amp;#1085;&amp;#1072;&amp;#1083;&amp;#1086;&amp;#1075;&amp;#1080;&amp;#1095;&amp;#1085;&amp;#1086; &amp;#1076;&amp;#1083;&amp;#1103; &amp;#1085;&amp;#1072;&amp;#1087;&amp;#1088;&amp;#1072;&amp;#1074;&amp;#1083;&amp;#1077;&amp;#1085;&amp;#1080;&amp;#1103; &amp;#1074;&amp;#1088;&amp;#1072;&amp;#1097;&amp;#1077;&amp;#1085;&amp;#1080;&amp;#1103;&lt;/span&gt;
    &lt;span style="color: #CC6600;"&gt;if&lt;/span&gt;(directionswitchSt==&lt;span style="color: #006699;"&gt;HIGH&lt;/span&gt;){
      motordirection=!motordirection;
    }
    prevdirectionswitchpinst=!prevdirectionswitchpinst;
  }
  &lt;span style="color: #7E7E7E;"&gt;//&amp;#1074; &amp;#1079;&amp;#1072;&amp;#1074;&amp;#1080;&amp;#1089;&amp;#1080;&amp;#1084;&amp;#1086;&amp;#1089;&amp;#1090;&amp;#1080; &amp;#1086;&amp;#1090; &amp;#1079;&amp;#1085;&amp;#1072;&amp;#1095;&amp;#1077;&amp;#1085;&amp;#1080;&amp;#1103; &amp;#1087;&amp;#1077;&amp;#1088;&amp;#1077;&amp;#1084;&amp;#1077;&amp;#1085;&amp;#1085;&amp;#1086;&amp;#1081;, &amp;#1086;&amp;#1087;&amp;#1088;&amp;#1077;&amp;#1076;&amp;#1077;&amp;#1083;&amp;#1103;&amp;#1102;&amp;#1097;&amp;#1077;&amp;#1081; &amp;#1089;&amp;#1086;&amp;#1089;&amp;#1090;&amp;#1086;&amp;#1103;&amp;#1085;&amp;#1080;&amp;#1077; &amp;#1084;&amp;#1086;&amp;#1090;&amp;#1086;&amp;#1088;&amp;#1072; &amp;#1079;&amp;#1072;&amp;#1087;&amp;#1091;&amp;#1089;&amp;#1082;&amp;#1072;&amp;#1077;&amp;#1084; &lt;/span&gt;
  &lt;span style="color: #7E7E7E;"&gt;//&amp;#1084;&amp;#1086;&amp;#1090;&amp;#1086;&amp;#1088; &amp;#1089; &amp;#1085;&amp;#1091;&amp;#1078;&amp;#1085;&amp;#1086;&amp;#1081; &amp;#1089;&amp;#1082;&amp;#1086;&amp;#1088;&amp;#1086;&amp;#1089;&amp;#1090;&amp;#1100;&amp;#1102; &amp;#1080;&amp;#1083;&amp;#1080; &amp;#1086;&amp;#1089;&amp;#1090;&amp;#1072;&amp;#1085;&amp;#1072;&amp;#1074;&amp;#1083;&amp;#1080;&amp;#1074;&amp;#1072;&amp;#1077;&amp;#1084; &amp;#1077;&amp;#1075;&amp;#1086;&lt;/span&gt;
  &lt;span style="color: #CC6600;"&gt;if&lt;/span&gt;(motorenabled==1){
    &lt;span style="color: #CC6600;"&gt;analogWrite&lt;/span&gt;(motorenablepin,motorSp);
  }
  &lt;span style="color: #CC6600;"&gt;else&lt;/span&gt;{
    &lt;span style="color: #CC6600;"&gt;digitalWrite&lt;/span&gt;(motorenablepin,&lt;span style="color: #006699;"&gt;LOW&lt;/span&gt;);
  }
  &lt;span style="color: #7E7E7E;"&gt;//&amp;#1074; &amp;#1079;&amp;#1072;&amp;#1074;&amp;#1080;&amp;#1089;&amp;#1080;&amp;#1084;&amp;#1086;&amp;#1089;&amp;#1090;&amp;#1080; &amp;#1086;&amp;#1090; &amp;#1079;&amp;#1085;&amp;#1072;&amp;#1095;&amp;#1077;&amp;#1085;&amp;#1080;&amp;#1103; &amp;#1087;&amp;#1077;&amp;#1088;&amp;#1077;&amp;#1084;&amp;#1077;&amp;#1085;&amp;#1085;&amp;#1086;&amp;#1081;, &amp;#1086;&amp;#1087;&amp;#1088;&amp;#1077;&amp;#1076;&amp;#1077;&amp;#1083;&amp;#1103;&amp;#1102;&amp;#1097;&amp;#1077;&amp;#1081; &amp;#1085;&amp;#1072;&amp;#1087;&amp;#1088;&amp;#1072;&amp;#1074;&amp;#1083;&amp;#1077;&amp;#1085;&amp;#1080;&amp;#1077; &amp;#1074;&amp;#1088;&amp;#1072;&amp;#1097;&amp;#1077;&amp;#1085;&amp;#1080;&amp;#1103; &amp;#1084;&amp;#1086;&amp;#1090;&amp;#1086;&amp;#1088;&amp;#1072; &amp;#1091;&amp;#1089;&amp;#1090;&amp;#1072;&amp;#1085;&amp;#1072;&amp;#1074;&amp;#1083;&amp;#1080;&amp;#1074;&amp;#1072;&amp;#1077;&amp;#1084; &amp;#1085;&amp;#1072;&amp;#1087;&amp;#1088;&amp;#1072;&amp;#1074;&amp;#1083;&amp;#1077;&amp;#1085;&amp;#1080;&amp;#1077;&lt;/span&gt;
  &lt;span style="color: #CC6600;"&gt;if&lt;/span&gt;(motordirection==1){
    &lt;span style="color: #CC6600;"&gt;digitalWrite&lt;/span&gt;(directionpin1,&lt;span style="color: #006699;"&gt;HIGH&lt;/span&gt;);
    &lt;span style="color: #CC6600;"&gt;digitalWrite&lt;/span&gt;(directionpin2,&lt;span style="color: #006699;"&gt;LOW&lt;/span&gt;);
  }
  &lt;span style="color: #CC6600;"&gt;else&lt;/span&gt;{
    &lt;span style="color: #CC6600;"&gt;digitalWrite&lt;/span&gt;(directionpin1, &lt;span style="color: #006699;"&gt;LOW&lt;/span&gt;);
    &lt;span style="color: #CC6600;"&gt;digitalWrite&lt;/span&gt;(directionpin2,&lt;span style="color: #006699;"&gt;HIGH&lt;/span&gt;);
  }
}
&lt;/pre&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/VqpzOjSyVK8" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;p&gt;Теперь осталось собрать непоследственно сам Зоотроп. Используем диск, который мы делали для &lt;a href="http://medinskiy.net/nfss/all/vertushka-s-motorchikom/" target="_blank"&gt;предыдущего проекта&lt;/a&gt;. Приделаем к нему цилиндр с прорезями и картинки.&lt;/p&gt;
&lt;div class="tiles"&gt;
     &lt;a href="pictures/IMG_0339.jpg" rel="lightbox[02]"&gt;
                &lt;img src="pictures/IMG_0339.jpg" /&gt;
        &lt;/a&gt;
  &lt;a href="pictures/IMG_0340.jpg" rel="lightbox[02]"&gt;
                &lt;img src="pictures/IMG_0340.jpg" /&gt;
           &lt;/a&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/RYXRgVyQQiQ" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;div class="tiles"&gt;
     &lt;a href="pictures/IMG_0288.jpg" rel="lightbox[03]"&gt;
                &lt;img src="pictures/IMG_0288.jpg" /&gt;
        &lt;/a&gt;
  &lt;a href="pictures/IMG_0289.jpg" rel="lightbox[03]"&gt;
                &lt;img src="pictures/IMG_0289.jpg" /&gt;
           &lt;/a&gt;
  &lt;a href="pictures/IMG_0290.jpg" rel="lightbox[03]"&gt;
                &lt;img src="pictures/IMG_0290.jpg" /&gt;
           &lt;/a&gt;
  &lt;a href="pictures/IMG_0291.jpg" rel="lightbox[03]"&gt;
                &lt;img src="pictures/IMG_0291.jpg" /&gt;
           &lt;/a&gt;
  &lt;a href="pictures/IMG_0292.jpg" rel="lightbox[03]"&gt;
                &lt;img src="pictures/IMG_0292.jpg" /&gt;
           &lt;/a&gt;
  &lt;a href="pictures/IMG_0293.jpg" rel="lightbox[03]"&gt;
                &lt;img src="pictures/IMG_0293.jpg" /&gt;
           &lt;/a&gt;
  &lt;a href="pictures/IMG_0294.jpg" rel="lightbox[03]"&gt;
                &lt;img src="pictures/IMG_0294.jpg" /&gt;
           &lt;/a&gt;
  &lt;a href="pictures/IMG_0339.jpg" rel="lightbox[03]"&gt;
                &lt;img src="pictures/IMG_0339.jpg" /&gt;
           &lt;/a&gt;
  &lt;a href="pictures/IMG_0340.jpg" rel="lightbox[03]"&gt;
                &lt;img src="pictures/IMG_0340.jpg" /&gt;
           &lt;/a&gt;
  &lt;a href="pictures/Zoetrope_схема.jpg" rel="lightbox[03]"&gt;
                &lt;img src="pictures/Zoetrope_схема.jpg" /&gt;
           &lt;/a&gt;
&lt;/div&gt;
</description><pubDate>Sun, 05 May 2013 08:34:21 +0300</pubDate></item><item><title>Вертушка с моторчиком</title><guid isPermaLink="true">http://medinskiy.net/nfss/all/vertushka-s-motorchikom/</guid><link>http://medinskiy.net/nfss/all/vertushka-s-motorchikom/</link><description>&lt;p&gt;В этом проекте Arduino будет управлять вращающейся с помощью моторчика вертушки.&lt;/p&gt;
&lt;p&gt;Управлять моторами с помощью Arduino намного сложнее чем управлять светодиодами. Во-первых, моторы требуют больше тока чем может дать Arduino. Во-вторых, моторы могут сами генерировать электрический ток за счет являния, называемого индукцией, и этот ток может повредить элементы схемы. Однако, моторы приводят в движение разные вещи, и от этого проекты становяться интереснее. В общем оно того стоит.&lt;/p&gt;
&lt;!--more--&gt;&lt;p&gt;Для того, чтобы что-то двигать, требуется много энергии.  Кроме того, что моторы требуют больше тока, чем дает Arduino (только 40мА на цифровом выходе), некоторым так же нужно более высокое напряжение. В момент начала движения  или при высоких нагрузках, потребление тока также может значительно возрастать.&lt;/p&gt;
&lt;p&gt;С помощью &lt;a href="https://ru.wikipedia.org/wiki/Транзистор" target="_blank"&gt;транзисторов&lt;/a&gt;, подсоединенных к Arduino можно решить эту проблему. Транзисторы позволяют управлять большим током и источниками питания с высоким напряжением с помощью небольшого управляющего тока, который уже может идти от Arduino. Существует можество разновидностей транзисторов, но принцип действия у всех одинаковый. В нашем примере транзистор лучше представить как цифровой выключатель. Есть подать напряжение на один из выходов транзистора (затвор), то он замыкает два других выхода (сток и исток). Таким образом можно включать и выключать высоковольтные и высокоамперные моторы при помощи Arduino.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://ru.wikipedia.org/wiki/Электродвигатель_постоянного_тока" target="_blank"&gt;Электромотор&lt;/a&gt; — это индуктивное устройство. &lt;a href="http://ru.wikipedia.org/wiki/Электромагнитная_индукция" target="_blank"&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/jMdlAHobzLk" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;p&gt;Если прекратить подавать электричество, то он по инерции продолжает какое-то время вращаться. Пока он вращается, он вырабатывает электрический ток, противоположный по направлению тому, который его вращал. Этот ток называют «обратным током», он может вывести из строя транзистор. Чтобы избежать этого, параллельно с мотором надо подключить диод и обратный ток будет проходить через диод.&lt;/p&gt;
&lt;p&gt;С учетом всего вышесказанного схема для управления мотором получается такая:&lt;/p&gt;
&lt;div class="tiles"&gt;
            &lt;a href="pictures/Motorized-Pinwheel_схема.jpg" rel="lightbox"&gt;
                &lt;img src="pictures/Motorized-Pinwheel_схема.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;Поскольку для мотора требуется много энергии, он питается от дополнительного источника — 9-ти вольтовой батерейки. И так получается, что управление транзистором производится с помощью Arduino, а сам мотор запитан от дополнительного мощного источника электроэнергии. Обязательное правило, которое следует соблюдать если в схеме используется несколько источников энергии — минусы всех источников должны быть соединены вместе.&lt;/p&gt;
&lt;p&gt;Теперь, когда макет готов, осталось написать программу:&lt;/p&gt;
&lt;pre&gt;&lt;span style="color: #cc6600;"&gt;int&lt;/span&gt; motor=9; &lt;span style="color: #7e7e7e;"&gt;//пин управления мотором&lt;/span&gt;
&lt;span style="color: #cc6600;"&gt;int&lt;/span&gt; switchButn=2; &lt;span style="color: #7e7e7e;"&gt;//кнопка включения мотора&lt;/span&gt;
&lt;span style="color: #cc6600;"&gt;int&lt;/span&gt; switchButnVal=0;&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;(){
  &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;pinMode&lt;/span&gt; (switchButn,&lt;span style="color: #006699;"&gt;INPUT&lt;/span&gt;);
  &lt;span style="color: #cc6600;"&gt;pinMode&lt;/span&gt;(motor,&lt;span style="color: #006699;"&gt;OUTPUT&lt;/span&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;(){
  switchButnVal=&lt;span style="color: #cc6600;"&gt;digitalRead&lt;/span&gt;(switchButn);&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;println&lt;/span&gt;(switchButnVal);
  &lt;span style="color: #cc6600;"&gt;if&lt;/span&gt;(switchButnVal==&lt;span style="color: #006699;"&gt;HIGH&lt;/span&gt;){
    &lt;span style="color: #cc6600;"&gt;digitalWrite&lt;/span&gt;(motor,&lt;span style="color: #006699;"&gt;HIGH&lt;/span&gt;);&lt;span style="color: #7e7e7e;"&gt;//если кнопка нажата включаем мотор&lt;/span&gt;
  }
  &lt;span style="color: #cc6600;"&gt;else&lt;/span&gt;{
    &lt;span style="color: #cc6600;"&gt;digitalWrite&lt;/span&gt;(motor,&lt;span style="color: #006699;"&gt;LOW&lt;/span&gt;);&lt;span style="color: #7e7e7e;"&gt;//если не нажата — выключаем&lt;/span&gt;
  }
}&lt;/pre&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/TU3u4SeteoM" 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/PZTbOulZQhA" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;p&gt;Если скорость вращения мотора уменьшить, то на диске с рисунком,  который крутиться, можно увидеть интересный оптический эффект. Для управления скоростью вращения в схему добавили потенциометр, и на затвор транзистора подаем напряжение от 0 до 5В, в зависимости от положения потенциометра. Программа чуть-чуть увеличилась.&lt;/p&gt;
&lt;pre&gt;&lt;span style="color: #cc6600;"&gt;int&lt;/span&gt; motor=9; &lt;span style="color: #7e7e7e;"&gt;//пин управления мотором&lt;/span&gt;
&lt;span style="color: #cc6600;"&gt;int&lt;/span&gt; switchButn=2; &lt;span style="color: #7e7e7e;"&gt;//кнопка включения мотора&lt;/span&gt;
&lt;span style="color: #cc6600;"&gt;int&lt;/span&gt; switchButnVal=0;&lt;span style="color: #7e7e7e;"&gt;//значение считанное с кнопки включения мотора&lt;/span&gt;
&lt;span style="color: #cc6600;"&gt;int&lt;/span&gt; pot=A0; &lt;span style="color: #7e7e7e;"&gt;// пин с потенциометром&lt;/span&gt;
&lt;span style="color: #cc6600;"&gt;int&lt;/span&gt; potVal=0;&lt;span style="color: #7e7e7e;"&gt;//значение считанное с потенциометра&lt;/span&gt;
&lt;span style="color: #cc6600;"&gt;int&lt;/span&gt; Val=0;&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;(){
  &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;pinMode&lt;/span&gt; (switchButn,&lt;span style="color: #006699;"&gt;INPUT&lt;/span&gt;);
  &lt;span style="color: #cc6600;"&gt;pinMode&lt;/span&gt;(motor,&lt;span style="color: #006699;"&gt;OUTPUT&lt;/span&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;(){
  potVal=&lt;span style="color: #cc6600;"&gt;analogRead&lt;/span&gt;(pot);&lt;span style="color: #7e7e7e;"&gt;//читаем значение с потенциометра&lt;/span&gt;
  Val=&lt;span style="color: #cc6600;"&gt;map&lt;/span&gt;(potVal,0,1023,0,254); &lt;span style="color: #7e7e7e;"&gt;// в значение для вывода&lt;/span&gt;
  switchButnVal=&lt;span style="color: #cc6600;"&gt;digitalRead&lt;/span&gt;(switchButn);&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;println&lt;/span&gt;(switchButnVal);
  &lt;span style="color: #cc6600;"&gt;if&lt;/span&gt;(switchButnVal==&lt;span style="color: #006699;"&gt;HIGH&lt;/span&gt;){
    &lt;span style="color: #cc6600;"&gt;analogWrite&lt;/span&gt;(motor,Val);&lt;span style="color: #7e7e7e;"&gt;//если кнопка нажата включаем мотор&lt;/span&gt;
  }
  &lt;span style="color: #cc6600;"&gt;else&lt;/span&gt;{
    &lt;span style="color: #cc6600;"&gt;digitalWrite&lt;/span&gt;(motor,&lt;span style="color: #006699;"&gt;LOW&lt;/span&gt;);&lt;span style="color: #7e7e7e;"&gt;//если не нажата — выключаем&lt;/span&gt;
  }
}&lt;/pre&gt;
&lt;div class="e2-text-video"&gt;
&lt;iframe width="768" height="480" src="http://www.youtube.com/embed/SCeCVayitxY" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;div class="tiles"&gt;
     &lt;a href="pictures/Motorized-Pinwheel_схема.jpg" rel="lightbox[01]"&gt;
                &lt;img src="pictures/Motorized-Pinwheel_схема.jpg" /&gt;
        &lt;/a&gt;
  &lt;a href="pictures/IMG_0275.jpg" rel="lightbox[01]"&gt;
                &lt;img src="pictures/IMG_0236.jpg" /&gt;
           &lt;/a&gt;
&lt;/div&gt;
</description><pubDate>Wed, 24 Apr 2013 23:02:00 +0300</pubDate></item><item><title>Паяем LOL shield</title><guid isPermaLink="true">http://medinskiy.net/nfss/all/payaem-lol-shield/</guid><link>http://medinskiy.net/nfss/all/payaem-lol-shield/</link><description>&lt;p&gt;Человек, умеющий что-то делать своими руками, обычно вызывает симпатию и уважение у родных и близких. Можно бесконечно долго собирать проекты на макетных платах. Можно даже собирать очень сложные схемы. Например такие:&lt;/p&gt;
&lt;div class="tiles"&gt;
            &lt;a href="pictures/Breadboard_complex.jpg" rel="lightbox"&gt;
                &lt;img src="pictures/Breadboard_complex.jpg" /&gt;
            &lt;/a&gt;
&lt;a href="pictures/empty.png" &gt;
                &lt;img src="pictures/empty.png" /&gt;
            &lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;Но для того, чтобы сделать законченное устройство, скорее всего, придется паять. Не обязательно «травить» плату.&lt;/p&gt;
&lt;!--more--&gt;&lt;p&gt;Можно использовать монтажную плату типа такой:&lt;/p&gt;
&lt;div class="tiles"&gt;
            &lt;a href="pictures/Proto-Shield_Kit_assembled1_big.jpg" rel="lightbox"&gt;
                &lt;img src="pictures/Proto-Shield_Kit_assembled1_big.jpg" /&gt;
            &lt;/a&gt;
&lt;a href="pictures/empty.png" &gt;
                &lt;img src="pictures/empty.png" /&gt;
            &lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;Вобщем пришло время обзавестись паяльником и овладевать навыками. Мы приобрели небольшой набор для паяния со всем необходимым:&lt;/p&gt;
&lt;div class="tiles"&gt;
            &lt;a href="pictures/IMG_0201.jpg" rel="lightbox"&gt;
                &lt;img src="pictures/IMG_0201.jpg" /&gt;
            &lt;/a&gt;
&lt;a href="pictures/empty.png" &gt;
                &lt;img src="pictures/empty.png" /&gt;
            &lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;А также небольшой &lt;a href="http://www.parallax.com/StoreSearchResults/tabid/768/List/0/SortField/4/ProductID/832/Default.aspx?txtSearch=robot+badge" target="_blank"&gt;конструктор&lt;/a&gt; типа DIY, чтобы было на чем тренироваться. Состоит он из небольшой печатной платы, на которую надо припаять светодиод, кнопочку и батарейку. В собранном виде выглядит вот так:&lt;br /&gt;
 &lt;/p&gt;
&lt;div class="e2-text-video"&gt;
&lt;iframe width="768" height="480" src="http://www.youtube.com/embed/mmQwAAXMQeQ" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;p&gt;Но самое интересное было дальше. После того, как несколько таких штук было успешно спаяны и раздарены бабушке с дедушкой мы решились на нечто грандиозное. Есть такой интересный проект &lt;a href="http://jimmieprodgers.com/kits/lolshield/" target="_blank"&gt;LOL Shield&lt;/a&gt; для Arduino. На одной плате 126 светодиодов.  Плата подключается с Arduino использует все его выходы, кроме двух. Получается такая свето-диодная матрица. Можно на ней бегущую строку делать, можно мультики рисовать или игрушки делать. Вобщем со всех сторон полезная вещь. Распространяется она в виде набора деталей, которые надо самостоятельно спаять.&lt;/p&gt;
&lt;p&gt;Вот все детали, которые предстоит соединить вместе с помощью паяльника и припоя:&lt;/p&gt;
&lt;div class="tiles"&gt;
     &lt;a href="pictures/IMG_0238.jpg" rel="lightbox[01]"&gt;
                &lt;img src="pictures/IMG_0238.jpg" /&gt;
        &lt;/a&gt;
  &lt;a href="pictures/IMG_0236.jpg" rel="lightbox[01]"&gt;
                &lt;img src="pictures/IMG_0236.jpg" /&gt;
           &lt;/a&gt;
  &lt;a href="pictures/IMG_0237.jpg" rel="lightbox[01]"&gt;
                &lt;img src="pictures/IMG_0237.jpg" /&gt;
           &lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;Поначалу объем работ пугает: припаять на плату 126 диодов, это 252 контакта. Но глаза боятся...&lt;/p&gt;
&lt;p&gt;Вставляем первый ряд:&lt;/p&gt;
&lt;div class="tiles"&gt;
            &lt;a href="pictures/IMG_0240.jpg" rel="lightbox"&gt;
                &lt;img src="pictures/IMG_0240.jpg" /&gt;
            &lt;/a&gt;
&lt;a href="pictures/empty.png" &gt;
                &lt;img src="pictures/empty.png" /&gt;
            &lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;Переворачиваем плату и понеслась:&lt;/p&gt;
&lt;div class="tiles"&gt;
            &lt;a href="pictures/IMG_0248.jpg" rel="lightbox[02]"&gt;
                &lt;img src="pictures/IMG_0248.jpg" /&gt;
            &lt;/a&gt;
 &lt;a href="pictures/IMG_0247.jpg" rel="lightbox[02]"&gt;
                &lt;img src="pictures/IMG_0247.jpg" /&gt;
            &lt;/a&gt;
 &lt;a href="pictures/IMG_0250.jpg" rel="lightbox[02]"&gt;
                &lt;img src="pictures/IMG_0250.jpg" /&gt;
            &lt;/a&gt;

 &lt;a href="pictures/IMG_0251.jpg" rel="lightbox[02]"&gt;
                &lt;img src="pictures/IMG_0251.jpg" /&gt;
            &lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;Пять часов прошли незаметно, шаг за шагом, светодиодная панель готова:&lt;/p&gt;
&lt;div class="tiles"&gt;
            &lt;a href="pictures/IMG_0253.jpg" rel="lightbox[03]"&gt;
                &lt;img src="pictures/IMG_0253.jpg" /&gt;
            &lt;/a&gt;
&lt;a href="pictures/IMG_0256.jpg" rel="lightbox[03]"&gt;
                &lt;img src="pictures/IMG_0256.jpg" /&gt;
            &lt;/a&gt;
&lt;a href="pictures/IMG_0259.jpg" rel="lightbox[03]"&gt;
                &lt;img src="pictures/IMG_0259.jpg" /&gt;
            &lt;/a&gt;
&lt;a href="pictures/IMG_0263.jpg" rel="lightbox[03]"&gt;
                &lt;img src="pictures/IMG_0263.jpg" /&gt;
            &lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;Пока мы с Арсением паяли, Фёдор успел поспать, а рядом пристоился котик:&lt;/p&gt;
&lt;div class="tiles"&gt;
            &lt;a href="pictures/IMG_0268.jpg" rel="lightbox"&gt;
                &lt;img src="pictures/IMG_0268.jpg" /&gt;
            &lt;/a&gt;
&lt;a href="pictures/empty.png" &gt;
                &lt;img src="pictures/empty.png" /&gt;
            &lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;К LOL Shield есть несколько &lt;a href="http://code.google.com/p/lolshield/downloads/list" target="_blank"&gt;бибилиотек&lt;/a&gt; для вывода текста, бегущей строки, картинок. Есть даже тетрис. Мы немного допилили программу для тетриса, так что стало можно с помощью потенциометров управлять фигурками. На некоторое время это стало любимой игрой Федора:&lt;/p&gt;
&lt;div class="tiles"&gt;
            &lt;a href="pictures/IMG_0271.jpg" rel="lightbox"&gt;
                &lt;img src="pictures/IMG_0271.jpg" /&gt;
            &lt;/a&gt;
&lt;a href="pictures/empty.png" &gt;
                &lt;img src="pictures/empty.png" /&gt;
            &lt;/a&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/xONxQqzyCqg" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;p&gt;В этом ролике еще нет потенциометров для управления, немного позже мы приделали вместо потенциометров нормальный джойстик. Но это уже в следующих сериях.&lt;/p&gt;
&lt;div class="tiles"&gt;
            &lt;a href="pictures/IMG_0201.jpg" rel="lightbox[04]"&gt;
                &lt;img src="pictures/IMG_0201.jpg" /&gt;
            &lt;/a&gt;
            &lt;a href="pictures/IMG_0202.jpg" rel="lightbox[04]"&gt;
                &lt;img src="pictures/IMG_0202.jpg" /&gt;
            &lt;/a&gt;
            &lt;a href="pictures/IMG_0222.jpg" rel="lightbox[04]"&gt;
                &lt;img src="pictures/IMG_0222.jpg" /&gt;
            &lt;/a&gt;
            &lt;a href="pictures/IMG_0223.jpg" rel="lightbox[04]"&gt;
                &lt;img src="pictures/IMG_0223.jpg" /&gt;
            &lt;/a&gt;
            &lt;a href="pictures/IMG_0236.jpg" rel="lightbox[04]"&gt;
                &lt;img src="pictures/IMG_0236.jpg" /&gt;
            &lt;/a&gt;
            &lt;a href="pictures/IMG_0237.jpg" rel="lightbox[04]"&gt;
                &lt;img src="pictures/IMG_0237.jpg" /&gt;
            &lt;/a&gt;
            &lt;a href="pictures/IMG_0238.jpg" rel="lightbox[04]"&gt;
                &lt;img src="pictures/IMG_0238.jpg" /&gt;
            &lt;/a&gt;
            &lt;a href="pictures/IMG_0239.jpg" rel="lightbox[04]"&gt;
                &lt;img src="pictures/IMG_0239.jpg" /&gt;
            &lt;/a&gt;
            &lt;a href="pictures/IMG_0240.jpg" rel="lightbox[04]"&gt;
                &lt;img src="pictures/IMG_0240.jpg" /&gt;
            &lt;/a&gt;
            &lt;a href="pictures/IMG_0242.jpg" rel="lightbox[04]"&gt;
                &lt;img src="pictures/IMG_0242.jpg" /&gt;
            &lt;/a&gt;
            &lt;a href="pictures/IMG_0247.jpg" rel="lightbox[04]"&gt;
                &lt;img src="pictures/IMG_0247.jpg" /&gt;
            &lt;/a&gt;
            &lt;a href="pictures/IMG_0248.jpg" rel="lightbox[04]"&gt;
                &lt;img src="pictures/IMG_0248.jpg" /&gt;
            &lt;/a&gt;
            &lt;a href="pictures/IMG_0250.jpg" rel="lightbox[04]"&gt;
                &lt;img src="pictures/IMG_0250.jpg" /&gt;
            &lt;/a&gt;
            &lt;a href="pictures/IMG_0251.jpg" rel="lightbox[04]"&gt;
                &lt;img src="pictures/IMG_0251.jpg" /&gt;
            &lt;/a&gt;
            &lt;a href="pictures/IMG_0253.jpg" rel="lightbox[04]"&gt;
                &lt;img src="pictures/IMG_0253.jpg" /&gt;
            &lt;/a&gt;
            &lt;a href="pictures/IMG_0254.jpg" rel="lightbox[04]"&gt;
                &lt;img src="pictures/IMG_0254.jpg" /&gt;
            &lt;/a&gt;
            &lt;a href="pictures/IMG_0256.jpg" rel="lightbox[04]"&gt;
                &lt;img src="pictures/IMG_0256.jpg" /&gt;
            &lt;/a&gt;
            &lt;a href="pictures/IMG_0257.jpg" rel="lightbox[04]"&gt;
                &lt;img src="pictures/IMG_0257.jpg" /&gt;
            &lt;/a&gt;
            &lt;a href="pictures/IMG_0259.jpg" rel="lightbox[04]"&gt;
                &lt;img src="pictures/IMG_0259.jpg" /&gt;
            &lt;/a&gt;
            &lt;a href="pictures/IMG_0261.jpg" rel="lightbox[04]"&gt;
                &lt;img src="pictures/IMG_0261.jpg" /&gt;
            &lt;/a&gt;
            &lt;a href="pictures/IMG_0263.jpg" rel="lightbox[04]"&gt;
                &lt;img src="pictures/IMG_0263.jpg" /&gt;
            &lt;/a&gt;
            &lt;a href="pictures/IMG_0267.jpg" rel="lightbox[04]"&gt;
                &lt;img src="pictures/IMG_0267.jpg" /&gt;
            &lt;/a&gt;
            &lt;a href="pictures/IMG_0268.jpg" rel="lightbox[04]"&gt;
                &lt;img src="pictures/IMG_0268.jpg" /&gt;
            &lt;/a&gt;
            &lt;a href="pictures/IMG_0271.jpg" rel="lightbox[04]"&gt;
                &lt;img src="pictures/IMG_0271.jpg" /&gt;
            &lt;/a&gt;
            &lt;a href="pictures/Breadboard_complex.jpg" rel="lightbox[04]"&gt;
                &lt;img src="pictures/Breadboard_complex.jpg" /&gt;
            &lt;/a&gt;
&lt;/div&gt;
</description><pubDate>Wed, 10 Apr 2013 23:00:00 +0300</pubDate></item><item><title>Электронные клавиши.</title><guid isPermaLink="true">http://medinskiy.net/nfss/all/elektronnye-klavishi/</guid><link>http://medinskiy.net/nfss/all/elektronnye-klavishi/</link><description>&lt;p&gt;C помощью нескольких резисторов и нескольких кнопок мы собираемся сделать небольшой электро-клавишный инструмент.&lt;/p&gt;
&lt;p&gt;В принципе, можно подключить несколько выключателей к цифровым входам и использовать их для воспроизвдения различных нот. Но в этом проекте мы будем конструировать что-то вроде &lt;a href="http://ru.wikipedia.org/wiki/Резисторные_матрицы" target="_blank"&gt;резисторной матрицы&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;С помощью этого приёма можно считывать нажатия нескольких клавиш, используя только один аналоговый вход. Это очень полезно, когда обнаруживается недостаток в цифровых входах. Несколько выключателей соединяются параллельно с аналоговым входом Arduino и плюсом, на минус они подключаются через общий резитор. На плюс большая часть выключателей подсоединяется через свой резитор. С таким подключением при нажатии различных кнопок на пине будет разное наряжение. Если нажать несколько кнопок одновременно, на входе получится другое значение, в зависимости от того какие резиторы оказались соединёнными параллельно.&lt;/p&gt;
&lt;p&gt;Схема подключения этого всего к Arduino выглядит так:&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="http://medinskiy.net/nfss/pictures/keyboard_схема.jpg" width="640" height="434" alt="" /&gt;
&lt;/div&gt;
&lt;p&gt;Первый выключатель подсоединяется к плюсу напрямую без резистора, второй — через резистор на 220 Ом, третий — через резистор на 10кОм, четвёртый — через резистор на 1МОм. Вторые выходы выключателей соединяются с аналоговым входом Arduino и через общий резистор в 10кОм идут на 0. В общем получается схема &lt;a href="http://ru.wikipedia.org/wiki/Делитель_напряжения" target="_blank"&gt;делителя напряжения&lt;/a&gt;, которую мы уже &lt;a href="http://medinskiy.net/nfss/all/svetovoy-termenvoks/" target="_blank"&gt;использовали&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Собранный макет:&lt;/p&gt;
&lt;div class="tiles"&gt;
            &lt;a href="pictures/IMG_0209.jpg" rel="lightbox"&gt;
                &lt;img src="pictures/IMG_0209.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;&lt;span style="color: #cc6600;"&gt;int&lt;/span&gt; notes[]={
  262,294,330,349};&lt;span style="color: #7e7e7e;"&gt;//ноты до-фа (массив)&lt;/span&gt;
&lt;span style="color: #cc6600;"&gt;int&lt;/span&gt; keys=A0;&lt;span style="color: #7e7e7e;"&gt;//клавиши&lt;/span&gt;
&lt;span style="color: #cc6600;"&gt;int&lt;/span&gt; speak=8;&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;(){
  &lt;span style="color: #cc6600;"&gt;pinMode&lt;/span&gt;(speak, &lt;span style="color: #006699;"&gt;OUTPUT&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;(){
  &lt;span style="color: #cc6600;"&gt;int&lt;/span&gt; keysVal=0;&lt;span style="color: #7e7e7e;"&gt;//переменная для хранения значения клавиши&lt;/span&gt;
  keysVal=&lt;span style="color: #cc6600;"&gt;analogRead&lt;/span&gt;(keys);
  &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;(keysVal); 
  &lt;span style="color: #cc6600;"&gt;if&lt;/span&gt;  (keysVal==1023){
    &lt;span style="color: #cc6600;"&gt;tone&lt;/span&gt;(speak,notes[0]);
  }
  &lt;span style="color: #cc6600;"&gt;else&lt;/span&gt; &lt;span style="color: #cc6600;"&gt;if&lt;/span&gt; ( (keysVal&amp;gt;=990)&amp;amp;&amp;amp;(keysVal&amp;lt;=1010)){
    &lt;span style="color: #cc6600;"&gt;tone&lt;/span&gt;(speak,notes[1]);
  }
  &lt;span style="color: #cc6600;"&gt;else&lt;/span&gt; &lt;span style="color: #cc6600;"&gt;if&lt;/span&gt; ( (keysVal&amp;gt;=505 )&amp;amp;&amp;amp;(keysVal&amp;lt;=515)){
    &lt;span style="color: #cc6600;"&gt;tone&lt;/span&gt;(speak,notes[2]);
  }
  &lt;span style="color: #cc6600;"&gt;else&lt;/span&gt; &lt;span style="color: #cc6600;"&gt;if&lt;/span&gt;( (keysVal&amp;gt;=5)&amp;amp;&amp;amp;(keysVal&amp;lt;=10)){
    &lt;span style="color: #cc6600;"&gt;tone&lt;/span&gt;(speak,notes[3]);
  } 
  &lt;span style="color: #cc6600;"&gt;else&lt;/span&gt;{
    &lt;span style="color: #cc6600;"&gt;noTone&lt;/span&gt;(speak);&lt;span style="color: #7e7e7e;"&gt;//если ничего не нажато, замолчать&lt;/span&gt;
  }  
}&lt;/pre&gt;
&lt;p&gt;Для того, чтобы программа могла воспроизвести ноты, она должна где-то хранить список частот, для каждой ноты. Мы будем играть ноты до, ре, ми, фа (262Гц, 294Гц, 330Гц и 349Гц). Для этого в программе мы используем массив.&lt;/p&gt;
&lt;p&gt;Массивы используют для хранения списков однотипных элементов, например, частоты нот, используя одно имя переменной. Это достаточно удобный инструмент для быстрого и эффективного доступа к информации.  Массив объявляется так же как и обычная переменная, но после её имени следует пара квадратных скобок []. Если нужно присвоить значения сразу всем элементам массива, то после знака равенства эти значения перечисляются через запятую и обрамляются фигурными скобками {}.&lt;/p&gt;
&lt;p&gt;Для того, чтобы прочитать значения из массива, к массиву обращаются по имени и в квадратных скобках указать индекс (номер) конкретного элемента.  Номера элементов в массиве начинаются с нуля. Первый элемент имеет индек 0, второй — 1 и т. д.&lt;/p&gt;
&lt;p&gt;Теперь небольшое описание программы:&lt;/p&gt;
&lt;p&gt;Сначала мы создаем массив с частотами звуков, которые будем воспроизводить. В функции &lt;strong&gt;setup() &lt;/strong&gt;указываем режим работы выхода, к которому подключен пьезоэлемент и включаем консоль (она нам нужна, чтобы определить какие значения за аналоговом входе будут выдавать нажатия различных кнопок).&lt;/p&gt;
&lt;p&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/C4TEtNeGo7E" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;div class="tiles"&gt;
     &lt;a href="pictures/IMG_0207.jpg" rel="lightbox[01]"&gt;
                &lt;img src="pictures/IMG_0207.jpg" /&gt;
        &lt;/a&gt;
  &lt;a href="pictures/IMG_0209.jpg" rel="lightbox[01]"&gt;
                &lt;img src="pictures/IMG_0209.jpg" /&gt;
           &lt;/a&gt;
  &lt;a href="pictures/keyboard_схема.jpg" rel="lightbox[01]"&gt;
                &lt;img src="pictures/keyboard_схема.jpg" /&gt;
           &lt;/a&gt;
&lt;/div&gt;
</description><pubDate>Tue, 26 Mar 2013 22:24:31 +0300</pubDate></item><item><title>Световой терменвокс.</title><guid isPermaLink="true">http://medinskiy.net/nfss/all/svetovoy-termenvoks/</guid><link>http://medinskiy.net/nfss/all/svetovoy-termenvoks/</link><description>&lt;p&gt;А теперь мы немного помузицируем. С помощью фоторезистора и &lt;a href="http://ru.wikipedia.org/wiki/Пьезоэлектрический_громкоговоритель" target="_blank"&gt;пьезоэлемента&lt;/a&gt; мы будем делать световой терменвокс. &lt;a href="http://ru.wikipedia.org/wiki/Терменвокс" target="_blank"&gt;Терменвокс&lt;/a&gt; — это музыкальный инструмент, издающий звуки, в зависимости от движений, которые производит музыкант вокруг инструмента. Такие звуки часто используют в фильмах ужасов.&lt;/p&gt;
&lt;!--more--&gt;&lt;p&gt;У терменвокса две антенны, при изменении положения рук исполнителя относительно них  изменяется ёмкость &lt;a href="http://ru.wikipedia.org/wiki/Колебательный_контур" target="_blank"&gt;колебательного контура&lt;/a&gt; антенн. Эти антенны подключены к аналоговой схеме, которая создает звук. Одна антенна отвечает за частоту звука, а вторая за его громкость. Arduino, конечно же, не может воспроизвести загадочные звуки этого инструмента, но можно эмулировать их с помощью функции &lt;strong&gt;tone(). &lt;/strong&gt;На рисунках ниже можно увидеть разницу между модуляциями произведёнными функцией &lt;strong&gt;analogWrite() &lt;/strong&gt;и функцией &lt;strong&gt;tone()&lt;/strong&gt;. Эти модуляции заставляют воспроизводящие устройства (такие как наушники, колонки или пьезоэлементы) издавать различые звуки.&lt;/p&gt;
&lt;table&gt;
&lt;tr &gt;
&lt;td valign="middle"&gt;
Большую часть времени сигнал равен нулю, но частота такая же как и в ШИМ 150
&lt;/td&gt;
&lt;td align="center"&gt;
&lt;img src="pictures/pwm50.jpg" align="middle"&gt;
PWM 50: analogWrite(50)
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr &gt;
&lt;td valign="middle"&gt;
Большую часть времени сигнал равен единице, но частота такая же как и в ШИМ 50
&lt;/td&gt;
&lt;td align="center"&gt;
&lt;img src="pictures/pwm150.jpg" align="middle"&gt;
PWM 150: analogWrite(50)
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr &gt;
&lt;td valign="middle"&gt;
Рабочий цикл составляет 50% (половину времени сигнал есть, половину времени нет), но частота изменилась.
&lt;/td&gt;
&lt;td align="center"&gt;
&lt;img src="pictures/tone440.jpg" align="middle"&gt;
TONE 440: tone(9,440)
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr &gt;
&lt;td valign="middle"&gt;
Рабочий цикл такой же как и в Tone 440, но частота больше вдвое.
&lt;/td&gt;
&lt;td align="center"&gt;
&lt;img src="pictures/tone880.jpg" align="middle"&gt;
TONE 880: tone(9,440)
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;p&gt;Вместо определения ёмкости с помощью Arduino, мы будем использовать фоторезистор, чтобы определять количество света. Двигая руки над фоторезистором, мы будем менять количество света, которое на него попадает, так же как проекте &lt;a href="http://medinskiy.net/nfss/all/lampa-hameleon-color-mixing-lamp/" target="_blank"&gt;«Лампа хамелеон»&lt;/a&gt;. Изменение напряжения на аналоговом входе будет определять ноту какой частоты играть.&lt;/p&gt;
&lt;p&gt;Фоторезистор к Arduino мы подключим используя схему &lt;a href="http://ru.wikipedia.org/wiki/Делитель_напряжения" target="_blank"&gt;делителя напряжения&lt;/a&gt;. Ранее мы уже заметили, что когда считываем напряжение с этой схемы используя функцию &lt;strong&gt;analogRead()&lt;/strong&gt;, получаемые значения не всегда полностью покрывают диапазон от 0 до 1023 (максимальный диапазон, который может быть считан с аналогового входа). Резистор фиксированного сопротивления, подсоединённый к «земле», ограничивает считываемые значения снизу, а максимальная яркость освещения — сверху. Вместо того, чтобы ограничивать диапазон возможных значений, можно откалибровать сенсор, получив максимальное и минимальное значения, и соотнести их с частотой извлекаемого звука с помощью функции &lt;strong&gt;map()&lt;/strong&gt; (как мы уже &lt;a href="http://medinskiy.net/nfss/all/ispolzovanie-servoprivoda/" target="_blank"&gt;делали&lt;/a&gt;), таким образом, диапазон частот, которые будет издавать наш терменвокс, станет максимально возможным. Так же к нашему сенсору добавится дополнительная «фича»: куда бы мы не перенесли схему, например, в более темное помещение, она будет автоматически подстраиваться.&lt;/p&gt;
&lt;p&gt;Итак , вот схема, которую мы будем собирать:&lt;/p&gt;
&lt;div class="tiles"&gt;
            &lt;a href="pictures/Theremin_схема_1.jpg" rel="lightbox"&gt;
                &lt;img src="pictures/Theremin_схема_1.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;div class="tiles"&gt;
            &lt;a href="pictures/photo-3_t.jpg" rel="lightbox"&gt;
                &lt;img src="pictures/photo-3_t.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;&lt;span style="color: #cc6600;"&gt;int&lt;/span&gt; sVal;&lt;span style="color: #7e7e7e;"&gt;//Значение на фоторезисторе&lt;/span&gt;
&lt;span style="color: #cc6600;"&gt;int&lt;/span&gt; sLow=1023; &lt;span style="color: #7e7e7e;"&gt;//минимальное значение фоторезистора&lt;/span&gt;
&lt;span style="color: #cc6600;"&gt;int&lt;/span&gt; sHigh=0;&lt;span style="color: #7e7e7e;"&gt;//максимальное значение фоторезистора&lt;/span&gt;
&lt;span style="color: #cc6600;"&gt;int&lt;/span&gt; ledPin=13;&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;(){
  &lt;span style="color: #cc6600;"&gt;pinMode&lt;/span&gt;(ledPin,&lt;span style="color: #006699;"&gt;OUTPUT&lt;/span&gt;);
  &lt;span style="color: #cc6600;"&gt;digitalWrite&lt;/span&gt;(ledPin,&lt;span style="color: #006699;"&gt;HIGH&lt;/span&gt;); &lt;span style="color: #7e7e7e;"&gt;//начало калибровки&lt;/span&gt;
  &lt;span style="color: #cc6600;"&gt;while&lt;/span&gt;(&lt;span style="color: #cc6600;"&gt;millis&lt;/span&gt;()&amp;lt;5000) { &lt;span style="color: #7e7e7e;"&gt;//калибруем в течении 5 секунд&lt;/span&gt;
    sVal=&lt;span style="color: #cc6600;"&gt;analogRead&lt;/span&gt;(A0);
    &lt;span style="color: #cc6600;"&gt;if&lt;/span&gt; (sVal&amp;gt;sHigh){
      sHigh=sVal;
    }
    &lt;span style="color: #cc6600;"&gt;if&lt;/span&gt;(sVal&amp;lt;sLow){
      sLow=sVal;
    }
  }
  &lt;span style="color: #cc6600;"&gt;digitalWrite&lt;/span&gt;(ledPin,&lt;span style="color: #006699;"&gt;LOW&lt;/span&gt;);&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;loop&lt;/b&gt;&lt;/span&gt;(){
  &lt;span style="color: #cc6600;"&gt;int&lt;/span&gt; freq;
  sVal=&lt;span style="color: #cc6600;"&gt;analogRead&lt;/span&gt;(A0);&lt;span style="color: #7e7e7e;"&gt;//считываем значение с фоторезистора&lt;/span&gt;
  freq=&lt;span style="color: #cc6600;"&gt;map&lt;/span&gt;(sVal,sLow,sHigh,50,4000);&lt;span style="color: #7e7e7e;"&gt;//приводим значение&lt;/span&gt;
  &lt;span style="color: #cc6600;"&gt;tone&lt;/span&gt;(8,freq,20);&lt;span style="color: #7e7e7e;"&gt;//извлекаем звук&lt;/span&gt;
  &lt;span style="color: #cc6600;"&gt;delay&lt;/span&gt;(10);
}&lt;/pre&gt;
&lt;p&gt;Небольшой комментарий к программе:&lt;/p&gt;
&lt;p&gt;Объявления переменных:&lt;/p&gt;
&lt;p&gt;sVal — сюда будем считывать значение с фоторезистора;&lt;/p&gt;
&lt;p&gt;sLow и sHigh — максимальное и минимальное значения, которые можно прочитать с фоторезистора. В начале программы они соответственно равны 1023 (минимальное) и 0 (максимальное). В процессе калибровки в этих переменных появятся реальные значения минимума и максимума.&lt;/p&gt;
&lt;p&gt;ledPin — пин со светодиодом, при начале калибровки включим его, по окончании выключим.&lt;/p&gt;
&lt;p&gt;Инициализация:&lt;/p&gt;
&lt;p&gt;Включаем светодиод. Втечении первых пяти секунд, в цикле считывается значение с фоторезистора, если оно меньше уже зафиксированного минимального значения (первоначально 1023), то записываем его в минимальное, если оно больше уже зафиксированного максимального значения (первоначально 0), то записываем его в максимальное. Используем функцию &lt;strong&gt;mills()&lt;/strong&gt;, для определения времени, прошедшего с момента включения Arduino.&lt;/p&gt;
&lt;p&gt;Основная программа: вобщем довольно простая, функция tone() используется для воспроизведения звука, первый её параметр — пин, на который выводить звук, второй — частота звука, третий — длительность.&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/CFNT91OJ66o" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;p&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/Qnfdkh-NzWQ" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;div class="tiles"&gt;
     &lt;a href="pictures/photo-1_t.jpg" rel="lightbox[01]"&gt;
                &lt;img src="pictures/photo-1_t.jpg" /&gt;
        &lt;/a&gt;
  &lt;a href="pictures/Theremin_схема_1.jpg" rel="lightbox[01]"&gt;
                &lt;img src="pictures/Theremin_схема_1.jpg" /&gt;
           &lt;/a&gt;
  &lt;a href="pictures/photo-3_t.jpg" rel="lightbox[01]"&gt;
                &lt;img src="pictures/photo-3_t.jpg" /&gt;
           &lt;/a&gt;
  &lt;a href="pictures/photo-2_t.jpg" rel="lightbox[01]"&gt;
                &lt;img src="pictures/photo-2_t.jpg" /&gt;
           &lt;/a&gt;
  &lt;a href="pictures/Theremin_схема_2.jpg" rel="lightbox[01]"&gt;
                &lt;img src="pictures/Theremin_схема_2.jpg" /&gt;
           &lt;/a&gt;
  &lt;a href="pictures/IMG_0198.jpg" rel="lightbox[01]"&gt;
                &lt;img src="pictures/IMG_0198.jpg" /&gt;
           &lt;/a&gt;
&lt;/div&gt;
</description><pubDate>Mon, 18 Mar 2013 12:07:18 +0300</pubDate></item>
</channel>

</rss>