Промышленное производство
Промышленный Интернет вещей | Промышленные материалы | Техническое обслуживание и ремонт оборудования | Промышленное программирование |
home  MfgRobots >> Промышленное производство >  >> Manufacturing Technology >> Производственный процесс

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 шт.

Приложения и сервисы

О проекте

Ровер на Intel Arduino 101 с PixyCam!

Hackster Live events — круто! Intel спонсировал наше мероприятие в Далласе и прислал платы Intel Arduino 101 для сборки роверов. Спасибо Intel и Arduino. Вот мой ровер для события.

Собрал по туториалу Джонатана Хоттелла (Johnathan Hottell). Он снял видео по сборке BLE-рувера. Очень просто! Видео Джонатана.

У меня ровер с 4 моторами, поэтому следовал этому руководству.

После сборки ровера и подключения к Blynk решил улучшить: добавил PixyCam. Перенёс батарейный отсек вперёд, чтобы установить панораму/наклон камеры.

PixyCam

PixyCam делает робототехническое зрение простым. Pixy — быстрый визуальный сенсор для DIY-робототехники, легко обучается объекту нажатием кнопки. Отслеживает сотни объектов одновременно и выдаёт только данные об отслеживаемых.

Rocky Rover: робот с системой зрения на PixyCam и Arduino 101

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

Rocky Rover: робот с системой зрения на PixyCam и Arduino 101

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

Rocky Rover: робот с системой зрения на PixyCam и Arduino 101

PixyCam Arduino API

Использование Pixy с Arduino очень просто. Подключите SPI и Pixy заголовки:

#include <SPI.h>
#include <Pixy.h>

Создайте глобальный экземпляр Pixy вне setup() и loop():

Pixy pixy;

Самый важный метод — getBlocks(), возвращает количество обнаруженных объектов. Информация об каждом объекте в массиве pixy.blocks[]. Каждый элемент содержит:

Пример кода для ровера. Модифицировал оригинальный 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

Полный код доступен в репозитории проекта.

Производственный процесс

  1. Arduino POV-часы: сборка дисплея на эффекте сохранения образа
  2. SERENA: Пользовательская система сигнализации на Arduino Mega 2560 с TFT Touchscreen
  3. Сборка функционального 3D-печатного манипулятора на Arduino: пошаговое руководство
  4. Оптимизированные решения питания для проектов на Arduino
  5. Роботизированная рука 6 степеней свободы на Arduino Mega с управлением через Nunchuk
  6. Arduino 101 BLE + Blynk: DIY танк с Bluetooth-управлением с телефона
  7. Умные очки для знакомств на Arduino 101 и tinyTILE BLE
  8. Сборка портативного дисплея на основе эффекта сохранения изображения с Arduino UNO и ATtiny85
  9. DIY Arduino Smartwatch: самодельные умные часы в стиле Apple Watch
  10. Оптимизация дизайна подсветки для систем зрения роботизированной хирургии