Գույնը փոխող գիշերային լույս ՝ օգտագործելով Ardruino 101: 4 քայլ (նկարներով)
Գույնը փոխող գիշերային լույս ՝ օգտագործելով Ardruino 101: 4 քայլ (նկարներով)
Anonim
Image
Image
Գույնը փոխող գիշերային լույս ՝ օգտագործելով Ardruino 101
Գույնը փոխող գիշերային լույս ՝ օգտագործելով Ardruino 101

Այս նախագծում դուք գիշերային լամպ եք պատրաստելու `օգտագործելով ardruino, Adafruit neo rgb Strips և 3D տպիչ:

Նկատի ունեցեք, որ այս անխախտը զուտ իմ դպրոցական ծրագրի համար է: Այս նախագծի ծածկագիրը հիմնված է այլ նախագծի վրա: Ասելով, որ ես մասնագետ չեմ, երբ խոսքը վերաբերում է Արդրուինոյին:

Քայլ 1: Պահանջներ

Պահանջներ
Պահանջներ
Պահանջներ
Պահանջներ
Պահանջներ
Պահանջներ

Այս նախագծի համար ձեզ հարկավոր կլինեն հետևյալ սարքավորումները և գործիքները

Սարքավորումներ:

1 - ardruino101 (ԱՄՆ -ում) կամ Genuino101 (ԱՄՆ -ից դուրս):

2 - NeoPixel rgb led շերտեր adafruit- ից (5 վոլտ):

3 - ardruino USB միակցիչ (տիպ B- ից A միակցիչ):

4 - softwareրագրային ապահովում Ardruino- ից, Ardruino IDE Այս ձեռնարկում մենք կօգտագործենք 1.8.5 տարբերակը: Softwareրագրային գրադարանի պահանջներն են ՝ 101, Adafruit NeoPixel և Madgwick:

5 -Եվ օբյեկտ ՝ ձեր սարքավորումները պահելու համար: Այս դեպքում ես կօգտագործեմ 3D տպիչ: Այս 3D տպման ֆայլը գտնվում է «Լամպի գլուխ» կոչվող նկարագրություններում: Նկատի ունեցեք, որ այս ֆայլի ձևաչափը պատրաստ չէ 3D տպման համար: Կախված ձեր 3D տպիչներից, նախ պետք է նախապես գործարկեք նշանակված 3D տպման ծրագրակազմը 3D օբյեկտի վրա: Երբեմն 3D տպման մասշտաբը կվերականգնվի: այնպես որ համոզվեք, որ տրամագիծը դրված է 11 սմ 11 սմ -ի վրա:

6 - հիմնական զոդման հավաքածու:

Քայլ 2: Սարքաշարի և ծրագրակազմի իմացություն

Ardruin/Genuino101

Պարզապես պարզաբանելու համար Ardruino101- ը և genuino101- ը անունների կողքին չափազանց նույնն են: Երկուսն էլ ունեն նույն բնութագրերը և օգտագործում են նույն ծրագրակազմը:

Ardruino101- ն ունի հիմնական բնութագրերը, ինչպիսիք են ardruino UNO- ն և այլն: Ardruino101- ի հիմնական առանձնահատկությունը արագացուցիչն ու գիրոսկոպն են, որոնք մենք կօգտագործենք մեր նախագծում: Նաև այս տեսակի ardruino- ն ունի իր եզակի ծածկագրային գրադարանը, որը կոչվում է CurrieIMU (Ներքին չափման միավորներ), որը ներառված է 101 գրադարանի ընդլայնման մեջ:

Ասվածով եկեք խոսենք ծրագրակազմի մասին:

oftրագրային ապահովում և գրադարաններ

Ardruino IDE- ն օգտագործում է python- ը որպես հիմնական աղբյուր: դա նաև պլատվորմի հիմնական կոդն է, որտեղ աշխատում է արդրուինոյի մեծ մասը: Առցանց կան բազմաթիվ ձեռնարկներ, թե ինչպես օգտագործել այս ծրագրաշարը, ուստի խորհուրդ եմ տալիս նախ ուսումնասիրել դրանք, եթե դուք նոր եք այս ծրագրում:

Այդ ասելով, այն գրադարանները, որոնք մենք օգտագործում ենք, հետևյալն են.

Էսքիզների ընտրացանկից,> Ներառել գրադարանը> Կառավարել գրադարանները … Տեքստի մուտքագրման դաշտում մուտքագրեք

- 101 Ստանդարտ ardruino 101 ավտոմատ կերպով ներառված չէ ardruino IDE- ի վրա: Մեզ անհրաժեշտ է գրադարանի այս ընդլայնումը `մեր ardruino տեսակը կոդավորելու համար:

-Adafruit NeoPixel ՝ մեր Neo պիքսելային շերտերը կոդավորելու համար:

-Madwwick Հում տվյալները կարդալու և այս տվյալները հում, սկիպիդար և գլորելու համար հաշվարկելու համար:

Նոր RGB շերտեր

Այն տեսակը, որը ես օգտագործելու եմ, 5 լարման կամ 5 վ տիպի է: Այս 5 վ -ով ինձ անհրաժեշտ չէ երկարացված էներգիայի աղբյուր ՝ իմ շերտերը կառավարելու համար: Փոխարենը ես կօգտագործեմ իմ արդրուինոն որպես էներգիայի աղբյուր ՝ շերտերը կառավարելու և լուսավորելու համար:

Ահա որոշ խորհուրդներ, որոնք դուք պետք է իմանաք, նախքան այս շերտերը սկսելը:

Նախ ձեզ հարկավոր կլինեն ադաֆրուտից Neodigital RGB led շերտեր: Այս տեսակի շերտերը համատեղելի են կոդերի միջոցով: Հաջորդը, ինչ դուք պետք է իմանաք, այն է, որ այս շերտերի վրա կա հետույք և դիմային հատված: Այս հետևի և առջևի կողմը կարևոր է զոդման համար: Համոզվեք, որ դուք կպցրել եք առջևի կողմը, որտեղ սլաքի բանալին ուղղված է ծայրից:

Ահա ուղեցույց, թե ինչպես օգտագործել դրանք:

Գոյություն ունի եռակցման 3 կետ, որոնք պետք է հիշել գետնին միացման (GND), լարման միացման (V) և կապի կապի (DIN):

Քայլ 3: Բաղադրիչների տեղադրում

Բաղադրիչների տեղադրում
Բաղադրիչների տեղադրում
Բաղադրիչների տեղադրում
Բաղադրիչների տեղադրում
Բաղադրիչների տեղադրում
Բաղադրիչների տեղադրում

Նախ պետք է եռաչափ տպել այն բաղադրիչը, որը կարող եք գտնել պահանջների մեջ: Այս դեպքում ես կամենամ օգտագործել PLA- ն: Համոզվեք, որ ընդհանուր առարկայի տրամագիծը 11 սմ է 11 սմ: Սա կապահովի, որ արդրուինոն և ժապավենները տեղավորվեն արագացման մեջ: Նկատի ունեցեք, որ յուրաքանչյուր 3D տպիչ օգտագործում է տարբեր ծրագրաշարեր `տպագրության գործընթացը հաշվարկելու համար: Այդ ասելով, ձեր օգտագործած ֆայլը կարող է տարբեր չափերով չափվել, այնպես որ դա նկատի ունեցեք:

Տպելուց հետո երկրորդը համոզվեք, որ բաղադրիչները կարող են փակվել: 3D տպումները միասին կազմում են մի ոլորտ: Նրանք պետք է գեղեցիկ տեղավորվեն: Եթե կոմպոնենը կկորցնի, ապա ներքին կողմով մի ժապավեն տեղադրեք, որպեսզի կափարիչը լցվի: Իսկ եթե հաստ է, օգտագործեք հղկաթուղթ:

Երրորդը `արդրուինոյի և շերտերի համար նախատեսված սխեմատիկները բավականին հեշտ են: Դուք 3 լարով կօգտագործեք ժապավեններն արդրուինոյին միացնելու համար: Ուշադրություն դարձրեք, որ միակ տեղերը, որոնք ես զոդում եմ, շերտերի վրա են: ոչ Արդրուինոյի վրա:

GND- ը գնում է GND

DIN- ը անցնում է Pin (մեր դեպքում pin6 arrruino- ում)

5 Վ -ն անցնում է 5 Վ -ի

Համոզվեք, որ ձեր կողմից օգտագործվող led շերտերի քանակը 30 է: Այլևս այն, և այն չի կարող պատշաճ կերպով կատարել կոդը: Դուք կարող եք պարզապես կտրել մկրատով նշանով ցուցադրված ցանկացած չկրկված շերտեր:

