Párhuzamos-soros konverter Arduinohoz

Megesik, hogy elfogynak a rendelkezésre álló pin-ek, mert túl sok eszközt csatlakoztatunk az Arduino boardunkra. Ilyenkor kellene valami ami lehetővé tenné, hogy kevesebb lábkihasználással több eszközt csatlakoztathassunk, erre használhatjuk a párhuzamos-soros konvertert vagy shift regisztert. A mi esetünkben ez egy 74HC595 típusú ic. A példa projektünkben 8db ledet fogunk vezérelni 3db Arduino kimeneten keresztül egy shift regiszter segítségével.

Alkatrészlista:

  • Arduino Uno

  • Usb kábel

  • Próbapanal

  • Összekötő vezetékek

  • 8db 5mm-es LED

  • 8db 270 ohmos ellenállás

  • 74HC595 Shift Register


A 74HC595 shift regiszterről:
A shift regiszter 8 memória helyet tartalmaz ami 0 vagy 1 értéket tud felvenni.(8 bit)
A clock órajelimpulzusra betölti a adatbemeneten a 8 bitértéket, minden impulzusra 1 újabb
bitet beolvasva a többit eggyel jobbra léptetve.
Aztán az ST_CP -t (latch pin) pozitív feszültségre húzva engedélyezzük a bit értékek kiíratását
a kimenetekre. A kapcsolásban a 10 pint (MR) +5V-re kell húzni, a 13 pint (OE) GND-re.

Kimenetek: Q1-Q7(1-7-ig), és a Q0(15)
Q7'(9):soros kimenet, ezen keresztül fűzhetünk össze több shift regisztert
MR inverz: a regisztert törli, aktív állapotban alacsony szinten van
SH_CP: órajel bemenet
ST_CP: latch pin
OE inverz: kimenet engedélyezés, aktív állapotban alacsony szinten
DS: Soros adat bemenet
Vcc: pozitív táp feszültség
 

Készítsük el az áramkört:

Maga a sketch:

/*
Adafruit Arduino - Lesson 4. 8 LEDs and a Shift Register
*/
int latchPin = 5; //a lanch változó kimenethez rendelése
int clockPin = 6; //idő változó kimenethez rendelése
int dataPin = 4; //adat változó kimenethez rendelése

byte leds = 0; //8bit-es változó létrehozása és kezdeti értékadása

void setup()
{
pinMode(latchPin, OUTPUT);
pinMode(dataPin, OUTPUT); // kimenetek beállítása
pinMode(clockPin, OUTPUT);
}

void loop()
{
leds = 0;// minden kimenet (led) kikapcsolása
updateShiftRegister(); //függvény meghívása, leds értéke elküldve shift regiszternek
delay(500); //1/2 sec várakozás
for (int i = 0; i < 8; i++) //i értékének növelése 8-ig
{
bitSet(leds, i); // leds változó i-edik értéke 1 , a többi 0
updateShiftRegister(); // függvény meghívása, leds értéke elküldve shift regiszternek
delay(500); //várakozás 1/2sec-ig aztán vissza a for ciklusig
}
}
void updateShiftRegister()
{
digitalWrite(latchPin, LOW); //latch alacsony szinten
shiftOut(dataPin, clockPin, LSBFIRST, leds);

//shift regiszterbe kiíratás, első két paraméter adat és az idő pin, a harmadik paraméter a kiolvasás

//iránya jobb szélső bittől kezdi (LSB), negyedik paraméter a tényleges bit adat a 'leds' változóban

digitalWrite(latchPin, HIGH); //latch magas szinten(kiíratás a kimenetekre)
}


A lényeg az hogy amit betárolunk a 8bit-es leds nevű változónkba azt íratjuk ki a shift regiszter
kimenetein. Pl.: a leds változóba berakjuk 00110011 bináris értéket, majd ezt az értéket kiküldjük
a programban látott módon a shift regiszterbe, akkor a regiszter kimenetei a bitmintában látottak szerint lesznek aktívak: 1.,2.,5.,6. led nem működik, 3.,4.,7.,8. led pedig működik.

A leds értékét lehet sokféle képpen variálni különböző mintákat kiíratva, érdemes próbálkozni
hisz evvel különböző eszközöket vezérelhetünk. Jó próbálkozást.