Prog Shield 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
- ↑ I2C scanner fra Arduinos hjemmeside