Rocky Rover: робот с системой зрения на PixyCam и Arduino 101
Компоненты и материалы
| Arduino 101 | 1 шт. |
| Adafruit Motor/Stepper Shield V2 | 1 шт. |
| Шасси SparkFun Dagu DG102 Tank Chassis | 1 шт. |
| Батареи AA | 1 комплект |
| USB-A to B Cable | 1 шт. |
| Adafruit USB Battery Pack | 1 шт. |
| Стойки M2.5 с гайкой и винтом | 4 шт. |
| JST разъёмы (male/female) | 1 комплект |
| Male Header 40 Position 1 Row (0.1") | 1 шт. |
| Перемычки Male/Male | 1 комплект |
| Pixy (CMUcam5) | 1 шт. |
| Pixy Pan-Tilt Kit | 1 шт. |
Приложения и сервисы
- Arduino IDE
- Blynk
О проекте
Ровер на Intel Arduino 101 с PixyCam!
Hackster Live events — круто! Intel спонсировал наше мероприятие в Далласе и прислал платы Intel Arduino 101 для сборки роверов. Спасибо Intel и Arduino. Вот мой ровер для события.
Собрал по туториалу Джонатана Хоттелла (Johnathan Hottell). Он снял видео по сборке BLE-рувера. Очень просто! Видео Джонатана.
У меня ровер с 4 моторами, поэтому следовал этому руководству.
После сборки ровера и подключения к Blynk решил улучшить: добавил PixyCam. Перенёс батарейный отсек вперёд, чтобы установить панораму/наклон камеры.
PixyCam
PixyCam делает робототехническое зрение простым. Pixy — быстрый визуальный сенсор для DIY-робототехники, легко обучается объекту нажатием кнопки. Отслеживает сотни объектов одновременно и выдаёт только данные об отслеживаемых.

Решил отслеживать оранжевую тыкву.

Удивительно легко завести. Инструкции по подключению PixyCam к Arduino: ссылка. Сборка панорамы/наклона: инструкция. Много картинок, легко следовать. Проверил примеры.

PixyCam Arduino API
Использование Pixy с Arduino очень просто. Подключите SPI и Pixy заголовки:
#include <SPI.h>
#include <Pixy.h>
Создайте глобальный экземпляр Pixy вне setup() и loop():
Pixy pixy;
Самый важный метод — getBlocks(), возвращает количество обнаруженных объектов. Информация об каждом объекте в массиве pixy.blocks[]. Каждый элемент содержит:
signature— номер сигнатуры (1-7)x— координата X центра (0-319)y— координата Y центра (0-199)width— ширина (1-320)height— высота (1-200)angle— угол для цветовых кодовprint()— вывод информации в Serial
Пример кода для ровера. Модифицировал оригинальный BLE-код, добавил отслеживание объектов. В setup():
void setup() {
.....
pixy.init();
....
}
Основной цикл loop() (упрощённо):
void loop() {
......
static int i = 0;
int j;
uint16_t blocks;
char buf[32];
int32_t panError, tiltError;
blocks = pixy.getBlocks();
if (blocks) {
panError = X_CENTER - pixy.blocks[0].x;
tiltError = pixy.blocks[0].y - Y_CENTER;
panLoop.updatePan(panError);
tiltLoop.update(tiltError);
pixy.setServos(panLoop.m_pos, tiltLoop.m_pos);
i++;
if (i % 10 == 0) {
int trackedBlock = 0;
sprintf(buf, "Detected %d:\n", blocks);
Serial.print(buf);
long maxSize = 0;
for (j = 0; j < blocks; j++) {
sprintf(buf, " block %d: ", j);
Serial.print(buf);
pixy.blocks[j].print();
long newSize = pixy.blocks[j].height * pixy.blocks[j].width;
if (newSize > maxSize) {
trackedBlock = j;
maxSize = newSize;
}
}
int32_t followError = RCS_CENTER_POS - panLoop.m_pos;
size += pixy.blocks[trackedBlock].width * pixy.blocks[trackedBlock].height;
size -= size >> 3;
int forwardSpeed = constrain(400 - (size / 256), -100, 400);
int32_t differential = (followError + (followError * forwardSpeed)) >> 8;
int leftSpeed = constrain(forwardSpeed + differential, -400, 400);
int rightSpeed = constrain(forwardSpeed - differential, -400, 400);
motor1->setSpeed(leftSpeed);
motor3->setSpeed(leftSpeed);
motor2->setSpeed(rightSpeed);
motor4->setSpeed(rightSpeed);
double width = pixy.blocks[trackedBlock].width;
if (width <= 5) { }
else if (width < 20 && !running) {
Serial.println("running");
motor1->run(FORWARD);
motor3->run(FORWARD);
motor2->run(FORWARD);
motor4->run(FORWARD);
running = true;
}
else if (width > 80 && !running) {
Serial.println("running");
motor1->run(BACKWARD);
motor3->run(BACKWARD);
motor2->run(BACKWARD);
motor4->run(BACKWARD);
running = true;
}
else if (width >= 20 && width <= 80 && running) {
motor1->setSpeed(128);
motor2->setSpeed(128);
motor3->setSpeed(128);
motor4->setSpeed(128);
motor2->run(RELEASE);
motor4->run(RELEASE);
motor1->run(RELEASE);
motor3->run(RELEASE);
running = false;
}
}
}
}
Чтобы управлять через Blynk без вмешательства PixyCam, накройте объектив крышкой. PixyCam не будет мешать управлению ботом.
Код
Rocky Rover
Полный код доступен в репозитории проекта.
Производственный процесс
- Arduino POV-часы: сборка дисплея на эффекте сохранения образа
- SERENA: Пользовательская система сигнализации на Arduino Mega 2560 с TFT Touchscreen
- Сборка функционального 3D-печатного манипулятора на Arduino: пошаговое руководство
- Оптимизированные решения питания для проектов на Arduino
- Роботизированная рука 6 степеней свободы на Arduino Mega с управлением через Nunchuk
- Arduino 101 BLE + Blynk: DIY танк с Bluetooth-управлением с телефона
- Умные очки для знакомств на Arduino 101 и tinyTILE BLE
- Сборка портативного дисплея на основе эффекта сохранения изображения с Arduino UNO и ATtiny85
- DIY Arduino Smartwatch: самодельные умные часы в стиле Apple Watch
- Оптимизация дизайна подсветки для систем зрения роботизированной хирургии