1. Bazele programului-algoritm.
Ca și înainte, nu putem face fără un plan. În articolul anterior, planul nostru a fost un circuit electric de bază. În programare, un plan este numit algoritm. Unii dintre voi știți ce este, cineva tocmai a auzit, dar sunt și cei care nu au știut și auzit pentru prima dată.
Nu voi folosi termeni științifici, voi spune pur și simplu, Algoritmul este o descriere a succesiunii anumitor acțiuni. Toată viața noastră este o acțiune diferită; mergem, vorbim, ne mișcăm brațele și picioarele, ne întoarcem capul. Toate acestea au propriul lor înțeles - algoritmul, secvența care determină comportamentul nostru și poate fi compilată și descrisă. Pentru claritate, voi da un exemplu din viață. Vă spăliți dinții în fiecare dimineață. Încercați să descrieți modul în care faceți acest lucru, cum să faceți un program pentru dvs. Iată ce se întâmplă: "Luăm o periuță de dinți. Scoateți pasta. Ne pensăm dinții cu mișcări stânga-dreapta. Piss gura ta. Pensula mea.
În principiu, totul este adevărat, dar acest mic program se poate face la prânz, seara sau după fiecare masă. Dar nu am ținut cont de factorii importanți care ne pot reduce eforturile noastre la NO. Inițial, am vorbit despre dimineață. Acesta este un factor important și dacă nu îl țineți cont, trebuie să vă spălați dinții în culcuș și cu ochii închiși. Prin urmare, întotdeauna orice program ar trebui să aibă un început și un sfârșit cu posibilitatea de a repeta ciclul. Un ciclu repetitiv pentru o persoană este a doua zi, unde din nou va fi dimineața, iar din nou va trebui să vă spălați dinții. Prin urmare, adăugați la programul nostru următorul algoritm (secvență de acțiuni).
"Trezește-te. Ieși din pat. "Dacă opriți crearea algoritmului în această etapă și mergeți direct la periajul dinților, programul se va opri (închide). De ce? Pentru că din nou nu am luat în considerare toți factorii. Stați în mijlocul dormitorului și nu puteți executa următoarea comandă; "Luăm o periuță de dinți", deoarece peria este în baie, dar trebuie încă să fie atinsă. Ei bine, dacă dormi în baie, atunci nu există probleme - programul va fi executat! Dar, în majoritatea cazurilor, oamenii normali dorm într-o altă cameră. Această abordare se numește logică, adică semnificativă. Toate acțiunile noastre trebuie să fie rezonabile și să conțină un anumit sens, altfel obiectivul stabilit nu va fi atins. Prin urmare, "Treziți-vă. Ieși din pat. Du-te la baie ", aceasta va fi cea mai bună opțiune.
Să ne întoarcem la robot. Cum putem face acum un plan pentru robotul mini sumo din ring? Avem reguli în care obiectivul este clar marcat - "Împingeți inamicul din inel". Dar pentru ao realiza, trebuie să țineți cont de anumiți factori. Principalul factor nu este acela de a merge dincolo de cercul însuși, dar, pentru a fi mai precis, nu depășește granița albă a cercului. Iată ce avem:
Fig. 1 Algoritmul comportamentului robotului în inel.
În Figura 1, vedeți o diagramă. Prin toate regulile, așa se fac algoritmii. În mod clar și clar.
Primul bloc este "Început". Din acest punct, programul începe executarea acțiunilor robotului după pornire. Primul lucru pe care va trebui să-l facă este să găsească inamicul, blocul "Quest for the target". Următorul bloc al schemei noastre sub forma unui diamant "Scopul este găsit?". Aceasta înseamnă că vom avea o opțiune de acțiune pentru a realiza un anumit eveniment. În cazul în care obiectivul este găsit (Da), atunci vom continua programul și trece la următoarea parte a „atac“ al programului, dar în cazul în care obiectivul nu este găsit (NO), cel mai logic să continue căutarea ei. Programul se va fixa în acest moment, până când robotul detectează inamicul. Când ataci robotul se deplasează înainte pe inamic, încercând să-l împingă afară din ring, la această unitate de lucru momentul „a ajuns la marginea inelului?“ Dacă nu se ajunge la marginea inelului, atacul continuă, dar dacă senzorii detectează o margine de bandă albă, atacul se oprește și programul Trece la următorul bloc "Lăsați înapoi" și "Întoarceți". După cotitură, ciclul principal de program se repetă, că este, se pornește de la început din nou, iar robotul este în căutarea pentru inamic. Deci nu este un accident. În cazul în care momentul atacului, inamicul a fost capabil să se strecoare departe de robotul nostru, trebuie să ne întoarcem la căutarea lui nu a lăsat marginea inelului. Cu teorie totul. Să mergem mai departe să practicăm.
2. Reguli de scriere a programelor pentru Arduino.
Chiar dacă am spus că din partea teoretică este de peste, dar noi ar trebui să examineze principiul programului pentru microcontrolere Arduino, cu toate că aceste principii sunt valabile pentru alte familie MK AVR.
Fig. 2 Metoda de scriere a programelor pentru Arduino.
Această diagramă bloc ne arată în mod clar ce puncte importante și în ce ordine ar trebui să fie respectate la scrierea programului.
La începutul programului, sunt conectate module suplimentare dacă este necesar. Apoi sunt declarate variabilele globale. Apoi vine unitatea de inițializare a controlerului. Definește atribuțiile portului, indiferent dacă este vorba despre o intrare sau o ieșire, și alte setări. De asemenea, din acest bloc pot fi apelate subprograme suplimentare. Dacă este scurt, atunci în acest loc programul face setările preliminare ale controlerului. Acest bloc este executat o singură dată când controlerul pornește sau repornește. Rețineți, în bloc se adaugă linia "întârziere 5 sec". Pentru regulile generale de scriere acest program nu se aplică, dar pentru un robot mini sumo este necesar. Regulile spun că după ce echipa arbitrului, roboții trebuie să înceapă să se miște după 5 secunde. Această întârziere nu poate fi efectuată în bucla principală a programului, deoarece va fi repetată în mod constant, iar comportamentul robotului nu se va schimba în bine.
În blocul ciclului principal al programului se va executa algoritmul de bază al comportamentului robotului în inel, pe care am examinat-o în Fig. 1. În timpul lucrului principalului ciclu, puteți accesa subrutine. Programatorii foarte des folosesc subrutine pentru a optimiza și scurta codul. De exemplu, un program pentru a vă deplasa înainte sau înapoi, este mai logic să vă separați în module separate și să nu îl includeți în corpul principal al programului. Aceasta va deveni imensă, complet nerecunoscută și găsirea unei greșeli sau a unei mici schimbări va fi foarte problematică.
Descărcați cea mai recentă versiune de Arduino IDE de la Arduino.ru. Programul nu necesită nicio instalare specială, este suficient să despachetați conținutul arhivei în locația dorită. La sfârșitul acestui articol există un fișier al UT al dispozitivului de măsurare a distanței cu ultrasunete. Ar trebui dezarhivat în dosarul Biblioteci.
Rulați aplicația. Verificăm corectitudinea instalării bibliotecii, mergeți la meniul "Fișier" - "Exemple". Aproape la partea de jos ar trebui să apară elementul Ultrasonic ca în Fig. 3.
Fig. Verificați instalarea bibliotecii cu ultrasunete.
Dacă totul merge bine, mergeți la "Service" - "Taxă". Trebuie să alegem placa de bază - Arduino Pro Mini 5v.
Fig. 4 Configurarea plăcii de comandă
Portul serial trebuie selectat cel care va apărea după conectarea lui Arduino la computer. Ar trebui să spunem ceva despre Arduino Pro Mini. Spre deosebire de alți controlori din familia Arduino, Pro Mini nu are un modul de conectare încorporat. Este livrat separat ca un card de adaptor USB (UART) (TTL) și este conectat la placa de control folosind patru fire.
Fig. 5 adaptor USB-UART (TTL).
În Fig. 6 arată cum să conectați corect controlerul și adaptorul.
Fig. 6. Conectarea controlerului la adaptorul USB-UART.
Spre deosebire de conexiunea recepționată a liniilor de semnal, în loc de RX-TX și TX-RX, aceste linii trebuie conectate direct: RX-RX, TX-TX. Când adaptorul este conectat mai întâi la computer, driverele de dispozitiv vor fi instalate automat. Așteptați până când instalarea este finalizată. O altă caracteristică a controlerului este lipsa resetării software-ului Resetare în momentul programării. Este cu siguranță un pic inconfortabil, dar nu atât de mult să renunțe la Pro Mini. Este suficient să apăsați butonul Reset de pe controler după ce semnul "Compilare" se schimbă pe "Descărcare", Fig. 7.
Fig. 7. Afișați informații despre cursul programării MK.
În acest capitol, nu mă voi referi la descrierea comenzilor, a directivelor și a operatorilor. Se presupune că aveți deja câteva cunoștințe de bază. În caz contrar, trebuie să consultați documentația de pe site-ul oficial sau alte surse din rețea. Vom scrie codul programului în mod clar conform planului sau algoritmului pe care l-am compilat. În anumite blocuri ale algoritmului, am adăugat codul, pe care acum îl considerăm mai detaliat în Fig. 8.
Fig. 8. Scrierea blocului inițial al programului.
Primul bloc: directiva # conectează biblioteca de gestionare a modulelor la proiectul nostru.
Al doilea bloc: declarați variabilele și scrieți în ele valorile inițiale egale cu zero. Vă atrag atenția că nu vom crea nume pentru porturile terminalelor MK. Le-am lăsat în mod deliberat în formă digitală pentru a putea consulta cu ușurință diagrama circuitului. În acest bloc, declarăm doar trei variabile - senzorii stânga și dreapta ale inelului (_ și _), în care se vor înregistra valorile ADC. Și, de asemenea, variabila distanței dispozitivului de măsurare cu ultrasunete (_), distanța în centimetri față de obstacol va fi înregistrată în acesta.
Al treilea bloc: (), în care ajustăm toate intrările și ieșirile microcontrolerului. Semnalele de intrare vor fi recepționate de porturile 15, 17, așa că le atribuim (intrare). Motoarele sunt controlate de patru porturi: 3.5 pentru motorul din stânga și 6.9 pentru motorul drept, le atribuim ca ieșire.
De ce folosim două porturi pentru un motor? Totul este simplu; dacă motorul intră în contact cu tensiunea, acesta va începe să se rotească în una din laturi, spunând în sensul acelor de ceasornic. Dar dacă schimbați polaritatea, adică. schimbați "plus" și "minus" - arborele motorului se va roti în direcția opusă. Această proprietate vom folosi pentru manevre deplină.
5. Bucla principală a buclă.
În această buclă, se execută programul principal de controler. Nu puteți ieși din ea complet sau complet. Din aceasta sunt posibile numai apeluri de proceduri externe, așa-numitele subprograme.
Luați în considerare structura ciclului nostru pe baza algoritmului din Fig. 9
Fig. 9. Algoritmul bucla principală a buclă.
De la început, trebuie să citim toate senzorii, pentru că noi numim subrutina:
void check_sensor () // Rutina de verificare a senzorului.
R_Sensor = citire analogică (15); citiți senzorul corect
întârziere (10); // Întârziere pentru sfârșitul conversiei ADC
L_Sensor = analogRead (17); citiți senzorul din stânga
întârziere (10); // Întârziere pentru sfârșitul conversiei ADC
dist_cm = ultrasonic.Ranging (CM); citiți citirile cu ultrasunete
întârziere (10); // Întârziere la terminarea conversiei
După primirea datelor, trebuie să le procesăm. Mai întâi trebuie să determinăm locația noastră, în ringul în care nu suntem. Dacă în ring vom verifica prezența dușmanului în limita a 40 cm. Dacă nu există niciun adversar, îl căutăm să se întoarcă la procedura din stânga:
void go_left () // căutați o țintă sau mutați în stânga
analogWrite (3, 0); // MOTOR STÂNGA
analogWrite (5, 100); // MOTOR STÂNGA
analogWrite (6, 100); // DREAPTA MOTOR
analogWrite (9, 0); // DREAPTA MOTOR
Valoarea puterii motoarelor este aproape înjumătățită, dacă ne întoarcem prea repede, putem trece peste ținta detectată de inerție.
Dacă țintă este detectată, trebuie să o atacăm, avansând la viteză maximă.
void go_forward () // Atac - merge mai departe
analogWrite (3, 0); // MOTOR STÂNGA
analogWrite (5, 255); // MOTOR STÂNGA
analogWrite (6, 0); // DREAPTA MOTOR
analogWrite (9, 255); // DREAPTA MOTOR
În cazul în care, la momentul atacului, ne-au condus la marginea inelului și a găsit o bandă albă, atunci trebuie să ne oprim, să sprijine, să se întoarcă și conduce un pic mai departe, apoi reporniți din nou căutarea. Pentru aceasta, în ordine, numim procedurile:
întârziere (100); // Așteptăm 10 ms
go_back (); // Mutarea înapoi
întârziere (1000); // 1 secundă.
go_right (); // Rotiți dreapta
întârziere (300); // 300 ms
go_forward (); // Deplasare înainte
întârziere (300); // 300 ms
void go_stop () // stop
analogWrite (3, 255); // MOTOR STÂNGA
analogWrite (5, 255); // MOTOR STÂNGA
analogWrite (6, 255); // DREAPTA MOTOR
analogWrite (9, 255); // DREAPTA MOTOR
void go_back () // mutați înapoi
analogWrite (3, 255); // MOTOR STÂNGA
analogWrite (5, 0); // MOTOR STÂNGA
analogWrite (6, 255); // DREAPTA MOTOR
analogWrite (9, 0); // DREAPTA MOTOR
void go_right () // căutați o țintă sau treceți la dreapta
analogWrite (3, 100); // MOTOR STÂNGA
analogWrite (5, 0); // MOTOR STÂNGA
analogWrite (6, 0); // DREAPTA MOTOR
analogWrite (9, 100); // DREAPTA MOTOR
void go_forward () // Atacând mișcarea înainte
analogWrite (3, 0); // MOTOR STÂNGA
analogWrite (5, 255); // MOTOR STÂNGA
analogWrite (6, 0); // DREAPTA MOTOR
analogWrite (9, 255); // DREAPTA MOTOR
Întârzierile între proceduri determină durata motorului în direcții diferite de mișcare. Dacă o măriți sau o micșorați, puteți obține unghiuri diferite de rotație sau distanța pe care robotul o va trece înainte ca următoarea comandă să fie executată.
Schița completă pentru descărcare este la sfârșitul articolului.
Codul, desigur, nu finala sau cea mai corectă, fiecare dintre voi are dreptul de a modifica sau de a corecta aceasta pentru a se potrivi cerințelor dumneavoastră, pentru că esența generală a articolului pentru a preda incepatori robotica gândire logică și sistematică, rezolva în mod corespunzător problema folosind toate resursele disponibile.
Arhiva 1 la articolul "Robot minisumo program." Descărcați arhiva
Arhiva 2 la articolul "Programul robotului MiniSumo". Descărcați arhiva
Dacă aveți întrebări, scrieți la chat-ul FORUM sau online despre robotică, le vom discuta!