Используя Arduino и XBee-shield можно сделать робота, полностью управляемого с ПК по радиоканалу.
Код скетча:
#define BACKWARD 0x2 #define LEFT 0x4 #define RIGHT 0x8 // Sensor Data #define LEFT_FRONT_BUMPER 0x1 #define RIGHT_FRONT_BUMPER 0x2 #define REAR_BUMPER 0x4 #define DEBOUNCE_THRESHOLD 50 int sensorData = 0; int lastSensorData = 0; int lastLeftFrontBumperReading; int lastRightFrontBumperReading; int lastRearBumperReading; int leftFrontBumperReadingTime; int rightFrontBumperReadingTime; int rearBumperReadingTime; int command[2]; void setup() { Serial.begin(9600); pinMode(DRIVE_ENABLE_PIN, OUTPUT); pinMode(TURN_ENABLE_PIN, OUTPUT); pinMode(LEFT_PIN, OUTPUT); pinMode(RIGHT_PIN, OUTPUT); pinMode(BACKWARD_PIN, OUTPUT); pinMode(FORWARD_PIN, OUTPUT); pinMode(LEFT_FRONT_BUMPER_PIN, INPUT); digitalWrite(LEFT_FRONT_BUMPER_PIN, HIGH); pinMode(RIGHT_FRONT_BUMPER_PIN, INPUT); digitalWrite(RIGHT_FRONT_BUMPER_PIN, HIGH); pinMode(REAR_BUMPER_PIN, INPUT); digitalWrite(REAR_BUMPER_PIN, HIGH); } void loop() { // Read sensors and transmit readSensors(); if (sensorData != lastSensorData) { Serial.write(sensorData); lastSensorData = sensorData; } // listen for wireless commands if (Serial.available() > 0) { if (readCommand() > 0) { executeCommand(); } } } void readSensors() { int s; s = digitalRead(LEFT_FRONT_BUMPER_PIN); if (s != lastLeftFrontBumperReading) { leftFrontBumperReadingTime = millis(); } if ((millis() - leftFrontBumperReadingTime) > DEBOUNCE_THRESHOLD) { if (s == LOW) { sensorData |= LEFT_FRONT_BUMPER; } else { sensorData &= ~LEFT_FRONT_BUMPER; } } lastLeftFrontBumperReading = s; s = digitalRead(RIGHT_FRONT_BUMPER_PIN); if (s != lastRightFrontBumperReading) { rightFrontBumperReadingTime = millis(); } if ((millis() - rightFrontBumperReadingTime) > DEBOUNCE_THRESHOLD) { if (s == LOW) { sensorData |= RIGHT_FRONT_BUMPER; } else { sensorData &= ~RIGHT_FRONT_BUMPER; } } lastRightFrontBumperReading = s; s = digitalRead(REAR_BUMPER_PIN); if (s != lastRearBumperReading) { rearBumperReadingTime = millis(); } if ((millis() - rearBumperReadingTime) > DEBOUNCE_THRESHOLD) { if (s == LOW) { sensorData |= REAR_BUMPER; } else { sensorData &= ~REAR_BUMPER; } } lastRearBumperReading = s; } int readCommand() { int b = Serial.read(); if (b == BEGIN_COMMAND) { command[0] = readByte(); command[1] = readByte(); return 1; } else { return 0; } } // blocking read int readByte() { while (true) { if (Serial.available() > 0) { return Serial.read(); } } } void executeCommand() { int c = command[0]; int speed = command[1]; digitalWrite(DRIVE_ENABLE_PIN, LOW); if (c & FORWARD) { digitalWrite(BACKWARD_PIN, LOW); digitalWrite(FORWARD_PIN, HIGH); } if (c & BACKWARD) { digitalWrite(FORWARD_PIN, LOW); digitalWrite(BACKWARD_PIN, HIGH); } if (c & (FORWARD | BACKWARD)) { analogWrite(DRIVE_ENABLE_PIN, speed); } digitalWrite(TURN_ENABLE_PIN, LOW); if (c & LEFT) { digitalWrite(RIGHT_PIN, LOW); digitalWrite(LEFT_PIN, HIGH); } if (c & RIGHT) { digitalWrite(LEFT_PIN, LOW); digitalWrite(RIGHT_PIN, HIGH); } if (c & (LEFT | RIGHT)) { digitalWrite(TURN_ENABLE_PIN, HIGH); } }
Ссылки
Wireless robotics platform
0 комментариев на «“Радиоуправляемый робот”»
Добрый день. Мне очень понравился данный проект. Я тоже хочу собрать робота. Не могли бы вы поподробнее описать работу с модулем xBee: ну там что он может, как организована передача информации от одного к другому модулю, как они узнают друг друга, как работают параллельно несколько устройств xBee, не мешают ли друг другу (если я соберу несколько устройств, не будут ли они мешать друг другу, например при проведении соревнований), как работают в одной сети более двух устройств и т.п. Я понимаю что в сети много информации на эту тему, но, увы, она почти вся на иностранном языке, а по сему, не очень хорошо для русского человека, который не очень знает другой язык. А в свою очередь я обещаю прислать отчет о проделанной работе.
Буду очень признателен. Спасибо.
Вы хотели сказать радиоуправляемую машинку, верно?
Да, так, наверное, вернее будет. Радиоуправляемую машинку с элементами робота)))
Nikolay18 а вы теперь можете поделиться информацией об XBee, вот есть XBee 56 и STM32L что нужно сделать чтобы допустим по Wi-Fi (если я правильно понимаю что XBee 56 — Wi-Fi) передать на ноутбук число скажем 0xA5 и главное как эо посмотреть на ноутбуке )
Неправильно понимаете. Zigbee — это отдельный протокол связи для дальнобойной (1км), низкоскоростной радиопередачи, Xbee — самые популярные модули, реализующие этот протокол. Вам потребуются два модуля Xbee и соответствующие адаптеры для них — под ноутбук и под ваш STM — хотя бы разведенный на макетке.
Если у вас не слишком хорошо с пайкой микроконтроллеров и разводкой плат, можете купить maple — http://hobbylab.ru/robototechnics/detail.php?ID=1293
Это совместимый с Ардуино механически STM Кортекс М3
Еще вам понадобятся адаптер ардуино — иксбишилд (http://amperka.ru/collection/Platy/product/wireless-shield), два модуля xbee (http://amperka.ru/collection/Platy/product/Modul-XBee) и переходник для USB (http://amperka.ru/collection/Platy/product/xbee-usb-adapter)
Смотрите в документах на ваш модуль, какой у него порт — UART, SPI, I2C. И подключайте ваш STM, исходя из этой информации.
Прошу прощения, но XBee S6 по-моему уже Wi-Fihttp://www.digi.com/products/wireless-wired-embedded-solutions/zigbee-rf-modules/point-multipoint-rfmodules/xbee-wi-fi#overview (ZigBee может вклиниваться вроде если найдет). Я уже распаял ножки RX0 TX0 на Arduino в целях быстрой отладки с программой X-CTU, потом это все заменит STM32 какой-нибудь. Так вот со стороны STM-UART-XBee S6 все ясно а как со стороны ноутбучного Wi-Fi. Я так предполагаю настроить сеть, а вот как потом посмотреть что пришло на ноут без написания софта?
Как я вижу, этот модуль — конкретно под WiFi. ZigBee протокола 802.15.4 в нем нет.
Вам, похоже, все равно потребуется USB-Xbee переходник — поставить драйверы и провести первоначальную настройку. Если я правильно понимаю то, что написано в руководстве по быстрому старту.
Вот а можно как-нибудь приспособить Arduino Mega 2560 вместо USB-XBee переходника?
Всё, я догадался подключаем ножки модуля к Serial1 и запускаем скетч в примерах MultiSerialMega, важно как оказалось питать модуль от того что тянет хотя бы 120 мА. Меня смутило что сначала иногда модуль потреблял 17 мА от 3,3 В. )