Չորրորդ Ամեն ինչ պետք է գեղեցիկ տեղավորվի ոլորտում: Դուք կցանկանայիք, որ ես խաչմերուկ դնեի 3 -րդ տպագրությունից 1 -ի միջև, որպեսզի տեսնեի գագաթը և գագաթին տեղադրեի պլաստիկ:

Քայլ 4: Կոդավորում

Այսպիսով, մինչ այժմ դուք պետք է ունենաք ձեր գրադարանում անհրաժեշտ բոլոր բաղադրիչները:

Ահա այն կոդը, որը ձեզ հարկավոր կլինի նախագիծը գործարկելու համար: Արդյունքը պետք է նմանվի այս էջում ուղարկված տեսանյութի հղմանը:

Այս ծածկագրի աղբյուրը կարելի է գտնել այստեղ: Այս նախագիծը ներառում է նաև անհապաղ քայլեր `օգտագործման հիմքում ընկած ծածկագիրն ու ալգարիտմը ավելի լավ հասկանալու համար:

#ներառել #ներառել #ներառել #ներառել

#սահմանեք PIN 6 // 11 պիքսել NeoPixel Strip

#սահմանել PIN1 7 // 1 պիքսել NeoPixel Strip #սահմանել NUMPIXELS 30 // Պիքսելների համարը #սահմանել SAMPLE_RATE 25 // Արագացուցիչի և գիրոսկոպի նմուշառման արագություն

// Madgwick կազմաձևում

Madgwick ֆիլտր; անստորագիր երկար microsPerReading, micros Նախորդ; float accelScale, gyroScale;

// NeoPixel կազմաձևում

Adafruit_NeoPixel պիքսել = Adafruit_NeoPixel (NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800); Adafruit_NeoPixel pixelsStatus = Adafruit_NeoPixel (1, 7, NEO_GRB + NEO_KHZ800);

// Գունավոր տարածություններ

RGBConverter rgbConverter; կրկնակի h = 1; կրկնակի s = 1; կրկնակի v = 1; բայթ rgb [3];

// Կարգավիճակի շարժման լամպ

// վիճակ 0 -> ընտրել երանգ -սկիպիդար // վիճակ 1 -> ընտրել հագեցվածություն -գլան // վիճակ 2 -> ընտրել արժեք -այո // վիճակ 3 -> գույնի անկայուն int կարգավիճակի շտկում Լամպ = 0;

void setup () {

Serial.begin (9600);

// սկսեք IMU- ն և զտեք

CurieIMU.begin (); CurieIMU.setGyroRate (SAMPLE_RATE); CurieIMU.setAccelerometerRate (SAMPLE_RATE); filter.begin (SAMPLE_RATE);

// Արագացուցիչի տիրույթը սահմանեք 2G

CurieIMU.setAccelerometerRange (2); // yrիրոսկոպի տիրույթը սահմանեք 250 աստիճանի/վայրկյան CurieIMU.setGyroRange (250);

CurieIMU.autoCalibrateAccelerometerOffset (X_AXIS, 0);

CurieIMU.autoCalibrateAccelerometerOffset (Y_AXIS, 0); CurieIMU.autoCalibrateAccelerometerOffset (Z_AXIS, 1); CurieIMU.autoCalibrateGyroOffset ();

CurieIMU.attachInterrupt (eventCallback);

CurieIMU.setDetectionThreshold (CURIE_IMU_TAP, 950); CurieIMU. Ընդհատում (CURIE_IMU_TAP);

// նախաստորագրել փոփոխականները `արագությունը ճշգրտելու համար

microsPerReading = 1000000 / SAMPLE_RATE; microsPrevenue = micros ();

// Init NeoPixel 11

pixels.begin (); pixels.show ();

// Init NeoPixel 1

pixelsStatus.begin (); pixels.show ();

// statusուցադրել կարգավիճակը px- ում

setStatusPixel (statusLamp); }

