Couleur Pixybot suivi des Robots (9 / 10 étapes)

Étape 9: Code

Vous aurez besoin de la bibliothèque de lutin de la suivre le lien :

Bibliothèque de lutin

Aussi essayer et mettre à jour vers le nouveau firmware sur le Pixy et son logiciel de contrôle PixyMon

Remarque :

Lorsque le chargement des programmes, il est préférable de déconnecter le Pixy du connecteur ISP puis se reconnecter une fois fait.

ArchReactor Pixybot < br > / / écrit par : Apollo W. bois / / 2015 / / / / Code de marque de révision VI / / / / ce code est une intigration du système Pixy vision en une plate-forme mobile de soulever que de l’espace machine à / / connu sous le réacteur arc. Articles du code incluent les suivants les objets suivis, la détection d’objet capteur IR, la boucle de régulation PID A, / / un avertissement de batterie faible/cuttoff. et une pause les servos de commande donc vous pouvez former le Pixy. / / Parties de ce code sont dérivés de code Adafruit Industries Pixy Pet. Certaines parties de ce code sont tirées de l’exemple du dôme de Pixy CMUcam5 code. < p > #include < SPI.h >< br > #include < Pixy.h > #include < Servo.h >< / p > #define centre_x 160L #define centre_y 100L #define RCS_MIN_POS 0L #define RCS_MAX_POS 1000 L #define RCS_CENTER_POS ((RCS_MAX_POS-RCS_MIN_POS)/2) / / nombre d’échantillons analogiques à prendre par lecture #define NUM_SAMPLES 10 / / constantes ne changeront pas. Ils sont utilisés ici pour / / set NIP : int somme = 0 ; somme des échantillons pris unsigned char sample_count = 0 ; actuel échantillon numéro const int buttonPin = 2 ; le nombre de la tige poussoir const int ledPin = 13 ; le nombre de broches de la LED pin int ledgreen = 5 ; le nombre de broches de la LED pin int ledred = 7 ; le NIP de la goupille de LED / / variables vont changer : buttonState int = 0 ; variable pour la lecture de l’État touche Servo leftServo ; Définir la rightServo Servos Servo ; Servo gripperServo ; int analogInput = A0 ; unsigned int brute ; double vcc = 0 ; double tension ; calculer la tension const int irSenseleft = A1 ; Connecter le capteur à broche analogique A0 int distanceleft = 0 ; const int irSenseright = A2 ; Connecter le capteur à broche analogique A0 int distanceright = 0 ; Class ServoLoop {public : ServoLoop (pgain int32_t, int32_t dgain); void update (erreur int32_t); int32_t m_pos ; int32_t m_prevError ; int32_t m_pgain int32_t m_dgain;} ; ServoLoop panLoop (200, 200) ; ServoLoop tiltLoop (150, 200) ; ServoLoop::ServoLoop (pgain int32_t, int32_t dgain) {m_pos = RCS_CENTER_POS ; m_pgain = pgain ; m_dgain = dgain ; m_prevError = 0x80000000L;} void ServoLoop::update (int32_t erreur) {long int vel ; char buf [32]; si (m_prevError! = 0 x 80000000) {vel = (erreur * m_pgain + (erreur - m_prevError) * m_dgain) >> 10 ; //sprintf (buf, « %ld\n », vel); / / Serial.print(buf) ; m_pos += vel ; si (m_pos > RCS_MAX_POS) m_pos = RCS_MAX_POS ; ElseIf (m_pos > 3; if (taille > = 500) ; Grip() ; Si (millis() - cale > random(3000, 7000)) / / Drop() ; } ElseIf (millis() - lastBlockTime > 3000) {leftServo.writeMicroseconds(1510) ; rightServo.writeMicroseconds(1510) ; ScanForBlocks() ; } Si (millis ()-minuterie > 2999) / / si au moins se sont écoulés 3000mS {timer=millis(); / / reset timer readVcc() ; Voltage() ; } Si (millis ()-timerA > 49) //Wait 50 ms entre chaque lecture pour IR / / fonction de l’heure de la feuille de données entre chaque lecture / / est-38ms +/-10ms. 50 ms d’attente assure chacun / / lecture est auprès d’un échantillon différent {timerA=millis(); / / reset timer Pausebutton() ; irRead();} si (tension > = 6) {digitalWrite (ledgreen, HIGH);} ElseIf ((tension > = 5) & & (tension < 6)) {digitalWrite (ledgreen, basse); digitalWrite (ledred, HIGH);} ElseIf (tension < 5) {leftServo.writeMicroseconds(1510); / / cale moteurs en raison de la faible poer state rightServo.writeMicroseconds(1510) ; digitalWrite (ledgreen, LOW); digitalWrite (ledred ÉLEVÉ) ; LED pour prévenir du retard de batterie faible (500) ; digitalWrite (ledred, basse) ; retard (500) ; }} int oldX, oldY, oldSignature ; ---/ / Blocs de piste via le Pixy pan/tilt mech / / (basée en partie sur l’exemple de dôme Pixy CMUcam5) / /---int TrackBlock (int blockCount) {int trackedBlock = 0; long maxSize = 0; uint32_t tenir = 0 ; Serial.Print ("blocs =") ; Serial.println(blockCount) ; pour (int i = 0; i < blockCount; i ++) {si ((oldSignature == 0) || (pixy.Blocks[i].signature == oldSignature)) {long newSize = pixy.blocks[i].height * pixy.blocks[i].width ; if (newSize > maxSize) {trackedBlock = i; maxSize = newSize;}} } panError int32_t = centre_x - pixy.blocks[trackedBlock].x ; int32_t tiltError = pixy.blocks[trackedBlock].y - centre_y ; panLoop.update(panError) ; tiltLoop.update(tiltError) ; pixy.setServos (panLoop.m_pos, tiltLoop.m_pos) ; oldX = pixy.blocks[trackedBlock].x ; oldY = pixy.blocks[trackedBlock].y ; oldSignature = pixy.blocks[trackedBlock].signature ; Return trackedBlock ; } void FollowBlock (int trackedBlock) {int32_t followError = pixy.blocks[0] .x-centre_x; / / comment loin hors du centre nous sommes maintenant à la recherche
? La taille est la zone de l’objet. Nous gardons une course moyenne des 8 derniers. taille += pixy.blocks[trackedBlock].width * pixy.blocks[trackedBlock].height ; Taille = Taille >> 3 ; Vitesse d’avancement diminue à mesure que nous approchons de l’objet (la taille est plus grande) int forwardSpeed = contraindre (400 - (taille/400), -100, 400) ; Prime de direction est proportionnelle à l’erreur fois la vitesse d’avancement int32_t différentielle = (followError + (followError * forwardSpeed)) >> 6 ; Ajuster les vitesses gauche et à droite par le différentiel de la direction. int leftSpeed = contraindre (forwardSpeed + différentiel, -400, 400) ; int rightSpeed = contraindre (forwardSpeed - différentielle, -400, 400) ; leftSpeed = map(leftSpeed,-400,400,1650,1350) ; Carte de sortie servo valeurs rightSpeed = map(rightSpeed,-400,400,1350,1650) ; Carte de valeurs de sortie servo / / mise à jour de servos leftServo.writeMicroseconds(leftSpeed) ; rightServo.writeMicroseconds(rightSpeed) ; } int scanIncrement = (RCS_MAX_POS - RCS_MIN_POS) / 150 ; uint32_t lastMove = 0 ; ---/ / Random recherche pour blocs / / / / ce code tourne lentement dans un cercle / / jusqu'à un bloc de détection / /---void ScanForBlocks() {si (millis() - lastMove > 10) {lastMove = millis() ; //panLoop.m_pos += scanIncrement ; //if ((panLoop.m_pos > = RCS_MAX_POS) || (panLoop.m_pos < = RCS_MIN_POS)) {tiltLoop.m_pos =(RCS_MAX_POS * 0.6) ; //scanIncrement = - scanIncrement ; leftServo.writeMicroseconds(1460) //if (scanIncrement < 0); rightServo.writeMicroseconds(1460) ; retard (20), pixy.setServos (panLoop.m_pos, tiltLoop.m_pos);}} Prendre des lectures multiples et leur moyenne afin de réduire les fausses lectures void irRead() {int averagingleft = 0; / / contient la valeur moyenne des lectures int averagingright = 0; / / contient la valeur de lectures moyennes / / obtenir un échantillon de 5 lectures du capteur //for (int j’ai = 0; j’ai < 3; i ++) {distanceleft = analogRead(irSenseleft) ; averagingleft = averagingleft + distanceleft ; distanceright = analogRead(irSenseright) ; averagingright = averagingright + distanceright;} distanceleft = averagingleft / 5; / / moyenne des lectures / / return(distanceleft); / / Return value Serial.println (distanceleft DEC) ; DistanceRight = averagingright / 5 ; Moyenne des lectures / / return(distanceright) ; Valeur de retour Serial.println (distanceright, DEC) ; Si (distanceleft > 85) {leftServo.writeMicroseconds(1510) ; //allstop rightServo.writeMicroseconds(1510) ; delay(200) ; leftServo.writeMicroseconds(1660) ; rightServo.writeMicroseconds(1460) //backup ; delay(500) ; leftServo.writeMicroseconds(1460) ; //spin rightServo.writeMicroseconds(1460) ; delay(300);} else if (distanceright > 85) {//allstop leftServo.writeMicroseconds(1510) ; rightServo.writeMicroseconds(1510) ; retard (200);}} void Voltage() {vcc = readVcc () / 1000.0 ; brut = analogRead(analogInput) ; tension = ((raw / 1023.0) * vcc) * 2 ; Serial.Print ("tension de la batterie =") ; Serial.println (tension, DEC) ; Serial.Print ("tension VCC =") ; Serial.println (vcc, DEC) ; } readVcc() long {longtemps en résulter; / / lecture 1.1V référence contre AVcc ADMUX = _BV(REFS0) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1) ; delay(2); / / attendre Vref de régler ADCSRA | = _BV(ADSC); / / convertir tandis que (bit_is_set(ADCSRA,ADSC)) ; résultat = ADCL ; résultat | = ADCH << 8; résultat = 1106400 L / résulter; / / AVcc rétrocalcul en mV retournent le résultat;} void Pausebutton() {sample_count = 0; somme = 0; buttonState = digitalRead(buttonPin); / / vérifier si le bouton est appuyé. / / si c’est le buttonState est élevée : si (buttonState == HIGH) {/ / allumer la LED: leftServo.writeMicroseconds(1510) ; rightServo.writeMicroseconds(1510) ; delay(18000);}}

Articles Liés

Comment faire un Artbot : couleur, télédétection, le dessin des robots Arduino, faire de l’art génératif

Comment faire un Artbot : couleur, télédétection, le dessin des robots Arduino, faire de l’art génératif

Pour les cours Hardware et Physical Computing supervisé par Paul Klomp, dans le cadre de la technologie des médias programma à l'Université de Leiden, nous avons créé deux robots de dessin. Chaque robot a été construit autour d'un Arduino Uno et équi
Roblocknics - des Robots en bois magnétiques

Roblocknics - des Robots en bois magnétiques

Je fais ces jouets de plaisir pour etsy à l'aide de la composante fondamentale de l'existence humaine appelée 2 x 4. Maintenant je vais vous montrer comment les faire vous-même !Ces blocs de « robot » utilisent des aimants pour tenir les pièces ensem
Ligne suivante SRK Robot avec pièces imprimées en 3d

Ligne suivante SRK Robot avec pièces imprimées en 3d

Le Robot SRK + ligne suivante est petit frère du Robot MRK + ligne suivante. Il utilise un autre type de Conseil et d'un autre type de moteur. (Le bruit que font les moteurs, c'est ce que j'imagine qu'un scarabée géant sonnerait comme, donc Le Beetle
Ligne suivante MRK Robot avec pièces imprimées en 3d

Ligne suivante MRK Robot avec pièces imprimées en 3d

Avec the MRK + ligne kit, vous pouvez construire votre propre ligne robot qui suit. Les plates-formes sont robustes et métal, mais rectangulaire. Nous avons voulu créer opensource pièces de robots qui ont une conception plus lisse, mais sont encore a
Comment construire Sauron le Seigneur des Robots

Comment construire Sauron le Seigneur des Robots

Vous êtes un fan de la série de films le Seigneur des anneaux ? Si oui, à coup sûr vous savez « Sauron » !Dans ce instructable nous allons construire un robot humanoïde semi taille humaine ressemble à Sauron:)Le robot a deux 3 bras DOF et une tête DO
Construire des Robots joutes

Construire des Robots joutes

Combinant deux choses préférées du jeune garçon, chevaliers et Robots, nous avons créé des Robots de joutes.Mais ne pense pas que ces 2 robots exécutent juste les uns les autres, il y a quelques technologie impressionnante derrière chacun d'eux. Il y
Comment faire une ligne suivant le Robot

Comment faire une ligne suivant le Robot

Bonjour Instructables,Ce ma première fois faire un robot. Dans ce instructable je vais vous montrer comment faire une ligne suivant le robot. Remarque que cela une instructable pour les débutants qui viennent veut faire un robot pour le plaisir d'app
Main construit des Robots humanoïdes, Part1 : Introduction

