Աշխատող լույսերի arduino միացման դիագրամ. Աշխատող շրջադարձային ազդանշաններ WS2812 ժապավենի և Arduino-ի վրա

Այս ձեռնարկում մենք կշարունակենք աշխատել LED-ների հետ, բայց LED-ների թիվը կավելացնենք մինչև 5-ի: Եվ մենք կստեղծենք վազող կրակի էֆեկտը: LED-ները կառավարելու համար մենք կօգտագործենք Arduino պորտի մանիպուլյացիա: Մենք ուղղակիորեն տվյալներ կգրենք Arduino նավահանգիստներին: Սա ավելի լավ է, քան վերահսկիչի հատուկ մուտքերի/ելքերի հետ աշխատելը: Սա թույլ կտա ձեզ մեկ գործողությամբ սահմանել LED-ների արժեքները:

Arduino UNO-ն ունի 3 նավահանգիստ.
B (Թվային I/Os 8-ից 13)
C (անալոգային մուտքեր)
D (Թվային I/O 0-ից 7)

Յուրաքանչյուր նավահանգիստ վերահսկվում է 3 ռեգիստրով: Գրանցեք DDRորոշում է, թե ոտքը (փին) ինչ մուտք կամ ելք կլինի: Օգնությամբ գրանցել PORTդուք կարող եք սահմանել քորոցը HIGH կամ LOW: Օգնությամբ գրանցել PIN-ըԴուք կարող եք կարդալ Arduino ոտքերի վիճակը, երբ դրանք մուտքագրվում են:

Մենք կօգտագործենք նավահանգիստ B: Նախ, մենք պետք է սահմանենք B պորտի բոլոր կապերը որպես թվային ելքեր: Նավահանգիստ B-ն ունի ընդամենը 6 կապ: DDRB B պորտի ռեգիստրի բիթերը պետք է սահմանվեն 1-ի, եթե ոտքը պետք է օգտագործվի որպես OUTPUT, և 0-ի, եթե ոտքը պետք է օգտագործվի որպես INPUT: Նավահանգստի բիթերը համարակալված են 0-ից 7-ը, բայց միշտ չէ, որ պարունակում են բոլոր 8 ոտքերը: Օրինակ:
DDRB = B00111110; // սահմանել B նավահանգիստ 1-ից 5-ը որպես ելքեր և 0-ը որպես մուտք:

Խնդրում ենք նկատի ունենալ, որ Microchip միկրոկարգավորիչներում հակառակն է: 0 բիթ - ոտքը աշխատում է որպես ելք, իսկ 1-ը՝ որպես մուտք:

Մեր ընթացիկ հրդեհային նախագծում մենք կօգտագործենք 5 վարդակներ.
DDRB = B00011111; // որպես ելքեր սահմանել B նավահանգիստը 0-ից 4-ը

B նավահանգստում արժեքներ գրելու համար դուք պետք է օգտագործեք PORTB ռեգիստրը: Դուք կարող եք վառել առաջին LED-ը հրամանով.
PORTB=B00000001;
առաջին և չորրորդ.
PORTB=B00001001;

Այժմ դուք տեսնում եք, թե որքան հեշտ է մենք կարող ենք միացնել և անջատել LED-ները: Հիմա խոսենք հերթափոխի օպերատորների մասին

Կան երկուական հերթափոխի 2 օպերատոր՝ ձախ հերթափոխի օպերատոր >: Ձախ հերթափոխի օպերատորը > բիթերը տեղափոխում է աջ:

Օրինակ:
varA = 1; // 00000001
varA = 1 varA = 1 varA = 1

Այժմ վերադառնանք մեր ծրագրին, որը ներկայացված է ստորև: Մենք պետք է ներմուծենք 2 փոփոխական՝ առաջինը վերև վարկպարունակի արժեքը, թե որտեղ պետք է շարժվել՝ վեր կամ վար, և երկրորդը գիլոնինչ լուսադիոդներ են վառվում:

Գործառույթի մեջ կարգավորում ()մենք սահմանում ենք, թե որ ոտքերը պետք է աշխատեն որպես արդյունք:

Հիմնական loop() ծրագրում LED-ները մեկ առ մեկ վառվում են՝ մեծացնելով cylon փոփոխականը, և երբ այն հասնում է ամենավերինին, upDown փոփոխականը դրվում է 0-ի, իսկ LED-ները հերթով վառվում են:

/* Հոսող կրակ. 5 LED */ չստորագրված char upDown=1; // սկսել շարժվել դեպի վեր unsigned char cylon=0; // որոշում է LED կարգը void setup() ( DDRB = B00011111; // սահմանել B պորտը 0-ից 4-ը որպես ելքեր ) void loop() (if(upDown==1)( // եթե բարձրանանք, ապա cylon++; եթե ( cylon>=4) upDown=0; // երբ հասնում է ամենաբարձր LED թիվը, ապա հաջորդ օղակում իջնում ​​ներքև ) else (cylon--; if(cylon==0) upDown=1; // երբ ամենացածրը LED համարը հասնում է, ապա հաջորդ ցիկլում մենք բարձրանում ենք) PORTB = 1

Այս փորձի ժամանակ մենք լուսադիոդային սանդղակի երկայնքով լույս ենք վազում:

ՓՈՐՁԱՐԿՄԱՆ ՄԱՍԵՐԻ ՑԱՆԿ

- 1 Arduino Uno տախտակ;

- 1 առանց զոդման տախտակ;

- 1 LED սանդղակ;

- 10 դիմադրություն 220 Օմ անվանական արժեքով;

- 11 արու-արական մետաղալարեր:

ԳԼԽԱՎՈՐ ԴԻԳՐԱՄ

ԴԻԳՐԱՄ Հաց տախտակի վրա

ԷՍՔԻՉ

ներբեռնեք էսքիզ Arduino IDE-ի համար
// LED սանդղակը միացված է մի խումբ կապում, որը գտնվում է // անընդմեջ: Առաջին և վերջին փիներին բարեկամական անուններ տալով #define FIRST_LED_PIN 2 #define LAST_LED_PIN 11 void setup() ( // սանդղակի մեջ կա 10 LED: Մենք կարող ենք գրել pinMode 10 // անգամ՝ յուրաքանչյուր կապի համար, բայց դա կլինի bloat կոդը և // ավելի խնդրահարույց դարձրեց այն փոխելը: // Հետևաբար, ավելի լավ է օգտագործել հանգույց: Մենք կատարում ենք // pinMode-ը (eng. for) յուրաքանչյուր փին (pin variable) // առաջինից (= FIRST_LED_PIN) մինչև վերջին ներառյալ // (<= LAST_LED_PIN), всякий раз продвигаясь к следующему // (++pin увеличивает значение pin на единицу) // Так все пины от 2-го по 11-й друг за другом станут выходами for (int pin = FIRST_LED_PIN; pin <= LAST_LED_PIN; ++pin) pinMode(pin, OUTPUT); } void loop() { // получаем время в миллисекундах, прошедшее с момента // включения микроконтроллера unsigned int ms = millis(); // нехитрой арифметикой вычисляем, какой светодиод // должен гореть именно сейчас. Смена будет происходить // каждые 120 миллисекунд. Y % X — это остаток от // деления Y на X; плюс, минус, скобки — как в алгебре. int pin = FIRST_LED_PIN + (ms / 120) % 10; // включаем нужный светодиод на 10 миллисекунд, затем — // выключаем. На следующем проходе цикла он снова включится, // если гореть его черёд, и мы вообще не заметим отключения digitalWrite(pin, HIGH); delay(10); digitalWrite(pin, LOW); }

ԿՈԴԻ ԲԱՑԱՏՐՈՒԹՅՈՒՆՆԵՐ

  • Օգտագործելով արտահայտությունը համարմենք կազմակերպում ենք հանգույց հաշվիչով . Այս դեպքում ելքի համար նավահանգիստները կարգավորելու համար: Նման ցիկլ պատրաստելու համար ձեզ հարկավոր է.
    • Նախաձեռնեք հաշվիչի փոփոխականն իր սկզբնական արժեքով: Մեր դեպքում. int pin = FIRST_LED_ PIN ;
    • Նշեք պայմանը, մինչև որ օղակը կկրկնվի: Մեր դեպքում. քորոց<= LAST_LED_ PIN ;
    • Որոշեք կանոնը, որով կփոխվի հաշվիչը: Մեր դեպքում ++ քորոց(տե՛ս ստորև օպերատորի համար ++ ).
  • Օրինակ, դուք կարող եք հանգույց պատրաստել համար (int i = 10; i > 0; i = i - 1). Այս դեպքում:
    • i փոփոխականին տրվում է արժեք 10 ;
    • Այս արժեքը բավարարում է պայմանը ես > 0 ;
    • Հետևաբար, հանգույցում տեղադրված կոդի բլոկը կատարվում է առաջին անգամ.
    • Իմաստը եսնվազում է մեկով, ըստ տրված կանոնի, և վերցնում արժեքը 9 ;
    • Կոդի բլոկը կատարվում է երկրորդ անգամ.
    • Ամեն ինչ կրկնվում է նորից ու նորից մինչև իմաստը եսհավասար 0 ;
    • Երբ եսդառնում է հավասար 0 , վիճակ ես > 0չի կատարվի, և հանգույցի կատարումը կավարտվի.
    • Կարգավորիչը ցատկում է կոդի վրա՝ հետևելով հանգույցին համար ;
  • Տեղադրեք կոդը, որը ցանկանում եք պտտել մի զույգ գանգուր փակագծերի միջև {} եթե այն պարունակում է մեկից ավելի հրահանգներ.
  • Հայտարարության մեջ հայտարարված հաշվիչի փոփոխականը համար, կարող է օգտագործվել օղակի ներսում: Օրինակ, այս փորձի մեջ քորոցհաջորդաբար վերցնում է արժեքները 2-ից 11-ը և փոխանցվում է pinMode, թույլ է տալիս կարգավորել 10 նավահանգիստներ մեկ տողով, որը տեղադրված է օղակում;
  • Հաշվիչ փոփոխականները տեսանելի են միայն օղակի ներսում: Նրանք. եթե դիմեք քորոցհանգույցից առաջ կամ հետո, կոմպիլյատորը սխալ կուղարկի չհայտարարված փոփոխականի մասին.
  • Դիզայն i = i - 1վերը նշված բացատրության մեջ հավասարություն չէ: Մենք օգտագործում ենք հանձնարարության օպերատորը` փոփոխականի մեջ դնելու համար եսդրել արժեքը հավասար է ընթացիկ արժեքին ես, կրճատվել է 1 ;
  • Արտահայտություն ++ քորոց- սա այսպես կոչված. օպերատոր ավելացում , կիրառվում է փոփոխականի վրա քորոց. Այս հրահանգը կտա նույն արդյունքը, ինչ pin = pin + 1;
  • Օպերատորն աշխատում է հավելման նման նվազում - - Արժեքի իջեցում մեկով. Այս մասին ավելի շատ թվաբանական գործողությունների մասին հոդվածում;
  • Տվյալների տեսակը անստորագիր միջօգտագործվում է անստորագիր ամբողջ թվեր պահելու համար, այսինքն. միայն ոչ բացասական . Լրացուցիչ բիտի շնորհիվ, որն այժմ չի օգտագործվում նշանը պահելու համար, մենք կարող ենք արժեքներ պահել մինչև 65 535 ;
  • Գործառույթ միլիսվերադարձնում է միկրոկոնտրոլերի միացումից կամ վերակայումից հետո անցած միլիվայրկյանների թիվը: Այստեղ մենք այն օգտագործում ենք լուսադիոդային անջատիչների միջև ընկած ժամանակը ժամանակավորելու համար.
  • Օգտագործելով արտահայտությունը (ms / 120) % 10մենք որոշում ենք, թե 10 LED-ներից որն է պետք վառել հիմա: Վերափոխելու համար մենք որոշում ենք, թե որ 120 ms հատվածն է այժմ և որքա՞ն է դրա թիվը ընթացիկ տասը սահմաններում: Մենք սեգմենտի հաջորդական համարը ավելացնում ենք ընթացիկ հավաքածուում առաջինը հայտնվող պորտի թվին.
  • Այն փաստը, որ մենք անջատում ենք LED- ի հետ թվային գրել (փին, ցածր)միացնելուց ընդամենը 10 ms հետո աչքին նկատելի չէ, քանի որ շատ շուտով նորից կհաշվարկվի, թե լուսադիոդներից որն է միացնել, և այն կմիացվի՝ նոր հանգած, թե հաջորդը։

ՀԱՐՑԵՐ, ՈՐՈՆՑՈՎ ՍՏՈՒԳԵԼ ԵՆՔ ՁԵԶ

  1. Ինչու՞ այս փորձի ժամանակ մենք միացնում ենք LED սանդղակը առանց տրանզիստորի օգտագործման:
  2. Եթե ​​մենք միայն միացնեինք LED-ները 5, 6, 7, 8, 9 պորտերի վրա, ի՞նչը պետք է փոխվի ծրագրում:
  3. Ինչ այլ հրահանգ կարող է օգտագործվել համարժեք գործողություն կատարելու համար ++ քորոց ?
  4. Ո՞րն է տարբերությունը տիպի փոփոխականների միջև միջև անստորագիր միջ ?
  5. Ի՞նչ է վերադարձնում ֆունկցիան millis () ?
  6. Ինչպե՞ս ենք մենք հաշվարկում պորտի համարը, որի վրա ցանկանում ենք միացնել LED-ն այս փորձի ժամանակ:

ԱՆԿԱԽ ԼՈՒԾՄԱՆ ԱՌԱՋԱԴՐԱՆՔՆԵՐ

  1. Փոխեք կոդը այնպես, որ լուսադիոդները միացվեն վայրկյանում մեկ անգամ:
  2. Առանց նավահանգիստներն անջատելու, համոզվեք, որ լույսն անցնում է միայն կշեռքի միջին չորս բաժինների երկայնքով:
  3. Փոփոխեք ծրագիրն այնպես, որ փոխարենը int pin = FIRST_LED_ PIN + (ms / 120) % 10բոցի շարժումը վերահսկվում էր ցիկլով համար .
  4. Առանց լարերը փոխելու, փոխեք ծրագիրն այնպես, որ լույսը վազի հակառակ ուղղությամբ:

Այս ձեռնարկում մենք կշարունակենք աշխատել LED-ների հետ, բայց LED-ների թիվը կավելացնենք մինչև 5-ի: Եվ մենք կստեղծենք վազող կրակի էֆեկտը: LED-ները կառավարելու համար մենք կօգտագործենք Arduino պորտի մանիպուլյացիա: Մենք ուղղակիորեն տվյալներ կգրենք Arduino նավահանգիստներին: Սա ավելի լավ է, քան վերահսկիչի հատուկ մուտքերի/ելքերի հետ աշխատելը: Սա թույլ կտա ձեզ մեկ գործողությամբ սահմանել LED-ների արժեքները:

Arduino UNO-ն ունի 3 նավահանգիստ.

  • B (Թվային I/Os 8-ից 13)
  • C (անալոգային մուտքեր)
  • D (Թվային I/O 0-ից 7)

Յուրաքանչյուր նավահանգիստ վերահսկվում է 3 ռեգիստրով: DDR ռեգիստրը որոշում է, թե արդյոք ոտքը (փին) կլինի մուտք, թե ելք: PORT ռեգիստրը կարող է օգտագործվել քորոցը HIGH կամ LOW սահմանելու համար: Օգտագործելով PIN ռեգիստրը, դուք կարող եք կարդալ Arduino ոտքերի վիճակը, երբ դրանք մուտքագրվում են:

Մենք կօգտագործենք նավահանգիստ B: Նախ, մենք պետք է սահմանենք B պորտի բոլոր կապերը որպես թվային ելքեր: Նավահանգիստ B-ն ունի ընդամենը 6 կապ: DDRB B պորտի ռեգիստրի բիթերը պետք է սահմանվեն 1-ի, եթե ոտքը պետք է օգտագործվի որպես OUTPUT, և 0-ի, եթե ոտքը պետք է օգտագործվի որպես INPUT: Նավահանգստի բիթերը համարակալված են 0-ից 7-ը, բայց միշտ չէ, որ պարունակում են բոլոր 8 ոտքերը:

Օրինակ:

DDRB = B00111110; // սահմանել B նավահանգիստ 1-ից 5-ը որպես ելքեր և 0-ը որպես մուտք:

Խնդրում ենք նկատի ունենալ, որ Microchip միկրոկարգավորիչներում հակառակն է: 0 բիթ - ոտքը աշխատում է որպես ելք, իսկ 1-ը՝ որպես մուտք:

Մեր ընթացիկ հրդեհային նախագծում մենք կօգտագործենք 5 վարդակներ.

DDRB = B00011111; // որպես ելքեր սահմանել B նավահանգիստը 0-ից 4-ը

B նավահանգստում արժեքներ գրելու համար դուք պետք է օգտագործեք PORTB ռեգիստրը: Դուք կարող եք վառել առաջին LED-ը հրամանով.

PORTB=B00000001;
առաջին և չորրորդ.
PORTB=B00001001;

Այժմ դուք տեսնում եք, թե որքան հեշտ է մենք կարող ենք միացնել և անջատել LED-ները: Հիմա խոսենք հերթափոխի օպերատորների մասին

Կան երկուական հերթափոխի 2 օպերատոր՝ ձախ հերթափոխի օպերատոր<< и оператор сдвига вправо >>. Ձախ հերթափոխի օպերատոր<< заставляет все биты сдвигаться влево, соответственно оператор сдвига вправо >> բիթերը տեղափոխում է աջ:

Օրինակ:

VarA = 1; // 00000001
varA = 1<< 0; // 00000001
varA = 1<< 1; // 00000010
varA = 1<< 2; // 00000100

Այժմ վերադառնանք մեր ծրագրին, որը ներկայացված է ստորև: Մենք պետք է ներմուծենք 2 փոփոխական՝ առաջինը վերև վարկպարունակի արժեքը, թե որտեղ պետք է շարժվել՝ վեր կամ վար, և երկրորդը գիլոնինչ լուսադիոդներ են վառվում:

Գործառույթի մեջ կարգավորում ()մենք սահմանում ենք, թե որ ոտքերը պետք է աշխատեն որպես արդյունք:

Ծրագրի հիմնական օղակում հանգույց (), լուսադիոդները հերթով վառվում են՝ մեծացնելով փոփոխականը գիլոն, և երբ այն հասնում է ամենավերին, ապա փոփոխականը վերև վարնշանակված է 0, իսկ LED-ները հերթով վառվում են դեպի ներքև:

միացման դիագրամ

Սխեման հացի տախտակի վրա

Նշում

    Նշենք, որ այս փորձի ժամանակ ռեզիստորները տեղադրվում են կաթոդների և հողի միջև՝ ի տարբերություն պուլսարի փորձի:

    Մենք LED-ները միացնում ենք թվային պորտերին՝ սկսած 2-րդ պորտից: Կարող ենք օգտագործել 0 և 1 պորտերը, բայց դրանք սերիական նավահանգիստների տվյալների ալիքներ են, և յուրաքանչյուր թարթող տախտակի համար մենք ստիպված կլինենք անջատել դրանց միացված սարքերը:

Էսքիզ

Unsigned int տվյալների տեսակը օգտագործվում է անստորագիր ամբողջ թվեր պահելու համար, այսինքն. միայն ոչ բացասական. Լրացուցիչ բիտի շնորհիվ, որն այժմ չի օգտագործվում նշանը պահելու համար, մենք կարող ենք այս տեսակի փոփոխականում պահել մինչև 65,535 արժեքներ:

(ms / 120) % 10 արտահայտությամբ մենք որոշում ենք, թե 10 LED-ներից որն է պետք վառել հիմա: Վերափոխելու համար մենք որոշում ենք, թե որ 120 ms հատվածն է այժմ և որքա՞ն է դրա թիվը ընթացիկ տասը սահմաններում: Մենք ավելացնում ենք հատվածի հաջորդական համարը պորտի թվին, որն առաջինն է ընթացիկ հավաքածուում:

Այն, որ LED-ն անջատում ենք digitalWrite-ով (pin, LOW) միացնելուց ընդամենը 10 ms հետո, աչքի համար նկատելի չէ, քանի որ. շատ շուտով նորից կհաշվարկվի, թե LED-ներից որն է միացնել, և այն կմիացվի՝ նոր հանգած, թե հաջորդ:

Հարցեր ինքներդ ձեզ փորձելու համար

    Ինչու՞ այս փորձի ժամանակ մենք միացնում ենք LED սանդղակը առանց տրանզիստորի օգտագործման:

    Եթե ​​մենք միայն միացնեինք LED-ները 5, 6, 7, 8, 9 պորտերի վրա, ի՞նչը պետք է փոխվի ծրագրում:

    Ինչ այլ հրահանգ կարող է կատարել ++pin-ի համարժեքը:

    Ո՞րն է տարբերությունը int և unsigned int տիպի փոփոխականների միջև:

    Ի՞նչ է վերադարձնում millis() ֆունկցիան:

    Ինչպե՞ս ենք մենք հաշվարկում պորտի համարը, որի վրա ցանկանում ենք միացնել LED-ն այս փորձի ժամանակ:

Մենք վազող լույսեր ենք պատրաստում Arduino-ի LED-ից: Այս դեպքում օգտագործվում է Arduino Mega 2560, որը պոտենցիալ ունակ է վարել 54 LED-ից բաղկացած վազքուղի: Բայց միացումն ու ծրագիրը չեն փոխվի, եթե օգտագործեք Arduino-ի այս տեսակի պլատֆորմի այլ կարգավորիչներ (UNO, Leonardo...)

LED-ների միացման դիագրամ Arduino Mega 2560-ին:

Այսպես է երևում էսքիզը Arduino ծրագրավորման ստանդարտ հավելվածի պատուհանում։

Arduino հարթակի վրա հոսող լույսերի ներդրման ծրագրի տեքստը.

int first_out = 11; //առաջին դիսկրետ ելք

int last_out = 13; //վերջին դիսկրետ ելք

//բլոկ մուտքերի/ելքերի և այլ նախնական տվյալների սկզբնավորման համար

last_out = last_out + 1; // ավելացրեք մեկը օղակներում ճիշտ օգտագործման համար

//սահմանել Arduino տախտակի 11-րդ, 12-րդ և 13-րդ դիսկրետ կապերը որպես ելքեր

համար (i = first_out; i< last_out; i++) { pinMode(i, OUTPUT); }

համար (t = first_out; t< last_out; t++) { //перебираем номера дискретных выходов 11,12,13 поочереди

digitalWrite (t, HIGH); //լույս հաջորդ LED

ուշացում (500); //ուշացում 500ms

համար (i = first_out; i< last_out; i++) { digitalWrite(i, LOW); }//гасим все светодиоды

Պսակի մեջ վերահսկվող LED-ների քանակը մեծացնելու համար ծրագրին պարզապես անհրաժեշտ կլինի փոխարինել փոփոխականների արժեքները՝ նախ և առաջ: last_out. Առաջին փոփոխականը պահպանում է վերահսկիչի սկզբնական դիսկրետ ելքը, իսկ երկրորդ փոփոխականը պահպանում է հաջորդական ելքերի խմբի վերջինը: Օրինակ, եթե մենք ցանկանում ենք միացնել 10 լուսադիոդներ ծաղկեպսակի մեջ, ապա մուտքագրում ենք հետևյալ արժեքները. first_out = 4, last_out = 13. Եվ 4-ից 13-րդ կարգի լուսադիոդներ դեպի կապում: Եվ ավելի լավ է չդիպչել դիսկրետ մուտք-ելքերի առաջին և երկրորդ կապին, քանի որ համակարգչին միացված USB պորտը խանգարում է դրանց: