Мазмуну:

Arduino & Neopixel Coke Bottle Rainbow Party Light: 7 кадам (сүрөттөр менен)
Arduino & Neopixel Coke Bottle Rainbow Party Light: 7 кадам (сүрөттөр менен)

Video: Arduino & Neopixel Coke Bottle Rainbow Party Light: 7 кадам (сүрөттөр менен)

Video: Arduino & Neopixel Coke Bottle Rainbow Party Light: 7 кадам (сүрөттөр менен)
Video: Arduino & Neopixel Coke Bottle Party Light 2024, Ноябрь
Anonim
Image
Image

Ошентип, менин уулум Дун эски кокс бөтөлкөлөрүнөн жана жаркыраган таякчалардан жасалган эң сонун кече жарыктарын байкап, анын алдыдагы мектеп экзамендерине даярдай алабызбы деп сурайт PartAYYY !!! Мен так айтам, бирок биз окуган Adafruit Neopixel шакектеринин кээ бирлерине ээ болгуңуз келбейт беле … Ал мага бош карап турат. Чындыгында, ал менин эмнени айтып жатканымды билбейт, бирок атам окуган Neopixel шакектери менен ойноо мүмкүнчүлүгүн байкады жана биз баарыбыз ген аталардын тукум улоочу 10 себебинин бирин билебиз. ар бир адам балдары үчүн деп айткан сонун гаджеттер менен ойногонго шылтоо.

Бул абдан сонун көрүнгөн супер-жөнөкөй долбоор. Биз өзүбүздүн 3 эски кокс бөтөлкөлөрүн, жыгач табакчаларды жана оюн аянтчасынын пост кронштейнин - подвалда жаткан нерселерди - Arduino (биздин учурда Леонардо, бирок кандайдыр бир Генуино тактасы жасайт!) Жана үч неопикселдүү шакекчелерди курдук.. Мен 9-LED шакегин заказ кылдым, бирок ошол эле баада 12-LED шакеги менен аяктады. Бул таттуу болчу, бирок кудуктун үстүндө иштөөнү билдирет-12-LED шакектери 23ммден айырмаланып, туурасы 35мм. Эмне керек:

  • Genuino/Arduino тактасы (Биз Леонардону колдонгонбуз, бирок дээрлик бардык такталар аткарат)
  • 3 Neopixel шакеги (12 LED)
  • 1000 µf 6.3v же жакшыраак конденсатор
  • 300-500 Ом каршылыгы
  • Жыгач табак, же чарчы сынык жыгач, же неопикселдерди коюп кокс бөтөлкөлөрүн үстүнө отургуза турган нерселер
  • Табакка орнотуунун кандайдыр бир түрү - оюн аянтчасынын кронштейни биз үчүн жакшы иштеди
  • 9v дубал сөөл
  • 40 мм тешик
  • Болттар, гайкалар, шайбалар, боштуктар
  • Катуу өзөк зым
  • Бир ширетүүчү жана темир
  • Breadboard
  • Arduino үчүн пластикалык корпус. Сиз чыгып, планетанын аркы өйүзүндө өндүрүлгөн жана контейнерде жаныңыздагы кампага жөнөтүлгөн миллиондогон жылдык мунайдан жасалган, эң сонун пластикалык корпусту сатып ала аласыз. порттор кемчиликсиз тегизделип, атмосферага көмүр кычкыл газын чачыратып турган фургон аркылуу эшикке жеткирилет. Же сен менин кылганымды кылып, эски ыргытылган пластик кутучаны колдонсоң болот.. бул учурда дары кабинетинин ичинде Мадагаскар тобунун жардам кутучасы жатат … жана анын ичинде бир нече тешиктерди бургулаңыз. Бул жерде лекция аяктады. Жасайык…

1 -кадам: Базаны жасаңыз

Базаны жасаңыз
Базаны жасаңыз
Базаны жасаңыз
Базаны жасаңыз

Сиз базаңызды өзүңүздүн жер төлөңүздө болгон нерселерден импровизациялай аласыз, же жөн эле жыгач кутуну же электроникаңызды жашыра турган нерселерди колдоно аласыз.

Адегенде биз жыгач табакка тегиз жайгашкан үч тешикти бурдук, бул неопикселдин шакектери отура турганчалык чоң. Сүрөттө тешиктер күрөк менен бургуланган скважиналар. Акыр-аягы, 12-LED шакектери чоңураак болгондуктан, биз тешиктерди бургучу бар бургулоого туура келген. Бул табак аркылуу өтүүнү билдирип, шакектерди 2 мм тереңдиктеги майда кудуктарга тыкан зым менен чуркоо үчүн жакшылап кысып койгондун ордуна, мен шакектерди бекитип койдум… ахем … Түбүндө скотч табактын. Соттобо. Сиз ансыз деле менин дизайнымдагы табактын түбүн көрө албайсыз. Ал эми күйүп турганда караңгы. Жана андан башка - скотчтун эмнеси жаман?

Мен табактын түбүндөгү нан табак үчүн табак менен кронштейндин ортосундагы боштукту жана бир компонентти - конденсаторду жана зымдын чуркоосу үчүн нан тактасынан Ардуиного чейин барышым керек болчу, аны мен кронштейнге коюуну пландадым. Мен болт шахталарына жетишерлик боштук берүү үчүн убактылуу бөлгүчтөрдүн топтомун койдум - болжол менен 3 см. Мен бурчта эки жыгач анкер болт колдондум, анткени алар туура бийиктикте болчу жана эркектин суурмасында жатып калышкан … ал куту бош бурамалар, болттор, мыктар, дат баскан чынжырлар, шланг муфталары, эски тыйындар, күтүлбөгөн жерден учтуу нерселер жана башка нерселер биттер менен бобдордун жардамы менен сиз аппараттык дүкөнгө саякатыңызды сыйкырдуу түрдө сактап кала аласыз, эгер сизге так керектүү нерсе болбосо, анда ал эң сонун кыла турган нерсе.

Мен жертөлөдөн табылган оюн аянтчасы жөнүндөгү бактылуу кырсык, ал плитанын ичине кирип кеткен тешиктер болгон. Темир бургулоонун кереги жок! Базанын төрт болт тешиги бар болчу, жана биз дал келүү үчүн жыгач табакка каршы чөгүп кеткен төрт тешикти бургуладык.

Биз андан кийин готика кара түстөгү нерсенин баарын боёлгонбуз.

2 -кадам: Neopixel шакектерин даярдоо

Neopixel шакектерин даярдоо
Neopixel шакектерин даярдоо

Сиз зымдарды неопикселдүү шакектериңизге ширетишиңиз керек: алардын баарына Data-In зымы, экөөнө Data-Out зымы жана ар бирине күч жана жер. Сизге кандай узундук керек деп ойлосоңуз, бир аз кошуңуз. Ар дайым ашыкча зымды үзсөңүз болот, өтө эле кыска созууга болбойт. Адафруттун эскертүүсүнөн кабардар болуңуз:

Бул шакектерге зымдарды ширеткенде, сиз ширетүү түйүндөрүнө жана кыска туташууларга өтө сергек болууңуз керек. Компоненттердин ортосундагы аралык абдан тыгыз! Көбүнчө зымды алдыңкы жана арткы жагына кыстаруу оңой.

Мен муну фронтко кеткенге чейин окугум келет. Мен эч кандай светодиоддорумду күйгүзө албадым, бирок мен анын четин күйгүзгөнгө чейин тердеп кеткендей күйгүздүм. Ошондой эле, эгер мен жакшы көрсөтмөнү окуганымда, LEDге аллигатордун клипин койбо деген эскертүүнү да окугам. Менин кемеге жакын кыйроолорум сенин маякың болсун.

Neopixel шакекчелери ромашка чынжырчасы, демек, сиз бир LEDдин бардыгын Ардуинодон бир шакектин ЧЫГЫШЫНАН экинчисинин INге туташтыруу менен бир убакта башкара аласыз. Ар бир шакекке электр жана жер зымдары керек.

3 -кадам: Кабелдик

Wiring
Wiring

Аны жогорудагы Фритзингдегидей эле байлаңыз-Arduino'дун 6-пини маалыматты биринчи рингге алып барат, ал рингден Берилиштер кийинки маалыматка өтөт, ал эми анын чыкылдатуусу Акыркы шакектин дайындары. Сизге акыркы шакектин маалымат чыгуучу зымы кереги жок.

1000 µf кубаттуулугу нан тактасынын оң жана терс рельстеринин ортосунда жүрөт. Бул капкак шакектерди кубаттан сактайт жана Adafruit NeoPixel Uberguideдин эң жакшы тажрыйба бөлүмү тарабынан сунушталат. Биринчи неопикселге берилиштердеги резистор да Adafruit тарабынан сунушталат-бул Fritzingде 1K, бирок сунушталган каршылык 300-500 Ом.

Менин конструкциямда, зымдарды Neopixelsтен плитанын артына, борборго бекитилген нанга чуркадым. Ошентип, сиз базалык блокко үч узун зымды түшүрүшүңүз керек: күч, жер жана маалымат. Мен бул зымдарды өтө узун кылдым-базада сактоочу жайлар көп, жана тактайды кайра программалоо үчүн сууруп алууну ыңгайлуу кылат.

4 -кадам: Код

"loading =" жалкоо "менин уулумдун музыканын реактивдүү версиясын каалаарын айтты. Бул үчүн 18 жашка чыкканга чейин, бирок бул жерде!

Кошумча жабдуулар:

1 Бир уюл, Double Throw Switch 1 Автоматтык кирешени көзөмөлдөө микрофондору (I AdaFruit MAX9184 колдондум) 1 1uF-100uF конденсатор (Ар кандай мааниде)

Микрофондун чындап иштеши үчүн Автоматтык кирешени көзөмөлдөөчү аппарат болушу керек. AGC дайыма айлана -чөйрөдөгү ызы -чууну тандап алат жана фон деп эсептеген босогону жогорулатат жана төмөндөтөт, андыктан сиздин жарык ошол фонго каршы чукулдарга жооп берет. AdaFruitтин микрофону эң сонун: сиз унчукпаган бөлмөдөн чыга аласыз, анда бир үндүн үнү аны толук кече режимине өткөрөт, ал жерде өспүрүмдөр жана музыканын үнү угулат жана ал музыканын ритмин алат жакшы. Альтернатива, жөнгө салынуучу киреше микрофону, тактада өтө кичинекей потенциометр бар, ал өтө назик жана катаал. Аппаратты жараксыз абалга келтирүү үчүн чөйрө үнүндө көп деле өзгөрүү болбойт: чырактар дайыма же дайыма караңгы. AGC сыйкырчылык сыяктуу иштейт.

Мен сыноо үлгүсүн же музыканы колдонууну кааладым, ошондуктан мен борбордук коргошун VINге, бир коргошун 4 пинге, экинчисин Леонардонун 8 пинине туташтырдым. Ошол казыктарды HIGH же LOW үчүн текшерүү менен биз которгучтун кайсы абалда экенин жана ага ылайык филиалдын кодун биле алабыз.

7 -кадам: Микрофонду туташтыруу

Микрофонду туташтыруу
Микрофонду туташтыруу

Микрофонду 1-100µF конденсатор аркылуу аналогдук пин 0го салыңыз. Эгерде сиздин конденсатор поляризацияланган болсо, чыккычы оң жагына барат (Жашыл зым).

CodeGirlJPке төмөндө ыңгайлаштырылган Trinket-Color-by-Sound тартиби үчүн рахмат:

// Ардуино жана NeoPixels менен үн активдештирилген диоддор

#кошуу

#define MIC_PIN A0 // Микрофон Леонардонун а0 пинине тиркелет

#define LED_PIN 6 // Леонардодогу 6 -пинге бекитилген NeoPixel LED жипчеси #define N_PIXELS 36 // LED тилкесиндеги пикселдердин саны !!!!!! Орнотууңуздагы пикселдердин санына тууралаңыз. Бул 3 Neopixel шакеги үчүн туура !!!!!! #аныктоо N 100 // Ар бир окуган үлгүлөрдүн саны Үлгүлөр #define fadeDelay 5 деп аталат / Кечигүү убактысы #ар бир өчкөн сумма үчүн #аныктоо ызы -чуусу 30 -деңгээл // орточо микрофондун ызы -чуунун деңгээли

