Výběr kompasu
Výběr kompasu
Dobrý den,
pořeboval bych poradit s výběrem kompasu do mobilního robotu. Rozhoduji se mezi těmito:
http://www.snailshop.cz/kombinovane-imu ... rrier.html
http://www.snailshop.cz/kompas/785-cmps10.html
Má někdo s některým z nich zkušenosti? Budou v budově dávat použitelné údaje, který bude přesnější? Mají oba dva kompenzaci náklonu a nebo se musí s náklonem u toho kombinovaného počítat zvlášť?
Předem děkuj.
pořeboval bych poradit s výběrem kompasu do mobilního robotu. Rozhoduji se mezi těmito:
http://www.snailshop.cz/kombinovane-imu ... rrier.html
http://www.snailshop.cz/kompas/785-cmps10.html
Má někdo s některým z nich zkušenosti? Budou v budově dávat použitelné údaje, který bude přesnější? Mají oba dva kompenzaci náklonu a nebo se musí s náklonem u toho kombinovaného počítat zvlášť?
Předem děkuj.
Re: Výběr kompasu
Ahoj. Mám trochu zkušeností jen s tím MinIMU-9. Přes I2C se z toho čtou data pěkně, ale jsou to jen "surová" data, bez kompenzace. Případná kompenzace náklonu se musí udělat programově mimo MiniIMU. Ověřil jsem si, že ta softwarová kompenzace není žádná legrace, protože pokud to chceš kompenzovat pomocí údajů z akcelerometru, tak v ruce to šlape dobře, ale jakmile se robot rozjede po trochu hrbolatější cestě, tak jsou data z akcelerometru tak "zašuměná" (jak akcelerometr kmitá), že se skoro "nedá určit kde je nahoře a kde dole". "Kompenzace" je pak mizerná a výsledky jsou skoro horší, než holá data z magnetometru. Tak se mi to alespoň chovalo pomocí standardních knihoven Arduina.
Nevím, jak dobře nebo špatně zvládá kompenzaci náklonu při rychlejším pohubu ten CMPS10.
Jinak musím konstatovat, že na Aukru se podobná IMU destička dá sehnat za cca 600 Kč (http://aukro.cz/gyroskop-akcelerometr-b ... 68583.html). Jednu jsem tam koupil a zatím se to chová velmi podobně, jako jednotka MinIMU-9 (tu jsem koupil o dost dříve a za víc peněz).
Samotný I2C magnetometr (bez kompenzace náklonu) se dá na Aukru pořídit i za méně, než 200 Kč (bez ceny za dopravu). Např. http://aukro.cz/hmc5883l-magnetometr-ko ... 10952.html
Nevím, jak dobře nebo špatně zvládá kompenzaci náklonu při rychlejším pohubu ten CMPS10.
Jinak musím konstatovat, že na Aukru se podobná IMU destička dá sehnat za cca 600 Kč (http://aukro.cz/gyroskop-akcelerometr-b ... 68583.html). Jednu jsem tam koupil a zatím se to chová velmi podobně, jako jednotka MinIMU-9 (tu jsem koupil o dost dříve a za víc peněz).
Samotný I2C magnetometr (bez kompenzace náklonu) se dá na Aukru pořídit i za méně, než 200 Kč (bez ceny za dopravu). Např. http://aukro.cz/hmc5883l-magnetometr-ko ... 10952.html
Re: Výběr kompasu
Ahoj, není to odpověď na dotaz, ale koukni se ještě na MPU-9150. Je to kompas+magnetometr+akcelerometr v jednom pouzdru s procesorem, který to umí zpracovat. Procesor má volatile paměť, takže je potřeba do něj při zapnutí nahrát nějakou binárku. To je ale docela pohodové. Dá se sehnat připájený na breakoutu.
Mělo by to mít v sobě teplotní čidlo, díky kterému se ten procesor uvnitř snaží kompenzovat drift (ale je možné, že ho obsahují i jiné digitální senzory). Moc jsem si s tím nehrál, jen mi to leží na stole.
Mělo by to mít v sobě teplotní čidlo, díky kterému se ten procesor uvnitř snaží kompenzovat drift (ale je možné, že ho obsahují i jiné digitální senzory). Moc jsem si s tím nehrál, jen mi to leží na stole.
“We’re all pathetic and creepy and can’t get girls. That’s why we fight robots.” –Kripke (TBBT)
Osobní web: adamh.cz
Osobní web: adamh.cz
Re: Výběr kompasu
Tak jsem koupil IMU destičku http://aukro.cz/show_item.php?item=3852118005 a teď se jí snažím zprovoznit.
Destička má tyhle piny:
P_eoc
P_xclk
T_int1
A_int1
M_drdy
Sda
Scl
Gnd
Vcc 3.3V
Vcc 5V
Zapojil jsem piny Gnd a Vcc 5V k napájení, Scl a Sda k Picaxe 08M2 společně se dvěma rezistory 4k7 tak jak tomu je v dokumentaci k Picaxe. Je potřeba zapojit i zbylé piny ?(kvůly nějaké inicializaci nebo něčemu podobnému) . Pic by měl s IMU komunikovat po I2C sběrnici.
Mám ukázkové programy pro Arduino ale neumím si je převést na programy pro Picaxe.
Je tu někdo kdo by s tím měl zkušenosti a byl mi ochoten pomoct?
Destička má tyhle piny:
P_eoc
P_xclk
T_int1
A_int1
M_drdy
Sda
Scl
Gnd
Vcc 3.3V
Vcc 5V
Zapojil jsem piny Gnd a Vcc 5V k napájení, Scl a Sda k Picaxe 08M2 společně se dvěma rezistory 4k7 tak jak tomu je v dokumentaci k Picaxe. Je potřeba zapojit i zbylé piny ?(kvůly nějaké inicializaci nebo něčemu podobnému) . Pic by měl s IMU komunikovat po I2C sběrnici.
Mám ukázkové programy pro Arduino ale neumím si je převést na programy pro Picaxe.
Je tu někdo kdo by s tím měl zkušenosti a byl mi ochoten pomoct?
Re: Výběr kompasu
Ahoj, myslím že s podobným typem mám základní zkušenosti. Zbylé piny není třeba zapojovat.
Můj funkční testovací program pro PICAXE 08M2 vypadá nějak takto:
Po nahrání programu do PICAXE je třeba stav a chod programu kontrolovat na terminálu (např. po stisku F8 v Programming Editoru). Rychlost terminálu musí být nastavena na 38400 bd (pro "setfreq m32").
Můj funkční testovací program pro PICAXE 08M2 vypadá nějak takto:
Kód: Vybrat vše
#picaxe 08M2
#no_data
; zpracování dat z I2C IMU modulu GY-80
; magnetom. HMC5883L, gyro L3G4200D, akcel. ADXL345 a tlak./tepl. BMP085 (neměřen)
; C.0 - sertxd (sériový výstup k PC nebo k dalšímu PICAXE)
; C.1 - SCL (k IMU)
; C.2 - SDA (k IMU)
; napájení 5V (např. 4x AA NiMH nabíjitelné akumulátory) [pro PICAXE i modul současně]
symbol MGMT_ADDR = 0x3C ; I2C adresa magnetometru HMC5883L
symbol GYRO_ADDR = 0xD2 ; I2C adresa gyroskopu L3G4200D
symbol GYRO_REG1 = 0x20
symbol GYRO_REG2 = 0x21
symbol GYRO_REG3 = 0x22
symbol GYRO_REG4 = 0x23
symbol GYRO_SREG = 0x27 ; status register
symbol GYRO_XINC = 0xA8 ; gyro data address
symbol ACC_ADDR = 0xA7 ; I2C adresa akcelerometru ADXL345
symbol xm = w0 ; měřená osa X magnetometru
symbol ym = w1 ; měřená osa Y magnetometru
symbol zm = w2 ; měřená osa Z magnetometru
symbol xg = w3 ; měřená osa X gyroskopu
symbol yg = w4 ; měřená osa Y gyroskopu
symbol zg = w5 ; měřená osa Z gyroskopu
symbol xa = w6 ; měřená osa X akcelerometru
symbol ya = w7 ; měřená osa Y akcelerometru
symbol za = w8 ; měřená osa Z akcelerometru
setfreq m32 ; zvýšení frekvence procesoru (max. 32 MHz [8x normal])
pause 100 ; počkáme na ustálení napájení a vstupů po startu
sertxd ("PICAXE 08M2 IMU s GY-80",CR,LF)
gosub setup
do
gosub readImu ; přečtení hodnot z IMU a jejich odeslání pres sertxd
pause 8000 ; nastavení rychlosti opakování (1x za sekundu)
loop
setup:
hi2csetup i2cmaster, MGMT_ADDR, i2cfast_32, i2cbyte ; inicializace I2C na adrese 3C (HMC5883L)
hi2cout 0, ( %01010100 ) ; config A - 4 averaged, 30Hz updates, normal measurement
hi2cout 1, ( %00100000 ) ; config B - 1.3Ga gain
hi2cout 2, ( %00000000 ) ; mode - continuous conversion
sertxd ("HMC5883L setup OK (magnetometr)",CR,LF)
hi2csetup i2cmaster, GYRO_ADDR, i2cfast_32, i2cbyte ; inicializace I2C na adrese D2 (L3G4200D)
hi2cout GYRO_REG3,(0x08)
hi2cout GYRO_REG4,(0x80)
hi2cout GYRO_REG1,(0x1f)
sertxd ("L3G4200D setup OK (gyro)",CR,LF)
hi2csetup i2cmaster, ACC_ADDR, i2cfast_32, i2cbyte ; inicializace I2C na adrese A7 (ADXL345)
hi2cout $2D, (8) ; measure enable
sertxd ("ADXL345 setup OK (akcelerometr)",CR,LF)
return
readImu:
sertxd (CR,LF,"time:",#time,CR,LF) ; výpis času (a větší odřádkování)
; data z magnetometru
hi2csetup i2cmaster, MGMT_ADDR, i2cfast_32, i2cbyte ; inicializace I2C na adrese 3C (mgmt)
hi2cin 3, (b5,b4, b3,b2, b1,b0) ; načtení holých dat z magnetometru (z,y,x)
sertxd ("magnetometr xm:",#xm," ym:",#ym," zm:",#zm,CR,LF)
; data z gyroskopu
hi2csetup i2cmaster, GYRO_ADDR, i2cfast_32, i2cbyte ; inicializace I2C na adrese D2 (gyro)
hi2cin GYRO_XINC, (b6,b7, b8,b9, b10,b11)
sertxd ("gyro xg:",#xg," yg:",#yg," zg:",#zg,CR,LF)
; data z akcelerometru
hi2csetup i2cmaster, ACC_ADDR, i2cfast_32, i2cbyte ; inicializace I2C na adrese A7 (accel)
hi2cin $32, (b12,b13, b14,b15, b16,b17)
sertxd ("acc xa:",#xa," ya:",#ya," za:",#za,CR,LF)
return
Re: Výběr kompasu
Díky za program, v mém IMU jsou stejné senzory jaké máš vypsané na začátku svého programu takže šlapal hned.
Nemáš někde nějaký návod jak hodnoty zpracovat?
Nemáš někde nějaký návod jak hodnoty zpracovat?
Re: Výběr kompasu
No, záleží na tom, co míníš tím pojmem "zpracovat". Já jsem zatím zkoušel jen nahrubo přepočítat hodnoty z magnetometru do "azimutu" (tedy polohy jedné roviny IMU vzhledem k severu). On je to občas docela problém u PICAXE 08M2, které umí jen kladná celá čísla do 65000 a nezná goniometrické funkce. Tak nějak jsem se s tím popasoval a výsledek posílám níže. Je to bez kalibrace, bez kompenzace náklonu a ještě s mizernou přesností, ale alespoň něco. Upozorňuju, že záleží na tom, jak je IMU otočen v prostoru (která plocha je nahoře). Musíš najít tu správnou polohu nebo experimentovat s výběrem načítaných hodnot z magnetometru (jestli zprcovávat osy X/Y, Y/Z nebo Y/Z a s jakými "znaménky").
Kód: Vybrat vše
#picaxe 08M2
#no_data
; zpracování dat z magnetometru I2C IMU modulu GY-80
; magnetom. HMC5883L
; C.0 - sertxd (sériový výstup k PC nebo k dalšímu PICAXE)
; C.1 - SCL (k magnetometru)
; C.2 - SDA (k magnetometru)
;
; Cílem je přepočítat hodnoty z magnetometru IMU na hodnotu Yaw (kurs, azimut).
; Spočítané hodnoty posílat alespoň 10x za sekundu přes sertxd jako Y:yyy
;
; Poznámky:
; - měřený rozsah v každé ose magnetometru je cca 1200 (+-600), šum cca 30
; - pro výpočet je využita tabulka přepočítaných hodnot ATAN
; - jeden přepočet atan2 trvá cca 3 - 4 ms (na frekvenci 32 MHz)
eeprom 0, (0,6,11,17,22,27,31,35,39,42,45) ; předpočítaná tabulka úhlů (atan)
symbol MGMT_ADDR = 0x3C ; I2C adresa magnetometru HMC5883L
symbol xm = w0 ; měřená osa X magnetometru
symbol ym = w1 ; měřená osa Y magnetometru
symbol zm = w2 ; měřená osa Z magnetometru
symbol yaw = w3 ; vypočítaný azimut (kurs, Yaw)
symbol uhel0 = w6 ; pomocný úhel (např. pro pamět prvního azimutu po zapnutí)
symbol uhel = b14 ; výsledný úhel po výpočtu arctan
symbol uhel2 = b15 ; pomocný úhel určený z tabulky
symbol tan100 = b16 ; tangens * 100 (X / Y * 100)
symbol index = b17 ; vypočítaný index do tabulky
symbol offset = b18 ; vypočítaný posun mezi body indexu
symbol kvadrant = b19 ; kvadrant azimutu podle hodnot X a Y
symbol x = w10 ; normalizovaná hodnota X (0 - 200)
symbol y = w11 ; normalizovaná hodnota Y (0 - 200)
symbol z = w12 ; normalizovaná hodnota Z (0 - 200)
symbol pom = w13 ; pomocná proměnná
setfreq m32 ; zvýšení frekvence procesoru (max. 32 MHz [8x normal])
pause 100 ; počkáme na ustálení napájení a vstupů po startu
sertxd ("PICAXE 08M2 kompas z IMU GY-80",CR,LF)
gosub setup
do
gosub readImu ; přečtení hodnot magnetometru z IMU, jejich přepočet na azimut a odeslání pres sertxd
pause 800 ; doladění prodlevy tak, aby se celý cyklus blížil 100 ms
loop
setup:
hi2csetup i2cmaster, MGMT_ADDR, i2cfast_32, i2cbyte ; inicializace I2C na adrese 3C (HMC5883L)
hi2cout 0, ( %01010100 ) ; config A - 4 averaged, 30Hz updates, normal measurement
hi2cout 1, ( %00100000 ) ; config B - 1.3Ga gain
hi2cout 2, ( %00000000 ) ; mode - continuous conversion
sertxd ("HMC5883L setup OK (magnetometr)",CR,LF)
return
readImu:
; data z magnetometru
hi2csetup i2cmaster, MGMT_ADDR, i2cfast_32, i2cbyte ; inicializace I2C na adrese 3C (mgmt)
hi2cin 3, ( b5,b4 , b3,b2 , b1,b0 ) ; načtení holých dat z magnetometru (z,y,x)
;sertxd ("magnetometr xm:",#xm," ym:",#ym," zm:",#zm,CR,LF)
x = xm + 600 / 6 ; normalizace X do max. rozsahu 0 - 200 se středem 100
y = ym + 600 / 6 ; normalizace Y do max. rozsahu 0 - 200 se středem 100
gosub atan2 ; výpočet úhlu z hodnot "x" a "y" (výsledek je v "pom")
yaw = pom
sertxd ("T:",#time," Y:",#yaw,CR,LF)
return
atan2:
; výpočet úhlu podle X a Y (arcustangens a kvadrant)
; hodnoty X a Y musí být předem normalizovány do rozsahu 0 - 200
; nula je na hodnotě 100 (pro X i pro Y)
if x>=100 then
x = x - 100
if y>=100 then
y = y - 100
kvadrant = 0
else
y = 100 - y
kvadrant = 3
endif
else
x = 100 - x
if y>=100 then
y = y - 100
kvadrant = 1
else
y = 100 - y
kvadrant = 2
endif
endif
tan100 = 100
if x>y then
tan100 = 100 * y / x
else if y>x then
tan100 = 100 * x / y
endif
; výpočet atan interpolací mezi dvěma předpočítanými hodnotami z tabulky (0 - 45°)
index = tan100 / 10
offset = tan100 % 10
read index,uhel
inc index
read index,uhel2
pom = uhel2 - uhel * offset / 10 + uhel
; posun azimutu do správného kvadrantu
if y>=x then
pom = 90 - pom
endif
if kvadrant = 1 or kvadrant = 3 then
pom = kvadrant * 90 - pom + 90
else
pom = kvadrant * 90 + pom
endif
return
Re: Výběr kompasu
Ten poslední program posílá do PC 0 ; 90 ; 180 ; 270 nebo 360 podle toho jak s kompasem otáčím. Musím si jej ještě pořádně projít ať vím jak to přepočítáváš.
Chci se ale ještě zeptat.
Když čtu data z kompasu a posílám je do PC těmahle příkazama:
A u toho otáčím kompasem vždy v jedné ose příjmané data mají hodnotu v intervalech 0-300 nebo 64000-65536 (300 a 64000 nejsou přesně je to plus mínus) ale nikdy se nezobrazí hodnota např. 2000 . Co jednotlivé bity b0 - b5 znamenají? Vím jen že b0,b1 je pro osu X b2,b3 pro Y a b4,b5 pro Z.
Chci se ale ještě zeptat.
Když čtu data z kompasu a posílám je do PC těmahle příkazama:
Kód: Vybrat vše
hi2cin 3, (b5,b4, b3,b2, b1,b0 ) ; načtení holých dat z magnetometru (z,y,x)
sertxd (xm:",#w0," ym:",#w1," zm:",#w2,CR,LF)
Re: Výběr kompasu
Zapomněl jsem napsat, že před nahráváním programu do procesoru musíš alespoň jednou odstranit direktivu "#no_data", protože jinak se ta předpočítaná tabulka nenahraje do EEPROM, odkud se pak hodoty berou do výpočtu. Teď jsou tam zřejmě nuly a výpočet samozřejmě blbne. Po úspěšném nahrání dat do EEPROM můžeš direktivu "#no_data" vrátit do programu (pro zrychlení nahrávání) a naopak klidně můžeš zakomentovat řádek s "eeprom" na začátku. Data budou v EEPROM držet, dokud bys je případně nepřepsal např. jiným příkazem "eeprom".
Jinak b0 až b5 nejsou bity, ale bajty. Protože hodnoty z magnetometru jsou v rozsahu 0 - 65536, tak jsou předávány dvoubajtově (v PICAXE platí, že bajty b0 a b1 vlastně dohromady tvoří slovo w0, bajty b2 a b3 jsou vlastně w1, atd. (viz definice xm, ym a zm na začátku programu). Když tedy něco načtu do bajtů b0 a b1, nastavím tím současně i dvoubajtovou hodnotu w0 (tedy v tomto případě proměnnou "xm"). Ty vysoké hodnoty poblíž 65000 vlastně znamenají malé záporné hodnoty.
Jak už jsem psal, tak ten můj program neobsahuje žádnou solidní "kalibraci", což je přizpůsobení výpočtu skutečným hodnotám, čteným z magnetometru. Pokud by ve Tvém případně magnetometr dával jiné hodnoty, než +- 600, případně by byla posunuta "nula", tak případně experimentuj v programu s úpravami níže uvedených řádků, kde místo 600 dej nějakou vyšší hodnotu, např. 800 nebo 1000. Je to taková nouzová "ruční kalibrace". Možná to ale nebude třeba a mnou experimentálně určená hodnota 600 bude vyhovovat i ve Tvém případě.
Možná lze v celočíselné aritmetice PICAXE nějak rovnou použít i ty "záporné" hodnoty kolem 65000, ale já to neumím, takže to všechno posunuju "nad nulu" (když v PICAXE k číslu 65000 přičteš 600, tak to "přeteče" přes těch maximálních 65536 a výsledek bude 64 [nikoliv 65600]).
Jinak b0 až b5 nejsou bity, ale bajty. Protože hodnoty z magnetometru jsou v rozsahu 0 - 65536, tak jsou předávány dvoubajtově (v PICAXE platí, že bajty b0 a b1 vlastně dohromady tvoří slovo w0, bajty b2 a b3 jsou vlastně w1, atd. (viz definice xm, ym a zm na začátku programu). Když tedy něco načtu do bajtů b0 a b1, nastavím tím současně i dvoubajtovou hodnotu w0 (tedy v tomto případě proměnnou "xm"). Ty vysoké hodnoty poblíž 65000 vlastně znamenají malé záporné hodnoty.
Jak už jsem psal, tak ten můj program neobsahuje žádnou solidní "kalibraci", což je přizpůsobení výpočtu skutečným hodnotám, čteným z magnetometru. Pokud by ve Tvém případně magnetometr dával jiné hodnoty, než +- 600, případně by byla posunuta "nula", tak případně experimentuj v programu s úpravami níže uvedených řádků, kde místo 600 dej nějakou vyšší hodnotu, např. 800 nebo 1000. Je to taková nouzová "ruční kalibrace". Možná to ale nebude třeba a mnou experimentálně určená hodnota 600 bude vyhovovat i ve Tvém případě.
Kód: Vybrat vše
x = xm + 600 / 6 ; normalizace X do max. rozsahu 0 - 200 se středem 100
y = ym + 600 / 6 ; normalizace Y do max. rozsahu 0 - 200 se středem 100
Re: Výběr kompasu
S EEPROM jsem u picaxe ještě nedělal tak jsem nevěděl že mám ten řádek smazat. Teď už ukazuje dobře.
Ty bajty u picaxe chápu jen jsem špatně napsal bity místo bajty. Nevěděl jsem kde z těch hodnot z kompasu je nula. Takže pokud jsem to dobře pochopil tak nula je nula a kladné hodnoty jsou od nuly kladné čísla a záporné hodnoty jsou od 65536 do nuly? Takže když kompas naměří hodnotu -300 tak mi pošle 65236 a já se k hodnotě -300 dostanu tak že vypočtu 65236-65536= -300 (samozřejmě takové počty ne v picaxe). Chápu to dobře?
Ty bajty u picaxe chápu jen jsem špatně napsal bity místo bajty. Nevěděl jsem kde z těch hodnot z kompasu je nula. Takže pokud jsem to dobře pochopil tak nula je nula a kladné hodnoty jsou od nuly kladné čísla a záporné hodnoty jsou od 65536 do nuly? Takže když kompas naměří hodnotu -300 tak mi pošle 65236 a já se k hodnotě -300 dostanu tak že vypočtu 65236-65536= -300 (samozřejmě takové počty ne v picaxe). Chápu to dobře?