السبت، 16 فبراير، 2013

7 Segment and Shift register

المقطعات السباعية Seven segment  و مسجل الإزاحة 74595




تحدثت في أخر تدوينة لي تحدثت عن المقطعات السباعية 7Segment و طريقة التحكم بها مباشرة من خلال بطاقة الأردوينو , و سنتابع اليوم طريقة توصيل المقطعات السباعية مع مسجل الإزاحة Shift register 74595 




لنبدأ بالفكرة , ما هي الفكرة التي يرتكز عليها نقل البيانات بين مسجل الإزاحة و المقطع السباعي Seven segment ؟

مسجل الإزاحة يحتوي في خرجه على 8bit أي يمكن التحكم بخانة واحدة من المقطع السباعيSeven segment بسهولة , كل ما سنفعله هو تفعيل مخرج مسجل HIGH الإزاحة لتضيئ الخانة المربوطة معه , أو تقوم بتعطيل مخرج مسجل الإزاحة LOW لإطفاء الخانة المربوطة معه .

في حالة استعملنا مقطع سباعي 7segment CC ذو سالب مشترك فإن العملية تكون معكوسة .

للتذكير : مسجل الإزاحة يعمل كمنبع للتيار Current source و ليس كمصرف للتيار Current sink و في حالة استخدامه 
 كمصرف للتيار Current sink يجب وضع ترانزستور معه . 

حسناً لنبدأ بالمعدات :


المعدات اللازمة لتبدأ التجربة هي :
1) بطاقة أردوينو  Arduino .
2) اسلاك توصيل Solderless Jumper 
3)مقطّع سُباعي 7segment " تغذية مشتركة CA أو سالب مشترك CC "
4) لوحة تعليمية مثقوبة BreadBoard .
5) مقاومات 150 أوم 
6) مسجل إزاحة Shift Register 74959
7) ترانزستور 2n2222 أو ما يكافئه. عدد 4




حسناً لننتقل للتوصيل .

مسجل الإزاحة كما نعرف له 8 ارجل خرج مرقمة من D0-D7 , كل ما سنقوم به هو ربط هذه الأرجل مع أرجل المقطع السباعي حسب الترتيب التالي :

و الرسم يوضح أكثر هذا التوصيل .






حسناً مسجل الإزاحة 74595 يتم توصيله مع الأردوينو بأربعة خطوط , بحسب البروتوكول SPI و هي موصولة كالآتي :


حسناً ننتقل الآن للسؤال الأهم ... كيف سننقل الأرقام ؟ أو بالأحرى كيف لنا أن نضيئ أي خانة نريدها في المقطع السباعي ؟ 

الجواب على هذا السؤال هو ...جدول الحقيقة Look up table

نقوم ببناء جدول , نضع فيها أرجل المقطع السباعي Seven segment في مُرتبة حسب المنزلة MSB  و الأرقام أو الرموز التي نريد إظهارها في الشق الثاني من الجدول , ثم نقوم بعبئة الجدول بالقيم الثنائية Binary code ثم نحسب مجموع الأرقام بالنظام العشري Decimal . 

الجدول التالي يوضح الفكرة و فيه قمت بعمل واحد مشابه .

نقوم بأخذ هذه القيم" القيم العشرية Decimal " و وضعها في البرنامج على شكل مصفوفة .

البرنامج  ادناه يقوم بنقل الأرقام من 0-9 .
//This program is free software: you can redistribute it and/or modify
//it under the terms of the GNU General Public License as published by
//the Free Software Foundation, either version 3 of the License, or
//(at your option) any later version.
//This program is distributed in the hope that it will be useful,
//but WITHOUT ANY WARRANTY; without even the implied warranty of
//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//You should have received a copy of the GNU General Public License
// along with this program. If not, see http://www.gnu.org/licenses/

//****************************************************
//Name :Mohannad Rawashdeh .
//Date "24\7/2012 3:00pm
// Description: This  Code for using a 74HC595 Shift Register and Seven segment CA          //
// to count from 0 to 9  , Using arduino pin # 8,10,11,12
// Programmed forhttp://genotronex.blogspot.com/
                
//****************************************************************
//define the Pins
//Pin connected to latch clock  of 74HC595 ""pin 12""
int latchPin = 8;
//Pin connected to shift clock of 74HC595 ""PIN 11 "
int clockPin = 12;
////Pin connected to serial Data A of 74HC595 "pin 14 "
int dataPin = 11;
///Output pin cotroller of 74HC595""pin 13""
int output_pin=10;

int N[]={3,159,37,13,153,73,65,31,1,25};
//___________________________________________________

void setup() {
  //set pins to output so you can control the shift register
  pinMode(latchPin, OUTPUT);
  pinMode(clockPin, OUTPUT);
  pinMode(dataPin, OUTPUT);
  pinMode(output_pin, OUTPUT);
  digitalWrite(output_pin,HIGH); // this instruction to disable Output pins
}
void loop(){
for (int i=0;i<10;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, N[i]);  

    //take the latch pin high so the LEDs will light up:
    digitalWrite(latchPin, HIGH);
    digitalWrite(output_pin,LOW);// enable OUTPUT Pins
    // pause before next value:
    delay(1000);
    
    digitalWrite(output_pin,HIGH); // this instruction to disable Output pins again .
  }
  }

كما تلاحظون قمت بوضع قيم الأرقام بالمصفوفة N ثم قمت باستدعائها في البرنامج داخل جملة الLoop كلما احتجت لها .

بهكذا ننتهي من الجزء الأول الخاص بربط مقطع سُباعي واحد .

لو اردنا توصيل أكثر من مقطع سُباعي واحد Multi seven  segment , فماذا سنفعل ؟

الأمر سهل و بسيط , فقط علينا توصيل كل المقطعات السباعية بنفس الطريقة التي ربطنا فيها المقطع السباعي الواحد Single 7segment و فقط نقوم بربط المدخل المشترك Common بمسجل إزاحة آخر "لا تنسى طبعاً الترانزستور ".

المخطط التالي يوضح توصيل اكثر من خانة معاً 



الخانة الأولى تربط مع ترانزستور قاعدته Base مربوطة مع Q0 , و الخانة الثانية 
تربط مع ترانزستور قاعدته Base مربوطة مع Q1  و هكذا ...

هذا الكود لمسجل أزاحة مربوط مع مقطعين سُباعيين 2digit  مربوطتان مع حساس على المدخل A0
 



//This program is free software: you can redistribute it and/or modify
//it under the terms of the GNU General Public License as published by
//the Free Software Foundation, either version 3 of the License, or
//(at your option) any later version.
//This program is distributed in the hope that it will be useful,
//but WITHOUT ANY WARRANTY; without even the implied warranty of
//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//You should have received a copy of the GNU General Public License
// along with this program. If not, see http://www.gnu.org/licenses/

//****************************************************
//Name :Mohannad Rawashdeh .
//Date "30/6/2012 3:00pm
// Description: This  Code for using a 74HC595 Shift Register and Seven segment CA          //
// to count from 0 to 9  , Using arduino pin # 8,10,11,12
// Programmed forhttp://genotronex.blogspot.com/                
//****************************************************************
//define the Pins
//Pin connected to latch clock  of 74HC595 ""pin 12""
int latchPin = 8;
//Pin connected to shift clock of 74HC595 ""PIN 11 "
int clockPin = 12;
////Pin connected to serial Data A of 74HC595 "pin 14 "
int dataPin = 11;
///Output pin cotroller of 74HC595""pin 13""
int output_pin=10;
int C=0; //which express about the Analoge pin reading surrounded by 0-99
int Tens=0;//Number that will show on digit_2
int Ones=0;//Number that will show on digit_1
int N[]={3,159,37,13,153,73,65,31,1,25,254};//the Number from 0-9 in an array
//___________________________________________________

void setup() {
  //set pins to output so you can control the shift register
  pinMode(latchPin, OUTPUT);
  pinMode(clockPin, OUTPUT);
  pinMode(dataPin, OUTPUT);
  pinMode(output_pin, OUTPUT);
  pinMode(A0,INPUT);
  pinMode(A1,INPUT);
  digitalWrite(output_pin,HIGH); // this instruction to disable Output pins
}
void digit_1(){
   shiftOut(dataPin, clockPin, MSBFIRST, 1);
    delayMicroseconds(100);
}
void digit_2(){
  shiftOut(dataPin, clockPin, MSBFIRST, 2);
    delayMicroseconds(100);
}
void dot(){
   digitalWrite(latchPin, LOW);
    // shift out the bits:
    digit_2();
    shiftOut(dataPin, clockPin, MSBFIRST, N[10]);  

    //take the latch pin high so the LEDs will light up:
    digitalWrite(latchPin, HIGH);
    digitalWrite(output_pin,LOW);// enable OUTPUT Pins
    // pause before next value:
    delay(4);  
    digitalWrite(output_pin,HIGH); // this instruction to disable Output pins again .
}
    void dot2(){
      digitalWrite(latchPin, LOW);
    // shift out the bits:
    digit_1();
    shiftOut(dataPin, clockPin, MSBFIRST, N[10]);  

    //take the latch pin high so the LEDs will light up:
    digitalWrite(latchPin, HIGH);
    digitalWrite(output_pin,LOW);// enable OUTPUT Pins
    // pause before next value:
    delay(4);  
    digitalWrite(output_pin,HIGH); // this instruction to disable Output pins again .
}
void loop(){
  int analoge_read=analogRead(A0);
  C=map(analoge_read,0,854,0,99);
  C=constrain(C,0,99);
  Tens=C/10;
  Ones=C-(Tens*10);
  //----------------------------------------------
  //**********************************************
    // take the latchPin low so 
    // the LEDs don't change while you're sending in bits:
    digitalWrite(latchPin, LOW);
    // shift out the bits:
    digit_1();
    shiftOut(dataPin, clockPin, MSBFIRST, N[Ones]);  
    //take the latch pin high so the LEDs will light up:
    digitalWrite(latchPin, HIGH);
    digitalWrite(output_pin,LOW);// enable OUTPUT Pins
    // pause before next value:
    delay(5);   
    digitalWrite(output_pin,HIGH); // this instruction to disable Output pins again .
  //---------------------------------------------------------------
    // take the latchPin low so 
    // the LEDs don't change while you're sending in bits:
    digitalWrite(latchPin, LOW);
    // shift out the bits:
    digit_2();
    shiftOut(dataPin, clockPin, MSBFIRST, N[Tens]);  

    //take the latch pin high so the LEDs will light up:
    digitalWrite(latchPin, HIGH);
    digitalWrite(output_pin,LOW);// enable OUTPUT Pins
    // pause before next value:
    delay(5);  
    digitalWrite(output_pin,HIGH); // this instruction to disable Output pins again .
    //-----------------------
  if (digitalRead(A1)==HIGH){
   dot();
  }
  if(digitalRead(A1)==LOW){
    dot2();
  }
}

ملاحظة , أن هذا البرنامج يمكنك تعديله عن طريق تعديل خيار ال  map الموجود فيه و جعل القيمة بين 0-1023 بدلاً من 0-854 .



 و اخيراً هذا البرنامج يقوم بنفس الوظيفة السابقة مع زيادة خانتين , أي أن هذا البرنامج ل 4 خانات 4digit seven segment





//This program is free software: you can redistribute it and/or modify
//it under the terms of the GNU General Public License as published by
//the Free Software Foundation, either version 3 of the License, or
//(at your option) any later version.
//This program is distributed in the hope that it will be useful,
//but WITHOUT ANY WARRANTY; without even the implied warranty of
//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//You should have received a copy of the GNU General Public License
// along with this program. If not, see http://www.gnu.org/licenses/

//****************************************************
//Name :Mohannad Rawashdeh .
//Date "30/6/2012 3:00pm
// Description: This  Code for using a 74HC595 Shift Register and four Seven segment CA          //
// to count from 0 to 9  , Using arduino pin # 8,10,11,12
// Programmed for  http://genotronex.blogspot.com/                 
//****************************************************************
//define the Pins
//Pin connected to latch clock  of 74HC595 ""pin 12""
int latchPin = 8;
//Pin connected to shift clock of 74HC595 ""PIN 11 "
int clockPin = 12;
////Pin connected to serial Data A of 74HC595 "pin 14 "
int dataPin = 11;
///Output pin cotroller of 74HC595""pin 13""
int output_pin=10;
float C=0; //which express about the Analoge pin reading surrounded by 0-99
int Tens=0;//Number that will show on digit_2
int Ones=0;//Number that will show on digit_1
float d=0;
int Hundreds=0;
int thousands=0;
unsigned long mul=0;
int N[]={3,159,37,13,153,73,65,31,1,25,254};//the Number from 0-9 in an array and 254 for dot
//___________________________________________________

void setup() {
  Serial.begin(115200);
  //set pins to output so you can control the shift register
  pinMode(latchPin, OUTPUT);
  pinMode(clockPin, OUTPUT);
  pinMode(dataPin, OUTPUT);
  pinMode(output_pin, OUTPUT);
  pinMode(A0,INPUT);
  digitalWrite(output_pin,HIGH); // this instruction to disable Output pins
}
void digit_1(){
   shiftOut(dataPin, clockPin, MSBFIRST, 1);
    delayMicroseconds(100);
}
void digit_2(){
  shiftOut(dataPin, clockPin, MSBFIRST, 2);
    delayMicroseconds(100);
}
void digit_3(){
  shiftOut(dataPin, clockPin, MSBFIRST, 4);
    delayMicroseconds(100);
}
void digit_4(){
  shiftOut(dataPin, clockPin, MSBFIRST, 8);
    delayMicroseconds(100);
}
 void digit_5(){
  shiftOut(dataPin, clockPin, MSBFIRST, 16);
    delayMicroseconds(100);
} 
void digit_6(){
  shiftOut(dataPin, clockPin, MSBFIRST, 32);
    delayMicroseconds(100);
}
void dot(){
   digitalWrite(latchPin, LOW);
   digit_3();
    // shift out the bits:
    shiftOut(dataPin, clockPin, MSBFIRST, N[10]);  
    //take the latch pin high so the LEDs will light up:
    digitalWrite(latchPin, HIGH);
    digitalWrite(output_pin,LOW);// enable OUTPUT Pins
    // pause before next value:
    delay(4);  
    digitalWrite(output_pin,HIGH); // this instruction to disable Output pins again .

}
  
void loop(){
         C=analogRead(A0);
         C=constrain(C,0,1023);
         Serial.println(C);
         thousands=C/1000;
         d=C/100;      
         Hundreds=d-(thousands*10);
         d=C/100;    
         mul=C/100;                  
         Tens=(d*10)-(mul*10); 
         d=C/10;
         mul=C/10;
         Ones=(d*10)-(mul*10);
  //----------------------------------------------
  //**********************************************
    // take the latchPin low so 
    // the LEDs don't change while you're sending in bits:
    digitalWrite(latchPin, LOW);
    // shift out the bits:
    digit_1();
    shiftOut(dataPin, clockPin, MSBFIRST, N[Ones]);  
    //take the latch pin high so the LEDs will light up:
    digitalWrite(latchPin, HIGH);
    digitalWrite(output_pin,LOW);// enable OUTPUT Pins
    // pause before next value:
    delay(3);   
    digitalWrite(output_pin,HIGH); // this instruction to disable Output pins again .
  //---------------------------------------------------------------
    // take the latchPin low so 
    // the LEDs don't change while you're sending in bits:
    digitalWrite(latchPin, LOW);
    // shift out the bits:
    digit_2();
    shiftOut(dataPin, clockPin, MSBFIRST, N[Tens]);  

    //take the latch pin high so the LEDs will light up:
    digitalWrite(latchPin, HIGH);
    digitalWrite(output_pin,LOW);// enable OUTPUT Pins
    // pause before next value:
    delay(3);  
    digitalWrite(output_pin,HIGH); // this instruction to disable Output pins again .
   // take the latchPin low so 
    // the LEDs don't change while you're sending in bits:
    digitalWrite(latchPin, LOW);
    // shift out the bits:
    digit_3();
    shiftOut(dataPin, clockPin, MSBFIRST, N[Hundreds]);  

    //take the latch pin high so the LEDs will light up:
    digitalWrite(latchPin, HIGH);
    digitalWrite(output_pin,LOW);// enable OUTPUT Pins
    // pause before next value:
    delay(3);  
    digitalWrite(output_pin,HIGH); // this instruction to disable Output pins again .
    //----------------------------------------------------------------
   // take the latchPin low so 
    // the LEDs don't change while you're sending in bits:
    digitalWrite(latchPin, LOW);
    // shift out the bits:
    digit_4();
    shiftOut(dataPin, clockPin, MSBFIRST, N[thousands]);  

    //take the latch pin high so the LEDs will light up:
    digitalWrite(latchPin, HIGH);
    digitalWrite(output_pin,LOW);// enable OUTPUT Pins
    // pause before next value:
    delay(3);  
    digitalWrite(output_pin,HIGH); // this instruction to disable Output pins again .
  
   // take the latchPin low so 
    // the LEDs don't change while you're sending in bits:
    digitalWrite(latchPin, LOW);
    // shift out the bits:
    digit_5();
    shiftOut(dataPin, clockPin, MSBFIRST, N[0]);  

    //take the latch pin high so the LEDs will light up:
    digitalWrite(latchPin, HIGH);
    digitalWrite(output_pin,LOW);// enable OUTPUT Pins
    // pause before next value:
    delay(3);  
    digitalWrite(output_pin,HIGH); // this instruction to disable Output pins again .
  //----------------------------------------------------------------
  
   // take the latchPin low so 
    // the LEDs don't change while you're sending in bits:
    digitalWrite(latchPin, LOW);
    // shift out the bits:
    digit_6();
    shiftOut(dataPin, clockPin, MSBFIRST, N[0]);  

    //take the latch pin high so the LEDs will light up:
    digitalWrite(latchPin, HIGH);
    digitalWrite(output_pin,LOW);// enable OUTPUT Pins
    // pause before next value:
    delay(3);  
    digitalWrite(output_pin,HIGH); // this instruction to disable Output pins again .
  
  }












يمكنك تعديل الكود كما تريد , و حتى تغيير طريقة التوصيل و ابتكار طريقتك الخاصة بالتحكم بالمقطعات السباعية .


أنا تمكنت من بناء حتى 6 مقطعات سباعية معاً , و ربطها بواسطة مسجلي ازاحة فقط   2shift register

اتمنى أن يكون هذا الدرس مفيداً , تحياتي لكم أعزائي .

0 التعليقات :

إرسال تعليق

 
Creative Commons License
This work is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.