// NeoPixel тилкесин жогоруда аныкталган маанилер менен баштаңыз:

Adafruit_NeoPixel тилкеси = Adafruit_NeoPixel (N_PIXELS, LED_PIN, NEO_GRB + NEO_KHZ800);

int үлгүлөрү [N]; // үлгү чогултуу топтому үчүн сактоо

int periodFactor = 0; // мезгилди эсептөө үчүн мс санын көзөмөлдөп туруу int t1 = -1; // эңкейиш убактысы> 100 аныкталды. int T; // миллисекунддарга масштабдалган убакыттар ортосундагы мезгил int жантайма; // эки чогултулган маалымат үлгүсүнүн жантайышы байт periodChanged = 0; const int SwitchPinMusic = 4; // которуштуруу позициясы үчүн музыка-сезимдүүлүк const int SwitchPinSwirl = 8; // которуштуруу позициясы үчүн пин Test Pattern (swirl) int MusicbuttonState = 0; // Музыканын сезгичтиги үчүн өчүрүү логикалык өзгөрмөсү

// Arduino орнотуу ыкмасы

жараксыз орнотуу () {

strip.begin ();

ledsOff (); кечигүү (500); displayColor (Wheel (100)); strip.show (); кечигүү (500); oddWheel (Wheel (100)); strip.show (); кечигүү (500); pinMode (SwitchPinMusic, INPUT); pinMode (SwitchPinSwirl, INPUT); // attachInterrupt (4, Которулган, ТҮШҮП);

}

// Arduino цикл ыкмасы

void loop () {SwirlbuttonState = digitalRead (SwitchPinSwirl); // ЖОГОРУ которуу Музыка сезгичтигине коюлса MusicbuttonState = digitalRead (SwitchPinMusic); // HIGH эгер которуу Test үлгүсүнө коюлса, (SwirlbuttonState == LOW) {readSamples (); // Музыканын үлгүлөрүн алуу тартибин иштетүү SwirlbuttonState = digitalRead (SwitchPinSwirl); // которгучтун алмаштырылгандыгын текшериңиз} SwirlbuttonState = digitalRead (SwitchPinSwirl); MusicbuttonState = digitalRead (SwitchPinMusic); while (SwirlbuttonState == HIGH) {Dance (); // SwirlbuttonState = digitalRead (SwitchPinSwirl) swirlly тест үлгүсүнүн тартибин иштетүү; // которгучтун алмаштырылгандыгын текшериңиз

}

}

жараксыз бий () {

while (SwirlbuttonState == HIGH) {colorWipe (strip. Color (255, 0, 0), 50); // Red SwirlbuttonState = digitalRead (SwitchPinSwirl); colorWipe (strip. Color (0, 255, 0), 50); // Green SwirlbuttonState = digitalRead (SwitchPinSwirl); colorWipe (strip. Color (0, 0, 255), 50); // Blue SwirlbuttonState = digitalRead (SwitchPinSwirl); //colorWipe(strip.color(0, 0, 0, 255), 50); // Ак RGBW // Театрдын пикселин кууп жиберүү… SwirlbuttonState = digitalRead (SwitchPinSwirl); teatrChase (тилке. 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); // Blue SwirlbuttonState = digitalRead (SwitchPinSwirl); асан -үсөн (20); SwirlbuttonState = digitalRead (SwitchPinSwirl); rainbowCycle (20); SwirlbuttonState = digitalRead (SwitchPinSwirl); teatrChaseRainbow (50); SwirlbuttonState = digitalRead (SwitchPinSwirl); }} // Микрофондогу үлгүлөрдүн маалыматтарын окуу жана иштетүү vS Read vampoid () {for (int i = 0; i0) {slope = sample - үлгүлөр [i -1]; } башка {эңиш = үлгүлөр - үлгүлөр [N -1]; } // Slope noiseLevelден чоңураак экендигин текшериңиз - ызы -чуунун деңгээлинде эмес, эгер үн аныкталса (abs (жантаюу)> ызы -чуу деңгээли) {if (жантык <0) {calcPeriod (i); if (periodChanged == 1) {displayColor (getColor (T)); }}} башка {ledsOff (); // TheaterChaseRainbow (50); } periodFactor += 1; кечигүү (1); }}

жараксыз эсептөө мөөнөтү (int i)

{if (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) return Wheel (0); else if (period> 400) Wheel (5); else кайтуу дөңгөлөгү (карта (-1*мезгил, -400, -1, 50, 255)); }

void fadeOut ()

{for (int i = 0; i <5; i ++) {strip.setBrightness (110 - i*20); strip.show (); // Жаңыртуу тилкесинин кечигүүсү (fadeDelay); periodFactor += fadeDelay; }}

void fadeIn ()

{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

Void displayColor (uint32_t түсү)

{үчүн (int i = 0; i

жараксыз дөңгөлөк (uint32_t түсү)

{for (int j = 0; j <256; j ++) {// дөңгөлөктөгү бардык 256 түстү цикл үчүн (int q = 0; q <3; q ++) {үчүн (uint16_t i = 24; i <36; i = i+3) {strip.setPixelColor (i+q, Wheel ((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 күтүү) {үчүн (uint16_t i = 0; i

бош асан -үсөн (uint8_t күтүү) {

uint16_t i, j;

for (j = 0; j <256; j ++) {for (i = 0; i

// Бир аз башкача, бул асан -үсөндү бирдей бөлүштүрөт

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

for (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 (); кечиктирүү (күтүү); }}

// Театр стилиндеги сойлоп жүрүүчү жарыктар.

жараксыз театрChase (uint32_t c, uint8_t күтүү) {үчүн (int j = 0; j <10; j ++) {// (int q = 0; q <3; q ++) {үчүн 10 циклди аткарыңыз (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); // ар бир үчүнчү пикселди өчүрүү}}}}

// Асан-үсөн эффекти менен театр стилиндеги сойлоп жүрүүчү жарыктар

(vint8_t i = 0;; i <strip.numPixels (); i = i+3) {strip.setPixelColor (i+q, Wheel ((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 Wheel (байт WheelPos) {WheelPos = 255 - WheelPos; if (WheelPos <85) {return strip. Color (255 - WheelPos * 3, 0, WheelPos * 3); } if (WheelPos <170) {WheelPos -= 85; кайра тилке. Color (0, WheelPos * 3, 255 - WheelPos * 3); } WheelPos -= 170; кайтуу тилкеси. Color (WheelPos * 3, 255 - WheelPos * 3, 0); }

void Switched () {

strip.show (); readSamples (); }

Мен комментарийлерде өлтүрүлөрдөн мурун (Nice болуу саясатын эстен чыгарбаңыз!) Мен жүктөгөндөн кийин түшүндүм, менин кодумдун канчалык начар экенин. Pin 4 жана Pin 8ди дайыма HIGH үчүн текшерүүнүн кажети жок. Коммутатор бир полюстук кош ыргытуу болгондуктан, биринин маанисин экинчисинен чыгарса болот: бирин сыноо гана керек. Ошентип, сиз MusicButtonStateти окуу жана жазуу боюнча ар бир шилтемени алып салсаңыз болот жана SwirlButtonStateти сыноо аркылуу бардык нерсени эффективдүү иштете аласыз, эгерде сизде эс тутуму начар болсо же башка күнүмдүк иштерди аткарсаңыз. Бирок жогорудагы код иштейт.

Эгерде кимдир бирөө бул аудио жол -жоболорун ызы -чуунун деңгээлин эле эмес, жыштыгын да билгиси келсе жана аудио спектри боюнча жылыштарга жооп катары жарык спектрин өйдө -ылдый жылдыруу үчүн жылмакай код жазгысы келсе, комментарийге шилтемени калтырыңыз кантип кылдың

Ырахат алыңыз!

Сунушталууда: