Innholdsfortegnelse:

Del 3: GPIO: ARM Montering: Linjefølge: TI-RSLK: 6 trinn
Del 3: GPIO: ARM Montering: Linjefølge: TI-RSLK: 6 trinn

Video: Del 3: GPIO: ARM Montering: Linjefølge: TI-RSLK: 6 trinn

Video: Del 3: GPIO: ARM Montering: Linjefølge: TI-RSLK: 6 trinn
Video: Part 1 ARM Assembly MSP432 TI RSLK Lab 7 Finite State Machines Memory Table 2024, Juli
Anonim
Image
Image
Maskinvaren
Maskinvaren

Hallo. Dette er den neste delen hvor vi fortsetter å bruke ARM-montering (i stedet for et språk på høyere nivå). Inspirasjonen til denne Instructable er Lab 6 fra Texas Instruments Robotics System Learning Kit, eller TI-RSLK.

Vi bruker mikrokontrolleren fra settet, MSP432 LaunchPad -utviklingskortet, men kanskje du finner noe nyttig å trekke ut fra denne instruksjonsboken selv om du ikke bruker LaunchPad eller følger T. I. læreplan.

Vi begynte med en instruerbar introduksjon av ARM Assembly, utviklingsmiljøet og hvordan vi lager et prosjekt.

Den neste Instructable on ARM Assembly introduserte hvordan du skal samhandle med input/output (GPIO).

Deretter utvidet vi kunnskapen vår og introduserte funksjoner, kontrollerte lysdioder og brytere.

Nå med denne Instructable, kan vi bruke det vi har lært til å gjøre noe morsommere og mer nyttig: oppdage en linje.

Dette kan hjelpe oss senere når vi bygger en linjefølgerrobot.

I læreplanen utføres det meste av programmeringen i C eller C ++, men det er nyttig å bli kjent med montering, før vi begynner avhengig av språk på høyere nivå og biblioteker.

Trinn 1: Maskinvaren

Maskinvaren
Maskinvaren
Maskinvaren
Maskinvaren
Maskinvaren
Maskinvaren

Jeg vil ikke revidere maskinvaren i detalj, siden det allerede er kilder, men vi legger til forklaringer der det er nødvendig.

For denne instruksen vil vi bruke reflekssensorarrayen fra Pololu, siden den kommer som en del av TI-RSLK (robotsettet). Det er den som ble brukt i kurset, og i Lab 6 i læreplanen.

Hvis du ikke har det, kan du bruke en hvilken som helst IR -detektor (eller en serie av dem) som sender ut et digitalt signal, HØYT eller LAVT, for tilstedeværelse og fravær.

Matrisesensoren er best fordi den kan hjelpe til med å oppdage om vi er midt på linjen eller av til den ene siden. Pluss, som vi får se senere, kan det hjelpe oss med å oppdage robotens vinkel i forhold til linjen.

Reflektansarrayet har detektorer veldig tett ved siden av hverandre. Det betyr at vi bør få flere deteksjonssignaler, selvfølgelig avhengig av tykkelsen på linjen.

I så fall, hvis roboten ikke er direkte på linje med linjen, bør den returnere en utgang som linjen er bredere enn den burde være (fordi vi er i en vinkel).

For en bedre forklaring av det ovennevnte, ta en titt på Lab 6 -dokumentet.

For hjelp med å koble / koble sensoren til MSP432 LaunchPad -utviklingskortet, her er noen nyttige instruksjoner.

Jeg har også lagt til de samme (lignende?) Pdf -instruksjonene i dette trinnet.

Hvis du leser Pololu -dokumentene nøye, forklarer de årsaken til "3.3V bypass", at du vil hoppe hvis du bruker 3.3V i stedet for 5V.

Siden vi ennå ikke bygger roboten, men i stedet bare lærer om ARM -montering og også hvordan vi skal samhandle med deler (undersystemer) av roboten, trenger vi ikke å følge instruksjonene ovenfor til punkt og prikke.

For øyeblikket koker/reduseres tilkoblingen av linjesensormatrisen til følgende:

  • koble 3.3V og GND fra MSP432 -kortet til sensormatrisen.
  • koble en portpinne (jeg foreslår P5.3) fra MSP432 til LED -aktiveringspinnen på linjesensormatrisen. Denne pinnen på sensoren er mellom 3,3V og GND.
  • koble alle åtte pinner/biter i en enkelt port (jeg foreslår P7.0 til P7.7) til de åtte pinnene i sensormatrisen merket "1" til "8". Dette er linjene som vil gå HIGH eller LOW avhengig av hva de aner.

Som du kan se på bildene av dette trinnet, og i videoen, festet jeg ikke sensoren til robotchassiset, fordi jeg ønsket enkel programmering, feilsøking, testing, læring.

Så med alt tilkoblet er vi klare til å komme inn i programvaren.

Trinn 2: Linjefølge

Linje følger
Linje følger
Linje følger
Linje følger

Reflektansarray -sensoren er ganske fin fordi den kan hjelpe på minst to måter.

  • Bestem er roboten sentrert på linje eller driver av til den ene siden.
  • Er roboten justert i retning av linjen, eller er den på skrå.

Hver av detektorene i matrisen gir i hovedsak en bit informasjon, enten HIGH eller LOW.

Tanken er å kombinere alle disse bitene til et enkelt tall eller enkelt bitmønster, og bruke det mønsteret til å ta beslutninger (for å bevege seg riktig).

Trinn 3: Før vi virkelig kan komme i gang…

.. vi trenger å lære noe nytt om programmering av ARM -montering. Og jeg mener ikke bare en annen instruksjon. De pleier å være mindre.

Hittil har vi ikke brukt "stabelen" i programmene våre.

Vi har stolt på å bruke de fleste kjernecpu -registrene globalt på tvers av forskjellige underprogrammer.

Den eneste tingen vi gjorde var å lagre og gjenopprette LR (lenkeregister) -adressen for en funksjon - den som kalte flere andre funksjoner. (Jeg bruker "funksjon" og "subrutine" om hverandre her).

Det vi har gjort er ikke bra. Hva om vi ønsker å hekke andre funksjoner? Hva om vi har mer enn ett hekkingsnivå?

I tidligere eksempler valgte vi å bruke register R6 som lagring for LR eller returadresse. Men hvis vi ønsker å gjøre ytterligere/dypere hekker, kan vi ikke fortsette å endre verdien på R6. Vi må velge enda et register. Og en til. Og så blir det belastende å holde oversikt over hvilket kjerne -cpu -register som inneholder hvilken LR som skal gjenopprettes til hvilken funksjon.

Så nå tar vi en titt på "stakken".

Trinn 4: Stakken

Her er litt lesestoff som forklarer stabelen.

Jeg er en større forkjemper for et par ideer:

  • bare så mye teori som kreves, gå raskt på det praktiske
  • lær etter behov, fokuser på å faktisk gjøre noe og ikke bare formålsløse øvelser eller eksempler.

Det er rikelig med ARM- og MSP432 -dokumentasjon på nettet som snakker om stabelen, så jeg kommer ikke til å revurdere alt det. Jeg kommer også til å holde bruken av bunken her til et minimum - lagre returadressen (lenkeregisteret).

I hovedsak trenger vi bare instruksjoner:

PUSH {register list}

POP {registerliste}

Eller, i vårt tilfelle, spesifikt:

PUSH {LR}

POP {LR}

Så en monteringsfunksjon/subrutine vil se slik ut:

funcLabel:.asmfunc

PUSH {LR}; dette bør sannsynligvis være en av de første instruksjonene for oppføring.; gjør mer kode her..; bla.. bla… bla…; ok, vi er ferdige med funksjonen, klare til å gå tilbake til ringefunksjonen POP {LR}; dette gjenoppretter riktig returadresse til å ringe; funksjon. BX LR; return.endasmfunc

Videoen går gjennom et levende eksempel på flere nestede funksjoner.

Trinn 5: Programvaren

Den vedlagte filen merket "MSP432_Chapter …" har mye god informasjon om portene til MSP432, og fra det dokumentet får vi følgende porter, registre, adresser, etc. Det er imidlertid litt datert. Imidlertid så jeg ikke de detaljerte adressene som er oppført for Port 5 og nyere. (bare "alternative funksjoner"). Men det er fortsatt nyttig.

Vi kommer til å bruke to porter. P5, P7, P1 og P2.

P5.3 (en enkelt bit) utgang vil være å kontrollere IR LED-aktivering på sensoren. Vi bruker P5.3 fordi det er en synlig pin på samme topptekst som de andre MSP432 -tilkoblingene som går til sensormatrisen.

P7.0 til P7.7 vil være de åtte inngangene som samler dataene fra sensoren; hva den "ser".

P1.0 er den eneste røde LED -en, og vi kan bruke den til å gi oss noen indikasjoner på dataene.

P2.0, P2.1, P2.2 er RGB LED, og vi kan også bruke det med sine forskjellige fargemuligheter for å gi oss indikasjon på sensordata.

Hvis du har gått gjennom de tidligere instruksjonene knyttet til alt dette, vet du allerede hvordan du konfigurerer programmet.

Bare ha en deklarasjonsseksjon for porter og biter, etc.

Du har en "hoved" -del.

Det bør være en sløyfe, der vi kontinuerlig leser dataene fra P7, tar beslutningen om disse dataene og tenner de to lysdiodene deretter.

Her er igjen portregisteradressene:

  • GPIO P1: 0x4000 4C00 + 0 (partalladresser)
  • GPIO P2: 0x4000 4C00 + 1 (oddetalladresser)
  • GPIO P3: 0x4000 4C00 + 20 (partalladresser)
  • GPIO P4: 0x4000 4C00 + 21 (oddetalladresser)
  • GPIO P5: 0x4000 4C00 + 40 (partalladresser)
  • GPIO P6: 0x4000 4C00 + 41 (oddetalladresser)
  • GPIO P7: 0x4000 4C00 + 60 (partalladresser)
  • GPIO P8: 0x4000 4C00 + 61 (oddetalladresser)
  • GPIO P9: 0x4000 4C00 + 80 (partalladresser)
  • GPIO P10: 0x4000 4C00 + 81 (oddetalladresser)

Det som er fet skrift er hva vi skal bruke til denne Instructable.

Programtrinn for å lese IR -detektorer

Følgende er psuedo-kode for å skrive programmet i C, men det er fortsatt nyttig, og vi vil følge det ganske nøye i monteringsversjonen av programmet.

hovedprogram0) Initialiser // porter mens (1) {1) Sett P5.3 høyt (slå på IR LED) 2) Gjør P7.0 til en utgang, og sett den høy (lader kondensatoren) 3) Vent 10 oss, Clock_Delay1us (10); 4) Gjør P7.0 til en inngang 5) Kjør denne løkken 10.000 ganger a) Les P7.0 (konverterer spenning på P7.0 til binær) b) Utgang binær til P1.0 (lar deg se binær i sanntid) 6) Sett P5.3 lav (slå av IR LED, sparer strøm) 7) Vent 10 ms, Clock_Delay1ms (10); } // gjenta (tilbake til mens ())

Trinn 6: La oss forbedre koden

Formålet eller bruken av Pololu IR LED -array er å oppdage en linje, og å vite om roboten (fremtiden) er direkte sentrert på linjen, eller av til den ene siden. Siden linjen har en viss tykkelse, og hvis sensoroppsettet er direkte vinkelrett på linjen, vil N -antallet sensorer ha en annen avlesning enn resten, mens hvis IR LED -matrisen er i en viss vinkel (ikke vinkelrett), da N+1 eller N+2 IR LED/detektorpar skal nå gi en annen avlesning.

Avhengig av hvor mange sensorer som indikerer tilstedeværelsen av linjen, bør vi derfor vite om vi er sentrert, og om vi er vinklede eller ikke.

For dette siste eksperimentet, la oss bare se om vi kan få den røde LED -en og RGB -LED -en til å gi oss mer informasjon om hva sensormatrisen forteller oss.

Videoen går inn på alle detaljene. Den endelige koden er også vedlagt.

Dette fullfører serien ARM Assembly relatert til GPIO. Vi håper å komme tilbake med mer ARM Assembly senere.

Takk skal du ha.

Anbefalt: