Создание автономного робота Frank. Часть вторая

в 11:37, , рубрики: Без рубрики

Создание автономного робота Frank. Часть вторая

Прошло немного времени и у меня значительный прогресс. Если вы не читали предысторию — добро пожаловать в «Создание автономного робота Frank. Часть первая» .

Итак, в первой части я собрал платформу на базе Lego Technic и серво-моторов HiTech. Угробив единственный шилд для прототипирования для Arduino, я ждал, когда мне прийдет замена, плюс новый припой, взамен экологически чистого, который у меня был — без содержания свинца. Так же, у меня в распоряжение была пара XBee для беспроводной связи, с которой необходимо было разобраться и Arduino Due, с которой хотелось поэкспериментировать.

Оказывается, припоем без содержания свинца очень сложно паять, поэтому я заказал другой S-Sn60Pb39Cu2 2.5% Flux производства фирмы Felder. Разница просто потрясающая. Он сразу плавится и отлично ложится на контакты. Это ускорило создание платы во много раз.

Попорядку. Сначала, я сделал свой шилд для управления серво-моторами. Эксперименты с breadboard'ом, конечно, обязательны, чтобы убедиться, что все работает, но выглядит это всегда отвратительно. Для того, чтобы спаять плату, я заказал макетную плату от DFRobot для Arduino Mega, которая прекрасно подошла к Arduino Due. Для управления серво-моторами, надо соединить желтый провод мотора с PWM выходами Arduino через резистор. Надо заметить, что на Arduino Due 12 PWM выходов, что позволяет подключить достаточно много серво-моторов без дополнительных контролеров. На практике, конечно, это надо проверить. Возможно, что на плате не хватит таймеров, чтобы плавно управлять 12 моторами. Плюс и землю надо подсоединить к батареи и объединить землю батареи с землей от Arduino. Об этом, я подробнее писал в предыдущей статье. Плата получилось достаточно чистой и на ней осталось еще много место для других компонентов — например XBee.

Создание автономного робота Frank. Часть вторая

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

Создание автономного робота Frank. Часть вторая

На этом все простое закончилось и начались эксперименты с XBee. Естественно, достав их из коробки и подключив — ничего не заработало. Поиск в интернете дал лиш пару статей по поводу того, что их сначала надо сконфигурировать. Софт для конфигурации XBee, естественно, написан под Windows, а у меня Mac. Что же делать? Наконец, я нашел статью, в которой описано, как это можно сделать через серийный интерфейс.

В комплекте с XBee идут две маленькие платы, куда втыкаются беспроводные модули. Обе платы можно подключить к Arduino, предварительно припаяв лапки и используя макетную плату. У одной из плат есть USB выход (USB-to-Serial).

Создание автономного робота Frank. Часть вторая

Так как я планировал взаимодействие и обмен информации между Фрэнком и моим лаптопом, я начал с написания простой программы для общения с XBee через серийный интерфейс. Для этого я скачал последнюю версию Qt (5.1), в которой появился класс QSerialPort, позволяющий общаться с внешними устройствами через серийный порт. Выглядит программа пока как терминал, но в будущем я ее расширю для полного управления Фрэнком через XBee, подключенному к моему компьютеру. Все, что программа делает на данный момент — это посылает и принимает сообщения по серийному порту, которые надо вводить вручную.

Создание автономного робота Frank. Часть вторая

Исходный код Так как написано все используя Qt, то работать должно на любом компьютере. Для компиляции необходимо Qt5.1. Проектный файл был сгенерирован QtCreator'ом.