Main construit des Robots humanoïdes, Part1 : Introduction

des robots humanoïdes presque tous assez grands pour être utile dans un contexte domestique sont toujours construits en utilisant une technologie développée à l'origine pour voiture-soudure robots d'usine - corps métalliques ultra rigides, entraînés
Répandre l’amour avec des Robots

Répandre l’amour avec des Robots

un kit de construction pour l'amour...L'idée d'un « Robot d'amour » a été initialement plantée dans ma tête par travail de Tika de ma fille « Un Robot fait d'amour et avec amour », comme le montre la troisième photo ci-dessous. Donc j'ai commencé à f
Construire des Robots sans scolarité

Construire des Robots sans scolarité

Pas besoin d'être un ingénieur pour libérer votre créativité !Dans ce guide, nous allons vous montrer combien il est facile de commencer à vous amuser avec le prototypage électronique.Tout ce que vous devez faire est de penser à votre prochaine inven
Construire des robots Raspberry Pi et Python

Construire des robots Raspberry Pi et Python

le but de ce tutoriel est de vous aider à commencer la programmation avec Python pour contrôler vos robots Arduino avec un PI de framboise. Nous irons sur les bases comme installation et quelques exemples simples pour contrôler votre robot depuis une
Route en suivant le Robot « Titi BOT »

Route en suivant le Robot « Titi BOT »

Bot titi est tout simplement une version perfectionnée d'un Robot suiveur de ligne. Il se compose de deux grandescomposants :(1) matériel (y compris les capteurs et les mécanismes de la conduite)(2) logiciels (chemin d'accès suivant et grille de réso
Suivi des yeux de chat via Kinect

Suivi des yeux de chat via Kinect

Cette instructable a été effectuée dans le cadre du cours supérieure CS « Tangibles informatique Interactive » à l'Université du Maryland, College Park, enseigné par le professeur Jon Froehlich. Le parcours axé sur l'étude de la matérialité de l'info
Mur en suivant le Robot à l’aide de 555 Timer

Mur en suivant le Robot à l’aide de 555 Timer

EDIT :Ce robot est également au concours de Robot pour la catégorie des 12-18 ans.Avant-propos :Dans ce instructable je vais écrire les idées de base que j'ai utilisé pour faire un mur suite robot sans n'importe quel microcontrôleur. Le robot dans ce