Այս ձեռնարկում մենք կշարունակենք աշխատել 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 հետո աչքին նկատելի չէ, քանի որ շատ շուտով նորից կհաշվարկվի, թե լուսադիոդներից որն է միացնել, և այն կմիացվի՝ նոր հանգած, թե հաջորդը։
ՀԱՐՑԵՐ, ՈՐՈՆՑՈՎ ՍՏՈՒԳԵԼ ԵՆՔ ՁԵԶ
- Ինչու՞ այս փորձի ժամանակ մենք միացնում ենք LED սանդղակը առանց տրանզիստորի օգտագործման:
- Եթե մենք միայն միացնեինք LED-ները 5, 6, 7, 8, 9 պորտերի վրա, ի՞նչը պետք է փոխվի ծրագրում:
- Ինչ այլ հրահանգ կարող է օգտագործվել համարժեք գործողություն կատարելու համար ++ քորոց ?
- Ո՞րն է տարբերությունը տիպի փոփոխականների միջև միջև անստորագիր միջ ?
- Ի՞նչ է վերադարձնում ֆունկցիան millis () ?
- Ինչպե՞ս ենք մենք հաշվարկում պորտի համարը, որի վրա ցանկանում ենք միացնել LED-ն այս փորձի ժամանակ:
ԱՆԿԱԽ ԼՈՒԾՄԱՆ ԱՌԱՋԱԴՐԱՆՔՆԵՐ
- Փոխեք կոդը այնպես, որ լուսադիոդները միացվեն վայրկյանում մեկ անգամ:
- Առանց նավահանգիստներն անջատելու, համոզվեք, որ լույսն անցնում է միայն կշեռքի միջին չորս բաժինների երկայնքով:
- Փոփոխեք ծրագիրն այնպես, որ փոխարենը int pin = FIRST_LED_ PIN + (ms / 120) % 10բոցի շարժումը վերահսկվում էր ցիկլով համար .
- Առանց լարերը փոխելու, փոխեք ծրագիրն այնպես, որ լույսը վազի հակառակ ուղղությամբ:
Այս ձեռնարկում մենք կշարունակենք աշխատել 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 պորտը խանգարում է դրանց: