Tau Labs Software unterstützt vielfältige Hardware

ernieift

Erfahrener Benutzer
Die Pixy erkennt den Stift und schickt die Position und Größe ans Quanton. Da läuft ein Script und wertet die Daten aus. Die Daten kommen in einen PID-Regler und dann schickt picoC die Solldaten für die Servos an die Pixy. Das soll die Grundlage für eine Objektverfolgung o.ä. sein. Also die Pixy macht das was sie immer macht. Die "Stift-Demo" ist ein picoC-Skript.
 

ernieift

Erfahrener Benutzer
Hier das Skript:
Code:
#include "system.h"
#include "pid.h"
#include "math.h"

/* Pixy Library functions (start) */
#define PIXY_ARRAYSIZE      30
#define PIXY_START_WORD     0xaa55
#define PIXY_START_WORD_CC  0xaa56
#define PIXY_START_WORDX    0x55aa

typedef struct {
   unsigned short signature;
   unsigned short x;
   unsigned short y;
   unsigned short width;
   unsigned short height;
   unsigned short angle;
} Block;

typedef enum BlockType {
   NORMAL_BLOCK,
   CC_BLOCK
} BlockType;

Block blocks[PIXY_ARRAYSIZE];
BlockType blockType;
short skipStart;

short getStart() {
   unsigned short w, lastw = 0xffff;
   char c;

   while(ReceiveBuffer(&w, 2, 100) == 2) {
      if (w==PIXY_START_WORD && lastw==PIXY_START_WORD) {
         blockType = NORMAL_BLOCK;
         return 1;
      }
      else if (w==PIXY_START_WORD_CC && lastw==PIXY_START_WORD) {
         blockType = CC_BLOCK;
         return 1;
      }
      else if (w==PIXY_START_WORDX) {
         ReceiveBuffer(&c, 1, 100);
      }
      lastw = w;
   }
   return 0;
}

short getBlocks(short maxBlocks) {
   short bc;
   short i;
     unsigned short w, checksum, sum;

   if (!skipStart) {
      if (getStart()==0)
      return 0;
   }
   skipStart = 0;

   for (bc = 0; bc < maxBlocks && bc < PIXY_ARRAYSIZE;) {
      ReceiveBuffer(&checksum, 2, 100);
      if (checksum==PIXY_START_WORD) {
         skipStart = 1;
         blockType = NORMAL_BLOCK;
         return bc;
      }
      else if (checksum==PIXY_START_WORD_CC) {
         skipStart = 1;
         blockType = CC_BLOCK;
         return bc;
      }
      else if (checksum==0) {
         return bc;
      }

      if (blockType == NORMAL_BLOCK) {
         ReceiveBuffer(&blocks[bc],10,100);
         blocks[bc].angle = 0;
      }
      else {
         ReceiveBuffer(&blocks[bc],12,100);
      }

      sum = blocks[bc].signature;
      sum += blocks[bc].x;
      sum += blocks[bc].y;
      sum += blocks[bc].width;
      sum += blocks[bc].height;
      sum += blocks[bc].angle;

      if (checksum==sum)
         bc++;

      ReceiveBuffer(&w, 2, 100);
      if (w==PIXY_START_WORD) {
         blockType = NORMAL_BLOCK;
      }
      else if (w==PIXY_START_WORD_CC) {
         blockType = CC_BLOCK;
      }
      else {
         return bc;
      }
   }
   return bc;
}

void setServos(short s0, short s1) {
   short outBuf[3];
   outBuf[0] = 0xff00;
   outBuf[1] = s0;
   outBuf[2] = s1;
   SendBuffer(outBuf, 6);
}

/* Pixy Library functions (end) */

