Track 1

In deze track gaan we een pittig onderdeel behandelen: het schuifregister. Een schuifregister is een hele handige chip om een paar extra pinnen aan je Arduino toe te voegen of een aantal componenten makkelijker gezamenlijk aan te spreken. Het schuifregister zelf kan in het begin lastig zijn om aan de praat te krijgen, maar als je het eenmaal werkend hebt, heb je er heel veel profijt van!

Deze track is vooral bedoeld als naslagwerk en voor als je zelf een keer met een schuifregister wilt gaan werken. Hij zat vroegen in het standaard programma, maar door de veranderingen vanwege de Corona-crisis is deze er tussenuitgevallen. Toch leek het me wel handig om deze pagina in de site te laten staan.

7-segment display

Voordat we het schuifregister gaan bespreken, gaan we een component bespreken die vaak aangesproken wordt met een schuifregister. Op die manier krijg je meteen te zien waarom een schuifregister zo handig kan zijn. Tijdens het project kan het voorkomen dat je ergens een tellertje voor wilt gebruiken. Daarvoor kun je een 7-segment-display gebruiken. Een 7-segment-display kan met 7 leds alle mogelijke getallen van 0 tot 9 tonen. Daarnaast is er een 8e led waarmee een decimale punt is te tonen. In het schema uit figuur 4.1 is te zien via welke pinnen van het display de leds aan te sturen zijn.

Figuur 4.1: De layout van een 7-segment-display

Een 7-segment-display heeft altijd een common cathode (gezamenlijke -) of een common annode (gezamenlijke +). Dat zijn de pinnen waar in het schema de tekst 'com' bij staat. Welk type display je zelf hebt, kun je opzoeken op het internet door het nummer wat (waarschijnlijk) ergen op het display staat te Googlen. Je kunt het echter ook zelf uitproberen door een weerstand aan te sluiten op de common poort en deze met een andere pin tussen de 5V en een Ground te verbinden. Als er geen ledje gaat branden moet je de aansluitingen omdraaien en moet er wel een led gaan branden. Dan weet je meteen of je een common cathode en annode hebt.

Let op! Denk er dus aan dat ook een 7-segment-display een weerstand nodig heeft! Dit kan dus een enkele weerstand aan een com-pin zijn, die met de Arduino is verbonden. Dit geldt ook als je zo dadelijk het display op een schuifregister gaat aansluiten!

Download de 7-segment-display opdracht

Schuifregister

In het vorige blok hebben jullie geleerd hoe je een 7-segment-display moet aansturen. Nu is het zonde om 8 pinnen van je Arduino op te offeren aan een display, zeker als je meerdere van deze displays wilt gebruiken. Om dat op te lossen bestaan er schuifregisters (shiftregister in het Engels). In afbeelding 4.2 zie je zo'n schuifregister staan.

Figuur 4.2: Het 74HC595N schuifregister

Om goed uit te kunnen leggen hoe een schuifregister werkt, hebben we een filmpje opgenomen. Pak dus je oortjes er weer bij en bekijk het onderstaande filmpje.

Tijd om iets dieper in de manier hoe je een schuifregister gebruikt te duiken. Dat doen we aan de hand van de layout van het schuifregister in figuur 4.3.

Figuur 4.3: De layout van het 74HC595N schuifregister

Op je schuifregister zie je aan een van de kanten een halve cirkel. Dit is de bovenkant van je schuifregister en komt in de afbeelding overeen met de kant waar het cirkeltje staat weergegeven. Je ziet in het diagram een VCC en een GND pin. De VCC is de pin om het register van stroom te voorzien en koppel je aan de 5V van je Arduino. De GND pin is de Ground pin van het schuifregister en koppel je aan een Ground van je Arduino.

Daarnaast zie je 8 Q pinnen, lopend van Q0 - Q7. (De Q7' laten we hierbij even buiten beschouwing) Dit zijn de pinnen waar de waarde van het desbetreffende bit op staat. Als het eerste bit in het register een 1 bevat, zal Q0 een hoog signaal uitsturen. Bevat het eerste bit in het register daarentegen een 0, dan zal Q0 een laag signaal uitsturen. Dit geld op dezelfde wijze ook voor de andere Q pinnen.

Hieronder een overzicht van de overige zes pinnen en hun functie:

Nu je van alle pinnen weet wat ze doen, is het de hoogste tijd om naar de code te kijken waarmee je dit schuifregister laat werken. Onder het codefragment leggen we weer precies uit wat de code doet.

const int latchPin = 8;
const int clockPin = 12;
const int dataPin = 11;
int VALUE = 0b11011010;

void setup() {
 pinMode(latchPin, OUTPUT);
 pinMode(clockPin, OUTPUT);
 pinMode(dataPin, OUTPUT);

 digitalWrite(latchPin, LOW);
 shiftOut(dataPin, clockPin, LSBFIRST, VALUE);
 digitalWrite(latchPin, HIGH);
}

void loop() {

}

Bron: https://www.arduino.cc/en/Tutorial/ShftOut11

Bovenaan de code worden de drie pinnen om het schuifregister aan te spreken, opgeslagen in een variabele. Daarna maken we een vierde variabele aan om de byte in op te slaan die we naar het schuifregister willen sturen. Aangesloten op een 7-segment-display geeft deze byte het getal 2 weer. Het voorvoegsel 0b (nul-B) geeft aan dat we een binaire waarde meegeven.

In de setup() functie stellen we eerst alle pinnen in als output. Vervolgens zetten we de latchPin van het schuifregister laag, zodat we de byte het schuifregister in kunnen sturen. Daaronder zie je de shiftOut(dataPin, clockPin, LSBFIRST, VALUE) functie. Dit is de functie die voor ons al het werk uit handen neemt. Van links naar rechts geven we aan wat de dataPin en de clockPin van het schuifregister zijn, of we de byte LSBFIRST of MSBFIRST het schuifregister in willen sturen en tot slot de byte die we in het schuifregister willen hebben. Het verschil tussen LSBFIRST en MSBFIRST is of er bij het wegschrijven wordt begonnen bij het linker (MSBFIRST) of het rechter (LSBFIRST) bit. Het juist aanspreken van de clockPin en de dataPin wordt volledig door deze functie afgehandeld.

Download de Schuifregister opdracht

Track 1 eindopdracht

Omdat het eigenlijk niet mogelijk is om een extra opdracht met het schuifregister te bedenken, die daadwerkelijk wat toevoegt aan de vorige opdracht, is de vorige opdracht meteen de eindopdracht voor deze track. Een extra uitdaging die je voor jezelf kunt stellen is om een programma te schrijven dat het display van 0 t/m 9 laat tellen, waarbij iedere tel 1 seconde duurt.