IR spårning torn med PIC och C (7 / 9 steg)
Steg 7: Testa och justera
Testrigg
Det enklaste sättet att testa detta är att montera servon tillsammans som i steg 5, och bifoga det kamera ombord med lite dubbelhäftande tejp. Det kan hjälpa att först montera kameran styrelsen på en bit av plast (Tic Tac box) att ge dig en bra yta att band till tilt servo.
Provning
Den enklaste beacon är en IR-fjärr, men eftersom de moduleras, prestanda är inte lika bra. Pixart kameran verkar reagera bättre till 940-950 nm IR-lysdioder, som du kan bara nypa runt ett mynt batteri. Jag gjorde denna wqith mycket goda resultat med en 940 nm ledde med en 90 graders synlighet kon. För att förbättra rundstrålande synlighet klustrade jag även 3 av dem parallellt som på bilden ovan.
Ganska mycket en IR källa fungerar inomhus och du kan justera kamerakänslighet för att få bästa resultat med din setup. Akta dig för glödljus, ljus, cigaretter och soliga fönster - de kan distrahera tornet förrän du har ställt in konfigurationen. Du kan också överväga att använda IR-pass filter från WiiMote eller från en annan IR-sensorn (från en trasig TV kanske). Det bästa är att ha en optiska lågpassfilter att matcha din ledstjärna lysdioder, men detta är tänkt för att vara ett billigt projekt :)
Försöka driva upp din testrigg. Det bör först centrerar sig, sedan vänta på en IR-källa. Steg tillbaka om 10 fot eller så och använda beacon. Servon ska flytta - om de inte flyttar korrekt, prova att byta pannan och tilt pluggar på moderkortet.
Tweaking
Pixart kamera Config
Denna länk kommer att spara mycket tid - jag tror allt du behöver veta om konfigurationen och några rekommenderade inställningar finns. http://wiibrew.org/wiki/Wiimote
Jag ska kortfattat relatera min erfarenhet här.
- Jag använde grundläggande utdata inställning som ger dig 10 byte av positionsuppgifter för upp till 4 BLOB. Det finns två andra nivåer som får du ytterligare information såsom storlek och intensitet (12 och 18 byte nyttolast, respektive - du skulle behöva öka den I2C läsa buffert accordinly), men jag inte använder det här.
- Finjustera blob storlek threshholds att filtrera bort oönskade störningar från windows, öppna spisar och glödljus.
- Att hålla maximal blob storlek liten är en bra början.
- Högre vinst innebär att det blir mer sensistive att störningar från reflektioner, andra IR källor etc., men ger bättre noggrannhet i positionering.
Jag fick ganska bra resultat inomhus (och ut på en mulen dag) med följande konfiguration och IR-pass filter som kommer i WiiMote.
statisk const uint8_t wiiCamInitData [14] [2] = {{0x30, 0x01}, < br >
/ * Känslighet config Block A * /
{0x00, 0x00}, {0x01, 0x00}, {0x02, 0x00}, {0x03, 0x00}, {0x04, 0x00}, {0x05, 0x00},
{0x06, 0x90}, / / p0: MAXSIZE: maximal storlek för blob. Wii använder värden från 0x62 till 0xc8
{0x07, 0x00},
{0x08, 0x41}, / / p1: få: Sensor få. Mindre värden = högre vinst
/ * Känslighet config Block B * /
{0x1A, 0x40}, / / p2: GAINLIMIT: Sensor få gräns. Måste vara mindre än vinst för kameran att fungera.
{0x1B, 0x00}, / / p3: MINSTORLEK: Minimum blob storlek. Wii använder värden från 3 till 5
/ * Läge config * /
{0x33, 0x01}, / / läge: 1 = basic, 3 = extended, 5 = full
< br > {0x30, 0x08}};
Servo vänden klassar
Kameran Returnerar koordinaterna på en 1028 x 768 x / y planet. Den har en FOV av ca 33 grader över och 23 grader hög. Det ger koordinater på en 1024 x 768 grid, så en grad är ca 30 bildpunkter. På grund av motringning tricket vi använde i tmr2.c har vi 9 bitar precision för 4ms (eller cirka 320 steg från 0.5ms till 2.5ms över 180 grader av servo resa) med servo signalen. Ökar CCPR för en PWM påverkar positionen av ca 0,6 grader.
För att förhindra jitter vi vill ange ett fönster som anses center är så att spåra smidigare och inte hyper-känsliga. I det här fallet har vi ett fönster 20 x 20 pixlar som anses center. Du kan spela med "center" rutan storlek att få resultat som passar dina behov.
Om koordinaterna returneras av kameran utanför fönstret, vi panorera eller luta i den riktningen. Jag delar pixel skillnaden med (20 * 3) för att jämna det ut och förhindra nickande effekten om du över rätt. Kameran är tillbaka koordinaterna cirka 60 gånger per sekund här, så vi måste jämna ut pan/tilt att hålla den från jering överallt.
875 och 375 är PWM värden som motsvarar 0,5 och 2,5 ms perioder på servo signalen (extrem vänster till höger på en servo).
void updatePan(void) {
om ((b1x == 0x00) || (b1x == 0xFF)) hemkomst.
om (b1x > 522) DcPan += (b1x-522)/(20*3);
om (b1x < 502) DcPan-= (502-b1x)/(20*3);
om (DcPan > 875) DcPan = 875;
om (DcPan < 375) DcPan = 375;
PWM2DCH = DcPan >> 2.
PWM2DCL = DcPan << 6.
}
void updateTilt(void) {
om ((b1y == 0x00) || (b1y == 0xFF)) hemkomst.
om (b1y > 394) DcTilt-= (b1y-394)/(20*3);
om (b1y < 374) DcTilt += (374-b1y)/(20*3);
om (DcTilt > 875) DcTilt = 875;
om (DcTilt < 375) DcTilt = 375;
PWM3DCH = DcTilt >> 2.
PWM3DCL = DcTilt << 6.
}
IR-Filter
Använda IR-filter från WiiMote är en bra idé om det inte är alltför repas upp. Annars kan du hitta dem i alla typer av kasserade elektronik.
IR-LED
940-950 nm rekommenderas. 880 fungerar också, men inte liksom ett avstånd.
Gemensamma frågor
Servo Back-och-Forth (över korrigering)
Prova DcTilt eller DcPan divideras med ett större numrerar att jämna ut panorering.
"Fastnar"
Servon kan dra för mycket ström - prova att använda en större kondensator på spänningsregulatorn.
Reagerar inte
Kan vara i ständig reset - servon kan dra för mycket ström för att hålla kameran eller IC från återställa. Kontrollera alla anslutningar och se om servon center när du slår på den.
Konstant återställa
Lågt batteri oftast (om inte något av ovanstående).