Робот-шпиён

Вступление.

Итак, так как после сборки ходовой части робота шпиона ожидается довольно длительный период когда в журналах будет всякая пластиковая ерунда.
Крылья на колеса, светодиоды и тд и тп, растянется на пару месяцев. Было принято решение параллельно с основной сборкой делать свое управление уже собранной тележкой.
Так как собирать еще годика полтора, то времени на поиграться со строящимся роботом шпионом есть больше чем достаточно.

Хочу предупредить что то что вы делаете со своим роботом на свой страх и риск, автор не отвечает за какую либо паленую электронику =)

2013-02-02_21-12-08_894

Как же управлять тележкой.

В нашем роботе используется очень распространенная шина i2c, она связывает между собой микроконтроллеры робота. В данном случае у нас их сейчас два .
Если присмотреться к соединительному разъему, между платами с чипами UC1 and UC2 то там мы увидим четыре пина, это питание, земля, clock и data. Такой же разъем, но уже 5-ти пиновый мы видим сверху, туда мы и будем подключатся.
Подписан он так, слева на право, Vcc, DATA, GND, CLOCK, 9v
Питание всех чипов на роботе у нас 3.3 вольта, это Vcc. Этот пин мы не будем использовать. C 9v пина запитаем нашу электронику, как соединять, будет написано ниже.
Что бы заставить тележку крутить например левым колесом мы должны подключить к пинам DATA, GND, CLOCK (соответствуют SDA, GND, SCL) мастера шины и дать нужную команду.

Более подробно про данную шину можно прочитать здесь:
I2C

Что нам требуется.

Посылать команды в шину I2C мы будем со своего микроконтроллера, но это не так страшно как кажется 🙂 так как есть такая замечательная платформа как Arduino:

UNO

Много чего интересного по разработке под эту платформу есть тут:
Ардуино.
И тут:
arduino-getting-started

Данная платформа является универсальной, и в дальнейшем может использоваться для чего угодно, от измерения температуры в аквариуме и до построения квадрокоптера. В среду разработки входит куча примеров, подключил, залил и работает 🙂

Нам понадобится любая из ардуин, например вот эта:
http://arduino.shopium.ua/products/arduino-uno-2/
И блютуз шилд к ней что бы можно было управлять тележкой удаленно, например с телефона:
http://arduino.shopium.ua/products/arduino-bluetooth-shield/
http://robocraft.ru/blog/electronics/587.html

Получим вот такой пакетик:

Уно плюс блютуз.

Для данного проекта нам лучше использовать 3.3 вольтовую ардуину, но 5-ти вольтовая более универсальная.

Блютуз шилд играет роль моста между блютуз каналом и пинами SERIAL порта ардуины с номерами 0 и 1.
Это цифровые выводы 0 и 1 с пометкой RX и TX. На шилде есть ползунок с пометками to board to ft232.
Во время программирования ардуины его нужно переключать в положение ft232 а во время работы обратно to board.

У меня на фотке вначале немного не такая конфигурация, так как я использовал arduino nano. Она меньше, но для подключения шилдов требует плату расширения.

Поехали!

Итак, крепим наш бутерброд на робота, программируем ардуино с помощью среды arduino IDE вот этим скетчем:


// robot-spy mazafaka

#include

enum { LED_PIN = 13 };
enum { LED_LIGHT = 12 };
enum State { FWD, BAK, LEF, RIG, STP, LON, LOF };

State state;

void setup()
{

Wire.begin(); // join i2c bus (address optional for master)
Serial.begin(9600); // start serial for output

pinMode(LED_PIN, OUTPUT);
pinMode(LED_LIGHT, OUTPUT);
}

