Cum se configurează smartphone-uri și PC-uri. Portal informativ

Comenzi Arduino în rusă. Programarea Arduino în C în AVR Studio

Limbajul de programare Arduino pentru începători este prezentat în detaliu în tabelul de mai jos. Microcontroler Arduino programabil pornit limbaj special programare bazată pe C/C++. Limbajul de programare Arduino este o variantă a C++, cu alte cuvinte, nu există un limbaj de programare separat pentru Arduino. Descarca carte PDF posibil la sfârșitul paginii.

ÎN Arduino IDE toate schițele scrise sunt compilate într-un program în C/C++ cu modificări minime. Compilatorul Arduino IDE simplifică foarte mult scrierea programelor pentru această platformă, iar crearea de dispozitive pe Arduino devine mult mai accesibilă persoanelor care nu au cunoștințe extinse despre limbajul C/C++. Să dăm mai departe putina informatie cu o descriere a funcţiilor principale Limbajul Arduino cu exemple.

Referință detaliată la limbajul Arduino

Limbajul poate fi împărțit în patru secțiuni: instrucțiuni, date, funcții și biblioteci.

Limbajul Arduino Exemplu Descriere

Operatori

înființat() void setup()
{
pinMode(3, INPUT);
}
Funcția este folosită pentru a inițializa variabile, pentru a determina modurile de funcționare ale pinii de pe placă etc. Funcția rulează o singură dată, după fiecare alimentare a microcontrolerului.
buclă() buclă goală ()
{
digitalWrite(3, HIGH);
întârziere (1000);
digitalWrite(3, LOW);
întârziere (1000);
}
Funcția de buclă se desfășoară, permițând programului să efectueze și să reacționeze la calcule. Funcțiile setup() și loop() trebuie să fie prezente în fiecare schiță, chiar dacă aceste instrucțiuni nu sunt utilizate în program.

Declarații de control

dacă
dacă(x>
dacă (x< 100) digitalWrite (3, LOW );
Instrucțiunea if este utilizată în combinație cu operatorii de comparare (==, !=,<, >) și verifică dacă condiția este adevărată. De exemplu, dacă valoarea variabilei x este mai mare de 100, atunci LED-ul de la ieșirea 13 se aprinde; dacă este mai mic, LED-ul se stinge.
daca..altfel
if (x > 100) digitalWrite (3, HIGH );
else digitalWrite(3, LOW);
Operatorul else vă permite să efectuați o altă verificare decât cea specificată în if, pentru a efectua mai multe verificări care se exclud reciproc. Dacă niciunul dintre verificări nu primește un rezultat ADEVĂRAT, atunci blocul de instrucțiuni din else este executat.
comutator...caz
comutator(x)
{


cazul 3: rupere ;

}
La fel ca o instrucțiune if, o instrucțiune switch controlează un program permițându-vă să specificați acțiuni care vor fi efectuate atunci când conditii diferite. Break este o comandă pentru a ieși dintr-o instrucțiune; implicit este executată dacă nu este selectată nicio alternativă.
pentru void setup()
{
pinMode(3, OUTPUT);
}
buclă goală ()
{
pentru (int i=0; i<= 255; i++){
analogWrite(3, i);
întârziere (10);
}
}
Construcția for este folosită pentru a repeta instrucțiunile cuprinse între acolade. De exemplu, diminuarea lină a unui LED. Antetul buclei for este format din trei părți: for (inițializare; condiție; increment) - inițializarea se efectuează o dată, apoi condiția este verificată, dacă condiția este adevărată, atunci se realizează incrementul. Bucla se repetă până când condiția devine falsă.
in timp ce buclă goală ()
{
în timp ce (x< 10)
{
x = x + 1;
Serial.println(x);
întârziere (200);
}
}
Instrucțiunea while este folosită ca o buclă care se va executa atâta timp cât condiția din paranteze este adevărată. În exemplu, instrucțiunea while loop va repeta codul între paranteze la nesfârșit până când x este mai mic de 10.
face în timp ce buclă goală ()
{
do
{
x = x + 1;
întârziere (100);
Serial.println(x);
}
în timp ce (x< 10);
întârziere (900);
}
Instrucțiunea do...while loop funcționează în același mod ca bucla while. Cu toate acestea, dacă expresia dintre paranteze este adevărată, bucla continuă mai degrabă decât iese din buclă. În exemplul de mai sus, dacă x este mai mare decât 10, operația de adăugare va continua, dar cu o pauză de 1000 ms.
pauză
continua
comutator(x)
{
cazul 1: digitalWrite (3, HIGH );
cazul 2: digitalWrite (3, LOW );
cazul 3: rupere ;
cazul 4: continua ;
implicit: digitalWrite (4, HIGH);
}
Break este folosit pentru a forța ieșirea din buclele switch, do, for și while fără a aștepta finalizarea buclei.
Instrucțiunea continue omite instrucțiunile rămase în pasul curent al buclei.

Sintaxă

;
(punct şi virgulă)

digitalWrite(3, HIGH);
Un punct și virgulă este folosit pentru a marca sfârșitul unei declarații. Uitarea unui punct și virgulă la sfârșitul unei linii are ca rezultat o eroare de compilare.
{}
(bretele)
void setup()
{
pinMode(3, INPUT);
}
Paranteza de deschidere „(” trebuie urmată de paranteza de închidere „)”. Parantezele nepotrivite pot duce la erori ascunse și de neînțeles la compilarea unei schițe.
//
(un comentariu)
x = 5; // un comentariu

În viața unui dezvoltator Arduino, mai devreme sau mai târziu vine un moment în care mediul de dezvoltare standard devine aglomerat. Dacă schițele nu mai au suficientă memorie, aveți nevoie de timp real și lucrați cu întreruperi, sau doriți doar să fiți mai aproape de hardware, atunci este timpul să treceți la C. Inginerii electronici cu experiență se vor încruntă disprețuitor la mențiunea Arduino și vor trimite începătorul la un magazin de radio pentru un fier de lipit. Poate că acesta nu este cel mai rău sfat, dar nu îl vom urma încă. Dacă aruncăm Arduino IDE și limbajul de cablare/procesare, rămânem cu o placă de depanare excelentă, dotată deja cu tot ce este necesar pentru funcționarea microcontrolerului. Și, important, un bootloader este deja conectat în memoria controlerului, permițându-vă să încărcați firmware-ul fără a utiliza un programator.

Pentru a programa în C, avem nevoie de AVR GCC Toolchain.

Vom avea nevoie și de Arduino IDE instalat, deoarece... conține utilitarul avrdude, care este necesar pentru a descărca firmware-ul pe controler. CrossPack conține și avrdude, dar versiunea care vine cu el nu funcționează cu Arduino.

După ce totul este instalat, să creăm primul nostru proiect. Pentru început, să scriem Makefile. Ne va permite să evităm introducerea manuală a comenzilor lungi de fiecare dată când compilam și încărcăm firmware-ul.

#Controller instalat pe placă. Poate fi diferit, de exemplu atmega328 DEVICE = atmega168 #Clock frequency 16 MHz CLOCK = 16000000 #Avrdude launch command. Trebuie copiat din IDE-ul Arduino. AVRDUDE = /Applications/Arduino.app/Contents/Resources/Java/hardware/tools/avr/bin/avrdude -C/Applications/Arduino.app/Contents/Resources/Java/hardware/tools/avr/etc/avrdude.conf -carduino -P/dev/tty.usbserial-A600dAAQ -b19200 -D -p atmega168 OBIECTE = main.o COMPILARE = ​​avr-gcc -Wall -Os -DF_CPU=$(CLOCK) -mmcu=$(DEVICE) all: main .hex .c.o: $(COMPILARE) -c $< -o $@ .S.o: $(COMPILE) -x assembler-with-cpp -c $< -o $@ .c.s: $(COMPILE) -S $< -o $@ flash: all $(AVRDUDE) -U flash:w:main.hex:i clean: rm -f main.hex main.elf $(OBJECTS) main.elf: $(OBJECTS) $(COMPILE) -o main.elf $(OBJECTS) main.hex: main.elf rm -f main.hex avr-objcopy -j .text -j .data -O ihex main.elf main.hex avr-size --format=avr --mcu=$(DEVICE) main.elf

În acest fișier trebuie să introducem comanda noastră pentru a lansa avrdude. Va arăta diferit pe sisteme diferite. Pentru a afla opțiunea dvs., lansați IDE-ul Arduino și bifați caseta „Afișați ieșirea detaliate în timpul încărcării” din setări.

Acum încărcăm orice schiță în Arduino și ne uităm la mesajele afișate în partea de jos a ferestrei. Găsim apelul avrdude acolo, copiem totul, cu excepția parametrului -Uflash și îl lipim în Makefile după „AVRDUDE =”.


O notă rapidă: toată indentarea din Makefile se face cu caractere tabulatoare (tasta Tab). Dacă editorul dvs. de text înlocuiește aceste caractere cu spații, comanda make va refuza construirea proiectului.

Acum să creăm un fișier principal.c- textul propriu-zis al programului nostru, în care în mod tradițional clipim LED-ul.

#include #include #define LED_PIN 5 int main() ( DDRB |= 1<< LED_PIN; while(1) { PORTB |= 1 << LED_PIN; _delay_ms(1000); PORTB &= ~(1 << LED_PIN); _delay_ms(1000); } return 0; }

Proiectul nostru este gata. Să deschidem consola în directorul nostru de proiect și să introducem comanda „make”:


După cum puteți vedea, dimensiunea firmware-ului rezultat este de numai 180 de octeți. O schiță similară Arduino ocupă 1116 octeți în memoria controlerului.

Acum să ne întoarcem la consolă și să introducem „make flash” pentru a încărca fișierul compilat în controler:


Dacă descărcarea a fost finalizată fără erori, LED-ul conectat la pinul 13 al plăcii va clipi fericit. Uneori, avrdude nu poate găsi placa sau cade din cauza unui timeout - în acest caz, răsucirea cablului USB poate ajuta. De asemenea, pentru a evita conflictele de acces la placă, nu uitați să închideți IDE-ul Arduino înainte de comanda „make flash”.

Poate că multe dintre lucrurile descrise în acest articol vor părea evidente pentru dezvoltatorii experimentați. Am încercat să descriu procesul într-un limbaj cât mai ușor de înțeles pentru un utilizator Arduino începător și să adun într-un singur loc informațiile pe care le-am putut obține din diverse surse și le-am verificat empiric. Poate că acest articol va economisi cuiva câteva ore de timp.

Succes în stăpânirea microcontrolerelor!

Arduino este o placă de dezvoltare gata de utilizat și un limbaj de programare foarte simplu, care face ușor să începeți cu microcontrolere cu prețul dimensiunii și vitezei programului. Recent, Atmel a adăugat suport pentru bootloader-ul Arduino în AVR Studio, adică puteți scrie și încărca programe scrise în C, C++ sau Assembler fără un programator. Mai mult, puteți scrie cod în limbajul de procesare/cablare în AVR Studio.
Recomand să începeți citirea articolului cu actualizarea la sfârșit!
În acest articol, oferim instrucțiuni pas cu pas pentru instalarea software-ului de programare Arduino folosind AVR Studio. Am luat ca bază o recenzie a extensiilor AVR Studio de pe site-ul easyelectronics.ru. Vom rula toate exemplele pe placa noastră.

Instalarea Arduino IDE

Folosim Arduino versiunea 1.5.2. Îl puteți descărca de pe site-ul oficial. Cea mai recentă versiune (1.6.2-r2 la momentul scrierii) din anumite motive nu funcționează cu microcontrolerul Atmega8.
Veți descărca o arhivă zip cu mediul deja implementat. Tot ce rămâne este să-l despachetezi în directorul programului.

Instalarea Atmel Studio

UPD

Văd că subiectul este popular și vreau să clarific câteva puncte.
Există trei moduri în care am încercat să programez o placă compatibilă cu Arduino în C:

  1. Scrieți direct în Arduino IDE în C. Trebuie să înțelegeți că Procesarea/Wiring nu este un limbaj, ci pur și simplu un set de macrocomenzi și biblioteci. Când scrieți în el, se uită în anteturile sale, vă convertește codul care poate fi citit de om în C și apoi se compilează cu compilatorul standard AVR GCC. Dacă scrieți cod în C, atunci acesta nu va accesa bibliotecile sale și va compila imediat totul așa cum ar trebui, DAR!... în același timp, linkerul va adăuga la proiectul dvs. orice dorește. Avantajul este că nu aveți nevoie de altceva decât de IDE-ul Arduino. Dezavantajul este magia, care este ascunsă de dezvoltator. Această metodă este adesea folosită în cazurile în care este necesară implementarea unei funcții pe care prietenii noștri italieni nu au prevăzut-o în limba lor.
  2. Metoda propusă în acest articol (de fapt, cea mai ciudată, deoarece îmbină toate neajunsurile). Din punct de vedere ideologic, această extensie este necesară pentru a programa în Procesare/Wiring și pentru a utiliza Atmel Studio ca interfață. Există, de asemenea, o funcționalitate plătită care vă permite să depanați codul, dar nu am încercat-o. Deci, în esență, la programare, totul se întâmplă la fel ca în prima opțiune, dar lucrezi într-un IDE diferit. În același timp, din punct de vedere al rezultatului, obțineți același lucru. Dacă ați programat Arduino și ați decis să o faceți în C, nu ezitați să scrieți direct în IDE-ul Arduino. Dacă nu vă place interfața, puteți folosi un editor normal (recomand Sublime Text). Dacă lucrați în Atnel Studio și doriți să vă flashați placa direct din interfața sa sau să scrieți Procesare/Cablare în ea (brusc!), atunci acest supliment este pentru dvs. Apropo, studioul funcționează doar sub Windows, adică metoda nu este pentru toată lumea. Am scris acest articol doar pentru că am găsit o metodă nouă pentru mine, dar nu-mi place.
  3. A treia metodă, mi se pare, este cea mai bună pentru un utilizator avansat. La început, totul se întâmplă ca de obicei - scrieți codul, îl compilați și obțineți un fișier hex. Apoi, amintindu-ți că aveți o placă obișnuită de depanare cu un bootloader în mâini, descărcați un utilitar care poate accesa acest bootloader și vă poate transfera codul în memorie. Am postat deja instrucțiuni pas cu pas. În acest caz, dezvoltatorul primește control maxim asupra tuturor funcțiilor, dar pot apărea probleme din cauza utilizării unui bootloader terță parte.

Aș dori să dezvălui încă un lucru care se întâmplă în Arduino. Orice ai face, Arduino IDE va ​​porni cu siguranță perifericele în sine. De exemplu, va porni temporizatoarele. Și dacă doriți să lucrați cu ei în C, s-ar putea să descoperiți că nu funcționează așa cum vă așteptați. Și asta poate deveni o problemă reală. Și există multe astfel de exemple, adică există multe potențiale greble, cârje și bug-uri.
Dacă pur și simplu încărcați un fișier hex, atunci problemele pot apărea numai din cauza bootloader-ului. Până acum am găsit doar unul - după ce bootloader-ul este finalizat, UART rămâne activat. Dacă scrieți prin Arduino IDE, atunci acesta se va insera în codul dvs. pentru a-l dezactiva și cine știe ce altceva. Dacă vrei doar să-ți alergi hex, atunci nu vei obține controlul asupra picioarelor UART. Va trebui să adăugați manual o dezactivare UART la proiectul dvs. Acest artefact și exemplele de cod sunt descrise în detaliu în .
Ei bine, în concluzie. Majoritatea plăcilor compatibile cu Arduino au un conector pentru un programator ISP. Dacă cumpărați acest programator de la chinezi cu 3-4 dolari, veți uita rapid de toate aceste probleme.

Vom fi foarte bucuroși dacă ne susțineți resursa și ne vizitați magazinul de produse.

Buna ziua! Sunt Alikin Alexander Sergeevich, profesor de educație suplimentară, conduc cluburile „Robotică” și „Inginerie radio” la Centrul pentru Tehnologia Tineretului și Tineretului din Labinsk. Aș dori să vorbesc puțin despre o metodă simplificată de programare a Arduino folosind programul ArduBlock.

Am introdus acest program în procesul educațional și sunt încântat de rezultat, este foarte solicitat în rândul copiilor, mai ales la scrierea unor programe simple sau pentru realizarea unei etape inițiale a unor programe complexe. ArduBlock este un mediu de programare grafic, adică toate acțiunile sunt efectuate cu imagini desenate cu acțiuni semnate în limba rusă, ceea ce simplifică foarte mult învățarea platformei Arduino. Copiii din clasa a II-a pot stăpâni cu ușurință lucrul cu Arduino datorită acestui program.

Da, cineva ar putea spune că Scratch încă există și este, de asemenea, un mediu grafic foarte simplu pentru programarea Arduino. Dar Scratch nu flashează Arduino, ci îl controlează doar printr-un cablu USB. Arduino este dependent de computer și nu poate funcționa autonom. Atunci când creați propriile proiecte, autonomia este principalul lucru pentru Arduino, mai ales atunci când creați dispozitive robotizate.

Chiar și roboții LEGO cunoscuți, precum NXT sau EV3, nu mai sunt atât de interesanți pentru studenții noștri odată cu apariția programului ArduBlock în programarea Arduino. Arduino este, de asemenea, mult mai ieftin decât orice trusă de construcție LEGO și multe componente pot fi pur și simplu luate din electronicele de uz casnic vechi. Programul ArduBlock va ajuta nu numai începătorii, ci și utilizatorii activi ai platformei Arduino.

Deci, ce este ArduBlock? După cum am spus deja, acesta este un mediu de programare grafică. Aproape complet tradus în rusă. Dar punctul culminant al ArduBlock nu este doar acesta, ci și faptul că programul ArduBlock pe care l-am scris se convertește în codul IDE Arduino. Acest program este integrat în mediul de programare Arduino IDE, adică este un plugin.

Mai jos este un exemplu de LED care clipește și un program convertit în Arduino IDE. Toate lucrările cu programul sunt foarte simple și orice student o poate înțelege.

Ca urmare a lucrului cu programul, puteți nu numai să programați Arduino, ci și să studiați comenzi pe care nu le înțelegem în formatul text al IDE-ului Arduino, dar dacă vă este prea lene să scrieți comenzi standard, puteți utiliza rapid mouse-ul pentru a schița un program simplu în ArduBlok și a-l depana în Arduino IDE.

Pentru a instala ArduBlok, trebuie mai întâi să descărcați și să instalați Arduino IDE de pe site-ul oficial Arduino și să înțelegeți setările atunci când lucrați cu placa Arduino UNO. Cum să faceți acest lucru este descris pe același site web sau pe Amperka, sau vizionați-l pe YouTube. Ei bine, când toate acestea sunt descoperite, trebuie să descărcați ArduBlok de pe site-ul oficial, aici. Nu recomand să descărcați cele mai recente versiuni, sunt foarte complicate pentru începători, dar versiunea din 2013-07-12 este cea mai bună, acest fișier este cel mai popular acolo.

Apoi, redenumiți fișierul descărcat în ardublock-all și în folderul „documente”. Creăm următoarele foldere: Arduino > instrumente > ArduBlockTool > instrument și în acesta din urmă aruncăm fișierul descărcat și redenumit. ArduBlok funcționează pe toate sistemele de operare, chiar și pe Linux, eu personal l-am testat pe XP, Win7, Win8, toate exemplele sunt pentru Win7. Instalarea programului este aceeași pentru toate sistemele.

Ei bine, ca să spun simplu, am pregătit o arhivă pe discul 7z Mail, despachetând care vei găsi 2 foldere. Într-unul există deja un program Arduino IDE funcțional, iar în celălalt folder conținutul trebuie trimis în folderul documente.

Pentru a funcționa în ArduBlok, trebuie să rulați IDE-ul Arduino. Apoi mergem la fila Instrumente și acolo găsim articolul ArduBlok, facem clic pe el - și iată-l, scopul nostru.

Acum să ne uităm la interfața programului. După cum înțelegeți deja, nu există setări în el, dar există o mulțime de pictograme pentru programare și fiecare dintre ele poartă o comandă în format text Arduino IDE. Noile versiuni au și mai multe pictograme, așa că înțelegerea celei mai recente versiuni de ArduBlok este dificilă și unele dintre pictograme nu sunt traduse în rusă.

În secțiunea „Management” vom găsi o varietate de cicluri.

În secțiunea „Porturi”, putem gestiona valorile porturilor, precum și emițătorul de sunet, servo sau senzorul de proximitate ultrasonic conectat la acestea.

În secțiunea „Numere/Constante”, putem selecta valori digitale sau crea o variabilă, dar este puțin probabil să utilizați ceea ce este mai jos.

În secțiunea „Operatori” vom găsi toți operatorii de comparare și calcul necesari.

Secțiunea Utilități folosește în principal pictograme cronometrate.

„TinkerKit Bloks” este secțiunea pentru senzorii TinkerKit achiziționați. Noi, desigur, nu avem un astfel de set, dar asta nu înseamnă că pictogramele nu sunt potrivite pentru alte seturi, dimpotrivă, este foarte convenabil ca băieții să folosească pictograme precum aprinderea unui LED sau a unui buton. Aceste semne sunt folosite în aproape toate programele. Dar au o particularitate - atunci când le selectați, există pictograme incorecte care indică porturi, așa că trebuie să le eliminați și să înlocuiți pictograma din secțiunea „numere/constante” din partea de sus a listei.

„Robot DF” - această secțiune este utilizată dacă senzorii specificați în ea sunt prezenți, uneori sunt găsiți. Iar exemplul nostru de astăzi nu face excepție, avem un „Comutator IR reglabil” și un „Senzor de linie”. „Senzorul de linie” este diferit de cel din imagine, deoarece este de la compania Amperka. Acțiunile lor sunt identice, dar senzorul Ampere este mult mai bun, deoarece are un regulator de sensibilitate.

„Seedstudio Grove” - Nu am folosit niciodată senzorii din această secțiune, deși există doar joystick-uri. În versiunile noi, această secțiune a fost extinsă.

Și ultima secțiune este „Kitul de linkuri”. Nu am dat peste senzorii prezentați în ea.

Aș dori să arăt un exemplu de program pe un robot care se mișcă de-a lungul unei benzi. Robotul este foarte simplu, atât de asamblat, cât și de achiziționat, dar pe primul loc. Să începem cu achiziția și asamblarea acestuia.

Iată setul de piese în sine, totul a fost achiziționat pe site-ul Amperka.

  1. AMP-B001 Scut motor (2 canale, 2 A) 1.890 RUB
  2. AMP-B017 Troyka Shield 1.690 RUB
  3. AMP-X053 Compartiment baterie 3×2 AA 1 60 RUR
  4. AMP-B018 Senzor digital de linie 2.580 RUB
  5. ROB0049 Platformă MiniQ cu două roți 1.1890 RUB
  6. SEN0019 Senzor de obstacol cu ​​infraroșu 1.390 RUB
  7. FIT0032 Suport pentru senzor infraroșu obstacol RUB 1,90
  8. A000066 Arduino Uno 1 1150 RUR

Mai întâi, să asamblam platforma cu roți și să lipim firele la motoare.

Apoi vom instala rack-uri pentru a monta placa Arduino UNO, care au fost luate de pe o placa de baza veche sau alte suporturi similare.

Apoi atașăm placa Arduino UNO la aceste rafturi, dar nu putem fixa un șurub - conectorii sunt în cale. Puteți, desigur, să le dezlipiți, dar acest lucru este la discreția dvs.

Apoi atașăm senzorul de obstacol în infraroșu la suportul său special. Vă rugăm să rețineți că regulatorul de sensibilitate este situat în partea de sus, acesta este pentru ușurință de reglare.

Acum instalăm senzori digitali de linie, aici va trebui să căutați câteva șuruburi și 4 piulițe pentru ei. Instalăm două piulițe între platformă în sine și senzorul de linie și fixăm senzorii cu restul.

Apoi instalăm Motor Shield, sau altfel îl puteți numi driverul motorului. În cazul nostru, acordați atenție jumperului. Nu vom folosi o sursă de alimentare separată pentru motoare, așa că este instalată în această poziție. Partea inferioară este sigilată cu bandă electrică, astfel încât să nu existe scurtcircuite accidentale de la conectorul USB Arduino UNO, pentru orice eventualitate.

Instalăm Troyka Shield deasupra motorului Shield. Este necesar pentru confortul conectării senzorilor. Toți senzorii pe care îi folosim sunt digitali, astfel încât senzorii de linie sunt conectați la porturile 8 și 9, deoarece sunt numiți și pini, iar senzorul de obstacol în infraroșu este conectat la portul 12. Asigurați-vă că rețineți că nu puteți utiliza porturile 4, 5, 6, 7 deoarece sunt folosite de Motor Shield pentru a controla motoarele. Chiar am pictat special peste aceste porturi cu un marker roșu, astfel încât elevii să-și poată da seama.

Dacă ați observat deja, am adăugat o bucșă neagră, pentru orice eventualitate, pentru ca compartimentul bateriei pe care l-am instalat să nu zboare. Și, în sfârșit, asigurăm întreaga structură cu o bandă de cauciuc obișnuită.

Există 2 tipuri de conexiuni la compartimentul bateriei. Prima conexiune a firelor la Troyka Shield. De asemenea, este posibil să lipiți ștecherul de alimentare și să îl conectați la placa Arduino UNO în sine.

Robotul nostru este gata. Înainte de a începe programarea, va trebui să învățați cum funcționează totul, și anume:
- Motoare:
Porturile 4 și 5 sunt folosite pentru a controla un motor, iar 6 și 7 pe celălalt;
Reglăm viteza de rotație a motoarelor folosind PWM pe porturile 5 și 6;
Înainte sau înapoi, trimițând semnale către porturile 4 și 7.
- Senzori:
Toți suntem digitali, așa că dau semnale logice sub formă de 1 sau 0;
Iar pentru a le regla, au regulatoare speciale, iar cu ajutorul unei surubelnite potrivite pot fi calibrate.

Detalii pot fi găsite la Amperke. De ce aici? Pentru că există o mulțime de informații despre lucrul cu Arduino.

Ei bine, probabil că am privit totul superficial, l-am studiat și, bineînțeles, am asamblat robotul. Acum trebuie programat, iată-l - programul mult așteptat!

Și programul a fost convertit în Arduino IDE:

Void setup() (pinMode(8, INPUT); pinMode(12, INPUT); pinMode(9, INPUT); pinMode(4, OUTPUT); pinMode(7, OUTPUT); pinMode(5, OUTPUT); pinMode(6) , OUTPUT); ) void loop() ( if (digitalRead(12)) ( if (digitalRead(8)) ( if (digitalRead(9)) ( digitalWrite(4 , HIGH); analogWrite(5, 255); analogWrite( 6, 255); digitalWrite(7, HIGH); ) else ( digitalWrite(4, HIGH); analogWrite(5, 255); analogWrite(6, 50); digitalWrite(7, LOW); ) ) else ( if (digitalRead) (9)) ( digitalWrite(4, LOW); analogWrite(5, 50); analogWrite(6, 255); digitalWrite(7, HIGH); ) else ( digitalWrite(4, HIGH); analogWrite(5, 255); analogWrite(6, 255); digitalWrite(7 , HIGH); ) ) ) else ( digitalWrite(4 , HIGH); analogWrite(5, 0); analogWrite(6, 0); digitalWrite(7 , HIGH); ) )

În concluzie, vreau să spun că acest program este pur și simplu o mană cerească pentru educație; chiar și pentru auto-studiu, vă va ajuta să învățați comenzile Arduino IDE. Principalul punct culminant este faptul că există mai mult de 50 de pictograme de instalare, începe să „se defecteze”. Da, într-adevăr, acesta este punctul culminant, deoarece programarea numai pe ArduBlok tot timpul nu vă va învăța să programați în Arduino IDE. Așa-numitul „glitch” vă oferă posibilitatea de a gândi și de a încerca să vă amintiți comenzile pentru depanarea precisă a programelor.

Vă doresc succes.

Introducere

Freeduino/Arduino este programat într-un limbaj de programare special - se bazează pe C/C++ și vă permite să utilizați oricare dintre funcțiile sale. Strict vorbind, nu există un limbaj Arduino separat, la fel cum nu există un compilator Arduino - programele scrise sunt convertite (cu modificări minime) într-un program în C/C++ și apoi compilate de compilatorul AVR-GCC. Deci, de fapt, se folosește o variantă de C/C++ specializată pentru microcontrolere AVR.

Diferența este că obțineți un mediu de dezvoltare simplu și un set de biblioteci de bază care simplifică accesul la perifericele situate „la bord” microcontrolerului.

De acord, este foarte convenabil să începeți să lucrați cu un port serial la o viteză de 9600 de biți pe secundă, efectuând un apel într-o singură linie:

Serial.begin(9600);

Și atunci când utilizați C/C++ „nud”, ar trebui să vă ocupați de documentația pentru microcontroler și să apelați ceva de genul acesta:

UBRR0H = ((F_CPU / 16 + 9600 / 2) / 9600 - 1) >> 8;
UBRR0L = ((F_CPU / 16 + 9600 / 2) / 9600 - 1);
sbi(UCSR0B, RXEN0);
sbi(UCSR0B, TXEN0);
sbi(UCSR0B, RXCIE0);

Iată o scurtă prezentare a principalelor funcții și caracteristici ale programării Arduino. Dacă nu sunteți familiarizat cu sintaxa limbajelor C/C++, vă recomandăm să consultați orice literatură despre această problemă, sau surse de internet.

Pe de altă parte, toate exemplele prezentate sunt foarte simple și, cel mai probabil, nu veți avea dificultăți de înțelegere textele sursăși scrisul programe proprii chiar fără a citi literatură suplimentară.

Documentație mai completă (la Limba engleză) este prezentat pe site-ul oficial al proiectului - http://www.arduino.cc. Există și un forum acolo, link-uri către biblioteci suplimentare si descrierea acestora.

Similar cu descrierea de pe site-ul oficial Proiectul Arduino, „port” înseamnă un contact de microcontroler conectat la conector sub numărul corespunzător. În plus, există un port de comunicație serial (port COM).

Structura programului

În programul dumneavoastră trebuie să declarați două funcții principale: setup() și loop().

Funcția setup() este apelată o dată, după fiecare pornire sau resetare a plăcii Freeduino. Folosiți-l pentru a inițializa variabile, pentru a seta moduri de operare ale porturilor digitale etc.

Funcția loop() execută secvențial comenzile descrise în corpul său din nou și din nou. Acestea. După finalizarea funcției, aceasta va fi apelată din nou.

Să ne uităm la un exemplu simplu:

void setup() // setările inițiale
{
beginSerial(9600); // setarea vitezei de operare port serial la 9600 bps
pinMode(3, INPUT); // setarea celui de-al 3-lea port pentru introducerea datelor
}

// Programul verifică al 3-lea port pentru prezența unui semnal pe el și trimite un răspuns către
// vizualizare mesaj text la portul serial al computerului
void loop() // corpul programului
{
if (digitalRead(3) == HIGH) // condiție pentru interogarea celui de-al 3-lea port
serialWrite("H"); // trimite un mesaj sub forma literei „H” la portul COM
altfel
serialWrite("L"); // trimite un mesaj sub forma literei "L" la portul COM
întârziere (1000); // întârziere 1 sec.
}

pinMode(port, mod);

Descriere:

Configurați portul specificat pentru a intra sau a ieși un semnal.

Opțiuni:

port – numărul portului al cărui mod doriți să îl setați (o valoare întreagă de la 0 la 13).

modul - fie INPUT (intrare) fie OUTPUT (ieșire).

pinMode(13, IEȘIRE); //Al 13-lea pin va fi ieșirea
pinMode(12, INPUT); //iar al 12-lea este intrarea

Notă:

Intrările analogice pot fi folosite ca intrări/ieșiri digitale prin accesarea lor prin numere care încep cu 14 ( intrare analogică 0) la 19 (intrare analogică 5)

digitalWrite(port, valoare);

Descriere:

Setează nivelul de tensiune la ridicat (HIGH) sau scăzut (LOW) pe portul specificat.

Opțiuni:

port: numărul portului

valoare: HIGH sau LOW

digitalWrite(13, HIGH); // setați pinul 13 la starea „înalt”.

valoare = digitalRead(port);

Descriere:

Citește valoarea pe portul specificat

Opțiuni:

port: numărul portului interogat

Valoare returnată: returnează valoarea curentă pe port (HIGH sau LOW) tastați int

int val;
val = digitalRead(12); // sondaj al 12-lea pin

Notă:

Dacă nu există nimic conectat la portul care este citit, atunci funcția digitalRead() poate returna valorile HIGH sau LOW în mod neregulat.

Intrare/ieșire semnal analogic

valoare = analogRead(port);

Descriere:

Citește o valoare de la portul analog specificat. Freeduino conține 6 canale, convertor analog-digital 10 biți fiecare. Aceasta înseamnă că tensiunea de intrare de la 0 la 5V este convertită într-o valoare întreagă de la 0 la 1023. Rezoluția citirii este: 5V/1024 valori = 0,004883 V/valoare (4,883 mV). Este nevoie de aproximativ 100 nS (0,0001 C) pentru a citi valoarea de intrare analogică, deci viteza maxima citiri - de aproximativ 10.000 de ori pe secundă.

Opțiuni:

Valoare returnată: returnează un număr int în intervalul de la 0 la 1023 citit de la portul specificat.

int val;
val = analogRead(0); // citește valoarea la a 0-a intrare analogică

Notă:

Porturile analogice sunt definite ca semnal de intrare în mod implicit și, spre deosebire de porturile digitale, nu trebuie să fie configurate prin apelarea funcției pinMode.

analogWrite(port, valoare);

Descriere:

Emite o valoare analogică către port. Această funcție funcționează pe: 3, 5, 6, 9, 10 și 11 porturi digitale Freeduino.

Poate fi folosit pentru a schimba luminozitatea unui LED, a controla un motor etc. După apelarea funcției analogWrite, portul corespunzător începe să funcționeze în modul de modulare a lățimii impulsului de tensiune până când există un alt apel la funcția analogWrite (sau funcțiile digitalRead / digitalWrite pe același port).

Opțiuni:

port: numărul intrării analogice interogate

valoare: un număr întreg între 0 și 255. O valoare de 0 generează 0 V pe portul specificat; o valoare de 255 generează +5V pe portul specificat. Pentru valori între 0 și 255, portul începe să alterneze rapid între nivelurile de tensiune 0 și +5 V - cu cât valoarea este mai mare, cu atât portul generează mai des nivelul HIGH (5 V).

analogWrite(9, 128); // setați pinul 9 la o valoare echivalentă cu 2,5V

Notă:

Nu este nevoie să apelați pinMode pentru a seta portul să iasă semnale înainte de a apela analogWrite.

Frecvența de generare a semnalului este de aproximativ 490 Hz.

timp = milis();

Descriere:

Returnează numărul de milisecunde de la executarea Freeduino programul curent. Contorul se va depăși și se va reseta după aproximativ 9 ore.

Valoarea returnată: returnează o valoare lungă nesemnată

nesemnat de mult timp; // declararea unei variabile de timp de tip unsigned long
timp = milis(); // transferă numărul de milisecunde

întârziere (timp_ms);

Descriere:

Întrerupe programul pentru numărul specificat de milisecunde.

Opțiuni:

time_ms – timpul de întârziere al programului în milisecunde

întârziere (1000); //pauză 1 secundă

delayMicrosecunde

delayMicrosecunde(time_μs);

Descriere:

Întrerupe programul pentru numărul specificat de microsecunde.

Opțiuni:

time_μs – timpul de întârziere al programului în microsecunde

delayMicrosecunde(500); //pauză 500 de microsecunde

pulseIn(port, valoare);

Descriere:

Citește un impuls (înalt sau scăzut) de la un port digital și returnează durata pulsului în microsecunde.

De exemplu, dacă parametrul „valoare” este setat la HIGH la apelarea funcției, atunci pulseIn() așteaptă să ajungă un nivel ridicat de semnal pe port. Din momentul în care sosește, începe numărătoarea inversă până când portul primește nivel scăzut semnal. Funcția returnează lungimea pulsului ( nivel inalt) în microsecunde. Funcționează cu impulsuri de la 10 microsecunde până la 3 minute. Rețineți că această funcție nu va returna un rezultat până când nu este detectat un puls.

Opțiuni:

port: numărul portului din care citim pulsul

valoare: tip puls HIGH sau LOW

Valoarea returnată: returnează durata pulsului în microsecunde (tip int)

int durata; // declararea unei variabile durate de tip int
durata = pulseIn(pin, HIGH); // măsoară durata pulsului

Transfer de date în serie

Freeduino are un controler încorporat pentru transmiterea datelor în serie, care poate fi folosit atât pentru comunicarea între dispozitivele Freeduino/Arduino, cât și pentru comunicarea cu un computer. Pe un computer, conexiunea corespunzătoare este reprezentată de un port USB COM.

Comunicarea are loc prin porturile digitale 0 și 1 și, prin urmare, nu le veți putea folosi pentru I/O digitale dacă utilizați funcții seriale.

Serial.begin(baud_rate);

Descriere:

Setează rata de transfer a informațiilor portului COM în biți pe secundă pentru transmisia de date în serie. Pentru a comunica cu un computer, utilizați una dintre aceste viteze standardizate: 300, 1200, 2400, 4800, 9600, 14400, 19200, 28800, 38400, 57600 sau 115200. Puteți, de asemenea, să comunicați cu alte microcontroloare. porturile 0 și 1.

Opțiuni:

baud_rate: Rata de flux de date în biți pe secundă.

Serial.begin(9600); //setează viteza la 9600 bps

Serial.disponibil

count = Serial.available();

Descriere:

Acceptat de port serial octeții ajung în memoria tampon al microcontrolerului, de unde programul tău îi poate citi. Funcția returnează numărul de octeți acumulați în buffer. Buffer-ul serial poate stoca până la 128 de octeți.

Valoare returnată:

Returnează o valoare int - numărul de octeți disponibili pentru citire în memoria tampon serial sau 0 dacă nu este nimic disponibil.

if (Serial.available() > 0) ( // Dacă există date în buffer
// aici ar trebui să existe recepția și procesarea datelor
}

char = Serial.read();

Descriere:

Citește următorul octet din buffer port serial.

Valoare returnată:

Primul octet disponibil de date primite de la portul serial sau -1 dacă nu există date de intrare.

incomingByte = Serial.read(); // citire octet

Descriere:

Șterge bufferul de intrare a portului serial. Datele din buffer se pierd, iar apelurile ulterioare către Serial.read() sau Serial.available() vor avea sens pentru datele primite după apelul Serial.flush().

Serial.flush(); // Ștergeți memoria tampon - începeți să primiți date „de la zero”

Descriere:

Datele de ieșire pe portul serial.

Opțiuni:

Funcția are mai multe forme de apel în funcție de tipul și formatul datelor de ieșire.

Serial.print(b, DEC) tipărește un șir ASCII - reprezentarea zecimală a numărului b.

int b = 79;

Serial.print(b, HEX) tipărește un șir ASCII - reprezentarea hexazecimală a numărului b.

int b = 79;

Serial.print(b, OCT) tipărește un șir ASCII - reprezentarea octală a numărului b.

int b = 79;
Serial.print(b, OCT); //va scoate șirul „117” către port

Serial.print(b, BIN) tipărește un șir ASCII - reprezentare binară numere b.

int b = 79;
Serial.print(b, BIN); //va scoate șirul „1001111” în port

Serial.print(b, BYTE) tipărește octetul inferior al lui b.

int b = 79;
Serial.print(b, BYTE); //va afișa numărul 79 (un octet). În monitor
//din portul serial obținem simbolul „O” - its
//codul este 79

Serial.print(str) dacă str este un șir de caractere sau o matrice de caractere, transferă str la byte-ul portului COM.

octeți de caractere = (79, 80, 81); //matrice de 3 octeți cu valorile 79,80,81
Serial.print("Aici octeții noștri:"); // scoate linia „Aici octeții noștri:”
Serial.print(octeți); //imite 3 caractere cu codurile 79,80,81 –
//acestea sunt caracterele „OPQ”

Serial.print(b) dacă b este de tip byte sau char, imprimă numărul b însuși în port.

char b = 79;
Serial.print(b); //va scoate caracterul „O” în port

Serial.print(b) dacă b are întreg tip, afișează reprezentarea zecimală a numărului b către port.

int b = 79;
Serial.print(b); //va scoate șirul „79” către port

Descriere:

Funcția Serial.println este similară cu funcția Serial.print și are aceleași opțiuni de apel. Singura diferență este că două caractere suplimentare sunt scoase după date - un caracter de întoarcere carucior (ASCII 13 sau „\r”) și un caracter de linie nouă (ASCII 10 sau „\n”).

Exemplul 1 și exemplul 2 vor scoate același lucru în port:

int b = 79;
Serial.print(b, DEC); //va scoate șirul „79” către port
Serial.print("\r\n"); //va afișa caracterele „\r\n” – line feed
Serial.print(b, HEX); //va scoate șirul „4F” către port
Serial.print("\r\n");//va imprima caracterele "\r\n" – line feed

int b = 79;
Serial.println(b, DEC); //va scoate șirul „79\r\n” în port
Serial.println(b, HEX); //va scoate șirul „4F\r\n” în port

În monitorul portului serial obținem.

Cele mai bune articole pe această temă