Nachdem ich die Pixy-Cam als Stand-Alone ausprobiert habe, wollte ich das Ganze auch an einem Arduino ausprobieren. Das Auslesen der Daten war einfacher, als ich mir anfangs gedacht habe.
Für den Betrieb mit Arduino, benötigt man die Pixy Library. Pixy wird mit Hilfe des mitgelieferten Kabels an die SPI-Schnittstelle (6-poliger Stecker) vom Arduino angeschlossen.
In einem früheren Artikel habe ich bereits beschrieben, wie man Pixy eine neue Signatur beibringen kann. Hat man die Signatur angelernt, kann man die Daten über erkannte Objekte, im Serial Monitor ausgeben lassen. Dazu findet man eine unter Datei > Beispiele > Pixy > hello_world, das Programm, das auf den Arduino aufgespielt werden muss. Danach sieht man im Serial Monitor die Informationen zum erkannten Objekt.
Während man sich im Serial Monitor die Daten ausgeben lässt, kann man parallel dazu auch PixyMon laufen lassen. Allerdings weiß ich nicht, ob es an meinem Setup liegt, aber man muss zuerst das Programm flashen, dann Serial Monitor starten und erst dann PixyMon. Nur in dieser Reihenfolge kann ich sowohl im Serial Monitor als auch PixyMon was sehen 🙁
Was sagen uns diese Zeilen im Serial Monitor eigentlich? Hier ist eine kurze Erklärung:
- Detected 1: – Ist die Anzahl der erkannten Objekte.
- block 0: – Nummer des Objektes (Zählung beginnt bei 0). Wenn ein weiteres Objekt auftauchen würde, würden weitere Zeilen, mit block 1: block 2: usw. dazu kommen.
- sig: 1 – ist die Nummer der angelernten Farbsignatur (0-7).
- x: 170 – die Position des Objektes auf der x-Achse. Und zwar wird hier der Mittelpunkt des Objektes genommen und nicht eine der vier Kanten (0 – 319)
- y: 152 – die Position des Objektes auf der y-Achse (0 – 199)
- width: 87 – Breite bzw. Länge (von li. nach re.) des Objektes (1 – 320)
- height: 27 – Höhe des Objektes. Bitte nicht mit y-Position verwechseln (1 – 200)
- angle: 0 – Die Neigung des Objektes. Diese Angabe ist aber erst bei zweifarbigen Signaturen relevant (soweit ich weiß).
Noch ein kleiner, aber evtl. wichtiger Hinweis: der Nullpunkt der y-Achse ist nicht unten links, sondern oben links.
Es wäre evtl. etwas kompliziert, die ganzen Daten aus einer Zeile raus zu fischen und in einzelne Variablen zu schreiben. Nach einem Blick ins Wiki von Pixy, habe ich aber einige tolle Befehle gefunden, wie man die Werte einzeln auslesen kann. Dazu gibt es zu jedem einzelnen Wert, einen eigenen Befehl.
1 2 3 4 5 6 |
pixy.blocks[i].signature; pixy.blocks[i].x; pixy.blocks[i].y; pixy.blocks[i].width; pixy.blocks[i].height; pixy.blocks[i].angle; |
Nach dem Anlernen der Signatur, werden mit dem nachfolgenden Code, die einzelnen Werte im Serial Monitor ausgegeben.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 |
/* Pixy Test Arduino IDE 1.0.6 */ #include <SPI.h> #include <Pixy.h> Pixy pixy; int signature = 0; //Nr of signature int x = 0; //positon x axis int y = 0; //position y axis int width = 0; //object's width int height = 0; //object's height void setup() { Serial.begin(9600); Serial.print("Starting...\n"); pixy.init(); } void loop() { static int i = 0; uint16_t blocks; blocks = pixy.getBlocks(); //receive data from pixy signature = pixy.blocks[i].signature; //get object's signature x = pixy.blocks[i].x; //get x position y = pixy.blocks[i].y; //get y position width = pixy.blocks[i].width; //get width height = pixy.blocks[i].height; //get height //Serial print single values //Print signature Serial.print("Signature = "); Serial.println(signature); //print x position Serial.print("x = "); Serial.println(x); //print y position Serial.print("y = "); Serial.println(y); //print tha wirdth of the object Serial.print("width = "); Serial.println(width); //print the height of the object Serial.print("height = "); Serial.println(height); Serial.println("###################"); delay(1000); } |
Nun kann man ganz bequem die einzelnen Werte auslesen und mit beliebigen Aktionen verknüpfen 🙂
Pingback: Pixy-Roboter mit Arduino | 5Volt-Junkie
Hallo
gibt es auch die Möglichkeit etwas zum Pixy zurückzuschreiben
z.B ändern der Konfiguration
Auto-Belichtung Ein / Aus (runprogAEC 1)
gruß Patrick
Hi,
mir ist nicht bekannt, dass man zu Pixy etwas quasi „on the fly“ zurückschreiben kann. Zumindest hat es die damalige Firmware nicht unterstützt. Wenn man sich das zu traut, könnte man die Firmware selbst anpassen und die Unterstützung implementieren. https://github.com/charmedlabs/pixy
Hi, erst mal vielen dank für die Erklärung.
also ich habe da eine kleine Frage, kann man mit der Pixy cam auch eine Schwarze Linie merken, und folgen, so was endliches wie der Linien folger Sensor..
MFG
toni
Danke für deine informative Beschreibung
Könnte es evtl möglich sein mit der cam ein dartboard (steeldart) abzutasten um festzustellen wo die 3 Darts stecken?
Laut deiner Beschreibung könnte es möglich sein.
Will nun aber keine 90€ ausgeben um festzustellen das dies unmöglich ist
LG
Hi,
mit Pixy habe ich nichts mehr gemacht und weiß leider nicht, ob der Hersteller seine Firmware noch irgendwie weiterentwickelt hat. Ich vermute aber, dass das sehr schwer zu bewerkstelligen ist. Pixy arbeitet mit sehr geringer Bildauflösung, was die Positionsbestimmung der Darts sehr ungenau macht.
Dann wäre noch die Frage, wo du die Kamera anbringen willst. Wenn du das so positioniert, dass die Kamera aus derselben Perspektive auf das Board schaut, wie der Spieler, siehst du lauter Kreuze und ich bezweifele, dass die dünnen farbigen Striche, die noch nicht mal 1mm dick sind, von Pixy erkannt werden.
Hallo
Sag hast Du eine Idee wie man die tilt Befehle an 2 stärkere Mg 996 Servos senden kann? Und weisst Du wo man den Code her bekommen könnte um einen Robot dann damit einem Ball folgen zu lasse?
Gruss und Dank
Anna
Hallo Anna,
mit dem Pan-Tilt habe ich damals nicht viel gemacht. Grundsätzlich kann man die Servos parallel schalten. Ich weiß zwar nicht, ob das für alle Servos gilt, aber ich habe das selber paar Mal gemachtt und es funktionierte ganz ok. Einziges Problem ist, dass die Servos Toleranzen haben und es kann dazu kommen, dass die Servos mechanisch gegeneinander arbeiten.
Wo man den Code bekommt, weiß ich leider nicht. Du kannst dich aber hier umschauen/fragen http://cmucam.org/projects/cmucam5
Vielleicht hat es schon jemand gepostet