תוכן עניינים:

Arduino & Neopixel בקבוק קולה קשת מסיבת קשת: 7 שלבים (עם תמונות)
Arduino & Neopixel בקבוק קולה קשת מסיבת קשת: 7 שלבים (עם תמונות)

וִידֵאוֹ: Arduino & Neopixel בקבוק קולה קשת מסיבת קשת: 7 שלבים (עם תמונות)

וִידֵאוֹ: Arduino & Neopixel בקבוק קולה קשת מסיבת קשת: 7 שלבים (עם תמונות)
וִידֵאוֹ: Arduino MIDI Drums with Piezo Disc Triggers (with schematic and code) 2024, נוֹבֶמבֶּר
Anonim
Image
Image

אז הבן שלי דון מזהה אור מסיבה מגניב מאוד העשוי מבקבוקי קולה ישנים והפנימיות הדביקות של Glow Sticks, ושואל אם נוכל להכין אחת לבחינות בית הספר הקרובות שלו שהן נגמרות MAYYY !!! אני אומר בוודאות, אבל האם לא היית מעדיף כמה מטבעות הנאפיקסל המנומנמות של Adafruit עליהן קראנו … הוא נותן בי מבט ריק. כי העובדה היא שהוא לא יודע על מה אני מדבר, אבל אבא הבחין בהזדמנות לשחק עם אותן טבעות ניאופיקסל שהוא קרא עליהן, וכולנו מכירים את אחת מעשר הסיבות הטובות ביותר שאבות חנון יוצרים היא שיש להם תירוץ לשחק עם גאדג'טים מגניבים שהם אומרים שכולם נועדו לילדים שלהם.

