Innholdsfortegnelse:

Gestkontrollert Rover ved hjelp av et akselerometer og en RF-sender-mottakerpar: 4 trinn
Gestkontrollert Rover ved hjelp av et akselerometer og en RF-sender-mottakerpar: 4 trinn

Video: Gestkontrollert Rover ved hjelp av et akselerometer og en RF-sender-mottakerpar: 4 trinn

Video: Gestkontrollert Rover ved hjelp av et akselerometer og en RF-sender-mottakerpar: 4 trinn
Video: 🟡 POCO X5 PRO - САМЫЙ ДЕТАЛЬНЫЙ ОБЗОР и ТЕСТЫ 2024, Juli
Anonim
Gestkontrollert Rover ved hjelp av et akselerometer og et RF-sender-mottakerpar
Gestkontrollert Rover ved hjelp av et akselerometer og et RF-sender-mottakerpar

Hei der, Har du noen gang ønsket å bygge en rover som du kan styre med enkle håndbevegelser, men aldri kunne ta mot til å våge deg inn i vanskelighetene med bildebehandling og grensesnitt mellom et webkamera og mikrokontrolleren din, for ikke å snakke om oppoverbakke for å overvinne dårlig rekkevidde og rekkefølge synsproblemer? Vel, frykt ikke … for det er en enkel vei ut! Se, som jeg presenterer for deg den mektige ACCELEROMETER! *ba dum tsss*

Et akselerometer er en veldig kul enhet som måler gravitasjonsakselerasjon langs en lineær akse. Det representerer dette som et spenningsnivå som svinger mellom jord og forsyningsspenning, som vår mikrokontroller leser inn som en analog verdi. Hvis vi bruker hjernen vår litt (bare litt matte og litt newtonsk fysikk), kan vi ikke bare bruke den til å måle lineær bevegelse langs en akse, men vi kan også bruke den til å bestemme tiltvinkelen og føle vibrasjoner. Ikke bekymre deg! Vi trenger ikke matematikk eller fysikk; vi skal bare håndtere råverdier som akselerometeret spytter ut. Faktisk trenger du ikke bekymre deg særlig mye om det tekniske ved et akselerometer for dette prosjektet. Jeg vil bare berøre noen få detaljer og utdype bare så mye du trenger for å forstå det store bildet. Selv om du er interessert i å studere dens indre mekanikk, ta en titt her.

Du trenger bare å huske på dette for øyeblikket: et akselerometer er gizmo (ofte kombinert med et gyroskop) som åpner dører til alle de bevegelsessensorspillene vi spiller på smarttelefonene våre; et bilspill for eksempel, hvor vi styrer kjøretøyet ved å vippe enhetene våre i begge retninger. Og vi kan etterligne denne effekten ved å stikke et akselerometer (med noen få hjelpemidler, selvfølgelig) på en hanske. Vi tar bare på oss våre magiske hansker og vipper hendene til venstre eller høyre, fremover eller bakover og ser roverne våre danse til melodiene våre. Alt vi trenger å gjøre her er å oversette akselerometerets avlesninger til digitale signaler som motorene på roveren kan tolke og utvikle en mekanisme for å overføre disse signalene til roveren. For å oppnå dette, ber vi den gode ol 'Arduino og dens hjelpere for dagens eksperiment, et RF-sender-mottakerpar som opererer på 434MHz og derved gi et område på omtrent 100-150m i åpent rom, noe som også redder oss fra linje-av- synsproblemer.

Ganske greit hack, ikke sant? La oss dykke inn…

Trinn 1: Samle rekvisita

Samle rekvisita
Samle rekvisita
Samle rekvisita
Samle rekvisita
Samle rekvisita
Samle rekvisita
Samle rekvisita
Samle rekvisita
• Arduino Nano x1
• Akselerometer (ADXL335) x1
• 5V DC motor + hjul x2 hver
• Storfehjul* x1
• L293D -motordriver + 16 -pinners IC -kontakt x1 hver
• 434 MHz RF -sender x1
• 434 MHz RF -mottaker x1
• HT-12E Encoder IC + 18-pins IC-kontakt x1 hver
• HT-12D dekoder IC + 18-pinners IC-kontakt x1 hver
• LM7805 spenningsregulator x1
• Trykknappbryter x2
• Rød LED + 330O motstand x2 hver
• Gul LED + 330O motstand x1 hver
• Grønn LED + 330O motstand (valgfritt) x4 hver
• 51kO og 1MO motstander x1 hver
• 10µF radialkondensatorer x2
Batterier, batterikontakter, USB-kabel, jumperledninger, hunnhoder, 2-pinners skrueterminaler, kretskort, Chasis og ditt vanlige loddetilbehør

Hvis du lurer på hvorfor vi bruker et storfehjul, er saken at RF -senderen og mottakermodulene bare har 4 datapinner, noe som betyr at vi bare kan kjøre 2 motorer og dermed bruk av et storfehjul for å støtte strukturen. Men hvis du føler at roveren din vil se litt mer kul ut med fire hjul, ikke bekymre deg, det er en jobb! I dette tilfellet kan du bare skrape storfehjulet fra listen og legge til et par 5V likestrømsmotorer, ledsaget av et hjul hver, og se etter den enkle hacken som ble diskutert mot slutten av trinn 3.

Til slutt, for de modige, er det rom for en annen liten modifikasjon i design, noe som innebærer å konstruere din egen Arduino. Gå til bonusseksjonen i neste trinn og se selv. Du trenger også noen ekstra forsyninger: en ATmega328P, en 28pin IC -kontakt, en 16Mhz krystalloscillator, to 22pF keramiske hetter, en annen 7805 spenningsregulator, ytterligere 10μF radialkapsler og 10kΩ, 680Ω, 330Ω motstander og ja, minus Arduino!

Trinn 2: Koble opp senderen

Koble opp senderen
Koble opp senderen
Koble opp senderen
Koble opp senderen
Koble opp senderen
Koble opp senderen
Koble opp senderen
Koble opp senderen

Vi vil dele prosjektet ned til to bestanddeler: senderen og mottakerkretsene. Senderen består av et akselerometer, en Arduino og en RF-sendermodul kombinert med en HT-12E-encoder IC, alle sammenkoblet i henhold til den vedlagte skjematikken.

Akselerometeret, som introdusert tidligere, tjener til å gjenkjenne håndbevegelsene våre. Vi kommer til å bruke et tre-akset akselerometer (i utgangspunktet tre enakse akselerometre i ett) for å dekke våre behov. Den kan brukes til å måle akselerasjon i alle tre dimensjonene, og som du kanskje har gjettet, gir den ikke én, men et sett med tre analoge verdier i forhold til de tre aksene (x, y og z). Egentlig trenger vi bare akselerasjonen langs x- og y -aksene siden vi bare kan kjøre roveren i fire retninger: fremover eller bakover (dvs. langs y -aksen) og venstre eller høyre (dvs. langs x -aksen). Vi ville trengt z -aksen hvis vi bygde en drone, slik at vi også kunne kontrollere dens stigning eller nedstigning ved hjelp av bevegelser. Uansett må disse analoge verdiene som akselerometeret gir, konverteres til digitale signaler for å kunne drive motorene. Dette blir tatt hånd om av Arduino som også overfører disse signalene, ved konvertering, til roveren via RF -sendermodulen.

RF-senderen har bare en jobb: å overføre de "serielle" dataene som er tilgjengelige på pin 3 ut av antennen på pin 1. Dette taler for bruk av HT-12E, en 12 biters parallell til seriell datakoder, som samler opptil 4 biter parallelle data fra Arduino på linjene AD8 til AD11, og dermed kan vi gjøre plass til opptil 24 = 16 forskjellige I/O -kombinasjoner i motsetning til den ene datapinnen på RF -senderen. De resterende 8 bitene, trukket fra linjene A0 til A7 på koderen, utgjør adressebyten, noe som letter paring av RF -senderen med en tilsvarende RF -mottaker. De 12 bitene blir deretter satt sammen og seriellisert og sendt videre til datapinnen til RF-senderen, som igjen ASK-modulerer dataene på en 434MHz bærerbølge og skyter den ut via antennen ved pinne 1.

Konseptuelt bør enhver RF -mottaker som lytter på 434Mhz kunne fange opp, demodulere og dekode disse dataene. Adresselinjene på HT-12E, og de på HT-12D-motstykket (en 12-biters seriell-til-parallell datadekoder), tillater oss imidlertid å gjengi et RF-sender-mottakerpar unikt ved å rute dataene bare til tiltenkt mottaker og dermed begrense kommunikasjonen med alle andre. Alt som kreves av oss er å konfigurere adresselinjene identisk på begge fronter. Siden vi for eksempel har jordet alle adresselinjene for HT-12E, må vi gjøre det samme for HT-12D i mottakerenden, ellers vil ikke roveren kunne motta signalene. På denne måten kan vi også kontrollere flere rovere med en enkelt senderkrets ved identisk å konfigurere adresselinjene på HT-12Dene på hver av mottakerne. Eller vi kan ta på oss to hansker, hver festet med en senderkrets som inneholder en distinkt adresselinjekonfigurasjon (si en med alle adresselinjer jordet og den andre med alle holdt høyt, eller en med en linje jordet mens de resterende syv holdes høy og den andre med to linjer jordet mens de resterende seks holdes høyt, eller en hvilken som helst annen kombinasjon derav) og hver styring av flere identisk konfigurerte rovere. Spill maestroen på en android symfoni!

En viktig ting å merke seg når du setter sammen kretsen, er verdien av Rosc. HT-12E har en intern oscillatorkrets mellom pinnene 15 og 16, som aktiveres ved å koble en motstand, kalt Rosc, mellom disse pinnene. Verdien som er valgt for Rosc bestemmer faktisk oscillatorfrekvensen, som kan variere avhengig av forsyningsspenningen. Å velge en passende verdi for Rosc er avgjørende for funksjonen til HT-12E! Ideelt sett bør HT-12Es oscillatorfrekvens være 1/50 ganger den for HT-12D-motstykket. Derfor, siden vi opererer på 5V, valgte vi 1MΩ og 51kΩ motstander som Rosc for henholdsvis HT-12E og HT-12D kretsene. Hvis du planlegger å bruke kretsene på en annen forsyningsspenning, kan du se grafen “Oscillatorfrekvens vs forsyningsspenning” på side 11 i det vedlagte HT-12E-databladet for å bestemme den eksakte oscillatorfrekvensen og motstanden som skal brukes.

Som en sidebemerkning vil vi også bruke kvinnelige overskrifter her (som tjener et lignende formål som IC -kontakter) for å plugge akselerometeret, RF -senderen og Arduino i kretsen i stedet for å lodde dem direkte på kretskortet. Intensjonen er å innkvartere litt gjenbrukbarhet. Si, det er en stund siden du konstruerte din gestkontrollerte rover og den bare satt der, halvt dekket av støv, på toppen av pokalhyllen din, og du snublet over en annen flott instruktør som utnytter effekten av et akselerometer. Så hva gjør du? Du tar den bare ut av roveren og skyver den inn i den nye kretsen. Du trenger ikke å tilkalle “Amazons” for å skaffe deg en ny:-p

Bonus: Gjør unna med Arduino, og likevel ikke

Bare i tilfelle du føler deg litt mer eventyrlystne, og spesielt hvis du tror at å bruke dette vakkert designet vidunderet (Arduino, selvfølgelig) for en så triviell oppgave som vår er litt av en overkill, må du bære med meg litt lenger; og hvis ikke, kan du hoppe til neste trinn.

Målet vårt her er å gjøre Arduino (hjernen til Arduino, faktisk; ja, jeg snakker om ATmega IC!) Til et permanent medlem av teamet. ATmega ville bli programmert til å kjøre bare en enkelt skisse igjen og igjen, slik at den kunne tjene som en evig del av kretsen, akkurat som HT-12E-bare IC, bare sitte der og gjøre det den skal. Er det ikke slik et ekte innebygd system skal være?

Uansett, for å fortsette med denne oppgraderingen, må du bare endre kretsen i henhold til den andre skjemaet som er vedlagt. Her erstatter vi ganske enkelt hunnhodene til Arduino med en IC-kontakt for ATmega, legger til en 10K opptrekkmotstand ved tilbakestillingspinnen (pin 1) på IC og pumper den opp med en ekstern klokke mellom pinne 9 og 10. Dessverre, hvis vi gjør opp med Arduino, slipper vi også de innebygde spenningsregulatorene; ergo, må vi replikere LM7805-kretsen som vi hadde brukt for mottakeren også her. I tillegg bruker vi også en spenningsdeler for å tegne 3.3V som kreves for å drive akselerometeret.

Nå er den eneste andre fangsten her å programmere ATmega for å gjøre jobben sin. Du må imidlertid vente på det til trinn 4. Så, følg med …

Trinn 3: Og mottakeren

Og mottakeren
Og mottakeren
Og mottakeren
Og mottakeren
Og mottakeren
Og mottakeren
Og mottakeren
Og mottakeren

Mottakeren består av en RF-mottakermodul kombinert med en HT-12D-dekoder IC og et par likestrømsmotorer som drives ved hjelp av en L293D-motordriver, alle sammenkoblet i henhold til vedlagt skjema.

RF-mottakerens eneste jobb er å demodulere bærebølgen (mottatt via antennen ved pinne 1) og gjengi de hentede "serielle" dataene på pinne 7 fra hvor den blir hentet av HT-12D for deserialisering. Forutsatt at adresselinjene (A0 til A7) på HT-12D er konfigurert identisk med HT-12E-motstykket, trekkes de 4 parallelle databitsene ut og sendes videre via datalinjene (D8 til D11) på HT-12D, til motorføreren, som igjen tolker disse signalene for å drive motorene.

Igjen, vær oppmerksom på verdien av Rosc. HT-12D har også en intern oscillatorkrets mellom pinnene 15 og 16, som aktiveres ved å koble en motstand, kalt Rosc, mellom disse pinnene. Verdien som er valgt for Rosc bestemmer faktisk oscillatorfrekvensen, som kan variere avhengig av forsyningsspenningen. Å velge en passende verdi for Rosc er avgjørende for funksjonen til HT-12D! Ideelt sett bør HT-12Ds oscillatorfrekvens være 50 ganger den for HT-12E-motstykket. Derfor, siden vi opererer på 5V, valgte vi 1MΩ og 51kΩ motstander som Rosc for henholdsvis HT-12E og HT-12D kretsene. Hvis du planlegger å bruke kretsene på en annen forsyningsspenning, kan du se grafen "Oscillatorfrekvens vs forsyningsspenning" på side 5 i det vedlagte HT-12D-databladet for å bestemme den eksakte oscillatorfrekvensen og motstanden som skal brukes.

Ikke glem de kvinnelige overskriftene til RF -mottakeren.

Eventuelt kan en LED kobles via en 330Ω strømbegrensende motstand til hver av de 4 datapinnene på HT-12D for å bestemme biten som mottas ved den pinnen. Lysdioden vil lyse hvis den mottatte biten er HØY (1) og dempe hvis den mottatte biten er LAV (0). Alternativt kan en enkelt LED knyttes til VT-pinnen på HT-12D (igjen, via en 330Ω strømbegrensende motstand), som ville lyse opp i tilfelle en gyldig overføring.

Nå, hvis du leter etter hacken med motorene som jeg snakket om i trinn ett, er det forbanna enkelt! Bare koble de to motorene i hvert sett parallelt som vist i det andre skjemaet. Dette fungerer slik det skal fordi motorene i hvert sett (motorene foran og bak på venstre og motorene foran og bak til høyre) aldri drives i motsatte retninger. Det vil si at for å dreie roveren til høyre må både fremre og bakre motorer på venstre kjøres fremover og motorene foran og bak til høyre må begge kjøres bakover. For å få roveren til å svinge til venstre må motorene foran og bak på venstre side begge kjøres bakover, og motorene foran og bak til høyre må kjøres fremover. Derfor er det trygt å mate inn det samme spenningsparet til begge motorene i et sett. Og måten å gjøre det på er ved å koble dem til motorer parallelt.

Trinn 4: Videre til koden

Over til koden
Over til koden

Det er bare en ting igjen å gjøre for å få roveren i gang. Ja, du gjettet riktig! (Jeg håper du gjorde) Vi må fortsatt oversette akselerometeravlesningene til et skjema som motordriveren kan tolke for å kunne kjøre motorene. Hvis du tenker at siden akselerometeravlesningene er analoge og motorføreren forventer digitale signaler, må vi implementere en slags ADC, vel, ikke teknisk, men det er det vi må gjøre. Og det er ganske greit.

Vi vet at et akselerometer måler gravitasjonsakselerasjon langs en lineær akse og at denne akselerasjonen er representert som et spenningsnivå som svinger mellom bakken og forsyningsspenningen, som mikrokontrolleren vår leser inn som en analog verdi som varierer mellom 0 og 1023. Men siden vi Hvis jeg bruker akselerometeret på 3,3V, anbefales det at vi setter den analoge referansen for 10-biters ADC (som kommer integrert i ATmeaga ombord på en Arduino) til 3,3V. Det vil bare gjøre ting enklere å forstå; selv om det ikke vil ha mye å si for vårt lille eksperiment, selv om vi ikke gjorde det (vi må bare justere koden litt). For å gjøre det, kobler vi ganske enkelt AREF -pinnen på Arduino (pin 21 på ATmega) til 3,3V og angir denne endringen i kode ved å ringe analogReference (EXTERNAL).

Når vi legger akselerometeret flatt og analogt Les akselerasjonen langs x- og y -aksene (husk? Vi trenger bare disse to aksene), får vi en verdi på omtrent 511 (dvs. halvveis mellom 0 og 1023), som bare er en måte å si at det er 0 akselerasjon langs disse aksene. I stedet for å grave i detaljene i det faktum, bare tenk deg dette som x- og y -aksene på en graf, med verdien 511 som angir opprinnelsen og 0 og 1023 endepunktene som vist på figuren; orienter akselerometeret på en slik måte at pinnene peker ned og holdes nærmere deg, ellers kan du snu/bytte aksene. Dette betyr at hvis vi vipper akselerometeret til høyre, bør vi lese en verdi større enn 511 langs x-aksen, og hvis vi vipper akselerometeret til venstre, bør vi få en verdi lavere enn 511 langs x-aksen. På samme måte, hvis vi vipper akselerometeret fremover, bør vi lese en verdi større enn 511 langs y-aksen, og hvis vi vipper akselerometeret bakover, bør vi lese en verdi lavere enn 511 langs y-aksen. Og dette er hvordan vi i kode utleder retningen som roveren skal kjøres i. Men dette betyr også at vi må holde akselerometeret virkelig stabilt og justert parallelt med en flat overflate for å kunne lese en 511 langs begge aksene for å få roveren parkert stille. For å lette denne oppgaven litt, definerer vi visse terskler som danner en grense, slik figuren viser, slik at roveren forblir stasjonær så lenge x- og y -avlesningene ligger innenfor grensene, og vi vet sikkert at roveren må settes i bevegelse når terskelen er overskredet.

For eksempel, hvis y-aksen leser 543, vet vi at akselerometeret er vippet fremover, så må vi styre roveren fremover. Vi gjør dette ved å sette pins D2 og D4 HIGH og pins D3 og D5 LOW. Siden disse pinnene er koblet direkte til HT-12E, blir signalene seriell og avfyrt RF-senderen bare for å bli fanget opp av RF-mottakeren som sitter på roveren, som ved hjelp av HT-12D deserialiserer signalene og sender dem videre til L293D, som igjen tolker disse signalene og driver motorene fremover

Du vil kanskje endre disse tersklene for å kalibrere følsomheten. En enkel måte å gjøre det på er å bare koble akselerometeret til Arduino og kjøre en skisse som spytter ut x- og y -avlesningene til den serielle skjermen. Nå er det bare å flytte akselerometeret litt rundt, se gjennom målingene og bestemme terskelverdiene.

Og det er det! Last opp koden til Arduino og nyt! Eller, kanskje ikke så snart:-(Hvis du ikke hoppet over bonusdelen, ville det å laste opp koden til ATmega bety litt mer arbeid. Du har to alternativer:

Alternativ A: Bruk en USB til seriell enhet, for eksempel FTDI FT232 basic breakout board. Bare kjør ledninger fra TTL -toppteksten til de tilsvarende pinnene på ATmega i henhold til kartleggingen nedenfor:

Pins på Breakout Board Pins på mikrokontrolleren
DTR/GRN RST/Tilbakestill (Pin 1) via 0,1 µF lokk
Rx Tx (Pin 3)
Tx Rx (Pin 2)
Vcc +5v utgang
CTS (ubrukt)
Gnd Bakke

Koble nå den ene enden av en USB -kabel til utbruddskortet og den andre til PC -en og last opp koden som du vanligvis ville: start Arduino IDE, velg en passende seriell port, angi brettypen, kompiler skissen og trykk på last opp.

Alternativ B: Bruk en UNO hvis du har en liggende et sted. Bare koble din ATmega til UNO, last opp koden som du vanligvis ville, trekk ICen ut og skyv den tilbake til senderkretsen. Så enkelt som en pai!

Begge disse alternativene burde fungere, forutsatt at du var smart nok til å brenne opplasteret på forhånd på din ATmega, eller hvis du var enda smartere å kjøpe en ATmega med bootloaderen allerede installert i utgangspunktet. Hvis ikke, fortsett og gjør det ved å følge trinnene som er skissert her.

Andddd, vi er offisielt ferdige! Jeg håper du likte denne bisarre lange instruksen. Nå, fortsett å bygge roveren din hvis du ikke allerede er ferdig, lek med den en stund og kom tilbake for å oversvømme kommentarfeltet nedenfor med spørsmål og/eller konstruktiv kritikk.

Takk

P. S. Grunnen til at jeg ikke lastet opp noen bilder av det ferdige prosjektet, er vel, fordi jeg ikke fullførte det selv. Halvveis i byggingen tenkte jeg på noen forstørrelser, for eksempel hastighetskontroll, hindring av hindringer og kanskje en LCD -skjerm på roveren, noe som faktisk ikke er så vanskelig hvis vi bruker en mikrokontroller på både sende- og mottaksenden. Men hvorfor ikke gjøre det på den harde måten ?! Så, jeg jobber for tiden i den retningen, og jeg legger ut en oppdatering så snart den bærer noen frukt. Imidlertid testet jeg ut koden og designet ved hjelp av en rask prototype som jeg bygde ved hjelp av moduler fra et av mine tidligere prosjekter; du kan se på videoen her.

Anbefalt: