niedziela, 22 lipca 2012

BMA180 i Arduino cz. 1

Jakiś czas temu zakupiłem moduł z akcelerometrem BMA180. Jednakże od początku były jakieś "ale". Pierwsza sprawa to cyfrowy interfejs - nie wystarczy mierzyć napięć, trzeba być dość rozmownym, by wydostać dane z układu. Drugim problemem był brak biblioteki dedykowanej na Arduino. Co prawda w sieci znalazłem nieoficjalne wsparcie, ale... Dlaczegóż by nie napisać czegoś samemu? No i trzeci problem - niezgodniość poziomów logicznych. Układ BMA180 pracuje w logice 3.3V,  natomiast Arduino w 5V.

Jak mawiają ludy anglojęzyczne "first things first" - jeśli chcemy używać układu trzeba mieć konwerter. Można go zakupić, zresztą wiele nie kosztuje, ale dostawa chwilę trwa. Można zbudować, schemat jest dostępny na stronie producenta, ale... Trzeba mieć odpowiednie tranzystory. Jak się okazało tranzystorów BSS138 nie mogłem dostać w znanych mi wrocławskich sklepach, więc trzeba było improwizować. Z tego typu tranzystorów łatwo dostać BS170, więc...

Schemat ideowy części konwertera:



A moduł wygląda tak:


Przed rozpoczęciem pracy z modułem trzeba się zdecydować, przez jaki interfejs będziemy się komunikować z układem. Mamy do dyspozycji SPI (4 przewody) i I2C (2 przewody). Osobiście wolę I2C, więc dalsze rozważania będą brać po uwagę tylko ten interfejs.

Jeśli chcemy włączyć komunikację po I2C, wystarczy na pinie CS ustawić stan wysoki (jak się można domyślić, stan niski przełącza komunikację na SPI).

Kompletny schemat układu poniżej:


Po podłączeniu otrzymujemy coś takiego:



Najmniej skomplikowanym sposobem weryfikacji połączenia jest odpytanie układu o jego ID:

#include 
#include 


#define BMA180_ADDR 0x40
#define CHIP_ID     0x00

byte val;

void setup() {
  Serial.begin(9600);
  Wire.begin();
  val = readI2C((uint8_t)CHIP_ID);
  Serial.print("CHIP_ID=");
  Serial.println(val);
}

void loop() {
}

byte readI2C(uint8_t offset) {
  byte val;
  Wire.beginTransmission(BMA180_ADDR);
  Wire.write((uint8_t)offset);
  Wire.endTransmission();

  Wire.requestFrom(BMA180_ADDR, 1);
  while (Wire.available()) {
    val = Wire.read();  
  }
  return val;
}

Jeśli w terminalu otrzymam wartość CHIP_ID=3,

 możemy zaczynać bardziej skomplikowane zabawy z akcelerometrem. 

1 komentarz:

  1. A co powiesz o tej platformie?
    http://www.raspberrypi.org/quick-start-guide

    OdpowiedzUsuń