זהו פרויקט סופר פשוט שנראה ממש נהדר. בנינו משלנו 3 בקבוקי קולה ישנים, צלחת עץ, ותושבת עמוד למגרש משחקים - דברים המונחים במרתף - בשילוב עם ארדואינו (לאונרדו במקרה שלנו, אבל כל לוח ג'נואינו יעשה!) ושלוש טבעות ניאופיקסל.. הזמנתי טבעת בעלת 9 לדים, אך בסופו של דבר קיבלתי טבעת בעלת 12 לדים באותו מחיר. מה שהיה מתוק, אבל התכוון לעשות-על בחורי הבאר-טבעות 12-LED ברוחב 35 מ"מ, לעומת 23 מ"מ. מה אתה צריך:

  • לוח ג'נווינו/ארדואינו (השתמשנו בלונרדו, אך כמעט כל לוח יעשה זאת)
  • 3 טבעות ניאופיקסל (12 נוריות כל אחת): קנה אותן מ- Adafruit ותמך באותם אנשים טובים
  • 1000 µf 6.3v או יותר קבלים
  • נגד 300-500 אוהם
  • צלחת עץ, או ריבוע של גרוטאות עץ, או כל דבר שתוכלו להכניס לתוכו את הניאופיקסלים ולהושיב את בקבוקי הקולה מעל
  • צורה כלשהי של הר לצלחת - סוגר עמוד למגרש משחקים עבד נהדר עבורנו
  • יבלת קיר 9v
  • חור חור 40 מ"מ
  • ברגים, אגוזים, מכונות כביסה, מרווחים
  • חוט ליבה מוצק
  • מגהץ והלחמה
  • לוח לחם
  • מארז פלסטיק לארדואינו. אתה יכול לצאת ולרכוש מארז פלסטיק מתאים להפליא, עשוי מנפט בן מיליון שנה, הוקדח מהאדמה באיזו סביבה שבירה ומיוצר בצד השני של כדור הארץ ונשלח במיכל למחסן לידך עם כל יציאות נחתכות בהתאמה מושלמת ושולחות לדלתך על ידי טנדר שפולט פחמן דו חמצני לאטמוספירה. או שאתה יכול לעשות את מה שעשיתי ולהשתמש בקופסת פלסטיק ישנה שהושלכה.. במקרה זה קופסת סיוע לפלסטי של מדגסקר השוכנת בארון התרופות … ונקדח בה כמה חורים. כאן מסתיימת ההרצאה. בואו נעשה…

שלב 1: הכינו את הבסיס

הכינו את הבסיס
הכינו את הבסיס
הכינו את הבסיס
הכינו את הבסיס

אתה יכול לאלתר את הבסיס שלך מכל זבל שיש לך במרתף שלך, או אפילו פשוט להשתמש בקופסת עץ או כל דבר שיסתיר את האלקטרוניקה שלך.

תחילה קידחנו שלושה חורים, במרווחים אחידים על צלחת העץ, גדולים מספיק כדי שניתן יהיה לשבת בטבעות הנאופיקסל. בתמונה החורים הם בארות שנקדחו בעזרת מקדחה כף. בסופו של דבר, בגלל הגודל הגדול יותר של טבעות 12 הלדים, נאלצנו לקדוח חורים עם מקדח. פירוש הדבר היה לעבור לאורך כל הצלחת, ובמקום ללחוץ את הטבעות יפה לתוך הבארות הקטנות בעומק 2 מ מ שלהן עם חור מרכזי לניווט חוט מסודר, בסופו של דבר אבטחתי את הטבעות בעזרת … אה … סרט דביק על החלק התחתון של הצלחת. אל תשפוט. ממילא אינך יכול לראות את תחתית הצלחת בעיצוב שלי. וחושך כשהוא נדלק. וחוץ מזה - מה רע בנייר דבק?

הייתי צריך מרווח בין הצלחת לתושבת ללוח בתחתית הצלחת ורכיב אחד - הקבל, ולריצות החוט שיצטרכו לעבור מלוח הלחם לארדואינו, שתכננתי לשים בתוך התושבת. אז הנחתי קבוצה של רווחים מאולתרים על פיר הבריח בכדי לתת מספיק מרווח - בערך 3 ס מ, גובה לוח הלחם וקצת כדי שלא תמעוך את החיווט. השתמשתי בשני ברגי עוגן מעץ לפינה מכיוון שהם היו בגובה הנכון ושוכבים במגירת האיש … אותה קופסת ברגים רופפים, ברגים, מסמרים, קישורי שרשרת חלודים, צימוד צינורות, מטבעות ישנים, חפצים חדים באופן בלתי צפוי וכל מיני דרכים. חלקים שיכולים לחסוך לך באורח קסום טיול לחנות חומרי בניין על ידי הצעת דבר, אם לא בדיוק מה שאתה צריך, משהו שיעשה את זה בסדר גמור.

תאונה מאושרת על עמוד המשחקים שמצאתי במרתף כי היו לו כבר חורים שעוברים בצלחת. אין צורך לקדוח ברזל! לבסיס היו ארבעה חורי בורג, וקידחנו ארבעה חורים שקועים בצלחת העץ.

לאחר מכן ריססנו את כל העניין הגותי שחור.

שלב 2: הכנת טבעות הנאופיקסל

הכנת טבעות הנאופיקסל
הכנת טבעות הנאופיקסל

יהיה עליך להלחים חוטים על טבעות הניאופיקסל שלך: חוט Data-In לכולם, חוט Data-Out לשניים מהם, והספק וקרקע לכל אחד. בכל אורך שאתה חושב שאתה צריך, הוסף קצת. אתה תמיד יכול לנתק חוט עודף, אתה לא יכול למתוח חוט קצר מדי. ותהיה מודע לאזהרה של Adafruit:

בעת הלחמת חוטים לטבעות אלה, עליך להיות ערני במיוחד לגבי כתמי הלחמה וקצרים. המרווח בין רכיבים הוא הדוק מאוד! לרוב הכי קל להכניס את החוט מלפנים ולהלחם מאחור.

הלוואי וקראתי את זה לפני שהלחמתי בחזית. הצלחתי לא לשרוף אף אחת מהנוריות שלי, אבל צרבתי את קצה האחת באופן שהניע אותי עד שהדלקתי אותו. כמו כן, אילו הייתי קורא את המדריך המשובח, הייתי קורא גם את האזהרה שלא לשים קליפ תנין על הנורית. תן לטרופות הספינות שלי להיות המגדלור שלך.

Neopixel טבעות שרשרת דייזי, מה שאומר שאתה יכול לשלוט בכל נוריות ה- LED שלהן בו זמנית מארדואינו על ידי חיבור חוט מה- OUT של טבעת אחת ל- IN של אחר. כל טבעת זקוקה גם לחוטי חשמל וארקה.

שלב 3: החיווט

החיווט
החיווט

חבר את זה כמו בפריצה למעלה-סיכה 6 של הארדואינו לוקחת את הנתונים לטבעת הראשונה, ה- Data-out מאותה טבעת עובר ל- Data-in של הבא, ה- Data-out של אותו הולך אל ה- נתונים של הטבעת האחרונה. אינך צריך את חוט הנתונים החוצה של הטבעת האחרונה.

קיבולת 1000 µf עוברת בין המסילות החיוביות והשליליות של לוח הלחם. מכסה זה מגן על הטבעות מפני קפיצי כוח ומומלץ על ידי מדור השיטות המומלצות של Adafruit NeoPixel Uberguide. הנגד בנתונים בנאופיקסל הראשון מומלץ גם הוא על ידי Adafruit-הוא 1K בפריטינג אך ההתנגדות המומלצת היא 300-500 אוהם.

במבנה שלי, העברתי את החוטים מהנאופיקסל על גב הצלחת ללוח קבוע במרכז. כך עליך רק להריץ שלושה חוטים ארוכים ביחידת הבסיס: כוח, קרקע ונתונים. עשיתי את החוטים האלה סופר ארוכים-יש הרבה מקום אחסון בבסיס, וזה מקל על האפשרות למשוך את הלוח לתכנות מחדש.

שלב 4: הקוד

"loading =" עצלן "הזכיר הבן שלי רצה גרסה שמגיבה לזה במוסיקה. לקח עד יום ההולדת ה -18 שלו להסתדר עם זה, אבל הנה זה!

ציוד נוסף:

1 מוט אחד, מתג זריקה כפולה 1 מיקרופון לבקרת רווח אוטומטית (השתמשתי ב- MAX9184 של AdaFruit) קבל 1 uF-100uF (כל ערך)

המיקרופון באמת חייב להיות בעל בקרת רווח אוטומטית כדי שזה יעבוד כמו שצריך. AGC תדגום כל הזמן את רעשי הסביבה ויעלה ויוריד את הסף שהוא מחשיב רקע, כך שהאור שלך יגיב לקוצים על רקע זה. המיקרופון של AdaFruit מבריק: אתה יכול לצאת מחדר שקט שבו צליל של קול אחד יפעיל אותו למצב מסיבות מלא עם חדר מלא בני נוער ומוזיקה בוהקת, והוא יקלוט את הקצב של המוסיקה רק בסדר גמור. האלטרנטיבה, מיקרופון רווח מתכוונן, בעלת פוטנציומטר זעיר בלוח שהוא עדין ומעורפל. לא צריך הרבה שינוי בצליל הסביבה כדי להפוך את היחידה לחסרת תועלת: אורות דולקים כל הזמן או חשוכים כל הזמן. AGC עובד כמו קסם.

רציתי את האפשרות להשתמש בתבנית בדיקת המערבולת או במוזיקה, אז חיברתי את המפתח המרכזי של מתג ל- VIN ומוביל אחד לסיכה 4 והשני לסיכה 8 של הלאונרדו. על ידי בדיקת הסיכות האלו עבור HIGH או LOW נוכל לדעת באיזה מצב המתג נמצא, ולקוד את הסניף בהתאם.

שלב 7: חיבור המיקרופון

חיבור המיקרופון
חיבור המיקרופון

הזן את כניסת המיקרופון באמצעות אותו קבל 1-100µF לתוך פין אנלוגי 0. אם הקבל שלך מקוטב, הסיכה החוצה עוברת לצד החיובי (חוט ירוק).

תודה ל- CodeGirlJP על שגרת טרינקט-צבע-לפי-סאונד שלה, שעיצבתי להלן:

// נוריות מופעלות קול עם Arduino ו- NeoPixels

#לִכלוֹל

#define MIC_PIN A0 // מיקרופון מחובר לסיכה a0 על לאונרדו

#define LED_PIN 6 // גדיל LED NeoPixel המחובר לסיכה 6 על לאונרדו #Define N_PIXELS 36 // מספר פיקסלים בגדיל LED !!!!!! התאם למספר הפיקסלים בהגדרה שלך. זה נכון ל -3 טבעות Neopixel !!!!!! #define N 100 // מספר הדגימות שצריך לקחת בכל פעם שנקרא דוגמאות נקראות #fade fadeDelay 5 // זמן עיכוב לכל כמות דהייה #רעש הגדרה רמה 30 // רמת שיפוע של רעש מיקרופון ממוצע ללא צליל

// אתחל את רצועת NeoPixel עם הערכים המוגדרים למעלה:

רצועת Adafruit_NeoPixel = Adafruit_NeoPixel (N_PIXELS, LED_PIN, NEO_GRB + NEO_KHZ800);

int דוגמאות [N]; // אחסון לסט איסוף דוגמאות

int periodFactor = 0; // עקוב אחר מספר ה- ms לחישוב התקופה int t1 = -1; // זוהו שיעורי שיפוע> 100. int T; // פרק זמן בין הזמנים המדורגים לשיפוע אל מילי שניות; // השיפוע של שתי נתוני מדגם הנתונים שנאספו בייט periodChanged = 0; const int SwitchPinMusic = 4; // סיכה למיקום מיתוג מתג רגישות מוזיקה const int SwitchPinSwirl = 8; // סיכה למיקום המתג תבנית בדיקה (מערבולת) int MusicbuttonState = 0; // משתנה לוגיקה כבויה לרגישות למוסיקה

// שיטת הגדרת Arduino

הגדרת בטל () {

strip.begin ();

ledsOff (); עיכוב (500); displayColor (גלגל (100)); strip.show (); עיכוב (500); oddWheel (גלגל (100)); strip.show (); עיכוב (500); pinMode (SwitchPinMusic, INPUT); pinMode (SwitchPinSwirl, INPUT); // attachInterrupt (4, Switched, FALLING);

}

// שיטת לולאת ארדואינו

לולאת void () {SwirlbuttonState = digitalRead (SwitchPinSwirl); // HIGH אם המתג מוגדר לרגישות מוסיקה MusicbuttonState = digitalRead (SwitchPinMusic); // HIGH if switch הוגדר ל- Test pattern while (SwirlbuttonState == LOW) {readSamples (); // הפעל את שגרת דגימת המוזיקה SwirlbuttonState = digitalRead (SwitchPinSwirl); // בדוק אם המתג השתנה} SwirlbuttonState = digitalRead (SwitchPinSwirl); MusicbuttonState = digitalRead (SwitchPinMusic); בעוד (SwirlbuttonState == HIGH) {Dance (); // הפעל את שגרת תבנית הבדיקה swirbuttonState = digitalRead (SwitchPinSwirl); // בדוק אם הבורר השתנה

}

}

ריקוד ריק () {

while (SwirlbuttonState == HIGH) {colorWipe (strip. Color (255, 0, 0), 50); // Red SwirlbuttonState = digitalRead (SwitchPinSwirl); colorWipe (strip. Color (0, 255, 0), 50); // ירוק SwirlbuttonState = digitalRead (SwitchPinSwirl); colorWipe (strip. Color (0, 0, 255), 50); // כחול SwirlbuttonState = digitalRead (SwitchPinSwirl); //colorWipe(strip. Color(0, 0, 0, 255), 50); // RGBW לבן // שלח מרדף לפיקסלים בתיאטרון ב… SwirlbuttonState = digitalRead (SwitchPinSwirl); theaterChase (strip. Color (127, 127, 127), 50); // White SwirlbuttonState = digitalRead (SwitchPinSwirl); theaterChase (strip. Color (127, 0, 0), 50); // Red SwirlbuttonState = digitalRead (SwitchPinSwirl); theaterChase (strip. Color (0, 0, 127), 50); // כחול SwirlbuttonState = digitalRead (SwitchPinSwirl); קשת (20); SwirlbuttonState = digitalRead (SwitchPinSwirl); rainbowCycle (20); SwirlbuttonState = digitalRead (SwitchPinSwirl); theaterChaseRainbow (50); SwirlbuttonState = digitalRead (SwitchPinSwirl); }} // קרא ועיבד נתוני דוגמה מ- mic void readSamples () {עבור (int i = 0; i0) {slope = samples - דוגמאות [i -1]; } אחרת {שיפוע = דוגמאות - דוגמאות [N -1]; } // בדוק אם שיפוע גדול מ noiseLevel - צליל שאינו מזוהה ברמת רעש אם (abs (שיפוע)> noiseLevel) {if (שיפוע <0) {calcPeriod (i); if (periodChanged == 1) {displayColor (getColor (T)); }}} else {ledsOff (); // theaterChaseRainbow (50); } periodFactor += 1; עיכוב (1); }}

לחשב חלל תקופה (int i)

{אם (t1 == -1) {// t1 לא הוגדר t1 = i; } else {// t1 נקבע כך calc period int period = periodFactor*(i - t1); periodChanged = T == תקופה? 0: 1; T = נקודה; //Serial.println(T); // אפס את t1 לערך i החדש t1 = i; periodFactor = 0; }}

uint32_t getColor (תקופה int)

{if (period == -1) גלגל החזרה (0); אחרת אם (תקופה> 400) גלגל החזרה (5); אחרת גלגל החזרה (מפה (-1*תקופה, -400, -1, 50, 255)); }

void fadeOut ()

{for (int i = 0; i <5; i ++) {strip.setBrightness (110 - i*20); strip.show (); // עדכון רצועת עיכוב (fadeDelay); periodFactor += fadeDelay; }}

לדעוך ריק (()

{strip.setBrightness (100); strip.show (); // עדכון רצועת // דהיית צבע פנימה עבור (int i = 0; i <5; i ++) {//strip.setBrightness(20*i+30); //strip.show (); // עדכון רצועת עיכוב (fadeDelay); periodFactor+= fadeDelay; }}

void ledsOff ()

{fadeOut (); עבור (int i = 0; i

תצוגת חלל צבע (צבע uint32_t)

{for (int i = 0; i

void oddWheel (צבע uint32_t)

{for (int j = 0; j <256; j ++) {// מחזור כל 256 הצבעים בגלגל עבור (int q = 0; q <3; q ++) {for (uint16_t i = 24; i <36; i = i+3) {strip.setPixelColor (i+q, גלגל ((i+j) % 255)); // הפעל כל פיקסל שלישי} strip.show ();

עיכוב (1);

עבור (uint16_t i = 24; i <36; i = i+3) {strip.setPixelColor (i+q, 0); // לכבות כל פיקסל שלישי}}} fadeIn (); }

// מלאו את הנקודות בזו אחר זו בצבע

void colorWipe (uint32_t c, uint8_t wait) {for (uint16_t i = 0; i

קשת חלל (uint8_t המתן) {

uint16_t i, j;

עבור (j = 0; j <256; j ++) {עבור (i = 0; i

// מעט שונה, זה הופך את הקשת לחלק שווה לכל אורך

void rainbowCycle (uint8_t wait) {uint16_t i, j;

עבור (j = 0; j <256*5; j ++) {// 5 מחזורים של כל הצבעים על הגלגל עבור (i = 0; i <strip.numPixels (); i ++) {strip.setPixelColor (i, Wheel (((i * 256 / strip.numPixels ()) + j) & 255)); } strip.show (); עיכוב (המתנה); }}

// אורות זחילה בסגנון תיאטרון.

void theaterChase (uint32_t c, uint8_t wait) {for (int j = 0; j <10; j ++) {// עשה 10 מחזורי מרדף אחר (int q = 0; q <3; q ++) {עבור (uint16_t i = 0; i <strip.numPixels (); i = i+3) {strip.setPixelColor (i+q, c); // הפעל כל פיקסל שלישי} strip.show ();

עיכוב (המתנה);

עבור (uint16_t i = 0; i <strip.numPixels (); i = i+3) {strip.setPixelColor (i+q, 0); // לכבות כל פיקסל שלישי}}}}

// אורות זחילה בסגנון תיאטרון עם אפקט קשת

void theaterChaseRainbow (uint8_t wait) {for (int j = 0; j <256; j ++) {// מחזור כל 256 הצבעים בגלגל עבור (int q = 0; q <3; q ++) {עבור (uint16_t i = 0; i <strip.numPixels (); i = i+3) {strip.setPixelColor (i+q, גלגל ((i+j) % 255)); // הפעל כל פיקסל שלישי} strip.show ();

עיכוב (המתנה);

עבור (uint16_t i = 0; i <strip.numPixels (); i = i+3) {strip.setPixelColor (i+q, 0); // לכבות כל פיקסל שלישי}}}}

// הזן ערך 0 עד 255 כדי לקבל ערך צבע.

// הצבעים הם מעבר r - g - b - חזרה ל- r. uint32_t גלגל (בייט WheelPos) {WheelPos = 255 - WheelPos; אם (WheelPos <85) {strip return. Color (255 - WheelPos * 3, 0, WheelPos * 3); } אם (WheelPos <170) {WheelPos -= 85; רצועת החזרה.צבע (0, WheelPos * 3, 255 - WheelPos * 3); } WheelPos -= 170; רצועת החזרה.צבע (WheelPos * 3, 255 - WheelPos * 3, 0); }

void Switched () {

strip.show (); readSamples (); }

לפני שאני נטבחת בתגובות (זכור את מדיניות Be Nice !!) הבנתי לאחר שהעליתי את זה כמה חלק מהקוד שלי מרושל. אין צורך לבדוק כל הזמן את פין 4 ואת סיכה 8 עבור HIGH. מכיוון שהמתג הוא זריקה כפולה של מוט אחד, ניתן להסיק מהערך של אחד מהשני: עליך לבדוק רק אחד. כך שתוכל לעבור ולהסיר כל התייחסות לקריאה ולכתיבה של MusicButtonState ופשוט להריץ את כל הדבר ביעילות רבה יותר על ידי בדיקת SwirlButtonState, אם יש לך זיכרון נמוך או הרחבה עם שגרות אחרות. אבל הקוד למעלה עובד.

ואם מישהו רוצה לצבוט את שגרות השמע האלה כדי לחוש לא רק ברמות הרעש, אלא גם בתדירות, ולכתוב קוד חלק להחלק למעלה ולמטה את ספקטרום האור כתגובה למהלכים לאורך ספקטרום האודיו, אנא שמור קישור בתגובות ל איך עשית את זה.

תהנה!

מוּמלָץ: