الأربعاء، 23 يناير، 2013

7segment المقطعات السباعية

seven 7 segment  المقطعات السباعية 


مرحباً بكم , سأعرض لكم اليوم سلسلة جديدة تعرض كيفية التحكم  بأحد لوحات الإضاءة الرقمية الشهيرة و التي تسمى seven segment أو بالعربية المقطعات السباعية , يمكن من خلالها عرض الأرقام و بعض الحروف و الأشكال عليها .

نراها في العديد من الأجهزة , قد تستخدم كعدّاد , أو كساعة رقمية  , أو لعرض القيم العددية للحساسات .



في هذه السلسة سنحاول عرض شرح مفصل , لكيفية التحكم بالمقطعات السباعية و دمج لغة أردوينو معها .


في البداية , ما هي المقطعات السباعية ؟

هو عبارة وسيلة عرض الكترونية لعرض الأرقام بالصيغة العشرية "Decimal numeric " , و هي مجموعة بواعث ضوئية LED مربوطة على التوازي من طرف واحد , يربط إما مع التغذية Vcc و يسمى وقتها ب Common anode مشترك موجب أو مربط مع السالب Gnd و يسمى وقتها Common cathode مشترك سالب .




هذه البواعث الضوئية توضع في ترتيب بحيث تظهر على شكل رقم 8  .
 

يمكن أن تأتي في عدة أشكال و تعليبات مختلفة , فقد تأتي بخانة واحدة 

او خانتين 

أو ثلاث خانات 

أو أربعة خانات 


لكل تعليب وظيفة و توصيلها لا يختلف كثير عن الأخرى .

سأشرح عن كل نوع و سنفهم كيفية توصيله و برمجته .

سنبدأ بالأسهل ألا و هو المقطع السباعي بخانة واحدة .

كيفية التحكم ؟

سنقسم طرق التحكم " قيادة " المقطعات السباعية إلى :
1) التحكم مباشرة من بطاقة الأردوينو .
2) باستخدام مسجل الإزاحة Shift register 74595 .
3) باستخدام الدارة المتكاملةMax7219 .
سنعطي كل طريقة على حدا , كما سنرى بعد قليل :

جهّز معداتك :

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




لنبدأ :)

1) التحكم مباشرة من بطاقة الأردوينو .

طريقة التوصيل : 






مهما كان نوع المقطع السباعي 7seg الذي تستخدمه , كل ما عليك هو توصيل الأرجل من أردوينو إلى المقطع السباعي حسب الترتيب التالي 

المقاومة " 150 أوم " توضع لتقليل التيار المار في المقطع السباعي , لكي لا يتلف و يتم اختيار قيمتها من 25 - 470 أوم .

التوصيل سهل كما رأيتم  , لننتقل الآن للبرمجة .

البرمجة 

الفكرة في كتابة البرنامج سهلة .

في حالتنا هذه , أنا استخدمت مقطع سباعي 7segment ذو قطب تغذية مشترك CA , في الحالة العادية يكون طرف الباعث الضوئي موصول للتغذية و الطرف الآخر موصول مع طرف المتحكم الموصول ببطاقة الأردوينو .
مدخل المتحكم يعمل كمصرف للتيار Current sink فلو تم تهيئته على وضع منخفضLOW فيمكن للتيار العبور و يضيئ الباعث الضوئي في المقطّع السباعي 7segment .
أما لو كان مدخل المتحكم موضوع على وضع مرتفعHIGH فلن يسمح للتيار بالمرور و هكذا لن يضيئ الباعث الضوئي في المقطّع السباعي 7segment  .

في جملة الإعداد للبرنامج , نقوم بتعريف المداخل من D2-D9  كمخارج كما يلي 

السؤال الذي قد يراودك الآن ... هو كيف لنا أن نظهر القيم التي نريدها على المقطع السباعي ؟ 

سنستخدم هنا تقنية تعلمناها منذ الصغر , ألا وهو جدول الحقيقة Truth table أو ما يسمى أحياناً look_up table و الذي يمكننا من اختيار حالة كل مدخل من مداخل المتحكم الموصولة مع المقطع السباعي و هل نريدها في حالة HIGH Or LOW  .
كمثال , لنفرض أننا نريد أن نضيئ الرقم 1 على المقطع السباعي , في حالة الCA يجب أن يكون فقط المدخلين الموصولين مع a,b في حالة منخفض LOW و الباقي في وضع مرتفع HIGH 
و العكس لو كان CC , و هكذا ...
و سنكتب داخل كود البرنامج الجملة التالية :


و كلما أردنا أن نظهر الرقم 1 نقوم باستدعاء هذه الجملة داخل الvoid loop في البرنامج .

الكود التالي يقوم بإظهار الأعداد من 0-9 بفارق زمني قدره 500ms       
        
//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/8/2012 12:00pm
// Description: This code used to Drive One seven segment directley 
//from arduino board , using pin D2-D9 
// Programmed for http://www.Genotronex.webs.com
                
//****************************************************************

int i=500;
void setup() {
   // Define Pins
        pinMode(2, OUTPUT); //expression about g
        pinMode(3, OUTPUT); //expression about f
        pinMode(4, OUTPUT); //expression about a
        pinMode(5, OUTPUT); //expression about b
        pinMode(6, OUTPUT); //expression about e 
        pinMode(7, OUTPUT); //expression about d
        pinMode(8, OUTPUT); //expression about c
        pinMode(9, OUTPUT);  ////expression about dot   
}  
        void one(){
         digitalWrite(2,HIGH);
         digitalWrite(3,HIGH);
         digitalWrite(4,HIGH);
         digitalWrite(5,LOW);
         digitalWrite(6,HIGH);
         digitalWrite(7,HIGH);
         digitalWrite(8,LOW);
         digitalWrite(9,HIGH);
        }
        //------------------------------------------------
        void two(){
         digitalWrite(2,LOW);
         digitalWrite(3,HIGH);
         digitalWrite(4,LOW);
         digitalWrite(5,LOW);
         digitalWrite(6,LOW);
         digitalWrite(7,LOW);
         digitalWrite(8,HIGH);
         digitalWrite(9,HIGH);
        }
        //--------------------------------------------------
        void zero(){
          digitalWrite(2,HIGH);
         digitalWrite(3,LOW);
         digitalWrite(4,LOW);
         digitalWrite(5,LOW);
         digitalWrite(6,LOW);
         digitalWrite(7,LOW);
         digitalWrite(8,LOW);
         digitalWrite(9,HIGH);
        }
        //---------------------------------------------------
        void clr(){
         digitalWrite(2,HIGH);
         digitalWrite(3,HIGH);
         digitalWrite(4,HIGH);
         digitalWrite(5,HIGH);
         digitalWrite(6,HIGH);
         digitalWrite(7,HIGH);
         digitalWrite(8,HIGH);
         digitalWrite(9,HIGH);
        }
        //----------------------------------------------------
         void three(){
         digitalWrite(2,LOW);
         digitalWrite(3,HIGH);
         digitalWrite(4,LOW);
         digitalWrite(5,LOW);
         digitalWrite(6,HIGH);
         digitalWrite(7,LOW);
         digitalWrite(8,LOW);
         digitalWrite(9,HIGH);
        }
         //---------------------------------------------------
        void four(){
         digitalWrite(2,LOW);
         digitalWrite(3,LOW);
         digitalWrite(4,HIGH);
         digitalWrite(5,LOW);
         digitalWrite(6,HIGH);
         digitalWrite(7,HIGH);
         digitalWrite(8,LOW);
         digitalWrite(9,HIGH);
        }
         //---------------------------------------------------
        void five(){
         digitalWrite(2,LOW);
         digitalWrite(3,LOW);
         digitalWrite(4,LOW);
         digitalWrite(5,HIGH);
         digitalWrite(6,HIGH);
         digitalWrite(7,LOW);
         digitalWrite(8,LOW);
         digitalWrite(9,HIGH);
        }
        //----------------------------------------------------
        void six(){
         digitalWrite(2,LOW);
         digitalWrite(3,LOW);
         digitalWrite(4,LOW);
         digitalWrite(5,HIGH);
         digitalWrite(6,LOW);
         digitalWrite(7,LOW);
         digitalWrite(8,LOW);
         digitalWrite(9,HIGH);
        }
        //----------------------------------------------------
        void seven(){
         digitalWrite(2,HIGH);
         digitalWrite(3,HIGH);
         digitalWrite(4,LOW);
         digitalWrite(5,LOW);
         digitalWrite(6,HIGH);
         digitalWrite(7,HIGH);
         digitalWrite(8,LOW);
         digitalWrite(9,HIGH);
        }
        //----------------------------------------------------
        void eight(){
         digitalWrite(2,LOW);
         digitalWrite(3,LOW);
         digitalWrite(4,LOW);
         digitalWrite(5,LOW);
         digitalWrite(6,LOW);
         digitalWrite(7,LOW);
         digitalWrite(8,LOW);
         digitalWrite(9,HIGH);
        }
        //----------------------------------------------------
        void nine(){
         digitalWrite(2,LOW);
         digitalWrite(3,LOW);
         digitalWrite(4,LOW);
         digitalWrite(5,LOW);
         digitalWrite(6,HIGH);
         digitalWrite(7,LOW);
         digitalWrite(8,LOW);
         digitalWrite(9,HIGH);
        }
        //----------------------------------------------------
         
        //****************************************************
        void loop(){
          zero(); delay(i);clr();
          one();  delay(i);clr();
          two();  delay(i);clr();
          three();delay(i);clr();
          four(); delay(i);clr();
          five(); delay(i);clr();
          six();  delay(i);clr();
          seven();delay(i);clr();
          eight();delay(i);clr();
          nine(); delay(i);clr();
        }
في حالة القطب السالب المشترك CC كل ما عليك فعله هو عكس الحالات , فبدل كل HIGH
نضع LOW و العكس صحيح .
و هذا الفيديو البسيط يوضح كيف تظهر النتائج بعد تحميل البرنامج على المتحكم .
هكذا نكون قد فهمنا مبدأ العمل و سننتقل الآن للجزء الثاني ألا و هو توصيل أكثر من مقطع سباعي
واحد أو توصيل مقطع سباعي متعدد الخانات مباشرة من الأردوينو , قد تكون فكرة صعبة
أو مستحيلة بنظرك , سنقوم بعمل هذه التجربة و نفرغ لها التدوينة المقبلة

0 التعليقات :

إرسال تعليق

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