int main() {
   float pan, tilt;
   pid pid_pan, pid_tilt;
   unsigned long oldtime;

   ChangeBaud(19200);

   // pid,p,i,d,iLim,CutOff
   pid_configure(&pid_pan,0.1,0,0.02,100,20);
   pid_configure(&pid_tilt,0.2,0,0.05,100,20);
   pid_zero(&pid_pan);
   pid_zero(&pid_tilt);

   for (float a=0; a<10; a += 0.01) {
      pan = 500 + 500.0*sin(a);
      tilt = 500 + 500.0*cos(3*a);
      setServos(pan,tilt);
      delay(10);
   }
   setServos(500,500);

   pan = 500;
   tilt = 500;
   oldtime = time();
   for (unsigned long timeout = time() + 30000; timeout > time();) {
      short block = getBlocks(1);
      if (block) {
         float dT = (time() - oldtime)/1000.0;
         pan -= pid_apply(&pid_pan, blocks[0].x - 160, dT);
         tilt += pid_apply(&pid_tilt, blocks[0].y - 100, dT);
          pan = (pan < 100) ? 100 : ((pan > 900) ? 900 : pan);
          tilt = (tilt < 100) ? 100 : ((tilt > 900) ? 900 : tilt);
         setServos(pan,tilt);
         oldtime = time();
         TestValSet(pan);
      }
   }
   setServos(500,500);
   return 0;
}

exit(main());
Die Pixy-Firmware (sonst kann man die Servos über setServos() nicht ansteuern)
https://www.dropbox.com/s/1pp8x2kgm1a7zko/video.hex?dl=0

Das Kabel:
Code:
USART       Pixy J2
(1) GND --- (6) GND
(2) VCC --- (2) VCC
(3) RX  <-- (4) TX
(4) TX  --> (1) RX
 
Zuletzt bearbeitet:

ernieift

Erfahrener Benutzer
Noch was. Mit PixyMon musst Du noch das Interface auf 2 stellen und die Baudrate nicht zu hoch wählen, da die Pixy ständig Daten sendet. Wenn Du also 115200Baud einstellst kommen haufenweise 0x00 raus, da soviel bis zum nächsten Frame nicht zu sehen ist. Ich habe zuletzt 19200 verwendet. Das reicht völlig und die erkannten Objekte werden eh der Größe nach sortiert. Color Codes geht übrigens auch super.

PS: Dann hast Du also dafür gesorgt, dass ich mich überhaupt mit der Pixy beschäftigt habe :)
 
Zuletzt bearbeitet:

cGiesen