void loop()
{

if (Serial.available())
{
char command = Serial.read();

switch (command)
{
case 'F': state = FWD; break;
case 'B': state = BAK; break;
case 'L': state = LEF; break;
case 'R': state = RIG; break;
case 'S': state = STP; break;
case 'W': state = LON; break;
case 'w': state = LOF; break;

default:
{
///
}
}
}

switch (state)
{
case FWD:
{
Wire.beginTransmission(0x40);
delay(10);
Wire.write(0x02); //с какого адреса начинаем запись 0х02
delay(10);
Wire.write(0x06); //первая пачка расстояние
delay(10);
Wire.write(0x03); //вторая пачка (адрес 0х03) левое колесо
delay(10);
Wire.write(0x04); //третья пачка (адрес 0х04) правое колесо
delay(10);
Wire.endTransmission();

digitalWrite(LED_PIN, HIGH);
delay(50);

state = STP;
} break;

case BAK:
{

Wire.beginTransmission(0x40);
delay(10);
Wire.write(0x02);
delay(10);
Wire.write(0x01);
delay(10);
Wire.write(0x83);
delay(10);
Wire.write(0x84);
delay(10);
Wire.endTransmission();

digitalWrite(LED_PIN, HIGH);
delay(50);

state = STP;
} break;

case LEF:
{

Wire.beginTransmission(0x40);
delay(10);
Wire.write(0x02);
delay(10);
Wire.write(0x01);
delay(10);
Wire.write(0x83);
delay(10);
Wire.write(0x04);
delay(10);
Wire.endTransmission();

digitalWrite(LED_PIN, HIGH);
delay(50);

state = STP;
} break;

case RIG:
{

Wire.beginTransmission(0x40);
delay(10);
Wire.write(0x02);
delay(10);
Wire.write(0x01);
delay(10);
Wire.write(0x04);
delay(10);
Wire.write(0x84);
delay(10);
Wire.endTransmission();

digitalWrite(LED_PIN, HIGH);
delay(50);

state = STP;
} break;

case STP: digitalWrite(LED_PIN, LOW); break;

case LON: digitalWrite(LED_LIGHT, HIGH); break;
case LOF: digitalWrite(LED_LIGHT, LOW); break;

}

}

Дальше, если у нас 3.3 вольтовая версия ардуины, то дополнительно согласовывать уровни между роботом и последней не требуется. На плате блютуз шилда ползунок должен стоять в положении 3.3v.
Можно напрямую соединять:

Arduino — Spy_bot

GND — GND
A4 — DATA
A5 — CLOCK
Vin — 9v

Arduino реализует I2c шину на пинах A4 and A5 с помощью встроенной библиотеки wire.
Программа принимает по serial интерфейсу символы с Bluetootch шилда и в соответствии с принятым символом решает какую комманду отослать по шине I2C роботу.
В прогамме видно, например кусок:

case FWD:
{
Wire.beginTransmission(0x40); //адрес контроллера моторов
delay(10);
Wire.write(0x02); //начинаем запись с 0х02
delay(10);
Wire.write(0x06); //первая пачка расстояние
delay(10);
Wire.write(0x03); //вторая пачка (адрес 0х03) левое колесо
delay(10);
Wire.write(0x04); //третья пачка (адрес 0х04) правое колесо
delay(10);
Wire.endTransmission();

digitalWrite(LED_PIN, HIGH);
delay(50);

state = STP;
} break;

Обращается к контроллеру моторов робота EM78P374N, его адрес 0×40.
EM78P374N
Дальше дает ему команды проехать вперед расстояние 0x06 и остановится.
Мигает встроенным светодиодом, выставляет режим работы СТОП и ожидает следующей команды.

Так как наш робот это закрытая система, то большинство команд требует подбора, а те которые подобраны работают не совсем понятно. По этому вопросу есть обсуждение на этом форуме:

Форум

Важно.
Если ардуина у нас 5-ти вольтовая, то требуется согласовать уровни между 3.3 вольтовой логикой робота с 5 вольтовым контроллером в ардуине. Я сделал это по такой схеме:

logic_levels
Согласование уровней.

Описание линейного стабилизатора LM1117-3.3: http://catalog.gaw.ru/index.php?page=document&id=6705

Согласовывать нужно CLOCK и DATA, тоесть нам нужно два канала, получилась вот такая платка:

2013-02-04_08-27-56_273

5v для питания данного конвертера можно брать от пина 5v на ардуине.

Возможно контроллеры робота и могут корректно работать с 5-ти вольтовыми уровнями, но я не стал рисковать и сразу сделал согласование.

Также, не забыть переключить на плате блютуз шилда переключатель в положение 5v в случае работы с 5-ти вольтовой arduino.

C чего управлять.

А с любого устройства что может слать в канал блютуз символы, я например использовал андроид телефон с программой Bluetootch RC Controller, можно загрузить из маркета.

Символы в программе:

case ‘F’: state = FWD; break;
case ‘B’: state = BAK; break;
case ‘L’: state = LEF; break;
case ‘R’: state = RIG; break;
case ‘S’: state = STP; break;
case ‘W’: state = LON; break;
case ‘w’: state = LOF; break;

Также можно просто переключить ползунок на шилде в положение ft232 и слать символы с компьютера через последовательный порт. Хорошо для отладки, что бы не использовать блютуз.

Видео.

http://vk.com/video10122622_164242229

Заключение.

На данном этапе связь между ардуиной и роботом по шине не очень стабильная, некоторые команды пропускаются, бывает что контроллер моторов начинает сходить с ума :). Но тем не менее это работает и сейчас в процессе оптимизации и поиска причин не стабильности.
В дальнейшем планирую подключить к всему этому ультразвуковой датчик что бы пустить шпиёна в свободное плавание по помещению ;):

Добавить комментарий