Arduino Shift register
Leestijd: 4 Minuten
Ze liggen al een tijdje in de la, de 74HC595 shift register (Datasheet). Ik vond altijd al dat AtTiny’s in sommige gevallen te weinig output pins hadden. Mede hierdoor heb ik een aantal 74HC595 gekocht op Ebay, maar tot op heden nog nooit gebruikt.
Met deze shift register kan je door middel van die pins op bijvoorbeeld je Arduino of Attiny 8 digitale outputs aan of uitzetten. Je hebt hiervoor drie pins nodig. Een Clock, een data en een Latch. Wanneer je met een Logic analyzer gaat kijken wat er gebeurt zie je de logica. In het stukje wat ik heb gerecord stuurt Arduino getallen opeenvolgend naar de shift register.
Je ziet dat de zwarte wire (channel 0), één byte verstuurd in het tempo van het clock signaal (channel 2). En wanneer de latch (channel 1/bruin) weer high gaat is één byte verstuurd. En wanneer je de binare getallen gaat omrekenen naar decimalen.
- 00011110 = 30
- 00011111 = 31
Wanneer je dus 8 keer een 1 stuurt en vervolgens de high signaal geeft op de latch output. dan zijn alle ledjes aan, je stuurt binaire gegevens naar je shift register. Je kan zelfs meerdere shift registers aan elkaar koppelen zodat je met nog steeds drie digitale pinnen in gebruik 16 outputs hebt.
Arduino
Zie onderstaande afbeelding hoe je dit aansluit op je breadboard (Meer info)
- GND (pin 8) naar ground
- Vcc (pin 16) naar 5V
- OE (pin 13) naar ground
- MR (pin 10) naar 5V
Het enigste nadeel aan deze setup is dat wanneer je de Arduino opstart alle ledjes aangaan. Je kan dit voorkomen om ook de OE en de MR pin te controleren met je Arduino. Maar op deze manier hou je meerdere Arduino pins over.
- DS (pin 14) naar Ardunio DigitalPin 11
- SH_CP (pin 11) naar to Ardunio DigitalPin 12
- ST_CP (pin 12) naar Ardunio DigitalPin 8
Deze worden ook wel de dataPin, de clockPin en de Latchpin genoemd. Wanneer de lampjes flikkeren is het mogelijk om een 0.1uF capacitor te plaatsen tussen de latchPin en de ground hiermee wordt dit uitgevlakt.
De code
En de code voor je Arduino
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 |
// Set Pins int latchPin = 8; int clockPin = 12; int dataPin = 11; // create variables int ispeed; int output; boolean up; void setup() { // initialise pin states pinMode(latchPin, OUTPUT); pinMode(clockPin, OUTPUT); pinMode(dataPin, OUTPUT); } void loop() { // initialise variable states up = true; output = 1; ispeed = 40; // scanner style led scrolling for (int j = 0; j < 253; j++){ // count from 0 to 255 and display the number // on the LEDs // take the latchPin low so // the LEDs don't change while you're sending in bits: digitalWrite(latchPin, LOW); // shift out the bits: shiftOut(dataPin, clockPin, MSBFIRST, output); //take the latch pin high so the LEDs will light up: digitalWrite(latchPin, HIGH); // pause before next value: if (up){output = output << 1;} else {output = output >> 1;} if ((output == 0b10000000) || (output == 0b00000001)){up = !up;} delay(ispeed); } // refresh rate example for (int j = 0; j < 200; j++){ // count from 0 to 255 and display the number // on the LEDs output = 1; for (int i = 0; i < 8; i++) { // take the latchPin low so // the LEDs don't change while you're sending in bits: digitalWrite(latchPin, LOW); // shift out the bits: shiftOut(dataPin, clockPin, MSBFIRST, output); //take the latch pin high so the LEDs will light up: digitalWrite(latchPin, HIGH); // pause before next value: output = output << 1; delay(ispeed); } if(ispeed > 1){ispeed = ispeed-1;} } // binary counter ispeed = 250; for (output = 0; output < 256; output++){ // take the latchPin low so // the LEDs don't change while you're sending in bits: digitalWrite(latchPin, LOW); // shift out the bits: shiftOut(dataPin, clockPin, MSBFIRST, output); //take the latch pin high so the LEDs will light up: digitalWrite(latchPin, HIGH); // pause before next value: delay(ispeed); } } |