Erfahrener Benutzer
Ich kriege hier die Krise.
Ich bastel jetzt schon den ganzen Tag mit PicoC rum.
Aber ständig geht mein Telemetrielink kapput.
Ich muss immer Reset und USB reconnect.
Wenn ich Glück habe klappt es dann wieder.
Oft mache ich das aber 4,5,6 mal hintereinander :(

Was kann das sein?

Windows 8.1 letztes Next
 

ernieift

Erfahrener Benutzer
Hmm. Sieht so aus. Ich habe damals 2 Platinen bestellt. Eine habe ich bestückt und die andere liegt hier noch. Nach der Preissenkung beim Quanton ist die Variante auch nicht mehr so interessant.

PS: Aber benutzt habe ich es auch vor kurzem. Zum Testen von OneShot auf TauLabs.
 
Zuletzt bearbeitet:
Hmm. Sieht so aus. Ich habe damals 2 Platinen bestellt. Eine habe ich bestückt und die andere liegt hier noch. Nach der Preissenkung beim Quanton ist die Variante auch nicht mehr so interessant.

PS: Aber benutzt habe ich es auch vor kurzem. Zum Testen von OneShot auf TauLabs.

Warum ist die Variante nicht mehr so interessant? Ist doch eigentlich eine nette Idee und mit etwas Einsatz kann man auch seine eigenes Shield bauen, so wie es einem am besten passt. Ist sicherlich nicht ganz einfach, aber mit etwas Geduld und Unterstützung wird das sicherlich was.
Was ist derzeitig die bessere Lösung STM32F3Discovery oder STM32F4Discovery?
 

ernieift

Erfahrener Benutzer
Der Vorteil vom DiscoF3 ist, dass es vollständig ist und keine weiteren Sensoren zum Fliegen braucht. Altitude Hold geht natürlich nur mit Baro. Die Shields sind nur zur einfacheren Verkabelung entwickelt worden. Da ich ja die picoC-Implementierung verbrochen habe und die F3-Targets nicht genug Platz dafür hatten würde ich Dir zu einem F4-Board raten. Das DiscoF4 fliegt aber nicht von allein. Dafür brauchst Du noch einen GY-86 und eventuell einen externen Flash. Beide Discos sind relativ gross.
Der GY-86 wird mit I2C angeschlossen. Klingt erstmal nicht so schlecht. Aber! Ich habe gerade einen PR zu laufen, der OneShot in TauLabs einpflegt. Damit wird die OneShot-Rate an die Sensorrate gehängt. Die ist mit I2C gegenüber SPI nicht so hoch. Auf dem Quanton sind mehr als 1000Hz möglich.
Der Preis für ein fertiges Quanton liegt bei 54€. Wenn Du lieber basteln willst kriegst Du für 4€ die Platine.
 
Der Vorteil vom DiscoF3 ist, dass es vollständig ist und keine weiteren Sensoren zum Fliegen braucht. Altitude Hold geht natürlich nur mit Baro. Die Shields sind nur zur einfacheren Verkabelung entwickelt worden. Da ich ja die picoC-Implementierung verbrochen habe und die F3-Targets nicht genug Platz dafür hatten würde ich Dir zu einem F4-Board raten. Das DiscoF4 fliegt aber nicht von allein. Dafür brauchst Du noch einen GY-86 und eventuell einen externen Flash. Beide Discos sind relativ gross.
Der GY-86 wird mit I2C angeschlossen. Klingt erstmal nicht so schlecht. Aber! Ich habe gerade einen PR zu laufen, der OneShot in TauLabs einpflegt. Damit wird die OneShot-Rate an die Sensorrate gehängt. Die ist mit I2C gegenüber SPI nicht so hoch. Auf dem Quanton sind mehr als 1000Hz möglich.
Der Preis für ein fertiges Quanton liegt bei 54€. Wenn Du lieber basteln willst kriegst Du für 4€ die Platine.
Das hört sich ja mal nicht so schlecht an auf den ersten Blick.
Ich versuche mich gerade an einer Adapterplatte für ein F3Discovery, vielleicht werde ich die aber auf F4Discovery umsetzen.
Wenn man das GY-86 (10DOF) nutzen möchte, davon habe ich eins hier liegen, kann man dann die Sensoren auf dem F4 deaktivieren?
 
Das F4Discovery unterstützt nur 3 USART? ..
Du darfst nicht vergessen das die Discoveryboards von ST zum Entdecken der Möglichkeiten ihrer CPU´s und SensorIC´s geschaffen wurden.
F3 - Bewegungssensoren - daher für uns zur Koptersteuerung geeignet

F4- Soundverarbeitung - daher auch bestimmte PIN´s dadurch blockiert - siehst Du in Deinem Bild Ein USART mit einem Taster, der andere mit Audio.

F4 401 wäre besser, da sind die Bewegungssensoren des F3 vorhanden, leider aber nicht als Target unterstützt. Und da Mic und LS Ausgang auch noch vorhanden sind könntest du dann eine fliegenden Komunikator bauen ;)

Ein Board mit einem nackten STM407V wie z.B von Waveshare, da hab ich meins her, ist auch geeignet.
 

Flensburger

Erfahrener Benutzer
Was haltet Ihr davon, das wir zusätzlich deutsche Seiten im Wiki erstellen? Ich denke hier vorallem an Anfänger als erste Hilfestellung.
 

cGiesen

Erfahrener Benutzer
Was haltet Ihr davon, das wir zusätzlich deutsche Seiten im Wiki erstellen? Ich denke hier vorallem an Anfänger als erste Hilfestellung.
Frage das mal drüben im Forum!
Keine Ahnung wie die dazu stehen!

Stellt sich aber auch die Frage, wie wir das organisieren, verlinken, weil ein Sprachwechsel nicht vom Wiki vorgesehen ist.
Zumindest habe ich es noch nicht entdeckt, aber die wissen bestimmt mehr.

Allerdings sind alle Frage zum Wiki bisher eher nicht beachtet worden :(
 
FPV1

Banggood

Oben Unten