Les 10(I2C protocol)

Alleen lezen

Moderator: pe1br

Post Reply
pe1br
Posts: 66
Joined: Thu Apr 14, 2016 3:37 am

Les 10(I2C protocol)

Post by pe1br »

Les10-1:

Zorg er voor dat je alle voedingsspanningen los koppelt (usb niet aangesloten op de pc en geen power adapter aangesloten op de voedingsplug).
sluit de Arduino aan volgens onderstaand schema:


Start het Arduino programma en sluit de USB kabel aan.
Typ de volgende code over of kopieer deze naar de arduino ide:

Code: Select all

#include <Wire.h> //Laad de I2C bibliotheek

int i2cadres = 32; //Het I2C adres van de pcf8574
int options[] = {0, 16, 32, 64, 128}; //uitgangen van de pcf8574

void setup() {
  Wire.begin(); //start I2C
}

void loop() {
  for (int i = 0; i < 5; i ++) {       //tel van 0 tot 5 en stop deze waarde in i
    Wire.beginTransmission(i2cadres);  //open de I2C verbinding
    Wire.write(options[i]);            //Schrijf de waarde van i naar de pcf8574
    Wire.endTransmission();            //sluit de i2C verbinding
    delay(1000);                       //wacht 1 seconde
  }
}
Klik op de upload button.

Les10-2:

Typ de volgende code over of kopieer deze naar de arduino ide:

Code: Select all

#include <Wire.h> //Laad de I2C bibliotheek

int i2cadres = 32; //Het I2C adres van de pcf8574
int options[] = {0, 16, 32, 64, 128}; //uitgangen van de pcf8574
int options2[] = {0, 16, 48, 112, 240}; //uitgangen van de pcf8574 + de vorige uitgang

void setup() {
  Wire.begin(); //start I2C
}

void loop() {
  for (int i = 0; i < 5; i ++) {       //tel van 0 tot 5 en stop deze waarde in i
    Wire.beginTransmission(i2cadres);  //open de I2C verbinding
    Wire.write(options[i]);            //Schrijf de waarde van i naar de pcf8574
    Wire.endTransmission();            //sluit de i2C verbinding
    delay(1000);                       //wacht 1 seconde
  }
  for (int i = 0; i < 5; i ++) {       //tel van 0 tot 5 en stop deze waarde in i
    Wire.beginTransmission(i2cadres);  //open de I2C verbinding
    Wire.write(options2[i]);           //Schrijf de waarde van i naar de pcf8574
    Wire.endTransmission();            //sluit de i2C verbinding
    delay(1000);                       //wacht 1 seconde
  }
}
Klik op de upload button.

Vorige keer hebben we geleerd dat er veel voorbeelden op het internet staan.
Soms komt het ook voor dat je deze informatie niet op internet kunt vinden en zijn we aangewezen op de datasheet.
Download hier de datasheet van de pcf8574: http://forum.pe1br.nl/download/file.php ... iew&id=105

In de datasheet vind je altijd een globaal voorbeeld schema en de pinout van het IC:

Image

Voor een I2C component hebben we ook een I2C adres nodig.
Meestal kan een component meerdere I2C adressen gebruiken, zo kun je dus meerdere componenten van hetzelfde type op 1 I2C bus gebruiken:


Wij hebben pin A0, A1 en A2 aan GND gelegd, deze zijn dus laag.
Ons I2C adres is dus 64 wat overeen komt met 01000000 (6 nullen) in de tabel.
De Arduino I2C bibliotheek wil alleen het slave adres hebben en dus niet de R/W bit aan het eind hiermee komen we op 0100000 (5 nullen).
Deze waarde komt overeen met 32, het I2C adres in onze code.

De PCF8574 heeft nog meer gegevens nodig namelijk de pinnen die aangestuurd of uitgelezen moeten worden:

In het 2de blokje met data sturen we de waarde van de leds die we aan willen hebben.
Ook dit gaat weer binair (in enen en nullen).
We sturen het decimale getal voor 8 bits, voor wie niet binair kan rekenen hieronder een aantal voorbeelden:

Elk ledje kan 1 van de 8 poortjes zijn, wij hebben onze leds aangesloten op de poorten 16,32,64 en 128.
om al onze leds aan te sturen moeten we dus 11110000 sturen wat overeen komt met 240.

De data voor het afsluiten laten we door de bibliotheek afhandelen.
Dit alles bij elkaar hebben we dus verstuurd:
Wire.beginTransmission(i2cadres); het I2C adres zoals de bibliotheek deze hebben wil
Wire.write(options2); De waarde van de ledjes
Wire.endTransmission(); We laten de bibliotheek het afsluiten afhandelen.

Les10-3:
Gelukkig is het ook mogelijk om het I2C adres te scannen met de Arduino:
Typ de volgende code over of kopieer deze naar de arduino ide:

Code: Select all

#include <Wire.h>
     
void setup() {
  Wire.begin();
  Serial.begin(9600);
}
     
void loop() {
  byte error, address;
  int nDevices;
  nDevices = 0;
  for(address = 1; address < 127; address++ ) {
    Wire.beginTransmission(address);
    error = Wire.endTransmission();
    if (error == 0) {
      Serial.print("I2C device found at address ");
      Serial.println(address);
      nDevices++;
    }
    else if (error==4) {
      Serial.print("Unknown error at address ");
      Serial.println(address);
    }    
  }
  if (nDevices == 0) Serial.println("No I2C devices found\n");
  delay(5000);           // wait 5 seconds for next scan
}
Klik op de upload button en start de serial monitor.
Attachments
les-10-1_bb.jpg
(774.09 KiB) Not downloaded yet
pcf8574-pinout.png
(7.49 KiB) Not downloaded yet
binary-numbers.jpg
(51.15 KiB) Not downloaded yet
pcf8574bytes.png
(9.66 KiB) Not downloaded yet
pcf8574adress.png
(5.33 KiB) Not downloaded yet
pcf8574-i2cadres.png
(28.42 KiB) Not downloaded yet
pcf8574-schema.png
(34.11 KiB) Not downloaded yet
pcf8574(10).pdf
(1.57 MiB) Downloaded 1819 times
Post Reply