դատարկ շրջան () {

int aix, aiy, aiz; // արագացուցիչ ՝ int gix, giy, giz; բոց կացին, այ, ազ; բոց gx, gy, gz; բոց գլորում, սկիպիդար, հորանջում; ստատիկ անստորագիր երկար միկրոնԱյժմ;

// ստուգեք, արդյոք ժամանակն է կարդալ տվյալները և թարմացնել զտիչը

microsNow = միկրոս (); եթե (microsNow - microsPrevious> = microsPerReading) {

// կարդալ CurieIMU- ի հում տվյալները

CurieIMU.readMotionSensor (aix, aiy, aiz, gix, giy, giz);

// փոխարկել չմշակված տվյալների ծանրության և աստիճանների/երկրորդ միավորների

ax = convertRawAcceleration (aix); ay = convertRawAcceleration (aiy); az = convertRawAcceleration (aiz); gx = convertRawGyro (gix); gy = convertRawGyro (giy); gz = convertRawGyro (giz);

// թարմացնել զտիչը, որը հաշվարկում է կողմնորոշումը

filter.updateIMU (gx, gy, gz, ax, ay, az);

// տպել վերնագիրը, սկիպիդարն ու գլորը

գլորում = filter.getRoll (); սկիպիդար = filter.getPitch (); yaw = filter.getYaw ();

// ավելացում նախորդ անգամ, այնպես որ մենք պահպանում ենք պատշաճ տեմպը

microsPrevious = microsPrevious + microsPerReading;

// Միայն եթե փոխեք երանգը, հագեցվածությունը կամ արժեքը

if (statusLamp ընտրել Hue if (սկիպիդար> = -90 && քայլ <= 90 && statusLamp == 0) {// Փոխակերպել անկյունի սկիպիդար = սկիպիդար + 90; // Ստանում է գույնի կոորդինատներ h = սկիպիդարից / 180.0;}

// Անկյունների սահմանափակումներ

// գլորում միայն -90º -ից 90º = 180º // Պետություն 1 -> ընտրել Հագեցում, եթե (գլորում> = -90 && գլորում <= 90 && statusLamp == 1) {// Փոխակերպել անկյունը գլորում = գլորում + 90; // Ստանում է գույնի կոորդինատներ s = roll / 180.0 անկյուններից; }

// Պետություն 2 -> ընտրել Արժեք

եթե (statusLamp == 2) {// yaw 0º -ից 360º v = yaw / 360.0; }

// Փոխակերպել rgb- ին

rgbConverter.hsvToRgb (h, s, v, rgb); /* Serial.print ("Գույն:"); Serial.print (h); Serial.print (" -"); Սերիա. Տպագիր (ներ); Serial.print (" -"); Serial.print (v); Serial.println ("");

Serial.print ("Կողմնորոշում.");

Serial.print (yaw); Serial.print (""); Serial.print (սկիպիդար); Serial.print (""); Serial.println (գլորում); */

// Փոխել պիքսելների գույնը

համար (int px = 0; px <NUMPIXELS; px ++) {pixels.setPixelColor (px, pixels. Color (rgb [0], rgb [1], rgb [2])); pixels.show (); }}

// statusուցադրել կարգավիճակը px- ում

setStatusPixel (statusLamp); }}

float convertRawAcceleration (int aRaw) {

// քանի որ մենք օգտագործում ենք 2G տիրույթ // -2 գ քարտեզներ -32768 հումքի արժեքով // +2 գ քարտեզներ ՝ 32767 հում արժեքով

բոց a = (aRaw * 2.0) / 32768.0;

վերադարձնել; }

float convertRawGyro (int gRaw) {

// քանի որ մենք օգտագործում ենք 250 աստիճան/վայրկյան տիրույթ // -250 քարտեզ ՝ -32768 հումքի արժեքով // +250 քարտեզ ՝ 32767 հում արժեքով

բոց g = (gRaw * 250.0) / 32768.0;

վերադարձ g; }

static void eventCallback ()

{// Հայտնաբերել հպումը բոլոր առանցքներում, եթե (CurieIMU.getInterruptStatus (CURIE_IMU_TAP)) {Serial.print ("Հպեք հայտնաբերված statusLamp:"); Serial.println (statusLamp);

// Փոխել վիճակը

statusLamp ++;

// Նախնական վիճակ

եթե (statusLamp> 3) {statusLamp = 0; }}}

անվավեր setStatusPixel (int statusPx)

{switch (statusPx) {case 0: pixelsStatus.setPixelColor (0, pixelsStatus. Color (150, 0, 0)); pixelsStatus.show (); ընդմիջում; գործ 1: pixelsStatus.setPixelColor (0, pixelsStatus. Color (0, 150, 0)); pixelsStatus.show (); ընդմիջում; գործ 2: pixelsStatus.setPixelColor (0, pixelsStatus. Color (0, 0, 150)); pixelsStatus.show (); ընդմիջում; գործ 3: pixelsStatus.setPixelColor (0, pixelsStatus. Color (0, 0, 0)); pixelsStatus.show (); ընդմիջում;

}

}

Խորհուրդ ենք տալիս: