Kā rodas programmas
Šis būs nedaudz neparasts raksts, tajā es centīšos ne tikai parādīt gatavu kodu, kas kaut ko dara, bet parādīšu, kā dzimst ierīce un programmaparatūra tai. Mēs aplūkosim programmas loģiku un to, kā šo loģiku veidot.
Šodien atrisināsim šādu problēmu: ir 2 gaismas diodes, tās jāsavieno ar Arduino un jārealizē iespēja regulēt to apgaismojuma spilgtumu.
Sāksim!
Pirmkārt, mums ir jādomā par to, kā izskatīsies mūsu ierīce un kas mums būs nepieciešams, lai to ieviestu. Mums ir nepieciešams kaut kas regulēt gaismas diožu spilgtumu un redzēt, kādā režīmā LED pašlaik darbojas vairogs, par kuru mēs runājām pēdējā rakstā, ir lielisks.
Tagad atliek tikai pieslēgt gaismas diodes, tam lieliski noder tā sauktais Bradboard, tā ir plastmasas lieta (nezinu kā to vēl nosaukt), kurā bez lodēšanas var pieslēgt vadus no Arduino un citiem. elektroniskās sastāvdaļas, kas ir ļoti ērti, ja nezināt, kā tieši tas izskatīsies gatava ierīce vai ķēde ir nepieciešama tikai dažiem startiem. Ķīnieši kniedē milzīgu skaitu savu šķirņu, es personīgi izmantoju šo:
Lai būtu vieglāk saprast, kā tas darbojas iekšpusē, pievienošu iekšējo savienojumu diagrammu:
Gaismas diožu pievienošana pieArduino
Daudzi tagad teiks: kas ir tik grūti savienot LED, tā ir spuldze! Un tie būs nepareizi, LED ir tālu no vienkāršas spuldzes, bet gan pusvadītāju apgaismes ierīce. Kuru darbina nevis spriegums kā parastā spuldze, bet gan strāva, un, ja strāva pārsniedz pieļaujamās vērtības, LED sāks pasliktināties, samazināsies tā spilgtums, kas kļūs pamanāms pēc kāda laika, atkarībā no jaudas. strāva tiek caurdurta vai pat uzreiz izdeg.
Kā izvairīties no LED bojājumiem lielas strāvas dēļ? Viss ir ļoti vienkāršs: jums ir jāizmanto strāvu ierobežojošs rezistors, kas jāaprēķina katrai LED atkarībā no tā īpašībām. LED rezistoru aprēķināšana ir atsevišķa raksta tēma, un šodien mēs šajā tēmā neiedziļināsimies, jo, visticamāk, jūs nezināt kaut kur atrastās gaismas diodes īpašības. Šajā gadījumā es izmantoju nelielu noteikumu: ja gaismas diode nav spilgta, es to baroju caur rezistoru ar pretestību no 220 līdz 400 omi atkarībā no tā, kurš rezistors bija pie rokas. Galvenais, kas jāatceras, ir tas, ka vairāk ir labāk nekā mazāk. Ar lielāku pretestību, nekā prasa LED, tas vienkārši degs blāvāk nekā parasti.
Tagad mums ir jāizlemj, kā pielāgot LED spilgtumu, šim nolūkam varat izmantot mainīgos rezistorus, kas principā novērsīs interaktīvo regulēšanu, un šī iemesla dēļ mēs neizmantosim šī metodešajā rakstā. Mēs izmantosim PWM, kas ieviests uz Arduino plates.
Kas ir PWM
PWM ( impulsa platuma modulācija) ir signāla darba cikla izmaiņas noteiktā laika periodā. Salīdzinot ar nemainīgu signālu, starplikas signālam ir šāda forma:
Šajā attēlā 100% no darba cikla ir PWM kā tāda neesamība, signāls iet bez izmaiņām, it kā izeja būtu vienkārši pievienota 5 voltiem.
0% darba cikls ir signāla neesamība, it kā vads nekur nebūtu pievienots.
Atlikušie darbības režīmi ir ātra darbības režīmu pārslēgšana, kas liek LED mirgot lielā, cilvēka acij nepamanāmā ātrumā (100 reizes sekundē), kas liek tai degt ar nepietiekamu spilgtumu. Arduino atkarībā no izmantotās mikroshēmas versijas ir dažādi daudzumi PWM izejas, uz tāfeles tās apzīmētas ar zīmi ~ no iepriekšējā raksta zinām, ka tās ir 6 izejas 3, 5, 6, 9, 10 un 11, izmantosim 10. un 11. tapas.
Beidzot savienosim gaismas diodes ar dēli. Mēs uzliekam LCD ekrāna vairogu uz Arduino un saliekam šādu ķēdi, kurai mums ir nepieciešams smadzeņu panelis, 2 gaismas diodes, 2 250 omu rezistori un 3–4 vīrišķie vadi. Diagramma izskatīsies šādi:
Un neaizmirstiet, ka LED ir polaritāte, gaismas diodes garā vai greizā kāja (kā diagrammā) ir plus, kas ir savienota caur rezistoru.
Šeit es, iespējams, pabeigšu raksta pirmo daļu, otrajā daļā strādāsim pie darba loģikas izstrādes un programmas koda rakstīšanas. Visu to labāko!
Potenciometrs ir mainīgais rezistors, kas maina savu pretestību, pagriežot pogu.
Kas ir nepieciešams projektam:
Savienojuma shēma uz maizes dēļa.
Lai regulētu gaismas diodes spilgtumu, pievienojam to savienotājam, kas atbalsta PWM, mūsu gadījumā tas ir digitālais kontakts 3. Potenciometra VCC un GND savienotājus pievienojam maizes paneļa barošanas un zemējuma sliedēm. Savienotājs A0 ar analogo tapu A0.
Pēc veiksmīgas ķēdes montāžas lejupielādējiet šo skici:
#define LED 3 #define POT A0 void setup() ( pinMode(LED, OUTPUT); // tapas iestatīšana izvades režīmā pinMode(POT, INPUT); // tapas iestatīšana ievades režīmā ) void loop() ( / / deklarēt integer mainīgos int, spilgtumu //nolasīt potenciometra spriegumu, tā vērtības mainīsies no 0 līdz 1023 pagriezieniem = analogRead(POT) //ierakstīt pagrieziena vērtību spilgtuma mainīgajā, /; /dalīts ar 4. Iegūs vērtības no 0 līdz 255 spilgtums = pagrieziens / 4 //ieslēdz LED ar spilgtumu, kas vienāds ar spilgtuma vērtību analogWrite(LED, spilgtums);
Tagad mēģināsim uzrakstīt kodu tai pašai shēmai, bet tīrā SI vidē AtmelStudio 7 Tas izskatīsies šādi.
#iekļauts Tagad mēģināsim izprast šos divus piemērus. Fakts ir tāds, ka Arduino vide bija paredzēta ātrai iesācēju sākšanai. Ja jums ir nepieciešams mirgot gaismas diode vai noklikšķināt uz releja, to var izdarīt dažu minūšu laikā. Arduino vide ir pilnībā izolēta no mikrokontrollera aparatūras, un tāpēc viss tajā tiek veikts, izmantojot šīs programmatūras izstrādātāju ierakstītās funkcijas. Šīs funkcijas un to iekšējie elementi ir paslēpti programmas dziļumos. Parastais lietotājs var izsaukt tikai nepieciešamās funkcijas, lai konfigurētu MK aparatūras komponentus. Šķiet, ka tas ievērojami atvieglo programmēšanu. Principā tā ir taisnība. Tāpēc Arduino vide un dēļi ir ļoti populāri iesācēju MK projektu entuziastu vidū. Tomēr ir arī trūkumi, piemēram, tie, kas programmē Arduino, nevar programmēt mikrokontrollerus, kurus neatbalsta Arduino IDE. Piemēram, šķiet neiespējami ieprogrammēt nevienu Attiny AVR mikrokontrollera modeli. Un arī citi Atmega modeļi, kas nav iekļauti Arduino dēļos, ir izlaisti. Principā, ja projekti nav īpaši sarežģīti, tad var izdabāt, tad pietiek ar Arduino vidi. Ja vajag ko lielu un sarežģītu, tad protams tīri SI noteikumi. Bet tad jums būs jāsaprot MK reģistri, kā darbojas atsevišķi MK mezgli. Jums ir jāizlasa dokumentācija, jāizpēta un jāsaprot pati SI. Taču, ja jau ir pieredze skiču rakstīšanā Arduino vidē, tad ar laiku būs iespējams arī saprast SI. Tagad mēģināsim aplūkot SI kodu un saprast, ka tas nav tik biedējoši. Piemēram, līnija #iekļauts DDRC=0< Šīs līnijas konfigurē Arduino plates tapas, kas mums vajadzīgas kā ievade vai izvade. PC0šis ir tāds pats kā A0 uz tāfeles šī tapa ir jākonfigurē kā ieeja, jo tai ir pievienots potenciometrs. Un ADC vērtība tiks nolasīta no šīs tapas. Reģistrēties ADMUX Un ADCSRA Mēs konfigurējam pašu ADC mezglu vajadzīgajā režīmā. Jo īpaši mēs to konfigurējam tā, lai ADC automātiski pastāvīgi nolasītu vērtību no izejas A0 un saglabājiet šo vērtību reģistrā ADCH. MK ir aparatūras taimeri, tie ir arī mezgli, kas ļauj strādāt ar PWM tapām, piemēram, PWM pin ~3, kuram ir pievienota gaismas diode, pieder iekšējai Taimeris2. Atmega 328 ir vairāk Taimeris0 Un Taimeris1. Tātad, izmantojot reģistrus TCCR2A Un TCCR2B, iestatīsim Timer2 režīmā FAST_PWM, tas dod mums iespēju strādāt ar Arduino plates tapu ~3. Nu, programmas galvenajā cilpā mēs nekavējoties pārsūtām vērtību no ADC uz mūsējo Taimeris2. Tas tiek darīts vienā rindā OCR2B=ADCH. Vienīgais jautājums ir, kā augšupielādēt kodu, kas rakstīts SI, mūsu Arduino programmā AtmelStudio? To var izdarīt tieši no AtmelStudio vides. Tiesa, pirms tam jums ir jāizlasa un jāsaglabā sāknēšanas ielādētājs no Arduino plates ar to pašu programmētāju. Pretējā gadījumā Arduino plate nevarēs strādāt ar Arduino vidi. Jebkurā laikā varat izmantot programmētāju, lai atgrieztu sāknēšanas ielādētāju savā vietā. Šajā eksperimentā mēs pievienojam gaismas diodes spilgtuma daļu ar vienu pogu un samazinām to ar otru.
Funkcija analogWrite () tiek izmantota, lai vājinātu LED un to pakāpeniski ieslēgtu. AnalogWrite izmanto impulsa platuma modulāciju (PWM), kas ļauj digitālajai tapai ieslēgt/izslēgties lielā ātrumā, radot slāpēšanas efektu. Savienojiet LED anodu (garāku, pozitīvo kāju) ar Arduino plates digitālo tapu 9, izmantojot 220 omu rezistoru. Savienojiet katodu (īsāku, negatīvi lādētu kāju) ar zemi. Pēc tam, kad tapa 9 ir pasludināta par ledPin, funkcijas setup() pamatteksts nav jāaizpilda. Funkcijai analogWrite (), ko izmantosit galvenajā cilpā, ir nepieciešami divi argumenti: viens, lai norādītu tapu, uz kuru rakstīt, un otrs, lai parādītu rakstāmo PWM vērtību. Lai pakāpeniski iedegtos un izslēgtu LED, pakāpeniski palieliniet PWM vērtību no 0 līdz 255, pēc tam atpakaļ uz 0, lai pabeigtu ciklu. Zemāk esošajā skicē PWM vērtība tiek izmantota mainīgajam, ko sauc par spilgtumu. Katru reizi, kad cilpa beidzas, tā palielina mainīgā vērtību. Ja spilgtums sasniedz robežvērtību (0 vai 255), fadeAmount maina savu vērtību uz negatīvu. Citiem vārdiem sakot, ja fadeAmount ir 5, tā vērtība mainās uz -5. Nākamajā cilpas atkārtojumā tas izraisa spilgtuma mainīgā maiņu. AnalogWrite () ļauj PWM vērtībai ātri mainīties, lai skices beigās esošā aizkave kontrolētu samazināšanās ātrumu. Mēģiniet mainīt aizkaves aizkaves vērtību un redzēt, kā programma darbojas. Šajā piemērā parādīts, kā nodrošināt vājināšanu 9. tapā, izmantojot funkciju analogWrite(). int led = 9; // tapa, pie kuras ir pievienota gaismas diode int spilgtums = 0; // LED spilgtums int fadeAmount = 5; // cik daudz palielināt gaismas diodes spilgtumu // iestatīšanas funkcija palaiž vienu reizi pēc plates pārstartēšanas: // deklarē tapu 9 kā izvadi: pinMode(led, OUTPUT); // cilpa atkārtojas bezgalīgi: // iestata 9. tapas spilgtumu: analogWrite(led, spilgtums); // mainīt spilgtumu nākamajā iterācijā, izmantojot cilpu: brightness = spilgtums + fadeAmount; // robežvērtībās maina vājinājuma vērtību uz līdzīgu ar pretēju zīmi: if (spilgtums == 0 || spilgtums == 255) ( fadeAmount = -fadeAmount ; // aizkave 30, lai izsekotu izbalēšanas efektu Tagad apskatīsim daudzkrāsu LED, ko bieži sauc saīsinājumā: RGB LED. RGB ir saīsinājums, kas apzīmē: sarkans — sarkans, zaļš — zaļš, zils — zils. Tas ir, šīs ierīces iekšpusē ir ievietotas trīs atsevišķas gaismas diodes. Atkarībā no veida RGB gaismas diodei var būt kopīgs katods vai kopīgs anods.
savieno galvenes failu, kurā ir atlasīts mūsu vēlamais MK. AtmelStudio 7 vide to dara automātiski, veidojot jaunu projektu.EKSPERIMENTA DAĻU SARAKSTS
- 1 Arduino Uno dēlis;
- 1 bezlodējamais maizes dēlis;
- 2 pulksteņa pogas;
- 1 rezistors ar nominālo vērtību 220 omi;
- 1 LED;
- 7 vīriešu-vīriešu vadi.
SĒTES DIAGRAMMA
DIAGRAMMA UZ PLĀCES
LŪDZU, ŅEMIET VĒRĀ
SKICE
lejupielādējiet Arduino IDE skici
#define PLUS_BUTTON_PIN 2 #define MINUS_BUTTON_PIN 3 #define LED_PIN 9 int spilgtums = 100; Būla plusUp = patiess; Būla minusUp = patiess; void setup() ( pinMode(LED_PIN, OUTPUT); pinMode(PLUS_BUTTON_PIN, INPUT_PULLUP); pinMode(MINUS_BUTTON_PIN, INPUT_PULLUP); ) void loop() ( analogWrite(LED_PIN, spilgtums); // reaģēt uz klikšķiem, izmantojot funkciju, ko mēs rakstījām plusU = handClick(PLUS_BUTTON_PIN, plusUp, +35 minusUp = handClick(MINUS_BUTTON_PIN, minusUp, -35) // Sava funkcija ar 3 parametriem: PIN numurs ar pogu // (buttonPin), stāvoklis pirms pārbaudes (wasUp) un spilgtuma gradācija //, noklikšķinot uz pogas (delta). Funkcija atgriež // (angļu valodā return) atpakaļ jauno, pašreizējo pogas Būla roktura stāvokliClick(int buttonPin, Boolean wasUp, int delta) ( boolean isUp = digitalRead(buttonPin); if (wasUp && !isUp) ( delay(10) ); isUp = digitalRead(buttonPin) // ja bija klikšķis, mainiet spilgtumu no 0 uz 255 if (!isUp) brightness = constrain(brightness + delta, 0, 255 ) return isUp; zvanītāja kodam)
KODS SKAIDROJUMI
JAUTĀJUMI, LAI PĀRBAUDĪTU SEVI
UZDEVUMI NEATKARĪGAM RISINĀJUMAM
Kas jums būs nepieciešams projektam
LED savienojuma shēma ar Arduino
Arduino savienotās gaismas diodes shēmas shēma
Vairoga iespēja ar LED priekš Arduino
Arduino programmas apraksts
Skice priekš Arduino IDE
1. Krāsu sajaukšana
Kāpēc RGB gaismas diode ir labāka par trim parastajām? Tas viss ir saistīts ar mūsu redzes spēju sajaukt gaismu no dažādiem avotiem, kas atrodas tuvu viens otram. Piemēram, ja novietosim blakus zilās un sarkanās gaismas diodes, tad vairāku metru attālumā to mirdzums saplūdīs un acs ieraudzīs vienu violetu punktu. Un, ja pievienosim arī zaļo, punkts mums šķitīs balts. Tieši tā darbojas datoru monitori, televizori un āra ekrāni. Televizora matrica sastāv no atsevišķiem dažādu krāsu punktiem. Ja paņemat palielināmo stiklu un skatāties caur to ieslēgtajā monitorā, šos punktus varat viegli redzēt. Taču uz āra ekrāna punkti nav izvietoti ļoti blīvi, lai tos varētu atšķirt ar neapbruņotu aci. Bet no vairāku desmitu metru attāluma šie punkti nav atšķirami. Izrādās, jo tuvāk viens otram atrodas daudzkrāsaini punktiņi, jo mazāks attālums ir nepieciešams acij, lai sajauktu šīs krāsas. No tā izriet secinājums: atšķirībā no trim atsevišķām gaismas diodēm RGB LED krāsu sajaukšanās ir pamanāma jau 30-70 cm attālumā Starp citu, RGB LED ar matētu objektīvu darbojas vēl labāk. 2. RGB LED pievienošana Arduino
Tā kā daudzkrāsu gaismas diode sastāv no trim parastajām gaismas diodēm, mēs tās savienosim atsevišķi. Katra gaismas diode ir savienota ar savu tapu, un tai ir savs atsevišķs rezistors. Šajā apmācībā mēs izmantojam RGB LED ar kopīgu katodu, tāpēc zemei būs tikai viens vads. Shematiska diagramma
Izkārtojuma izskats3. Programma RGB gaismas diodes vadīšanai
Izveidosim vienkāršu programmu, kas pēc kārtas izgaismos katru no trim krāsām.<3; i++)
pinMode(rgbPins[i], OUTPUT);
}
void loop() {
digitalWrite(rgbPins, LOW);
digitalWrite(rgbPins, HIGH);
delay(500);
digitalWrite(rgbPins, LOW);
digitalWrite(rgbPins, HIGH);
delay(500);
digitalWrite(rgbPins, LOW);
digitalWrite(rgbPins, HIGH);
delay(500);
}
const baits rPin = 3; const baits gPin = 5; const baits bPin = 6; void setup() ( pinMode(rPin, OUTPUT); pinMode(gPin, OUTPUT); pinMode(bPin, OUTPUT); ) void loop() ( // izslēgt zilu, ieslēgt sarkanu digitalWrite(bPin, LOW); digitalWrite( rPin, HIGH; , HIGH (500) Ielādējiet programmu Arduino un novērojiet rezultātu. Jūsu pārlūkprogramma neatbalsta video tagu. Nedaudz optimizēsim programmu: mainīgo rPin, gPin un bPin vietā izmantosim masīvu. Tas mums palīdzēs nākamajos uzdevumos.
const baits rgbPins = (3,5,6); void setup() ( for(baits i=0; i
zils<3; i++)
pinMode(rgbPins[i], OUTPUT);
}
void loop() {
// перебираем все шесть цветов
for(int i=0; i<6; i++){
// перебираем три компоненты каждого из шести цветов
for(int k=0; k<3; k++){
digitalWrite(rgbPins[k], rainbow[i][k]);
}
delay(1000);
}
}
В результате работы программы получается:
Your browser does not support the video tag.
zils + sarkans = violets
Vienkāršības labad mēs izlaidām oranžo krāsu. Tātad, izrādījās, ka tās ir sešas varavīksnes krāsas 🙂 const baits rgbPins = (3,5,6); const baits varavīksne = ( (1,0,0), // sarkans (1,1,0), // dzeltens (0,1,0), // zaļš (0,1,1), // zils ( 0,0,1), // zils (1,0,1), // violets ); void setup() ( for(baits i=0; i analogWrite 5. Gluda krāsas maiņa<3; i++){
pinMode(rgbPins[i], OUTPUT);
}
// начальное состояние - горит красный цвет
analogWrite(rgbPins, 255);
analogWrite(rgbPins, 0);
analogWrite(rgbPins, 0);
}
void loop() {
// гасим красный, параллельно разжигаем зеленый
for(int i=255; i>Ne velti RGB LED pieslēdzām pie 3., 5. un 6. tapām. Kā zināms, šīs tapas ļauj ģenerēt dažādu darba ciklu PWM signālu. Citiem vārdiem sakot, mēs varam ne tikai ieslēgt vai izslēgt LED, bet arī kontrolēt tā sprieguma līmeni. Tas tiek darīts, izmantojot funkciju . Padarīsim tā, lai mūsu gaismas diode starp varavīksnes krāsām pārietu nevis pēkšņi, bet vienmērīgi.