Fun with HMC6352 magnetometer27.dec 2010
     A year ago I have bought a electronic compass module based on Honeywell HMC6352 chip from ebay. You can get this small board for $50 from www.seeedstudio.com. For the first experiments I connected this module to microchip 44-pin demo board that comes with PicKit2 programmer. After some troubles finding I2C communication protocol routines I have developed my own small I2C bit banging module in C. To make whole device portable I have soldered two double pins on the board to hold the 3.6V SAFT battery I used in my previous projects. The communication with PC is through bluetooth wireless channel. For this purpose I have used my favourite ConnectBlue OEMSPA310 Bluetooth module. Everything is directly connected to the demo board without any passive or active components.
Unfortunatelly when I was writing this description, I couldn't find the compass module, nor the bluetooth module. But I hope the image is self-explanatory.
The compass module provides 2 useful informations - rotation in degrees with 0.1° resolution (heading) and elevation in degrees. Unfortunatelly this cheap module does not provide reliable elevation information. And the rotation is reliable only when the device is parallel to the ground plane. Any elevation will cause partial error to the heading information.
Small OpenGl based application opens communication port to the bluetooth module and communicates with the PIC16F887 microprocessor that translates the serial port commands to the I2C commands. Application renders cube that rotates based on the angle the magnetometer gives.
As I said, I cannot reproduce the results, but I remember that it together really looked amazing :)
For the readers this project should be interesting because it connects the Opengl with microchip pic projects.
     Neviem presne, ale asi pred rokom som si na ebay.com objednal modul elektronickeho kompasu, ktory bol postaveny na cipe HMC6352. Dnes uz to v ponuke ebayu neviem najst, ale pamatam si ze to predavalo www.seeedstudio.com a na ich stranke sa da najst tento modul v cene okolo $50. Z modulu su vyvedene 4 piny: SDA a SCL tvoriace I2C komunikacny kanal, a samozrejme napajanie. Toto je dostatocne flexibilne - modul si vystaci s napatim v rozsahu 2.7V az 5.2V. Prve pokusy som realizoval na Microchip 44-pin demo doske ktora sa dodava spolu s programatorom PicKit2. Dosku som pre taketo ucely trosku upravil. Na obrazkoch je vidiet prilepena lista tavnou pistolou na ktoru su vyvedene vsetky dolezite piny. Na zaciatok listy je pripojeny cely 8 bitovy PortB. Cize najvrchnejsi pin listy je RB0. Na spodku je seriove komunikacne rozhranie a napajanie.
Modul HMC6352 je pripojeny priamo na zaciatok listy, cize pin SDA modulu zpodoveda RB0 na demo doske, SCL - RB1, zem - RB2 a napajanie - RB3. Zdrojovy kod v jazyku C (kompilator HiTech) nakonfiguruje vhodne tieto piny aby poskytovali napajacie napatie modulu. Taketo riesenie bolo provizorne, ale nevyzadovalo ziadne modifikacie do dosky ktoru som uz takto mal upravenu. Na spodku listy je pripojeny moj oblubeny bluetooth modul ConnectBlue cbOemSpa310.
Aby bolo cele zariadenie mobilne, na dosku som priletoval dva dvojpiny z lamacej listy do oblasti urcenej na uzivatelske zapojenia. Na obrazku je to celkom dobre vidiet a do takehoto uchytu vyborne pasuje bateria SAFT LS14250. Tato ma rozmer polovicnej AA baterie a je velmi prakticka pre taketo ucely.
Program v mikropocitaci PIC sprostredkuje rozhranie medzi prikazmi prijatymi zo serioveho bluetooth rozhrania a I2C komunikacnym kanalom s pripojenym elektronickym kompasom. Najprv som na internete hladal pouzitelnu kniznicu s I2C komunikacnymi funkciami - no kedze bolo moje hladanie neuspesne, pokusil som sa navrhnut vlastne. Cele to funguje celkom spolahlivo, odoslanim riadiacich prikazov (znakov) sa da nastavit ake hodnoty ma modul HMC6352 reportovat po seriovej linke. Zaujimave su tu v podstate tieto: Magnetometer X (heading) - bud mozeme spracovavat surove data alebo hodnotu v stupnoch s rozlisenim 0.1°. Tato hodnota zodpoveda natoceniu cipu vzhladom na sever. Potom je tam hodnota Magnetometer Y, ktora zodpoveda uhlu natocenia oproti rovine zeme - cize je to elevacia. Nanestastie tento modul patri do kategorie "lacnych" a tomu zodpoveda aj vystupna hodnota. Hodnota rotacie je spolahliva iba ak cely modul lezi rovnobezne s rovinou zeme. Lubovolne naklonenie sa premietne ako chybova hodnota do rotacie. Hodnota z Magnetometra Y sa pre mna javila ako kompletne nepouzitelna. Samozrejme ze netreba zabudnut zariadenie skalibrovat. Cez seriove rozhranie treba programu odoslat znak "c" ktory spusti kalibracny proces na 20 sekund. Pocas tohoto casu treba zariadenie otocit okolo svojej osi (aspon) dvakrat. Je vyhodne vykonat tuto rotaciu s co najrovnomernejsim pohybom.
A teraz prichadzame na tu veselsiu cast - graficka reprezentacia. Kedze sa jedna o rotaciu, napadlo ma ze co tak vyuzit OpenGL a v trojrozmernom priestore rotovat nejaky predmet na zaklade udaja z magnetometra X. Vyuzil som nejaky svoj stary projekt z ktoreho sa neskor mala stat jednoducha logicka hra - no ako to byva, projekt zapadol prachom a nebol cas sa mu venovat. V scene sa vygeneruje kocka zostavena z farebnych guliciek. Rotovanie modelu je prepojene s hodnotou heading ziskanou po bluetooth komunikacnom kanali s mikropocitacom PIC. Cele zostavene zariadenie (demo doska, HMC6352 modul, bluetooth modul a bateriu) som vlozil do nepriehladnej krabicky. Teraz ako som krabicku otacal, rovnako sa otacal aj model na obrazovke a cele to posobilo velmi efektnym dojmom.
Nanestastie nemozem tento experiment zreprodukovat, pretoze som nenasiel ani elektronicky kompas ani bluetooth modul. Bud som to niekomu pozical, alebo sa to jednoducho v mojom pracovnom bordeli stratilo. Neexistuje ani video dokazujuce funkcnost zariadenia, ale ja verim ze mi verite ze vsetko fungovalo tak ako to popisujem.
Koniec koncov tento clanok bude zaujimavy urcite pre mikropocitacistov pretoze spaja svet osembitov a 3d svet opengl :)