Rocky Rover : Construire un système de vision robotique avec PixyCam et Arduino 101
Composants et fournitures
| Composant | Quantité |
|---|---|
| Arduino 101 | 1 |
| Adafruit Motor/Stepper Shield V2 | 1 |
| Châssis chenillé SparkFun Dagu DG102 | 1 |
| Piles AA | 1 |
| Câble USB-A vers B | 1 |
| Pack batterie USB Adafruit | 1 |
| Entretoises M2.5 avec écrou et vis | 4 |
| Connecteurs JST polarisés mâle/femelle pour batterie | 1 |
| Connecteurs mâle 40 positions 1 rangée (0,1") | 1 |
| Fils de connexion mâle/mâle | 1 |
| Pixy (CMUcam5) | 1 |
| Kit Pan-Tilt pour Pixy | 1 |
Applications et services en ligne
- Arduino IDE
- Blynk
À propos du projet
Rover basé sur Intel Arduino 101 avec PixyCam !
Les événements Hackster Live sont géniaux ! Intel a sponsorisé notre événement Hackster Dallas et nous a envoyé des Intel Arduino 101 pour construire des rovers. Merci Intel, merci Arduino. Voici le rover que j'ai construit pour l'événement.
J'ai construit cet appareil en suivant ce tutoriel de Johnathan Hottell. Il a créé des vidéos pour construire le rover BLE. C'est facile à suivre ! Regardez-le ici. Voici la vidéo de Johnathan Hottell.
Comme j'ai un rover avec 4 moteurs, j'ai suivi cette configuration.
Après avoir construit le rover et l'avoir connecté avec Blynk, j'ai décidé d'améliorer la construction en ajoutant une PixyCam. J'ai déplacé le support de batterie à l'avant pour pouvoir monter une caméra pan/tilt.
PixyCam
PixyCam rend la vision robotique facile. Pixy est un capteur de vision rapide pour la robotique DIY, il est facile d'apprendre à Pixy un objet en appuyant simplement sur un bouton. Il est capable de suivre des centaines d'objets simultanément et ne fournit que les données qu'il suit.

J'ai décidé de suivre une citrouille orange.

Je suis surpris de la facilité pour le faire fonctionner. Voici le lien pour les instructions de connexion de PixyCam à Arduino. Cliquez ici pour les instructions d'assemblage du mécanisme Pan/Tilt. Je suis content qu'il y ait beaucoup d'images, très facile à suivre. J'ai suivi les instructions de configuration et de construction, comment intégrer avec Arduino. J'ai testé leurs exemples.

API Arduino PixyCam
Utiliser Pixy avec Arduino est vraiment simple. Vous incluez simplement les en-têtes SPI et Pixy :
#include <SPI.h> #include <Pixy.h>
Et créez une instance globale de Pixy en plaçant ce code en dehors de vos fonctions setup() et loop() :
Pixy pixy;
La méthode la plus importante dans la bibliothèque Arduino est getBlocks(), qui retourne le nombre d'objets détectés par Pixy. Vous pouvez ensuite regarder dans le tableau pixy.blocks[] pour obtenir des informations sur chaque objet détecté (un élément de tableau par objet détecté). Chaque élément de tableau (i) contient les champs suivants :
pixy.blocks[i].signature: Numéro de signature de l'objet détecté (1-7 pour les signatures normales)pixy.blocks[i].x: Position x du centre de l'objet détecté (0 à 319)pixy.blocks[i].y: Position y du centre de l'objet détecté (0 à 199)pixy.blocks[i].width: Largeur de l'objet détecté (1 à 320)pixy.blocks[i].height: Hauteur de l'objet détecté (1 à 200)pixy.blocks[i].angle: Angle de l'objet détecté s'il s'agit d'un code couleurpixy.blocks[i].print(): Fonction membre qui imprime les informations de l'objet détecté sur le port série
C'est donc simple de communiquer avec Pixy depuis votre Arduino ! Pour plus d'informations sur la bibliothèque et l'API Arduino, allez ici. Voici le code utilisé pour le rover. J'ai modifié le code BLE original et ajouté le suivi d'objets. Lors de l'initialisation :
void setup() { ..... pixy.init(); .... }
La boucle principale ressemble à ceci :
void loop() { ...... // lire les données pixy et obtenir les blocs static int i = 0; int j; uint16_t blocks; char buf[32]; int32_t panError, tiltError; blocks = pixy.getBlocks(); // s'il y a des blocs 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++; // la frame ralentirait l'Arduino 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; // La taille est la surface de l'objet. // On garde une moyenne glissante des 8 dernières. 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; } } } }
Pour faire fonctionner Blynk sans que la PixyCam ne le contrôle, mettez le capuchon d'objectif. Cela garantira que la PixyCam n'interférera pas dans le contrôle du robot. Si ce projet vous a intéressé à la programmation Arduino ou à l'utilisation de PixyCam dans votre prochain projet, cliquez sur le bouton "Respect Project" et suivez-moi.
N'hésitez pas à poser des questions.
Code
Rocky Rover
Le code complet est disponible dans la section code du projet original.
Processus de fabrication
- Horloge POV Arduino : Construire un affichage LED à persistance rétinienne
- SERENA : Système d'Alarme Arduino Mega 2560 Personnalisé avec Écran Tactile TFT LCD
- Construire un bras robotique 3D fonctionnel piloté par Arduino – Guide pas à pas
- Solutions d'alimentation optimisées pour projets Arduino
- Bras robotique 6 DoF piloté par Nunchuk Wii – Kit Arduino Mega
- Robot chenillé Bluetooth BLE + Blynk – Arduino 101 (Intel Curie)
- Lunettes connectées « Smart Match-Making » avec Arduino 101 et tinyTILE BLE
- Construire un affichage à persistance rétinienne portable avec Arduino UNO et ATtiny85
- Optimisation du design d'illumination pour systèmes de vision en chirurgie robotique