Pull to refresh

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

Reading time5 min
Views63K


Прошло немного времени и у меня значительный прогресс. Если вы не читали предысторию — добро пожаловать в «Создание автономного робота 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.



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



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

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



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



Исходный код Так как написано все используя 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.

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

Tags:
Hubs:
Total votes 39: ↑36 and ↓3+33
Comments8

Articles