Výběr kompasu

viki
Příspěvky: 42
Registrován: 14 pro 2013, 22:23

Výběr kompasu

Příspěvek od viki »

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.
AlesH
Příspěvky: 323
Registrován: 25 úno 2013, 09:18

Re: Výběr kompasu

Příspěvek od AlesH »

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
Uživatelský avatar
adamh
Příspěvky: 62
Registrován: 24 úno 2013, 23:10
Bydliště: Opava / Praha
Kontaktovat uživatele:

Re: Výběr kompasu

Příspěvek od adamh »

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.
“We’re all pathetic and creepy and can’t get girls. That’s why we fight robots.” –Kripke (TBBT)
Osobní web: adamh.cz
viki
Příspěvky: 42
Registrován: 14 pro 2013, 22:23

Re: Výběr kompasu

Příspěvek od viki »

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?
AlesH
Příspěvky: 323
Registrován: 25 úno 2013, 09:18

Re: Výběr kompasu

Příspěvek od AlesH »

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:

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
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").
viki
Příspěvky: 42
Registrován: 14 pro 2013, 22:23

Re: Výběr kompasu

Příspěvek od viki »

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?
AlesH
Příspěvky: 323
Registrován: 25 úno 2013, 09:18

Re: Výběr kompasu

Příspěvek od AlesH »

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
viki
Příspěvky: 42
Registrován: 14 pro 2013, 22:23

Re: Výběr kompasu

Příspěvek od viki »

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:

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)
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.
AlesH
Příspěvky: 323
Registrován: 25 úno 2013, 09:18

Re: Výběr kompasu

Příspěvek od AlesH »

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

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
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]).
viki
Příspěvky: 42
Registrován: 14 pro 2013, 22:23

Re: Výběr kompasu

Příspěvek od viki »

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?
Odpovědět