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

<channel>

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

<item><title>Роборука</title><guid isPermaLink="true">http://medinskiy.net/nfss/all/roboruka/</guid><link>http://medinskiy.net/nfss/all/roboruka/</link><description>&lt;p&gt;В эти выходные делали с Фёдором руку киборга из картона.&lt;br /&gt;
Проект с сайта &lt;a href="ПростоРобот"&gt;simplerobot.org&lt;/a&gt;:&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="http://medinskiy.net/nfss/pictures/12719121_1027911413914623_8051593912531233738_o.png" width="679" height="960" alt="" /&gt;
&lt;/div&gt;
&lt;p&gt;Игрушка достаточно простая в исполнении, но выглядит очень интересно и необычно.&lt;br /&gt;
Фёдор был в восторге. Я ещё раз убедился, что самая лучшая для ребенка игрушка — та, которую он сделал своими (или почти своими) руками.&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;div class="fotorama" data-width="768" data-ratio="0.75"&gt;
&lt;img src="http://medinskiy.net/nfss/pictures/IMG_0640.JPG" width="768" height="1024" data-caption="" alt="" /&gt;
&lt;img src="http://medinskiy.net/nfss/pictures/IMG_0641.JPG" width="768" height="1024" data-caption="" alt="" /&gt;
&lt;img src="http://medinskiy.net/nfss/pictures/IMG_0643.JPG" width="768" height="1024" data-caption="" alt="" /&gt;
&lt;img src="http://medinskiy.net/nfss/pictures/IMG_0644.JPG" width="768" height="1024" 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/No-lUXad3EU" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;
&lt;/div&gt;
</description><pubDate>Tue, 23 Feb 2016 22:48:46 +0300</pubDate></item><item><title>Воздушно-инженерная школа (2)</title><guid isPermaLink="true">http://medinskiy.net/nfss/all/vozdushno-inzhenernaya-shkola-2/</guid><link>http://medinskiy.net/nfss/all/vozdushno-inzhenernaya-shkola-2/</link><description>&lt;p&gt;Вообщем, начали работать, т. е. работать мы начали еще до того как команда собралась.&lt;br /&gt;
Первый этап, как обычно, сбор и анализ информации. Поискали, есть ли в сети похожие проекты, как они были реализованы.&lt;br /&gt;
&lt;br&gt;&lt;br /&gt;
Нашли несколько более менее похожих проектов:&lt;br /&gt;
&lt;br&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href="http://www.danielstough.com/projects/xfire/"&gt;XFIRE: A ROBOTIC FIRE EXTINGUISHER&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.eecs.ucf.edu/seniordesign/su2013fa2013/g13/pictures.html"&gt;Робот Heatseekr&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=PL1wztgA2pE"&gt;Проект ESE 111&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.designer2k2.at/index.php?option=com_content&amp;amp;view=article&amp;amp;id=30:thermoscanner&amp;amp;catid=13:arduino&amp;amp;Itemid=40"&gt;Arduino thermo scanner&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.poprobot.ru/home/mlx90620_Arduino"&gt;Тепловизор на базе MLX90620&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.hoagieshouse.com/IR/"&gt;InfraRed WebCam&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;По &lt;a href="https://yadi.sk/d/2u-np5uWfWadJ"&gt;этой&lt;/a&gt; ссылке находятся материалы по этим проектам, на тот случай, если оригинальные ссылки не будут работать.&lt;/p&gt;
&lt;p&gt;После изучения этих материалов,  условий конкурса, кучи обсуждений появилось представление о том, что вообще можно сделать в этом направлении.&lt;br /&gt;
&lt;br&gt;&lt;br /&gt;
Примерная конструкция прибора представлялась такой:&lt;br /&gt;
&lt;br&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;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;/ol&gt;
&lt;p&gt;&lt;br&gt;&lt;br /&gt;
В дальнейшем при обсуждении в команде приняли решения остановится на наиболее простом и дешевом варианте датчика для обнаружения огня. А именно, переделать обычную вебкамеру в ИК вебкамеру, как описано по &lt;a href="http://www.hoagieshouse.com/IR/"&gt;ссылке&lt;/a&gt;, а затем анализировать полученное изображение.&lt;br /&gt;
&lt;br&gt;&lt;br /&gt;
В качестве центрального мозга я предложил использовать микро-компьютер &lt;a href="http://www.black-swift.ru"&gt;Black Swift&lt;/a&gt;, к тому моменту я уже сделал предзаказ без конкретной цели, но вот применение нашлось. Из плюсов этого устройства надо отметить его малый размер, низкое энергопотребление, большое количество вводов выводов, возможность программирования на «человеческом» языке, например, на Python. Уже позже, black swift &lt;a href="https://www.kickstarter.com/projects/1133560316/black-swift-tiny-wireless-computer"&gt;вышел&lt;/a&gt; на кикстартер и мы там заказали еще парочку прозапас.&lt;br /&gt;
&lt;br&gt;&lt;br /&gt;
Весь этот подготовительный этап продолжался до начала февраля, когда должна была состоятся очная часть Воздушно-инженерной школы, на которой мы должны были представить и защитить наш проект.&lt;br /&gt;
&lt;br&gt;&lt;br /&gt;
К защите мы подошли вот с такой схемой прибора:&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;a href="http://medinskiy.net/nfss/pictures/2015-03-27-17-16-32-WinterSchoolPres.png" class="e2-text-picture-zoom-link" width="876"&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:2015-03-27-17-16-32-WinterSchoolPres.png" width="768" height="574.24657534247" alt="" /&gt;
&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Продолжение следует.&lt;/p&gt;
</description><pubDate>Fri, 27 Mar 2015 17:19:05 +0300</pubDate></item><item><title>Воздушно-инженерная школа (1)</title><guid isPermaLink="true">http://medinskiy.net/nfss/all/vozdushno-inzhenernaya-shkola-1/</guid><link>http://medinskiy.net/nfss/all/vozdushno-inzhenernaya-shkola-1/</link><description>&lt;p&gt;В этом учебном году на базе НИИЯФ МГУ начала работать воздушно-инженерная школа &lt;a href="http://www.sinp.msu.ru/ru/post/20372"&gt;&lt;a href="http://www.sinp.msu.ru/ru/post/20372"&gt;http://www.sinp.msu.ru/ru/post/20372&lt;/a&gt;&lt;/a&gt; . Это продолжение проекта &lt;a href="http://roscansat.com"&gt;«CanSat в России» &lt;/a&gt;, которому уже четыре года.&lt;br /&gt;
&lt;br&gt;&lt;br /&gt;
Cansat  — это соревнование, в рамках которого, команды школьники создают «мини спутники» (спутники в банке), выполняющие определенную научную миссию. Аппарат должен содержать научную нагрузку для выполнения миссии, систему спасения, например, парашют, и систему обнаружения после приземления. Спутники запускаются на разную высоту (от 200м до 30км), проводят какое-то время в свободном полете, производят необходимые измерения (температура, давление, GPS позиционирование и т. п.) передают по радио каналу полученную информацию. Затем должна сработать система спасения, т. е. раскрыться парашют, аппарат приземляется, и команда, должна его найти. После того как аппарат найден в рабочем состоянии, полетная часть миссии считается выполненной. Дальше надо обработать полученные данные и представить в виде доклада или статьи.&lt;br /&gt;
&lt;br&gt;&lt;br /&gt;
Поскольку CanSat проходит в России уже не первый год, есть постоянные участники и команды разного уровня подготовки. Для  их дифференциации сделано несколько конкурсов: Регулярная лига, Высшая лига и Высшая лига (первый эшелон). Миссии для разных конкурсов разные. В этом году впервые появился новый конкурс, по проектированию нагрузки для коптера: «Разработка полезной нагрузки, выполняющей конкретную практическую задачу для беспилотного летательного аппарата типа „Коптер“». В этом году основная миссия состоит в поиске очагов пожаров на заданной территории.&lt;br /&gt;
&lt;br&gt;&lt;br /&gt;
До прошлого года я вообще об этом проекте ничего не слышал. Рассказал мне об этом наш с Арсением знакомый &lt;a href="http://www.izmiran.ru/~zaitzev/"&gt;Александр Николаевич Зайцев&lt;/a&gt; (д. ф-м. н.). В общем осенью решили мы участвовать в этом проекте, выбрали конкурс «Коптер».&lt;br /&gt;
&lt;br&gt;&lt;br /&gt;
В  НИИЯФ МГУ с октября по январь проводились лекции для участников проекта. Проводились они еженедельно, также транслировались онлайн и выкладывались позже на сайте &lt;a href="http://space.msu.ru"&gt;&lt;a href="http://space.msu.ru"&gt;http://space.msu.ru&lt;/a&gt;&lt;/a&gt;, там их можно посмотреть и сейчас. Лекции очень интересные. Но все таки формат соревнований предполагает, что бОльшая часть работы и обучения будет проведена в команде силами руководителя и самих участников.&lt;br /&gt;
&lt;br&gt;&lt;br /&gt;
Кстати, о команде. Сначала в команде был один только Арсений :), а надо три-пять человек.  «Вербовка» людей в команду на такой классный и интересный проект оказалась той еще задачкой. Сначала начали вовлекать всех друзей и знакомых Арсения не по школе. Кому-то не интересно (ну здесь ничего не сделаешь), кому-то мама не разрешила (!). Из этого источника привлекли одного приятеля Арсения Илью, он программист. Провел агитационную работу у Арсения в школе, поговорил с администрацией, оставил материалы о проекте, побеседовал с классами. В итоге — ноль. Казалось бы один из ведущих ВУЗов страны проводит такое мероприятие, ученые читают для школьников лекции, база — НИИЯФ МГУ, не можешь приехать на лекцию — смотри через интернет. Участие бесплатное, за исключением стоимости комплектующих! Но это лирика. Третий источник — преподаватель Арсения из кружка от Троицкого дома ученых, в который он ходил в младшей школе. Отсюда мы получили сразу трех человек: братья Стефан и Левко — его бывшие коллеги по кружку, Лев — раньше знакомы не были, тоже программист.&lt;br /&gt;
&lt;br&gt;&lt;br /&gt;
Вот и наша команда.&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="http://medinskiy.net/nfss/pictures/IMG_0184.JPG" width="640" height="480" alt="" /&gt;
&lt;p&gt;Лев, Левко, Арсений, Илья, Стефан.&lt;br /&gt;
&lt;br&gt;&lt;br /&gt;
Вообщем, собрались, начали работать. Продолжение следует...&lt;/p&gt;
&lt;/div&gt;
</description><pubDate>Mon, 23 Mar 2015 17:33:58 +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>
</channel>

</rss>