Oefeningen basis 1

Maak een schakeling met een PCF8574AN I/O expander en twee drukknoppen. Wanneer de ene drukknop ingedrukt wordt, moet op de uitgang van de PCF8574 een linkslopende volloper getoond worden. Bij indrukken van de andere knop moet dit een rechtslopende volloper zijn. Maak gebruik van de Wire bibliotheek.

Bepaal eerst welk adres je moet gebruiken om de PCF8574AN aan te sturen.

wat is een volloper?

Een volloper is een lichteffect waarbij eerst de uiterste led gaat branden, daarna de twee uiterste leds, daarna de drie uiterste leds enz... tot alle leds uiteindelijk branden. Daarna gaan alle leds uit en begint alles opnieuw

opgelet! domme gebruikers!

Ga er altijd van uit dat een gebruiker domme dingen gaat doen. Dat betekent dat de gebruiker bijvoorbeeld ook beide knoppen tegelijk kan indrukken. In dat geval moeten alle leds gedoofd blijven.

Je vindt meer info over de Wire bibliotheek en functies op https://www.arduino.cc/en/Reference/Wire

volgend

Oefeningen basis 2

Sluit enkele drukknoppen aan op de PCF8574 en lees hun toestand in op de Leonardo. Geef daarna de toestand weer via de seriële monitor.

Oefeningen gevorderd 1

sluit 4 drukschakelaars en 4 leds aan op de PCF8574. Laat elke schakelaar één led bedienen om de led te kunnen aan- en uitschakelen.

 

bibliotheken en Arduino

Eén van de sterke punten van de Arduino programmeeromgeving is het grote aanbod aan software bibliotheken. Het is mogelijk om grote stukken ingewikkelde code in een bibliotheek onder te brengen. Een andere gebruiker kan dan die bibliotheek integreren in zijn/haar programma en hoeft dus alleen maar de functies te kennen die de bibliotheek aanbiedt. We bekijken als voorbeeld de Wire bibliotheek, waarmee het mogelijk is om I²C elektronica aan te sturen.

bibliotheek toevoegen aan programma.

Om een bibliotheek te gebruiken moet deze eerst toegevoegd zijn aan de Arduino omgeving. De Wire bibliotheek is standaard al geïnstalleerd dus toevoegen is hier niet aan de orde. Om andere bibliotheken toe te voegen is de gemakkelijkste manier om gebruik te maken van de optie "bibiotheken beheren". Deze optie is te vinden via het menu: "Schets->Bibliotheek gebruiken". Via hetzelfde menu kunnen we de bibliotheek Wire kiezen.

In het programma zien we dan in het begin een regel toegevoegd:

#include <Wire.h>

Welke functies allemaal te vinden zijn in deze bibliotheek kan achterhaald worden via de officiële Arduino site. Via "Software->Reference" komen we op het overzicht van alle instructies. Onderaan deze pagina staat een link naar de libraries pagina, waar je een overzicht van de meeste bibliotheken terug kan vinden. Kiezen we daar de Wire bibliotheek, dan komen we op de specifieke pagina voor deze bibliotheek terecht, en zien we rechts een lijst van beschikbare functies.

bibliotheekfuncties gebruiken.

Door de #include instructie zijn al deze functies beschikbaar in ons eigen programma. Voor het aansturen van een PCF8574 is het bijvoorbeeld voldoende om in de setup een Wire.begin() functie op te nemen, en in de loop functie de combinatie

Wire.beginTransmission();
Wire.Write();
Wire.endTransmission();

op te nemen. Elk van deze functies moet natuurlijk nog de nodige parameters meekrijgen. Zo moet de functie beginTransmission() als parameter het adres van de chip meekrijgen waar men naar wil schrijven.

De Write() functie moet dan de waarde meekrijgen die moet geschreven worden.

De endTransmission() functie zorgt er voor dat de I²C-communicatie opgestart en uitgevoerd wordt.

voorbeeldprogramma's.

Elke goeie bibliotheek (ja, er zijn er ook slechte) bevat tevens een aantal voorbeeldprogramma's. Deze kunnen dikwijls als leidraad dienen om te zien hoe de functies best kunnen geïmplementeerd worden. Deze voorbeeldprogramma's zijn terug te vinden via "bestand->voorbeelden->naam van de bibliotheek".

 

 

potentiometer bestuurt looplicht

const int ds = 2;
const int stclk = 3;
const int shclk = 4;
const int analogIn = A0;

void setup()
{
  for(int i=2; i<=4;i++) {
      pinMode(i, OUTPUT);
  }
  pinMode(analogIn,INPUT);
}

void loop()
{
  int patroon=1;
  // bepaal de analoge waarde
  int analogeWaarde = analogRead(analogIn);
  if(analogeWaarde>127) { patroon=2; }
  if(analogeWaarde>255) { patroon=4; }
  if(analogeWaarde>383) { patroon=8; }
  if(analogeWaarde>511) { patroon=16; }
  if(analogeWaarde>639) { patroon=32; }
  if(analogeWaarde>767) { patroon=64; }
  if(analogeWaarde>895) { patroon=128; }
 
  for(int bit=0;bit<8;bit++) {
    if(bitRead(patroon,bit)==1) {
      digitalWrite(ds,HIGH);
    }
    else
    {
      digitalWrite(ds,LOW);
    }
    digitalWrite(shclk,HIGH);
    digitalWrite(shclk,LOW);
  }
  digitalWrite(stclk,HIGH);
  digitalWrite(stclk,LOW);
  // delay(500);
}
 

oplossing looplicht met twee schuifregisters (16 bit)

 

const int patroon[]={1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384,32768};
const int ds = 2;
const int stclk = 3;
const int shclk = 4;

void setup()
{
  for(int i=2; i<=4;i++) {
      pinMode(i, OUTPUT);
  }
}

void loop()
{
  int aantal=sizeof(patroon)/sizeof(patroon[0]);
  for(int i=0; i<aantal;i++) {
    for(int bit=0;bit<16;bit++) {
      if(bitRead(patroon[i],bit)==1) {
        digitalWrite(ds,1);}
      else {
        digitalWrite(ds,0);}
      // puls op shiftklok
      digitalWrite(shclk,HIGH);
      digitalWrite(shclk,LOW);
    }
    // puls op storage klok
    digitalWrite(stclk,HIGH);
    digitalWrite(stclk,LOW);
    delay(500);
  }
}