اعداد و کاراکترها بر روی دستگاههای الکترونیکی با استفاده از ماژولهایی با هشت LED نمایش داده میشوند که LED هشتم برای نمایش ممیز اعداد اعشاری است. نامگذاری LEDها به صورت a,b,….g یا A,B,….,G میباشد و نقطه دهدهی بهصورت P یا DP نامگذاری میشود. نمایشگر سون سگمنت ۱۰ پایه دارد پایههای ۱ تا ۵ متناظر با LEDهای ,e,d,پایه مشترک,c,P, پایههای ۶ تا ۱۰ متناظر با LEDهای b,a, پایه مشترک, g, f میباشند. دو پایه مشترک، ۳ و ۸، به کاتد مشترک یا به آند مشترک متصل میشوند.
برای تعیین کاتد مشترک یا آند مشترک بودن سون سگمنت، منفی باتری لیتیومی به یک پایه مشترک و مثبت آن به یک پایه دیگر متصل میشود. اگر یکی از LEDها روشن شود سون سگمنت کاتد مشترک است. در این پروژه سون سگمنت کاتد مشترک بکاربرده میشود، بنابراین یک LED هنگامی روشن میشود که سیگنال HIGH باشد.
شماتیک پایه نمایشگر سون سگمنت
هر LED متصلشده به یک پایه آردوینو HIGH یا LOW میشود. برای نمایش عدد ۲ پایههای LEDهای a,b,d,e و g در HIGH و پایههای LEDهای c و f در LOW تنظیم میشود. برای مثال، دستورات زیر بطورمتناوب اعداد ۲ و ۶ را نمایش میدهند. خطوط اولیه دستورات اتصالهای بین پایههای آردوینو و سون سگمنت را نشان میدهند، پایه مشترک با یک مقاومت ۲۲۰ اهم به زمین آردوینو متصل میشود.
کد نمایش LEDهای سون سگمنت
int pinA = 2; // yellow wire to display LED a
int pinB = 3; // blue wire to display LED b
int pinC = 4; // yellow wire to display LED c
int pinD = 5; // blue wire to display LED d
int pinE = 6; // yellow wire to display LED e
int pinF = 7; // blue wire to display LED f
int pinG = 8; // yellow wire to display LED g
void setup()
{
pinMode (pinA, OUTPUT); // define LED pins as output
pinMode (pinB, OUTPUT);
pinMode (pinC, OUTPUT);
pinMode (pinD, OUTPUT);
pinMode (pinE, OUTPUT);
pinMode (pinF, OUTPUT);
pinMode (pinG, OUTPUT);
}
void loop()
{
digitalWrite(pinA, HIGH); // display number two
digitalWrite(pinB, HIGH);
digitalWrite(pinC, LOW);
digitalWrite(pinD, HIGH);
digitalWrite(pinE, HIGH);
digitalWrite(pinF, LOW);
digitalWrite(pinG, HIGH);
delay(1000);
digitalWrite(pinA, HIGH); // display number six
digitalWrite(pinB, LOW);
digitalWrite(pinC, HIGH);
digitalWrite(pinD, HIGH);
digitalWrite(pinE, HIGH);
digitalWrite(pinF, HIGH);
digitalWrite(pinG, HIGH);
delay(1000);
}
نیازی به تعریف هر پایه LED به عنوان خروجی با دستور pinMode() و استفاده از دستور ()digitalWrite بهصورت جداگانه نیست. برای تعریف پایههای LED و حالت آنها بصورت ۰ و ۱ بجای HIGH و LOW میتوان از آرایه استفاده کرد. آرایههای متناظر با حالت LEDها و دستورات ()digitalWrite با یک حلقه for تنظیم میشوند. لیست دستورات زیر بسیار کوتاهتر و آسانتر از لیست دستورات بالا است.
int LEDs[] = {2,3,4,5,6,7,8}; // define LED pins
int two[] = {1, 1, 0, 1, 1, 0, 1}; // LED states to display number two
int six[] = {1, 0, 1, 1, 1, 1, 1}; // LED states to display number six
void setup()
{ // define LED pins as OUTPUT
for (int i = 0; i<7; i++) pinMode (LEDs[i], OUTPUT);
}
void loop()
{ // display number two
for (int i = 0; i<7; i++) digitalWrite(LEDs[i], two[i]);
delay(1000); // display number six
for (int i = 0; i<7; i++) digitalWrite(LEDs[i], six[i]);
delay(1000); // delay 1s
}
PWM و روشنایی LED در 7-سگمنت
هنگامیکه یک LED روشن میشود، مقاومت ۲۲۰ اهم بین زمین و پایه مشترک سون سگمنت جریان را به کمتر از ۲۰ میلیآمپر محدود میکند. هنگام نمایش اعداد، از آنجاییکه LED ها موازی هستند جریان هر LED برابر با کل جریان تقسیم بر تعداد LEDها است. برای نمایش عدد ۱، جریان هر دو LED بزرگتر از جریان عبوری از تمام LEDهای بکاربردهشده برای نمایش عدد ۸ می باشد از اینرو عدد ۱ پر نورتر است. به منظور روشنایی یکسان تمام اعداد، میتوان یک مقاومت را با هرکدام از LEDها سری کرد.
برای نمایش اعداد ۱ و ۷ که کمترین تعداد LED روشن را دارند، میتوان بجای دستور ,()digitalWrite از دستور () analogWrite برای کنترل روشنایی LED با PWM استفاده کرد. سطح روشنایی LEDها در آرایههای حالت LED، one و seven، مقادیر 0 و 255×N/7 را دارند که در آن N تعداد LEDهای روشن میباشد. LEDهای a، b و c سون سگمنت به پایههای PWM آردوینو 9،10 و 11 متصل میشوند تا اعداد 1 و 7 با سطوح روشنایی LEDها به ترتیب 73 یا 109 با دستور ()analogWrite نمایش داده شوند. اعداد دیگر با استفاده از ()digitalWrite نمایش داده میشوند، برای این اعداد بیشترین تعداد LEDها روشن هستند. هنگامی که یک دستور ()analogWrite بعد از دستور ()digitalWrite میآید، تمامی LEDها باید قبل از دستور ()analogWrite خاموش شوند. دستورات زیر ()digitalWriteرا با ()analogWrite و PWM ترکیب میکند تا اعداد 1، 2، 7 و 0 را نمایش دهند، اعداد نمایش دادهشده روشنایی یکسانی دارند.
کد نمایش اعداد صفر، دو، هفت با سون سگمنت در آردوینو
int LEDpin[] = {9,10,11,5,6,7,8}; // LED pins with PWM for LEDs a, b and c
int one[] = {0,72,72,0,0,0,0}; // LED brightness to display number one
int two[] = {1,1,0,1,1,0,1}; // LED states to display number two
int three[] = {1,1,1,1,0,0,1};
int four[] = {0,1,1,0,0,1,1};
int five[] = {1,0,1,1,0,1,1};
int six[] = {1,0,1,1,1,1,1};
int seven[] = {109,109,109,0,0,0,0};// LED brightness to display number seven
int eight[] = {1,1,1,1,1,1,1};
int nine[] = {1,1,1,1,0,1,1};
int zero[] = {1,1,1,1,1,1,0};
void setup()
{ // define LED pins as OUTPUT
for (int i = 0; i<7; i++) pinMode (LEDpin[i], OUTPUT);
}
void loop()
{ // turn off all LEDs
for (int i = 0; i<7; i++) digitalWrite(LEDpin[i],0);
delay(10); // display number one
for (int i = 0; i<3; i++) analogWrite(LEDpin[i], one[i]);
delay(1000); // display number two
for (int i = 0; i<7; i++) digitalWrite(LEDpin[i], two[i]);
delay(1000); // turn off all LEDs
for (int i = 0; i<7; i++) digitalWrite(LEDpin[i],0);
delay(10); // display number seven
for (int i = 0; i<3; i++) analogWrite(LEDpin[i], seven[i]);
delay(1000); // display number zero
for (int i = 0; i<7; i++) digitalWrite(LEDpin[i], zero[i]);
delay(1000); // delay 1s
}
شیفت رجیستر چیست؟
یک شیفت رجیستر ، مثل 74HC595، یک بایت شامل 8 بیت داده و در هر مرتبه یک بیت را بارگذاری میکند. یک عدد 8 بیتی میتواند نشاندهنده وضعیت تمام LEDهای سون سگمنت باشد، به جای اینکه وضعیت هر LED را به صورت جداگانه نشان دهد. برای مثال، برای نمایش عدد 5 LEDهای a، c، d، f و g روشن و LEDهای b و e خاموش میشوند. یک LED خاموش با 0 و یک LED روشن با 1 نمایش داده میشود، دنباله 0ها و 1ها برای نمایش عدد 5 برای LEDهای a تا g 1101101 میباشد، که معادل عدد باینری B1101101 یا دسیمال 109 یا هگزادسیمال x6D0 است. مزیت دوم شیفت رجیستر این است که بجای 8 پایه از آردوینو تنها 3 پایه برای ارتباط LEDها مورد نیاز میباشد.
جدول پایههای شیفت رجیستر 74HC595
نماد
|
توضیح
|
متصل به
|
---|---|---|
QB
|
خروجی شیفت رجیستر برای LED b
|
پایه b سون سگمنت
|
QC
|
خروجی شیفت رجیستر برای LED c
|
پایه c سون سگمنت
|
QD
|
خروجی شیفت رجیستر برای LED d
|
پایه d سون سگمنت
|
QE
|
خروجی شیفت رجیستر برای LED e
|
پایه e سون سگمنت
|
QF
|
خروجی شیفت رجیستر برای LED f
|
پایه f سون سگمنت
|
QG
|
خروجی شیفت رجیستر برای LED g
|
پایه g سون سگمنت
|
QH
|
خروجی شیفت رجیستر برای LED p
|
|
GND
|
زمین
|
GND آردوینو
|
QH
|
یک خروجی اگر بیش از یک رجیستر موردنیاز باشد
|
|
SRCLR
|
پاک کردن شیفت رجیستر در هنگام LOW بودن
|
5 ولت آردوینو
|
RCLk
|
کلاک شیفت رجیستر
|
لج پایه 3 آردوینو
|
OE
|
خروجی هنگامی که زمین است فعال میشود
|
GND آردوینو
|
SER
|
ورودی سریال برای پایه بعدی
|
پایه 4 آردوینو
|
QA
|
خروجی شیفت رجیستر برای LED a
|
پایه a سون سگمنت
|
VCC
|
تغذیه 5 ولت
|
5 ولت آردوینو
|
خط بالای نمادهای SRCLR و OE نشان میدهد که این پایهها active LOW هستند و در صورت LOW بودن پایه فعال میشوند بجای اینکه در حالت HIGH بودن فعال شوند. پایههای شیفت رجیستر از 1 تا 16 شمارهگذاری میشوند، پایههای 1، 8، 9 و 16 متناظر QB، GND، QH’، و VCC هستند. پایههای 1 و 16 یا QB و VCC در انتهای شیفت رجیستر 74HC595 قرار دارند.
برای نمایش عدد 5، حالت LEDهای P و g تا a معادل عدد باینری B01101101 یا 109 دسیمال است.
یا تبدیل هگزادسیمال
این عدد معادل 0x6D هگزادسیمال است.
هگزادسیمال یک نمایش 2 رقمی 4 بیتی از یک عدد باینری 8 بیتی است، که به اعداد 4 بیتی کم ارزش و پر ارزش تقسیم میشود.در مثال پیشن، 0110 Bعدد باینری 4 بیتی پرارزش و 1101 Bعدد باینری 4 بیتی کم ارزشتر است. این اعداد 4 بیتی کم ارزش و پر ارزش به ترتیب معادل 6 و 13 دسیمال هستند، معادل 0x6D هگزادسیمال است، مقادیر دسیمال 10، 11، 12، 13، 14 و 15 نمایشهای هگزادسیمال A، B، C، D، E و F دارند. مزیت نمایش هگزادسیمال این است که اعداد تا 256 تنها با کاراکتر الفبایی نمایش داده میشوند و یک عدد باینری 8 بیتی میتواند به آسانی به دو مولفه هگزادسیمال تقسیم شود.
شیفت رجیستر حالت اولین LED، سپس حالت LED بعدی را بارگذاری میکند تا زمانیکه وضعیت تمامی LEDها بارگذاری شود. وقتیکه کلاک شیفت رجیستر (RCLK یا LATCH) LOW تنظیم شود، وضعیت LED ها (HIGH یا LOW) برای LED های P و g تا a از طریق پایه داده (SER یا DATA) در شیفت رجیستر بارگذاری میشود، وضعیت یک LED در یک زمان، توسط کلاک رجیستر ذخیرهسازی (SRCLK یا CLOCK) کنترل میشود. پس از بارگذاری وضعیت هر هشت LED، کلاک شیفت رجیستر (RCLK یا LATCH) HIGH تنظیم میشود و حالتهای LED به روز شده بطور همزمان اعمال میشوند. شکل.5 شیفت رجیستر را نشان میدهد که حالتهای LED را بطور متوالی برای نمایش عدد 5 برروی سون سگمنت بارگذاری میکند.
دستورات انتقال داده از طریق شیفت رجیستر
digitalWrite(latchPin, LOW); // set the latch to LOW
shiftOut(dataPin, clockPin, MSBFIRST, number); // LED states as a number
digitalWrite(latchPin, HIGH); // set the latch to HIGH
MSBFIRST نشان میدهد ابتدا پر ارزشترین بیت بارگذاری میشود، که وضعیت LED P، LED نقطه دسیمال را نمایش میدهد و مضرب باینری 27 دارد.
برای مثال، نمایشهای دسیمال اعداد 1، 2 و 3 با بارگذاری پر ارزشترین بیت در ابتدا 6، 91، و 79 با نمایشهای باینری به ترتیب B00000110، B01011011، و B01001111 میباشند. کم ارزشترین بیت، وضعیت LED a را نشان میدهد که ضریب باینری 20 دارد. اگر ابتدا کم ارزشترین بیت بارگذاری شود، پس LSBFIRST در دستور shiftOut() استفاده میشود. برای مثال نمایشهای دسیمال اعداد یک، دو و سه با بارگذاری کم ارزشترین بیت در ابتدا 96، 218 و 242 با نمایشهای باینری به ترتیب B01100000، B11011010، و B11110010 هستند. بنابراین استفاده از LSBFIRST یا MSBFIRST باید تعریف شود.
یک لیست از دستورات با یک شیفت رجیستر برای نمایش اعداد 0 تا 9 با دستورات بدون شیفت رجیستر تنها برای نمایش اعداد 2 و 6 مقایسه میشوند تا مزیت استفاده از شیفت رجیستر را نشان دهند (جدول 2 را مشاهده کنید). در شکل.4 پایههای 1 و 16 شیفت رجیستر 74HC595 در سمت چپ مدار قرار دارند.
جدول دستورات با و بدون یک شیفت رجیستر
اعداد 0 تا 9
int clockPin = 2;
int latchPin = 3;
int dataPin = 4;
int num[ ] = {63,6,91,79,102,109,125,7,127,111};
void setup()
{
pinMode (clockPin, OUTPUT);
pinMode (latchPin, OUTPUT);
pinMode (dataPin, OUTPUT);
}
void loop()
{
for (int i=0; i<10; i++)
{
digitalWrite(latchPin, LOW);
shiftOut(dataPin,clockPin,MSBFIRST,num[i]);
digitalWrite(latchPin, HIGH);
delay(1000);
}
}
فقط اعداد 2 و 6
int pins[ ] = {2,3,4,5,6,7,8,9};
int two[ ] = {1, 1, 0, 1, 1, 0, 1 };
int six[ ] = {1, 0, 1, 1, 1, 1, 1};
void setup()
{
for(int i=0; i<7;i++)
pinMode (pins[i], OUTPUT);
}
Void loop()
{
for (int i=0; i<7; i++)
digitalWrite(pins[i],two[i]);
delay(1000);
for (int i=0; i<7; i++)
digitalWrite(pins[i], six[i]);
delay(1000);
}
دستور shiftOut() میتواند از اعداد باینری، دسیمال یا هگزادسیمال برای نمایش وضعیت LED در سون سگمنت استفاده کند. برای مثال، سه دستور زیر برای نمایش عدد 5 معادل هستند:
shiftOut(dataPin, clockPin, MSBFIRST, B01101101)
یا :
shiftOut(dataPin, clockPin, MSBFIRST, 109)
یا :
shiftOut(dataPin, clockPin, MSBFIRST, 0x6D)
شیفت رجیستر ، PWM و روشنایی LEDها
پایه فعالساز خروجی شیفت رجیستر، ، بهطور معمول به زمین متصل میشود. اگر پایه فعالساز خروجی شیفت رجیستر به پایه PWM متصل شود (شکل 6 را مشاهده کنید)، میتوان روشنایی سون سگمنت را با PWM کنترل کرد.
برای مثال، تعریف پایه PWM بصورت int PWMpin = 11 و سپس وارد کردن دستور analogWrite (PWMpin, 250 – i*25) در تابع ()void loop روشنایی سون سگمنت را با افزایش تعداد نمایش افزایش میدهد. روشنایی نمایش سون سگمنت هنگامیکه مقدار (250 – i*25) در تابع ()analogWrite کاهش مییابد، پایه OE شیفت رجیستر بجای اکتیو HIGH اکتیو LOW میشود و به این دلیل روشنایی نمایش سون سگمنت افزایش مییابد. یک کاربرد تغییر روشنایی نمایش سون سگمنت با توجه به نور برخوردی، ساعت دیجیتالی است که صفحه نمایش آن در هنگام روز روشنتر از شب میباشد، همانطور که در دستورات لیست 4 هنگام نمایش اعداد استفاده میشود. خروجی تقسیمکننده ولتاژ با یک مقاومت وابسته به نور روشنایی سون سگمنت را کنترل میکند. (شکل 6 را مشاهده کنید).
دستور bright = map(reading, 0, 1023, 255, 0) اثر پایه OE شیفت رجیستر را معکوس میکند. شماتیک مشابه شکل 4 است با این تفاوت که یک مقاومت وابسته به نور و یک تقسیمکننده ولتاژ اضافه میشوند. اتصالات جدید در جدول زیر بیان میشوند.
جدول اتصالات برای شیفت رجیستر، تقسیمکننده ولتاژ، و مقاومت وابسته به نور
قطعه
|
متصل به
|
و به
|
---|---|---|
پایه راست LED
|
5 ولت آردوینو
|
|
پایه راست LED
|
مقاومت 4.7 کیلو اهم
|
GND آردوینو
|
پایه چپ LED
|
5 ولت آردوینو
|
|
پایه 13 یا OE شیفت رجیستر 74HC595
|
پایه 11 آردوینو
|
|
کد روشنایی نمایش وابسته به نور برخوردی
int clockPin = 2; // shift register CLOCK pin
int latchPin = 3; // shift register LATCH pin
int dataPin = 4; // shift register DATA pin
int num[] = {63,6,91,79,102,109,125,7,127,111}; // binary for numbers 0 to 9
int Vdivid = A5; // voltage divider pin
int PWMpin = 11; // shift register OE pin used for PWM
int reading, bright;
void setup()
{ // define
pinMode (clockPin, OUTPUT); // shift register CLOCK pin as output
pinMode (latchPin, OUTPUT); // shift register LATCH pin as output
pinMode (dataPin, OUTPUT); // shift register DATA pin as output
{
void loop()
{
for (int i=0; i<10; i++) // for each number 0 to 9
{
reading = analogRead(Vdivid); // voltage divider reading
bright = map(reading, 0, 1023, 255, 0); // map reading to LED brightness
analogWrite(PWMpin, bright); // change LED brightness
digitalWrite(latchPin, LOW); // set the latch to LOW
shiftOut(dataPin,clockPin,MSBFIRST,num[i]); // LED states as a number
digitalWrite(latchPin, HIGH); // change number pattern
delay(1000); // delay 1s
}
}
نمایش دسیمال حروف الفبا و عدد روی سون سگمنت
نمایش دسیمال کاراکترهای حروف الفبا و عدد برای نمایش با یک سون سگمنت کاتد مشترک و پرارزشترین بیت در ابتدا در جدول زیر بیان شدهاند.
، Sb، Sc، Sd، Se، Sf، Sg و SP هشت حالت LED ها در سون سگمنت، از جمله نقطه اعشاری هستند. اگر سون سگمنت آند مشترک باشد، نمایش دسیمال یک کاراکتر حرفی عددی برابر 127 منهای مقادیر جدول.4 میشود. نمایش دسیمال نقطه اعشاری وقتیکه سون سگمنت یک آند مشترک دارد 127 میباشد.