יום שבת, 21 ביולי 2012

Arduino Shift Register Guide



ל Arduino יש סה"כ 14 כניסות \ יציאות דיגיטליות שעלולות להיגמר לנו מהר מאוד, מסכים ו Leds עלולים "לשתות" לנו את כל הכניסות\ היציאות ובעצם להגביל אותנו לכמות הרכיבים שנוכל לחבר, כאן ה Shift Registers נכנסים לתמונה ומאפשרים לנו להרחיב את כמות הכניסות \ יציאות ולנהל אותם בעזרת ה Arduino.

דרישות:

  • Arduino Uno
  • Arduino Prototype Shield
  • 74HC595N Shift Register 
  • Wires



74HC595N - Shifit Register

מוני הזזה נפוצים מאוד באלקטרוניקה , מדובר על מעגל לוגי ששומר מידע במערך תאים שכל תא בגודל של אחד ביט, ומאפשר לנו להעביר את המידע באופן טורי ( Serial) ומקבילי (Parallel), הוא מתמלא בכל פעימת שעון של המעבד, כל ביט חדש שנכנס מעלה את מיקום הביט שנכנס לפניו במערך כפי שניתן לראות בדוגמה:


מדובר ב"ג'וק" עם 16 רגליים שמאפשר לנו להגדיל את כמות I\Os  הדיגיטלים עבור ה Arduino, בעזרתו ניתן להוסיף עוד 8 רגליים ולשלם על 3 רגליים בלבד ב Arduino, ניתן לשרשר קבוצה של Shift Registers ביחד.




מפת רגליים:



QA - QH
שמונה רגליים חדשות לשליטה, QH היא רגל מיוחדת, ודרכה משרשרים Shift Register נוסף.

SER
מכיל את המידע עבור התא הבא שהולך להיכנס.

SRCLK
כשנעביר HIGH הוא יכניס את התא למערך.

RCLK
כשנעביר High נפעיל \ נכבה את הרגליים (QA-QH) ע"פ המערך.

SRCLR
מאפס את ה Shifit Register

OE
מאפשר להתחבר לרגליים (QA-QH) מופעל כאשר עובר בו GND.


מבנה סופי




קוד:

int SER_Pin = 10;
int RCLK_Pin = 9;
int SRCLK_Pin = 8;

#define number_of_74hc595s 1 
#define numOfRegisterPins number_of_74hc595s * 8

boolean registers[numOfRegisterPins];

void setup(){
  pinMode(SER_Pin, OUTPUT);
  pinMode(RCLK_Pin, OUTPUT);
  pinMode(SRCLK_Pin, OUTPUT);
  
  clearRegisters();
  writeRegisters();
}               

//write the register array items to low
void clearRegisters(){
  for(int i = numOfRegisterPins - 1; i >=  0; i--){
     registers[i] = LOW;
  }

//write values of the registers
void writeRegisters(){
  
  digitalWrite(RCLK_Pin, LOW);

  for(int i = numOfRegisterPins - 1; i >=  0; i--){
    digitalWrite(SRCLK_Pin, LOW);
    
    //get the register value from the Register Array
    int val = registers[i];

    //write the pin value to the SER Register
    digitalWrite(SER_Pin, val);
    
    //shift the register
    digitalWrite(SRCLK_Pin, HIGH);

  }
  //set the pins by the shifted registers
  digitalWrite(RCLK_Pin, HIGH);

}

//set value of the pin by index value
void setRegisterPin(int index, int value){
  registers[index] = value;
}

void loop(){

  setRegisterPin(1, HIGH);
  setRegisterPin(2, HIGH);
  setRegisterPin(3, HIGH);
  setRegisterPin(4, HIGH);
  setRegisterPin(5, HIGH);
  setRegisterPin(6, HIGH);
  setRegisterPin(7, HIGH);

  writeRegisters();
  delay(1000);
  
  setRegisterPin(1, LOW);
  setRegisterPin(2, LOW);
  setRegisterPin(3, LOW);
  setRegisterPin(4, LOW);
  setRegisterPin(5, LOW);
  setRegisterPin(6, LOW);
  setRegisterPin(7, LOW);
 writeRegisters();
   delay(1000);
}

סיכום:
עכשיו שום דבר לא יכול להגביל אותנו ובעזרת Arduino בודד ניתן להתממשק למספר גדול של כניסות \ יציאות דיגיטליות ולהפוך את הפרויקטים שלנו ליותר מורכבים.

תרחיב אותו!


אין תגובות:

הוסף רשומת תגובה