PICAXE kompas (1)
Tak jsem včera zahájil malý podzimní projekt s názvem "PICAXE kompas". Na letošním Robotickém dni jsem měl problém s orientací robotů na hřišti, pokud došlo k neočekávanému posunutí mého robota, například po střetu se soupeřem. Rád bych tedy svoje roboty doplnil o nějaké relativně levné čidlo absolutní polohy, zatím alespoň o elektronický kompas (magnetometr). Proto jsem na Aukru koupil jeden čínský modul GY-271 za cca 200 Kč (obsahuje tříosý magnetometr HMC5883L s rozhraním I2C). Myšlenka je taková, že nechci příliš zatěžovat hlavní procesor robota (v mém případě to je jen PICAXE 20M2 nebo PICAXE 20X2) zpracováním dat z magnetometru, takže zkusím měření průběžně zpracovávat dodatečným PICAXE 08M2 (za cca 50 Kč) a do hlavního procesoru posílat už zpracovaná data (filtrovaná, kalibrovaná a přepočítaná na azimut) pomocí klasického sériového rozhraní jako řetězec znaků (několikrát za sekundu).
Včera jsem tedy koupený modul poprvé propojil s PICAXE 08M2 (na nepájivém poli) a vyzkoušel první testovací program (jen pro výpis surových dat bez jakéhokoliv zpracování). Fungovalo to solidně. Holá data (jen naměřené hodnoty mg. pole v osách x, y, z) jsou ale nekalibrovaná a trochu se mění i bez pohybu čidla (obsahují určitý "šum"). Níže je uveden použitý testovací kód i se stručným popisem propojení.
#picaxe 08M2 #no_data ; zpracovani dat z I2C magnetometru HMC5883L (modul GY-271) ; C.0 - sertxd (seriovy vystup k PC nebo k dalsimu PICAXE) ; C.1 - SCL (k magnetometru) ; C.2 - SDA (k magnetometru) ; C.3 - in (nepouzito) ; C.4 - out (LED, pripojena pres odpor cca 800 ohm k zemi nebo k + napajeni) ; C.5 - serin (nepouzito) ; napajeni 5V (4x AA NiMH nabijitelne akumulatory) [PICAXE i modul] symbol x = w0 symbol y = w1 symbol z = w2 setfreq m32 ; zvyseni frekvence procesoru (max [8x]) pause 100 ; pockame na ustaleni napajeni a vstupu po startu sertxd ("PICAXE 08M2 kompas HMC5883L",CR,LF) hi2csetup i2cmaster, $3C, i2cslow_32, i2cbyte ; inicializace I2C na adrese 3C hi2cout 0, ( %00010000 ) ; Config A Default - 15Hz updates, Normal measurement hi2cout 1, ( %00100000 ) ; Config B Default - +/1Ga gain hi2cout 2, ( %00000000 ) ; Mode - Continuous conversion do pause 8000 ; pauza 1 sekunda hi2cin 3, ( b1,b0 , b3,b2 , b5,b4 ) ; nacteni holych dat z magnetometru (x,y,z) sertxd ("t:",#time," x:",#x," y:",#y," z:",#z,CR,LF) ; vypis casu a holych dat toggle C.4 ; kontrolni blikani LEDkou loop
V dalších dnech zkusím data trochu filtrovat (průměrovat), kalibrovat (posunout v jednotivých osách symetricky ke středu) a přepočítat do nějakého rozumného rozsahu (zatím mi asi bude stačit přesnost na 10°, tedy přepočítaný rozsah azimutu např. 0 - 35). Pokračování příště...