جدول المحتويات:
2025 مؤلف: John Day | [email protected]. آخر تعديل: 2025-01-13 06:56
بعد رؤية مشروع مكعب مزاج صغير LED تم إنشاؤه بواسطة إيرل ، قررت عمل نسخة محسنة من LED Mood Cube. سيكون الإصدار الخاص بي أكثر تعقيدًا من الإصدار الأصلي ، حيث سيكون أكبر قليلاً من الإصدار الأصلي ، ويحتوي على لونين إضافيين مقارنة بالمكعب الأصلي (مضافان الأصفر والأبيض) ، ويحتويان على قدر غير محدود من دوران الألوان ، وما إلى ذلك. يجب أن يكون مشروعًا جيدًا للتدرب على المزيد من استخدام مصابيح LED لأولئك الذين فهموا مفهوم توصيل مصابيح LED بالأسلاك.
الخطوة 1: المواد
فيما يلي بعض المواد التي ستحتاجها لصنع Mood Cube:
- اللوح
- اردوينو - (لدي ليوناردو هنا)
- مصدر طاقة اردوينو / كابل USB
- اللوح
- أسلاك العبور (الكثير منها ، استخدمت 29 سلكًا)
- الصمام الأحمر × 2
- LED أزرق × 2
- مصباح LED أخضر × 2
- الصمام الأصفر × 2
- LED أبيض × 1
- 9 مقاومات
- صندوق كبير بما يكفي ليلائم اللوح (استخدمت صندوق أحذية)
- سكين متعدد الاستخدام
- ورق
الخطوة 2: الكود
بعض الشرح للرمز الوارد هنا:
يعود الفضل في الرموز إلى المصدر الأصلي لمشروعي حيث أنشأ محرر المشروع هذه الرموز. لقد قمت فقط بتحسين بعضها من خلال جعلها أكثر تعقيدًا. في بعض الرموز ، قد ترى // 改 في النهاية. هذا يعني أن هذا الرمز تم تحريره بواسطتي ، لذا فهو يختلف عن مصدري الأصلي.
لدي أيضًا نسخة من الكود على Arduino Creator.
/ * رمز لـ 3 مصابيح LED ، أحمر وأخضر وأزرق (RGB) لإنشاء تلاشي ، تحتاج إلى القيام بأمرين: 1. وصف الألوان التي تريد عرضها 2. سرد الترتيب الذي تريده أن يتلاشى فيه
وصف اللون:
اللون عبارة عن مجموعة من ثلاث نسب ، 0-100 ، تتحكم في المصابيح الحمراء والخضراء والزرقاء
الأحمر هو مؤشر LED الأحمر بالكامل ، والأزرق والأخضر متوقف
الأحمر الخافت = {100 ، 0 ، 0} الأبيض الخافت هو جميع مصابيح LED الثلاثة عند 30٪ int dimWhite = {30 ، 30 ، 30} إلخ.
يتم توفير بعض الألوان الشائعة أدناه ، أو اصنعها بنفسك
سرد الطلب:
في الجزء الرئيسي من البرنامج ، تحتاج إلى سرد الترتيب الذي تريد ظهور الألوان به ، على سبيل المثال CrossFade (أحمر) ؛ CrossFade (أخضر) ؛ CrossFade (أزرق) ؛
ستظهر تلك الألوان بهذا الترتيب ، تتلاشى
لون واحد واللون الذي يليه
بالإضافة إلى ذلك ، هناك 5 إعدادات اختيارية يمكنك ضبطها:
1. يتم ضبط اللون الأولي على الأسود (بحيث يتلاشى اللون الأول) ، ولكن يمكنك ضبط اللون الأولي ليكون أي لون آخر 2. تعمل الحلقة الداخلية لـ 1020 interations ؛ يعيّن متغير "الانتظار" المدة التقريبية لتلاشي التلاشي الفردي. من الناحية النظرية ، يجب أن يؤدي "الانتظار" بمقدار 10 مللي ثانية إلى حدوث تلاشي متقاطع لمدة 10 ثوانٍ تقريبًا. من الناحية العملية ، فإن الوظائف الأخرى التي يؤديها الكود تؤدي إلى إبطاء هذا إلى حوالي 11 ثانية على لوحي. YMMV. 3. إذا تم ضبط "تكرار" على 0 ، فسيقوم البرنامج بالتكرار إلى أجل غير مسمى. إذا تم تعيينه على رقم ، فسيتم تكرار هذا العدد من المرات ، ثم يتوقف عند اللون الأخير في التسلسل. (اضبط "return" على 1 ، واجعل اللون الأخير أسودًا إذا كنت تريده أن يتلاشى في النهاية.) 4. يوجد متغير "Hold" اختياري ، والذي يمرر البرنامج لـ "Hold" مللي ثانية عندما يكون اللون اكتمل ، ولكن قبل أن يبدأ اللون التالي. 5. اضبط علامة DEBUG على 1 إذا كنت تريد إرسال إخراج التصحيح إلى الشاشة التسلسلية.
الأجزاء الداخلية للبرنامج ليست معقدة ، لكنها كذلك
صعب بعض الشيء - يتم شرح الإجراءات الداخلية أسفل الحلقة الرئيسية.
أبريل 2007 ، كلاي شيركي
*
/ انتاج
int ylwPin = 5 ؛ // مؤشر LED أصفر متصل بالدبوس الرقمي 5 // 改 int redPin = 6 ؛ // Red LED ، متصل بالدبوس الرقمي 6 // 改 int grnPin = 7 ؛ // Green LED ، متصل بالطرف الرقمي 7 // 改 int bluPin = 8 ؛ // Blue LED متصل بالطرف الرقمي 8 // 改 int whiPin = 9 ؛ // مصباح LED أبيض ، متصل بالدبوس الرقمي 9 // 改 int ylwPin2 = 10 ؛ // مؤشر LED أصفر متصل بالدبوس الرقمي 10 // 改 int redPin2 = 11 ؛ // Red LED ، متصل بالدبوس الرقمي 11 // 改 int grnPin2 = 12 ؛ // Green LED ، متصل بالطرف الرقمي 12 // 改 int bluPin2 = 13 ؛ // LED أزرق ، متصل بالرقم الرقمي 13 // 改
// مصفوفات اللون
int black [9] = {0 ، 0 ، 0 ، 0 ، 0 ، 0 ، 0 ، 0 ، 0} ؛ // 改 int أبيض [9] = {100 ، 100 ، 100 ، 100 ، 100 ، 100 ، 100 ، 100، 100}؛ // 改 int red [9] = {0، 0، 100، 0، 0، 0، 100، 0، 0}؛ // 改 int green [9] = {0، 100، 0، 0 ، 0 ، 0 ، 0 ، 100 ، 0} ؛ // 改 int أزرق [9] = {0 ، 0 ، 0 ، 100 ، 0 ، 0 ، 0 ، 0 ، 100} ؛ // 改 int أصفر [9] = {100 ، 0 ، 0 ، 0 ، 0 ، 100 ، 0 ، 0 ، 0} ؛ // 改 int أرجواني [9] = {0 ، 50 ، 0 ، 50 ، 0 ، 0 ، 50 ، 0 ، 50} ؛ // 改 int orange [9] = {50، 50، 0، 0، 0، 50، 50، 0، 0} ؛ // 改 int pink [9] = {0، 50، 0، 0، 50، 0، 0، 50، 0،} ؛ // 改 // إلخ.
// تعيين اللون الأولي
int redVal = أسود [0] ؛ int grnVal = أسود [1] ؛ int bluVal = أسود [2] ؛ int ylwVal = أسود [3] ؛ // 改 int whiVal = أسود [4] ؛ // 改
انتظر int = 15 ؛ // 10 مللي ثانية تأخير التداخل الداخلي ؛ زيادة يتلاشى أبطأ // 改
عقد int = 1 ؛ // تعليق اختياري عند اكتمال اللون ، قبل التقاطع التالي // 改 int DEBUG = 1 ؛ // عداد DEBUG ؛ إذا تم ضبطه على 1 ، فسيتم إعادة كتابة القيم عبر serial int loopCount = 60 ؛ // كم مرة يجب أن تبلغ DEBUG؟ تكرار int = 0 ؛ // كم مرة يجب أن نكررها قبل التوقف؟ (0 بدون توقف) // 改 int j = 0 ؛ // حلقة العداد للتكرار
// تهيئة متغيرات اللون
int prevR = redVal ؛ int prevG = grnVal ؛ int prevB = bluVal ؛ int prevY = ylwVal ؛ int prevW = whiVal ؛ // 改
// إعداد نواتج LED
إعداد باطل () {pinMode (redPin ، الإخراج) ؛ // يعين المسامير كإخراج pinMode (grnPin ، الإخراج) ؛ pinMode (bluPin ، الإخراج) ؛ pinMode (ylwPin ، الإخراج) ؛ // 改 pinMode (whiPin ، الإخراج) ؛ // 改 pinMode (grnPin2 ، الإخراج) ؛ // 改 pinMode (bluPin2 ، الإخراج) ؛ // 改 pinMode (ylwPin2 ، الإخراج) ؛ // 改 pinMode (redPin2 ، الإخراج) ؛ // 改
إذا (DEBUG) {// إذا أردنا رؤية قيم لتصحيح الأخطاء …
Serial.begin (9600) ؛ // … إعداد الإخراج التسلسلي}}
// البرنامج الرئيسي: قائمة بترتيب التلاشي المتقاطع
حلقة باطلة () {crossFade (أحمر) ؛ CrossFade (أخضر) ؛ CrossFade (أزرق) ؛ CrossFade (أصفر) ؛ CrossFade (أبيض) ؛ CrossFade (وردي) ؛ CrossFade (أرجواني) ؛ CrossFade (برتقالي) ؛
إذا (كرر) {// هل نكرر عددًا محدودًا من المرات؟
ي + = 1 ؛ إذا (j> = كرر) {// هل وصلنا بعد؟ خروج (ي) ؛ // إذا كان الأمر كذلك ، توقف. }}}
/ * يوجد أسفل هذا السطر الرياضيات - يجب ألا تحتاج إلى تغيير هذا من أجل الأساسيات
يعمل البرنامج على النحو التالي:
تخيل تلاشيًا متقاطعًا يحرك مؤشر LED الأحمر من 0 إلى 10 والأخضر من 0 إلى 5 والأزرق من 10 إلى 7 في عشر خطوات. نرغب في حساب 10 خطوات وزيادة قيم اللون أو إنقاصها بزيادات تدريجية متساوية. تخيل أن a + يشير إلى رفع قيمة بمقدار 1 ، و a - يساوي خفضها. سيبدو التلاشي المكون من 10 خطوات كما يلي:
1 2 3 4 5 6 7 8 9 10
R + + + + + + + + + G + + + + + B - - -
يرتفع اللون الأحمر من 0 إلى 10 في عشر خطوات ، بينما يرتفع اللون الأخضر من
0-5 في 5 خطوات ، واللون الأزرق يتساقط من 10 إلى 7 في ثلاث خطوات.
في البرنامج الحقيقي ، يتم تحويل نسب الألوان إلى
قيم 0-255 ، وهناك 1020 خطوة (255 * 4).
لمعرفة حجم الخطوة التي يجب أن تكون بين واحد لأعلى أو
علامة لأسفل لإحدى قيم LED ، نسميها calculateStep () ، والتي تحسب الفجوة المطلقة بين قيم البداية والنهاية ، ثم تقسم هذه الفجوة على 1020 لتحديد حجم الخطوة بين التعديلات في القيمة. * /
int calculateStep (int prevValue، int endValue) {
خطوة int = endValue - prevValue ؛ // ما هي الفجوة الإجمالية؟ إذا (الخطوة) {// إذا كانت غير صفرية ، الخطوة = 1020 / الخطوة ؛ // قسمة على 1020} خطوة إرجاع ؛ }
/ * الوظيفة التالية هي calculateVal. عندما تكون قيمة الحلقة ، i ،
يصل إلى حجم الخطوة المناسب لأحد الألوان ، فهو يزيد أو ينقص قيمة ذلك اللون بمقدار 1. (يتم حساب كل من R و G و B على حدة.) * /
int calculateVal (int step، int val، int i) {
إذا ((الخطوة) && i٪ step == 0) {// إذا كانت الخطوة غير صفرية ووقتها لتغيير القيمة ،
إذا (الخطوة> 0) {// قم بزيادة القيمة إذا كانت الخطوة موجبة … val + = 1؛ } else if (الخطوة 255) {val = 255 ؛ } else if (val <0) {val = 0 ؛ } إرجاع val؛ }
/ * crossFade () يحول النسبة المئوية للألوان إلى أ
نطاق 0-255 ، ثم حلقات 1020 مرة ، والتحقق لمعرفة ما إذا كانت القيمة بحاجة إلى التحديث في كل مرة ، ثم كتابة قيم اللون على المسامير الصحيحة. * /
تلاشي باطل (int color ) {// 改
// تحويل إلى 0-255 int R = (color [0] * 255) / 100 ؛ int G = (color [1] * 255) / 100 ؛ int B = (color [2] * 255) / 100 ؛ int Y = (color [3] * 255) / 100 ؛ // 改 int W = (color [4] * 255) / 100 ؛ // 改
int stepR = calculateStep (prevR، R) ؛
int stepG = calculateStep (prevG، G) ؛ int stepB = calculateStep (prevB، B) ؛ int stepY = calculateStep (prevY، Y)؛ // 改 int stepW = calculateStep (prevW، W)؛ // 改
لـ (int i = 0 ؛ i <= 1020 ؛ i ++) {redVal = calculateVal (stepR، redVal، i) ؛ grnVal = calculateVal (stepG، grnVal، i) ؛ bluVal = calculateVal (stepB، bluVal، i) ؛ ylwVal = calculateVal (stepY، ylwVal، i) ؛ // 改 whiVal = calculateVal (stepW، whiVal، i) ؛ // 改
analogWrite (redPin ، redVal) ؛ // اكتب القيم الحالية إلى دبابيس LED
analogWrite (grnPin ، grnVal) ؛ analogWrite (bluPin ، bluVal) ؛ analogWrite (ylwPin ، ylwVal) ؛ // 改 analogWrite (whiPin ، whiVal) ؛ // 改 analogWrite (grnPin2 ، grnVal) ؛ // 改 analogWrite (bluPin2 ، bluVal) ؛ // 改 analogWrite (ylwPin2 ، ylwVal) ؛ // 改 analogWrite (redPin2 ، redVal) ؛ // 改
تأخير (انتظر) ؛ // توقف لمدة مللي ثانية "انتظر" قبل استئناف الحلقة
إذا (DEBUG) {// إذا أردنا إخراج تسلسلي ، فقم بطباعته على
إذا (i == 0 أو i٪ loopCount == 0) {// بداية ، وكل حلقة تكرار مرات Serial.print ("Loop / RGBYW: #") ؛ Serial.print (i) ؛ Serial.print ("|") ؛ Serial.print (redVal) ؛ Serial.print ("/") ؛ Serial.print (grnVal) ؛ Serial.print ("/") ؛ Serial.println (bluVal) ؛ Serial.print ("/") ؛ Serial.println (ylwVal) ؛ // 改 Serial.print ("/") ؛ // 改 Serial.println (whiVal) ؛ // 改 Serial.print ("/") ؛ // 改} تصحيح + = 1 ؛ }} // تحديث القيم الحالية للحلقة التالية prevR = redVal ؛ prevG = grnVal ؛ prevB = bluVal ؛ prevY = ylwVal ؛ // 改 prevW = whiVal ؛ // 改 تأخير (تعليق) ؛ // إيقاف مؤقت لملي ثانية "انتظار" اختياري قبل استئناف الحلقة}
الخطوة 3: الإعداد
- احصل على اللوح.
-
عرض توضيحي لتوصيل الأسلاك حتى يتألق ضوء LED:
- ضع المصباح على اللوح. ضع الطرف الأطول على اليسار والنهاية الأقصر على اليمين.
- ضع أحد طرفي سلك العبور في مكان موجود في نفس الصف مع الطرف الأطول لمصباح LED. ضع الطرف الآخر على قسم Digital PWM. حدد الكود أن المصابيح الصفراء متصلة بـ 10 و 5 ، والأحمر بـ 6 و 11 ، والأزرق بـ 8 و 13 ، والأخضر إلى 7 و 12 ، وأخيراً LED الأبيض بـ 9.
- ضع أحد طرفي المقاوم في نفس الصف مع الطرف الأقصر لمصباح LED. ضع الطرف الآخر في مكان قريب.
- ضع طرفًا لسلك توصيل آخر بنفس الصف مع نهاية المقاوم الذي لا يوجد في نفس الصف مع الطرف الأقصر لمصباح LED. ضع الطرف الآخر من السلك على صف الشحنة السالبة.
- ضع طرفًا لسلك توصيل آخر على صف الشحنة السالبة وضع الطرف الآخر على GND.
- كرر الخطوة 2 لمدة 8 مرات كما تريد 9 مصابيح LED للتألق
-
ضع اللوح داخل الصندوق. بعض التذكيرات هنا:
- لقد استخدمت مصدر طاقة. قم بإنشاء ثقب صغير للأسلاك الخاصة بك باستخدام سكين فائدة لتمرير الصندوق والاتصال بلوح التجارب.
- تأكد من أن الصندوق مفتوح كجانب واحد. يحتوي صندوق الأحذية بالفعل على جانب واحد مفتوح. إذا كان الصندوق مغلقًا تمامًا ، فقم بقص جانب واحد من الصندوق لتوفير مساحة مفتوحة.
- قم بتغطية الجانب بالورق. هذا هو لأضواء LED لتسطع من خلال الورق.