در قسمت 45 از آموزش آردوینو به بررسی راهاندازی نمایشگر LED هفت سگمنت و راهاندازی نمایشگرهای LED هفتسگمنت چندرقمی (مالتیپلکسینگ) پرداختیم. در این قسمت قصد داریم درباره کنترل آرایهای از دیودهای نوری با استفاده از رجیسترهای انتقالی MAX72xx، افزایش تعداد خروجیهای آنالوگ با استفاده از مدارهای گسترشدهنده PWM و استفاده از یک آمپرمتر آنالوگ پنلی به عنوان نمایشگر، صحبت کنیم.
فرض کنید شما یک آرایه ۸×۸ از LEDها دارید و میخواهید تعداد پینهای موردنیاز برای کنترل آن را کاهش دهید. در این صورت، شما میتوانید از یک رجیستر انتقال (shift register) برای کاهش تعداد پینهای موردنیاز استفاده کنید. این راهحل از چیپ درایور LED محبوب MAX7219 یا MAX7221 برای این منظور استفاده میکند. آردوینو، matrix و MAX72xx خود را مطابق با شکل 1 متصل کنید.

شکل 1: MAX72xx driving یک آرایه LED 8×8
این اسکچ بر اساس کتابخانه قدرتمند MD_MAX72XX ساخته شده است که میتواند متن نمایش دهد، آبجکتها را روی نمایشگر بکشد و تبدیلهای مختلفی روی نمایشگر انجام دهد. این کتابخانه را میتوانید در مدیر کتابخانه آردوینو (Arduino Library Manager) پیدا کنید.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
/* 7219 Matrix demo */ #include <MD_MAX72xx.h> // Pins to control 7219 #define LOAD_PIN 2 #define CLK_PIN 3 #define DATA_PIN 4 // Configure the hardware #define MAX_DEVICES 1 #define HARDWARE_TYPE MD_MAX72XX::PAROLA_HW MD_MAX72XX mx = MD_MAX72XX(HARDWARE_TYPE, DATA_PIN, CLK_PIN, LOAD_PIN, MAX_DEVICES); void setup() { mx.begin(); } void loop() { mx.clear(); // Clear the display // Draw rows and columns for (int r = 0; r < 8; r++) { for (int c = 0; c < 8; c++) { mx.setPoint(r, c, true); // Light each LED delay(50); } // Cycle through available brightness levels for (int k = 0; k <= MAX_INTENSITY; k++) { mx.control(MD_MAX72XX::INTENSITY, k); delay(100); } } } |
به طور خلاصه، این کد یک matrix را با مشخصکردن نوع سختافزار، شماره پینهای دیتا، لود و کلاک، و حداکثر تعداد دستگاهها ایجاد میکند. سپس نمایشگر را پاک میکند و از متد setPoint برای روشنکردن پیکسلها استفاده میکند. پس از رسم یک سطر، کد بین شدتهای روشنایی موجود جابهجا شده و به سطر بعدی میرود.
شماره پینهای نشاندادهشده برای LEDهای سبز در ماتریس دو رنگ 8 × 8 هستند که از Adafruit (شماره قطعه 458) در دسترس است. اگر از یک ماتریس LED دیگر استفاده میکنید، برای تعیین اینکه کدام پینها به هر ردیف و ستون مربوط میشوند، مستندات فنی آن را بررسی کنید.
این کد با یک matrix تکرنگ نیز کار میکند، زیرا فقط از یکی از دورنگ استفاده میکند. اگر متوجه شدید که متن بهصورت معکوس یا با جهتگیری موردانتظار نمایش داده میشود، میتوانید نوع سختافزار را در خط #define HARDWARE_TYPE MD_MAX72XX::PAROLA_HW از PAROLA_HW به یکی از GENERIC_HW ،ICSTATION_HW یا FC16_HW تغییر دهید. یک تست اسکچ در نمونههای کتابخانه MD_MAX72xx به نام MD_MAX72xx_HW_Mapper وجود دارد که یک تست را اجرا کرده و به شما در تعیین نوع سختافزار مناسب کمک میکند.
مقاومت (R1) برای کنترل حداکثر جریان استفاده شده برای هدایت یک LED به کار میرود. در دیتاشیت MAX72xx، جدولی وجود دارد که محدوده مقادیر را نشان میدهد (جدول 1).

جدول 1: جدول مقادیر مقاومت (از دیتاشیت MAX72xx)
دیود نوری (LED) سبز در آرایه ماتریسی LED که در شکل 1 نشان داده شده است، دارای ولتاژ فوروارد ۲ ولت و جریان فوروارد ۲۰ میلیآمپر است. جدول 1 مقدار ۲۸ کیلواهم را نشان میدهد، اما برای ایجاد حاشیه اطمینان کمی، مقاومتی معادل ۳۰ کیلواهم یا ۳۳ کیلواهم انتخاب مناسبی خواهد بود. خازنها (۰.۱ میکروفاراد و ۱۰ میکروفاراد) برای جلوگیری از ایجاد نوسانات نویز هنگام روشن و خاموش شدن LEDها موردنیاز هستند.
فرض کنید شما میخواهید شدت روشنایی LEDهای بیشتری را بهصورت جداگانه کنترل کنید، بیش از آنچه آردوینو بتواند پشتیبانی کند.
تراشه PCA9685 میتواند تا ۱۶ LED را تنها با استفاده از دو پین I2C (SDA و SCL) کنترل کند. شرکت Adafruit بردی (برد توسعه) تولید کرده است که میتواند چندین سروو یا LED را درایو کند (شماره قطعه Adafruit: ۸۱۵). شکل 2 اتصالات را نشان میدهد. این نمونه کد بر اساس کتابخانه Adafruit_PWMServoDriver آدافرت است که میتوانید با استفاده از مدیر کتابخانههای آردوینو (Arduino Library Manager) آن را نصب کنید.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
/* PCA9685 sketch Create a Knight Rider-like effect on LEDs plugged into all the PCA9685 outputs this version assumes one PCA9685 with 16 LEDs */ #include <Wire.h> #include <Adafruit_PWMServoDriver.h> Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver(); void setup() { pwm.begin(); // Initialize the PWM board } int channel = 0; int channel_direction = 1; int intensity = 4095; // Maximum brightness int dim = intensity / 4; // Intensity for a dim LED void loop() { channel += channel_direction; // increment (or decrement) the channel number // Turn off all the pins for (int pin = 0; pin < 16; pin++) { pwm.setPin(pin, 0); } // If we've hit channel 0, set direction to 1 if (channel == 0) { channel_direction = 1; } else { // If we're at channel 1 or higher, set its previous neighbor to dim pwm.setPin(channel - 1, dim); } // Set this channel to maximum brightness pwm.setPin(channel, intensity); if (channel < 16) { // If we're below channel 16, set the next channel to dim pwm.setPin(channel + 1, dim); } else { // If we've hit channel 16, set direction to -1 channel_direction = -1; } delay(75); } |

شکل 2: شانزده LED که با استفاده از PWM خارجی راهاندازی شدهاند.
این برنامه (اسکچ) در یک حلقه تکرار (لوپ) از طریق هر کانال (LED) میگذرد، شدت LED قبلی را کم میکند (تضعیف میکند)، کانال فعلی را در حداکثر شدت قرار میدهد و کانال بعدی را کمنور میکند. LEDها از طریق چند متد اصلی کنترل میشوند. این برنامه فرض میکند که تراشه PCA9685 با آدرس پیشفرض I2C یعنی 0x40 پیکربندی شده است.
متد Adafruit_PWMServoDriver.begin درایور را قبل از هر تابع دیگری مقداردهی اولیه میکند. متد pwm.setPin وظیفه تنظیم چرخه وظیفه (Duty Cycle) یک کانال مشخص را بر عهده دارد که بهصورت تعداد تیکها از ۰ تا ۴۰۹۵ داده میشود. آرگومان اول، شماره کانال و به دنبال آن، میزان روشنایی است. هر سیکل مدولاسیون عرض پالس (PWM) به ۴۰۹۶ تیک تقسیم میشود. مقداری که برای روشنایی (brightness) فراهم میکنید، نشاندهنده تعداد تیکهایی است که LED باید روشن بماند. شما میتوانید فرکانس PWM را با استفاده از متد pwm.setPWMFreq تغییر دهید (مقدار را بر حسب هرتز، از ۴۰ تا ۱۶۰۰، وارد کنید).
توابع بیشتری در این کتابخانه موجود است.
شما میتوانید با اتصال پینهای بردهای درایور مختلف به یکدیگر، چندین برد درایور را زنجیرهای (سری) کنید. هر برد باید یک آدرس منحصربهفرد داشته باشد که این آدرس را با لحیمکردن پدهای برچسبگذاری شده A0 تا A5 تنظیم میکنید. همچنین، شما میتوانید تا ۶۲ برد درایور را بهصورت زنجیرهای متصل کنید.
فرض کنید میخواهید نشانگر (pointer) یک متر پنلی آنالوگ را از طریق اسکچ خود کنترل کنید.
نمایشگرهای آنالوگ، تغییرات و نوسانات را راحتتر نشان میدهند و ظاهری نوستالژیک (رترو) به پروژه شما میبخشند.
متر را از طریق یک مقاومت سری (۵ کیلواهم برای متر معمولی ۱ میلیآمپر) به خروجی آنالوگ (PWM) وصل کنید (شکل 3 را ببینید).
حرکت نشانگر متناظر با موقعیت یک پوتانسیومتر (مقاومت متغیر) است:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
/* * AnalogMeter sketch * Drives an analog meter through an Arduino PWM pin * The meter level is controlled by a variable resistor on an analog input pin */ const int analogInPin = A0; // Analog input connected to variable resistor const int analogMeterPin = 9; // Analog output pin connected to the meter int sensorValue = 0; // value read from the pot int outputValue = 0; // value output to the PWM (analog out) void setup() { // nothing in setup } void loop() { sensorValue = analogRead(analogInPin); // read the analog in value outputValue = map(sensorValue, 0, 1023, 0, 255); // scale for analog out analogWrite(analogMeterPin, outputValue); // write the analog out value } |

شکل 3: راهاندازی یک متر آنالوگ
در این حالت، خروجی analogWrite آردوینو یک متر پنلی را راهاندازی میکند. مترهای پنلی معمولاً بسیار حساستر از LEDها هستند؛ بنابراین، برای کاهش جریان به سطح مناسب برای متر، باید یک مقاومت بین خروجی آردوینو و متر متصل شود.
مقدار مقاومت سری به حساسیت متر بستگی دارد؛ برای یک متر ۱ میلیآمپری، ۵ کیلواهم انحراف کامل مقیاس را ایجاد میکند. شما میتوانید از مقاومتهای ۴.۷ کیلواهمی استفاده کنید، زیرا تهیه آنها آسانتر از ۵ کیلواهم است، اگرچه احتمالاً لازم است حداکثر مقداری که به analogWrite میدهید را به حدود ۲۴۰ کاهش دهید. در اینجا نحوه تغییر دامنه در تابع map آمده است اگر از مقاومت ۴.۷ کیلواهمی با یک متر ۱ میلیآمپر استفاده میکنید:
|
1 |
outputValue = map(sensorValue, 0, 1023, 0, 240); // map to meter's range |
اگر متر شما حساسیت متفاوتی نسبت به ۱ میلیآمپر داشته باشد، نیاز خواهید داشت که از مقدار متفاوتی برای مقاومت سری استفاده کنید. مقدار مقاومت بر حسب اهم بهصورت زیر است:
مقاومت = 5,000 / mA
بنابراین، برای یک متر ۵۰۰ میلیآمپری (اگر ۰.۵ میلیآمپر در نظر گرفته شود)، مقدار مقاومت 5,000/0.5 محاسبه میشود که برابر با ۱۰,۰۰۰ اهم (۱۰ کیلو اهم) است. یک متر ۱۰ میلیآمپری به ۵۰۰ اهم و یک متر ۲۰ میلیآمپری به ۲۵۰ اهم نیاز دارد.
برخی از مترهای مازاد (استوک) از قبل دارای یک مقاومت سری داخلی هستند؛ ممکن است برای تعیین مقدار صحیح مقاومت خارجی نیاز به آزمایش داشته باشید، اما مراقب باشید که ولتاژ بیش از حدی به متر اعمال نکنید.
من کاپیتان آردوینو، اسمم میلاده و اینجا هستم تا تجربیاتم در رابطه با آردوینو رو با شما به اشتراک بزارم!
سیسوگ با افتخار فضایی برای اشتراک گذاری دانش شماست. برای ما مقاله بنویسید.