Для начала, необходимо определить как называется XBee, подключенный к компьютеру. Для этого смотрим на список устройств в папке /dev и ищем что-то похожее на tty.usbserial-A9014B88 (так оно называется у меня). В коде меняем строчку «port = new QSerialPort(»usbserial-A9014B88");" на ваше название устройства (без «tty.»).

Если до этого вы сами не конфигурировали XBee, то необходимо поменять «port->setBaudRate(19200);» на 9600 или просто закомментить эту строчку, так как эта скорость по умолчанию прописана в устройстве. Далее запускаем программу, подключив первый модуль и вводим "+++". Три плюса «будят» устройство для дальнейших команд. В ответ вы должны получить «ОК», что отобразится в окне терминала. Через некоторое время (я так и не понял через какое) устройство уходит в спящий режим, так что не затягивайте с остальными командами. Для того, чтобы его снова разбудить, отошлите опять три плюса.

Далее посылаем конфигурацию в первый модуль. «ATID4000,DH0,DL1,MY0,BD4,WR,CN». Это меняет его ID на 4000 (может быть любое число), скорость общения на 19200 и его адрес на «0». Чтобы два устройства общались между собой их ID должен совпадать, а у одного устройства адрес должен быть «0», а у другого «1». После того, как вы послали эту команду, вам должно обратно прийти 7 «ОК» (или около того). Если что-то прошло не так то одно из «ОК» будет «ERROR».

Теперь мы можем вытащить чип из платы и поставить туда второй чип, предварительно отключив плату от компьютера. Повторив все те же команды, за исключением того, что MY0 должно быть MY1 «ATID4000,DH0,DL1,MY1,BD4,WR,CN». Не забудьте, что теперь оба устройства работают на чистоте 19200. Поэтому, при дальнейшем подключение в исходном коде программы надо надо указать эту скорость при подключение — «port->setBaudRate(19200);».

Теперь осталось подключить одно устройство к компьютеру (можете просто оставить то, которое подключено уже), а второе к Arduino. Я опять прибегну к макетной плате, но скорее всего, сегодня припаяю XBee к своему макетному шилду.

Подключение достаточно простое — необходимо соединить VSS с землей Arduino, VCC с 3,3V, DOUT с RX(0 порт на Arduino Due), а DIN с TX(1 порт). На других платах, это могут быть другие порты — просто найдите RX и TX (серийный интерфейс). Теперь надо сделать так, чтобы они посылали друг-другу сообщения.

Опять все оказалось не так просто. SofwareSerial еще не портировали на ArduinoDue — значит использовать можно только хардверный интерфейс, а большинство примеров в интернете, просто не работают. Факт того, что у меня XBee Series1, уменьшил количество примеров, доступных в интернете до минимума. Очень сильно помогла вот эта библиотека. Если у вас Arduino Due, то необходимо скачать «xbee-arduino-0.3.zip», так как версия 0.4 работает через SoftwareSerial. Устанавливаем библиотеку в Arduino (Sketch->Import Library->Add Library) и указываем папку, в которой лежит то, что вы скачали и разархивировали. После этого нажмите (Sketch->Import Library->XBee), и у вас появится строчка "#include <XBee.h>".

Теперь мы можем загрузить вот такой скетч в Arduino.

#include <XBee.h>

// XBEE Code
XBee xbee = XBee();
unsigned long start = millis();
uint8_t payload[] = { 0, 0 };
Tx16Request tx = Tx16Request(0x4000, payload, sizeof(payload));


void setup() {
  // XBee Code
  Serial.begin(19200);
  xbee.setSerial(Serial);
}

void loop() {
  // XBee Code 
  if (millis() - start > 15000) { // Wait for boot and connection to establish
    xbee.send(tx);
  }
  delay(1000);
}

uint8_t payload[] = { 0, 0 }; — это массив данных, который XBee будет посылать.

Tx16Request tx = Tx16Request(0x4000, payload, sizeof(payload)); — Это запрос на отправку информации. Обратите внимание на 0x4000 — это значение должно соответствовать ID, который мы задали раньше, при настройки пары XBee.

Все, что он будет делать, это посылать два символа с ASCII кодом «0» на другой XBee. Запустив iFrank, можете увидеть, как пустые символы появляются в окне терминала. Это конечно не так интересно, но цель была проверить наличие связи между модулями. К следующий статье я надеюсь разобраться с камерой, обменом информацией между компьютером и Arduino, солнечными батареями, а так же написать управление на Qt.

В сборе сейчас все выглядит вот так:

Создание автономного робота Frank. Часть вторая

Автор: dsedov

Источник

Поделиться

* - обязательные к заполнению поля