Cuprins:
- Pasul 1: Hardware-ul
- Pasul 2: Urmărirea liniei
- Pasul 3: Înainte să putem începe cu adevărat…
- Pasul 4: Stiva
- Pasul 5: Software-ul
- Pasul 6: Să îmbunătățim codul
Video: Partea 3: GPIO: Ansamblu ARM: Urmăritor de linie: TI-RSLK: 6 pași
2024 Autor: John Day | [email protected]. Modificat ultima dată: 2024-01-30 11:43
Buna ziua. Aceasta este următoarea tranșă în care continuăm să folosim ansamblul ARM (în loc de un limbaj de nivel superior). Inspirația pentru acest instructabil este Laboratorul 6 al kitului de învățare a sistemului de robotică Texas Instruments sau TI-RSLK.
Vom folosi microcontrolerul din kit, placa de dezvoltare MSP432 LaunchPad, dar poate veți găsi ceva util pentru a extrage din acest instructabil chiar dacă nu utilizați LaunchPad sau urmați T. I. curriculum.
Am început cu un Instructable care introduce Asamblarea ARM, mediul de dezvoltare și modul de realizare a unui proiect.
Următorul Instructable on ARM Assembly a introdus cum să interacționăm cu intrarea / ieșirea (GPIO).
Apoi ne-am extins cunoștințele și am introdus funcții, controlând LED-urile și comutatoarele.
Acum, cu acest instructabil, putem folosi ceea ce am învățat pentru a face ceva mai distractiv și mai util: detectarea unei linii.
Acest lucru ne poate ajuta mai târziu atunci când construim un robot de linie.
În programa, cea mai mare parte a programării se face în C sau C ++, dar este util să vă familiarizați cu asamblarea, înainte de a începe să depindem de limbaje de nivel superior și biblioteci.
Pasul 1: Hardware-ul
Nu vreau să refac hardware-ul în detaliu, deoarece există deja surse, dar vom adăuga explicații acolo unde este necesar.
Pentru acest instructabil, vom folosi dispozitivul pentru senzor de reflecție de la Pololu, deoarece vine ca parte a TI-RSLK (kitul robot). Este cel utilizat în curs și în laboratorul 6 al curriculumului.
Dacă nu aveți acest lucru, puteți utiliza orice detector IR (sau serie de ele) care transmite un semnal digital, HIGH sau LOW, pentru prezență și absență.
Senzorul de matrice este cel mai bun, deoarece poate ajuta la detectarea dacă suntem chiar în centrul liniei sau într-o parte. În plus, așa cum vom vedea mai târziu, ne poate ajuta să detectăm unghiul robotului față de linie.
Matricea de reflectanță are detectoare foarte apropiate una de cealaltă. Asta înseamnă că ar trebui să obținem mai multe semnale de detectare, în funcție, desigur, de grosimea liniei.
Dacă da, atunci dacă robotul nu este direct în linie cu linia, atunci ar trebui să returneze o ieșire care linia este mai largă decât ar trebui să fie (pentru că suntem la un unghi).
Pentru o explicație mai bună a celor de mai sus, aruncați o privire la documentul Lab 6.
Pentru ajutor la conectarea / conectarea senzorului la placa de dezvoltare MSP432 LaunchPad, iată câteva instrucțiuni utile.
De asemenea, am adăugat aceleași instrucțiuni (similare?) Pdf la acest pas.
Dacă citiți cu atenție documentele Pololu, acestea explică motivul "bypass-ului de 3,3V", că veți dori să faceți jumper dacă utilizați 3,3V în loc de 5V.
Deoarece nu construim încă robotul, ci în schimb învățăm doar despre asamblarea ARM și despre cum să interacționăm cu piesele (subsistemele) robotului, nu trebuie să urmăm instrucțiunile de mai sus la literă.
Deocamdată, conectarea matricei de senzori de linie fierbe / se reduce la următoarele:
- conectați 3.3V și GND de pe placa MSP432 la matricea de senzori.
- conectați un pin de port (vă sugerez P5.3) de la MSP432 la pinul de activare a LED-ului de pe senzorul de linie. Pinul de pe senzor este între 3,3 V și GND.
- conectați toți cei opt pini / biți ai unui singur port (sugerez P7.0 până la P7.7) la cei opt pini ai matricei de senzori etichetați "1" până la "8". Acestea sunt liniile care vor merge la HIGH sau LOW în funcție de ceea ce simt.
După cum puteți vedea în imaginile acestui pas și în videoclip, nu am atașat senzorul la șasiul robotului, pentru că am vrut ușurința de programare, depanare, testare, învățare.
Deci, cu tot ce este conectat, suntem gata să intrăm în software.
Pasul 2: Urmărirea liniei
Senzorul de matrice de reflectanță este destul de ingenios, deoarece poate ajuta în cel puțin două moduri.
- Determinați este robotul centrat pe linie sau care se îndreaptă spre o parte.
- Robotul este aliniat în direcția liniei sau este unghiular.
Fiecare dintre detectoarele matricei furnizează în esență un bit de informații, fie HIGH, fie LOW.
Ideea este să combinați toți acei biți într-un singur număr sau într-un singur model de biți și să utilizați acel model pentru a lua decizii (pentru a vă deplasa corect).
Pasul 3: Înainte să putem începe cu adevărat…
.. trebuie să învățăm ceva nou despre programarea ansamblului ARM. Și nu mă refer doar la o altă instrucțiune. Acestea tind să fie minore.
Până în prezent nu am folosit „stiva” în programele noastre.
Ne-am bazat pe utilizarea majorității registrelor CPU de bază la nivel global în diferite subrutine.
Singurul lucru pe care l-am făcut a fost să salvăm și să restaurăm adresa LR (link register) pentru o funcție - cea care a numit mai multe alte funcții. (Eu folosesc "funcție" și "subrutină" în mod interschimbabil aici).
Ceea ce am făcut nu este bine. Ce se întâmplă dacă vrem să cuibărim alte funcții? Ce se întâmplă dacă avem mai mult de un nivel de cuibărit?
În exemplele anterioare, am ales să folosim registrul R6 ca spațiu de stocare pentru adresa LR sau de returnare. Dar dacă vrem să facem cuiburi mai adânci / mai adânci, nu putem continua să schimbăm valoarea R6. Ar trebui să alegem încă un registru. Si altul. Și apoi devine împovărător să țineți evidența careui registru central de bază deține ce LR să restabiliți la ce funcție.
Așa că acum aruncăm o privire asupra „stivei”.
Pasul 4: Stiva
Iată câteva materiale de lectură care explică stiva.
Sunt un susținător mai mare al câteva idei:
- doar câtă teorie este necesară, mergeți rapid la practică
- învățați după cum este necesar, concentrați-vă pe a face de fapt ceva și nu doar exerciții sau exemple fără scop.
Există o mulțime de documentație ARM și MSP432 online care vorbește despre stivă, așa că nu va reveni la toate acestea. De asemenea, voi menține utilizarea stivei aici la un minim - salvând adresa de returnare (Registrul de legături).
În esență, avem nevoie doar de instrucțiuni:
PUSH {lista de înregistrări}
POP {lista de înregistrări}
Sau, în cazul nostru, în mod specific:
PUSH {LR}
POP {LR}
Deci, o funcție de asamblare / subrutină ar arăta astfel:
funcLabel:.asmfunc
PUSH {LR}; aceasta ar trebui să fie probabil una dintre primele instrucțiuni la intrare.; faceți mai multe coduri aici..; bla.. bla … bla …; ok, am terminat cu funcția, gata să revenim la funcția de apel POP {LR}; aceasta restabilește adresa de returnare corectă la apelare; funcţie. BX LR; returnează.endasmfunc
Videoclipul trece printr-un exemplu live de mai multe funcții imbricate.
Pasul 5: Software-ul
Fișierul atașat etichetat „MSP432_Chapter …” conține o mulțime de informații bune despre porturile MSP432, iar din documentul respectiv obținem următoarele porturi, registre, adrese etc. Cu toate acestea, este puțin datat. Cu toate acestea, nu am văzut adresele detaliate listate pentru Portul 5 și versiunile ulterioare. (numai „funcții alternative”). Dar este totuși util.
Vom folosi două porturi. P5, P7, P1 și P2.
Ieșirea P5.3 (un singur bit) va fi pentru a controla LED-ul IR activat pe senzor. Folosim P5.3 deoarece este un pin expus pe același antet ca celelalte conexiuni MSP432 care merg la matricea senzorilor.
P7.0 până la P7.7 vor fi cele opt intrări care colectează datele de la senzor; ce „vede”.
P1.0 este singurul LED roșu și l-am putea folosi pentru a ne oferi câteva indicații ale datelor.
P2.0, P2.1, P2.2 este LED-ul RGB și îl putem folosi și cu diferitele sale posibilități de culoare, pentru a ne oferi indicații despre datele senzorului.
Dacă ați parcurs Instructabilele anterioare legate de toate acestea, atunci știți deja cum să configurați programul.
Trebuie doar să aveți secțiunea de declarație pentru porturi și biți etc.
Veți avea o secțiune „principală”.
Ar trebui să existe o buclă, în care citim continuu datele din P7, luăm decizia asupra acestor date și aprindem în mod corespunzător cele două LED-uri.
Iată din nou adresele registrului portului:
- GPIO P1: 0x4000 4C00 + 0 (adrese pare)
- GPIO P2: 0x4000 4C00 + 1 (adrese impare)
- GPIO P3: 0x4000 4C00 + 20 (adrese pare)
- GPIO P4: 0x4000 4C00 + 21 (adrese impare)
- GPIO P5: 0x4000 4C00 + 40 (adrese pare)
- GPIO P6: 0x4000 4C00 + 41 (adrese impare)
- GPIO P7: 0x4000 4C00 + 60 (adrese pare)
- GPIO P8: 0x4000 4C00 + 61 (adrese impare)
- GPIO P9: 0x4000 4C00 + 80 (adrese par)
- GPIO P10: 0x4000 4C00 + 81 (adrese impare)
Ceea ce este aldin este ceea ce vom folosi pentru acest instructabil.
Etapa programului pentru citirea detectoarelor IR
Următorul este codul psuedo pentru scrierea programului în C, dar este încă util și îl vom urmări destul de atent în versiunea de asamblare a programului.
programul principal 0) Inițializați // porturile în timp ce (1) {1) Setați P5.3 înalt (porniți LED-ul IR) 2) Faceți din P7.0 o ieșire și setați-l ridicat (încărcarea condensatorului) 3) Așteptați 10, Clock_Delay1us (10); 4) Faceți din P7.0 o intrare 5) Rulați această buclă de 10, 000 de ori a) Citiți P7.0 (convertește tensiunea de pe P7.0 în binar) b) Ieșiți binar în P1.0 (vă permite să vedeți binar în timp real) 6) Setați P5.3 jos (opriți LED-ul IR, economisiți energie) 7) Așteptați 10 ms, Clock_Delay1ms (10); } // repetați (înapoi la while ())
Pasul 6: Să îmbunătățim codul
Scopul sau utilizarea matricei LED Pololu IR este de a detecta o linie și de a ști dacă robotul (viitorul) este direct centrat pe linie sau într-o parte. De asemenea, deoarece linia are o anumită grosime, dacă matricea senzorilor este direct perpendiculară pe linie, numărul de senzori N va avea o citire diferită de restul, în timp ce dacă matricea LED IR este la un unghi (nu perpendicular), atunci N + 1 sau N + 2 LED-uri IR / perechi de detectoare ar trebui să dea acum o citire diferită.
Astfel, în funcție de cât de mulți senzori indică prezența liniei, ar trebui să știm dacă suntem centrați și dacă suntem înclinați sau nu.
Pentru acest ultim experiment, să vedem doar dacă putem obține LED-ul roșu și LED-ul RGB pentru a ne oferi mai multe informații despre ceea ce ne spune matricea senzorilor.
Videoclipul intră în toate detaliile. Codul final este, de asemenea, atașat.
Aceasta completează seria Asamblării ARM legate de GPIO. Sperăm să ne întoarcem cu mai multe adunări ARM mai târziu.
Mulțumesc.
Recomandat:
Urmăritor simplu de linie folosind Arduino: 5 pași
Următorul de linie simplu folosind Arduino: robotul Arduino de urmărire a liniei Arduino Line Follower Co
Urmăritor de linie GoPiGo3: 8 pași
Urmăritor de linie GoPiGo3: În acest tutorial, luăm un urmăritor de linie și îl folosim pe GoPiGo3 pentru a-l face să urmeze o linie neagră
Urmăritor de linie folosind Arduino - Proiect DIY ușor: 6 pași
Urmăritor de linie folosind Arduino | Proiect DIY ușor: În acest tutorial, vom crea un urmăritor de linie folosind ArduinoParts necesare: Chasis: Motoare și roți BO: https://amzn.to/2Yjh9I7 Driver motor L298n: https://amzn.to/2IWNMWF senzor IR : https://amzn.to/2FFtFu3 Arduino Uno: https://amzn.to/2FyTrjF J
Urmăritor de linie BrickPi3: 4 pași
BrickPi3 Line Follower: Iată un proiect care demonstrează modul în care Dexter Industries Line Follower poate fi folosit pentru a face un robot BrickPi3 să urmeze o linie
Cum să faci un urmăritor de linie folosind Arduino: 8 pași (cu imagini)
Cum să faci un urmăritor de linie folosind Arduino: Dacă începi să folosești robotică, unul dintre primele proiecte realizate de începători include un următor de linie. Este o mașină de jucărie specială, cu proprietatea de a alerga de-a lungul unei linii care în mod normal este de culoare neagră și în contrast cu fundalul. Să luăm stea