Prog Shield I2C Enheder

Fra Holstebro HTX Wiki
Skift til: navigering, søgning
Principskitse for tilslutning af I2C-Enheder

En del af de enheder der kan anvendes på Programmerings-Shieldet er I2C-enheder, hvilket betyder at de kommunikerer med Arduinoen via en I2C-Bus, der i praksis betyder at de skal have en 5V forsyning (i forhold til stel) og så to signaler SDA og SCK, der er en data-ledning og en clock-ledning, som på Arduinoen ligger på A4 og A5.

For at mange forskellige enheder kan kommunikere på de samme to ledninger er I2C-protokollen opbygget med at hver enhed har sin indbyggede adresse. På de fleste enheder er der ikke noget at gøre ved den adresse, den ligger fast, men enkelte moduler som I2C-Displayet kan indstille adresserne i et område (0x20 - 0x27), så man på den måde kan sætte 8 forskellige displays på samme Arduino.

Software

Koden her er hentet fra Arduinos side[1].

Den beskrevne kode kan hentes i denne ZIP-fil. Denne software fungerer ved at scanne efter tilsluttede I2C-enheder.

Anvendelsen af softwaren

Som alle andre typer software, så skal wire-biblioteker sættes op med de grundlæggende ting op for at kontakte biblioteket. Her defineres et Wire objekt med wire-kommunikationen i.

#include <Wire.h>

Inde i setup() skal biblioteket initialiseres med begin-metoden, og der sættes op til seriel kommunikation som vist her:

void setup() {
  Wire.begin();
 
  Serial.begin(9600);
  while (!Serial);             // Leonardo: wait for serial monitor
  Serial.println("\nI2C Scanner");
}

I loop() scannes hvert 5. sekund for alle adresser fra 0 til 127. Resultatet printes den i Serial Monitor.

void loop() {
  byte error, address;
  int nDevices;
 
  Serial.println("Scanning...");
 
  nDevices = 0;
  for(address = 1; address < 127; address++ )
  {
    // The i2c_scanner uses the return value of
    // the Write.endTransmisstion to see if
    // a device did acknowledge to the address.
    Wire.beginTransmission(address);
    error = Wire.endTransmission();
 
    if (error == 0)
    {
      Serial.print("I2C device found at address 0x");
      if (address<16)
        Serial.print("0");
      Serial.print(address,HEX);
      Serial.println("  !");
 
      nDevices++;
    }
    else if (error==4)
    {
      Serial.print("Unknow error at address 0x");
      if (address<16)
        Serial.print("0");
      Serial.println(address,HEX);
    }    
  }
  if (nDevices == 0)
    Serial.println("No I2C devices found\n");
  else
    Serial.println("done\n");
 
  delay(5000);           // wait 5 seconds for next scan
}

Hardware

De I2C-enheder der kan tilsluttes Programmerings-Shieldet skulle gerne have følgende adresser:

I2C-Enhed Adresse (hexadecimal)
I2C Display 0x27 (kan omkodes til 0x20-0x26)
Barometer BMP085 0x77
Barometer BMP180 0x77
Accelerometer MMA7660 0x4C
Gyroskop MPU6050 0x68
Kompas HMC5883 0x1E
Real Time Clock DS1307 0x68
Real Time Clock DS3231 0x68, 0x57

Referencer

  1. I2C scanner fra Arduinos hjemmeside