PICAXE kompas (1)

17.09.2013 20:33

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ě...