Innholdsfortegnelse:

UCL Embedded - B0B Linefollower: 9 trinn
UCL Embedded - B0B Linefollower: 9 trinn

Video: UCL Embedded - B0B Linefollower: 9 trinn

Video: UCL Embedded - B0B Linefollower: 9 trinn
Video: Human vs Robot | Artificial Intelligence 2024, Juli
Anonim
UCL Embedded - B0B Linefollower
UCL Embedded - B0B Linefollower

Dette er B0B.*

B0B er en generisk radiostyrt bil, som midlertidig tjener grunnlaget for en robot som følger linjen.

Som så mange Line-følgende roboter før ham, vil han gjøre sitt beste for å holde seg på en linje forårsaket av en overgang mellom gulvet og et kontrastmateriale, i vårt tilfelle duct tape.

I motsetning til så mange andre Line-følgende roboter, samler B0B også inn data og sender dem via WiFi.

Helt overkill for et hobbyprosjekt, det involverer en rekke emner du kan synes er interessante. Denne guiden beskriver hans fødsel, funksjoner og hvordan du kan få en til å like ham.

Det innebærer også å være sint på diverse elektronikk for ikke å fungere som vi ville at de skulle gjøre, og trinnene vi tok for å overvinne disse vanskelighetene, (jeg ser på deg ESP 8266-01).

Det er 2 koder for å få prosjektet til å fungere. Den første koden er for ESP8266 -modulen som vi bruker Arduino som programmerer, og den andre koden skal kjøres på Arduino.

Trinn 1: Komponenter

For dette prosjektet trenger du:

Maskinvare:

• 1x radiokontrollerbil, (må ha ESC og styreservo).

Vi brukte en hovedsakelig Traxxas 1/16 E-Revo VXL, hovedsakelig fordi det var det vi hadde, og var ganske sikre på at vi ville kunne kontrollere den med en Arduino. Også fordi det vil ende opp med en ikke ubetydelig mengde ekstra maskinvare, var vi sikre på at dette ikke ville være et problem for 1/16 E-Revo.

Imidlertid kan de fleste radiostyrte biler (som lett kan skilles fra hverandre) sannsynligvis brukes i stedet, og prosessen vil være veldig lik.

• Massevis av tape.

Fargen skal kontrastere gulvet så mye som mulig. I testmiljøet vårt brukte vi hvit tape på et mørkt gulv.

• 1x Arduino Mega 2560.

Mindre Arduino er sannsynligvis også bra, men du vil bli presset for pinner.

• 1 x stort brødbrett.

Den ene er nok, men vi hadde også en mindre for å skille ut de andre spenningsledningene for å redusere risikoen for brukerfeil.

• 1x TCRT5000 IR analog sensor (brukes for å unngå kollisjoner).

Det eksakte merket/modellen spiller ingen rolle om den er Arduino -kompatibel og måler avstand. Søk etter søkeord som “Distance”, “hinder” sensor. Teknisk ville en digital sensor fungere like bra med mindre kodeendringer, men vi bruker en analog.

• 1x eller 2x Gravity: Analog gråtonesensor v2

Den ene er en nødvendighet for linjefolgeren. Eksakt modell spiller ingen rolle, så lenge den ser på intensiteten til reflektert lys og sender ut et analogt signal. Det andre for "rom" -deteksjon fungerte ikke så godt som forventet og kan utelates, eller et alternativ, som en RGB -fargesensor kan bli funnet, antagelig for bedre effekt. Vi har ennå ikke testet dette.

• 1 x ESP 8266-01.

Det er mange versjoner av ESP 8266 tilgjengelig. Vi har bare erfaring med 8266-01, og kan ikke garantere at ESP-koden fungerer med en annen versjon.

• 1 x ESP8266-01 Wi-Fi-skjerm.

Teknisk valgfritt, men hvis du ikke bruker dette, blir alt som involverer Wi-Fi-modulen mye mer komplisert. Guiden vil imidlertid anta at du har dette (hvis ikke, finn guidene på nettet for riktig tilkobling av ESP-01 til Arduino), ettersom det å gjøre dette feil kan og sannsynligvis vil skade modulen.

• Batterier til selve kjøretøyet og batterier for å drive tilleggselektronikken.

Vi brukte et par 2,2 AH kapasitet, 7,4 V Lipo -batterier parallelt for å drive alt. Du bør kunne bruke de batteriene du vanligvis bruker med ditt foretrukne kjøretøy. Hvis du er over 5V, men under 20V, er kapasitet viktigere enn nominell spenning.

• Mange hoppekabler.

Jeg har gitt opp å telle det eksakte antallet av disse. Hvis du tror du har nok, har du sannsynligvis ikke det.

• Til slutt, for å feste alt, må du montere Arduino, sensorene, brødbrettet (e) og Wi-Fi-modulen til det kjøretøyet du ønsker. Resultatet ditt vil variere avhengig av hva du bruker som base, og hvilke materialer som er tilgjengelige.

Vi brukte:

• Glidelås.

• Litt superlim.

• Små biter av skrapepapir/harpiksrør vi hadde med en passende diameter.

• En gammel Masonite -bakplate fra en bilderamme, kuttet i størrelse.

• Litt mer gaffatape.

• Eventuelle verktøy som trengs for å arbeide på den radiostyrte bilen du ønsker.

Vi brukte stort sett et lite skrutrekkersett med flere biter, men måtte av og til trekke ut verktøysettet som fulgte med bilen.

Programvare:

• Noderød

En viktig del av datainnsamlingen.

• En MQTT -server.

Midtmannen mellom kjøretøyet vårt og Node-red. Til å begynne med brukte vi test.mosquitto.org for testing

Senere brukte vi:

• CloudMQTT.com

Dette var mye mer pålitelig som mer enn gjorde opp for å være litt mer komplisert å sette opp.

• WampServer.

Den siste delen av datainnsamlingen. Spesielt vil vi bruke SQL -databasen til å lagre de innsamlede dataene våre.

Trinn 2: Elektrisk diagram

Elektrisk diagram
Elektrisk diagram

Trinn 3: Fysisk konstruksjon

Fysisk konstruksjon
Fysisk konstruksjon
Fysisk konstruksjon
Fysisk konstruksjon
Fysisk konstruksjon
Fysisk konstruksjon

Vår løsning har en rett frem tilnærming til fysisk montering.

Den originale mottakeren og dens vanntette kabinett ble fjernet fra RC -bilen, da den ikke er nødvendig.

Vi fant ut at det var et passende sted mellom forhjulene for linjefølgesensoren vår, så vi holdt den på plass ved å sløyfe en glidelås over frontplaten.

Sensoren vi bruker til antikollisjon er liksom klemt inn bak støtfangeren foran. Den er fremdeles beskyttet mot støt og passform. Det ender med å se fremover i en aldri så liten oppadgående vinkel. Dette er perfekt.

Masonittplaten, (bakplate fra gammel bilderamme), på toppen har små deler av papir/harpiksrør kuttet i størrelse og limt på bunnen. Disse er i tråd med festene til kroppspostene og sitter ganske enkelt på toppen og holder alt sikkert. Forutsatt at limet som fester røret på platen holder, og at det ikke vipper for mye, vil dette forbli på plass. Det er også verdt å merke seg at platen er innenfor den beskyttende sfæren til hjulene og støtfangerne. Arduino Mega og de to brødbrettene er festet til tallerkenen med enten dobbeltsidig tape, eller med en sløyfe med tape duket rundt, lim ut.

Det er ikke iverksatt spesielle tiltak for å sikre WiFi-modulen. Det er ikke vårt, så liming eller taping ble ansett som unødvendig ettersom det er så lett at det ikke beveger seg mye, og ledningene er nok til å holde det på plass.

Til slutt har vi en sensor for å oppdage "rom" som ble ziptied til fjæringskomponentene av et av bakhjulene. Under drift må dette være borte fra linjemarkeringen kjøretøyet bruker for å navigere.

Trinn 4: ESP8266 -modul

ESP8266 -modul
ESP8266 -modul
ESP8266 -modul
ESP8266 -modul

WiFi -modulen, ESP8266, krever to forskjellige pinneoppsett. Ett oppsett skal brukes når modulen blinker med et nytt program og bruker Arduino Mega 2560 som programmerer. Det andre oppsettet er for modulen når den er i bruk og sender informasjon til MQTT -megleren.

Ved å bruke Arduino IDE til å laste opp kode til ESP8266 -modulen må du installere en styringsleder og en ekstra styringsleder

Under board manager installer du esp8266 board manager. Det vil lett bli funnet ved å søke "esp". Det er avgjørende at du installerer versjon 2.5.0, ikke eldre, ikke nyere.

Under innstillinger i flere nettadresser for styringsadministrator, kopier i denne linjen:

arduino.esp8266.com/stable/package_esp8266c…

For å kunne laste opp noe til ESP8266 -modulen må du bruke et spesifikt pin -oppsett, slik at du kan blinke modulen. Dette må gjøres hver gang du vil gjøre en endring i den nåværende koden som kjører på modulen. Ikke glem å velge riktig ESP8266 -modul fra brettsjefen før du blinker modulen. I dette prosjektet valgte vi det generiske ESP8266 -kortet. Pin -oppsettet for å blinke modulen finnes på det første bildet i dette segmentet.

Etter å ha blinket ESP8266 -modulen, må du bytte pinneoppsett. Du kan også velge å bruke en adapter for å gjøre oppsettet enklere for deg. I dette prosjektet valgte vi å ha en adapter når vi hadde modulen i gang. Pin -oppsettet med adapter finnes på det andre bildet i dette segmentet.

Koden som skal blinkes til ESP8266 -modulen setter opp tilkoblingen til en WiFi og en MQTT -megler, i dette tilfellet med et brukernavn og passord, men kan gjøres uten hvis du gjør de nødvendige endringene beskrevet i kodekommentarene. For dette prosjektet krevde megleren et brukernavn og passord for å fungere. Modulen leser innkommende meldinger fra den serielle porten som den er koblet til. Den vil lese hver nye linje som er opprettet av Arduino -koden, tyde meldingen og gjenskape meldingen. Deretter sender den meldingen til MQTT -megleren som er spesifisert i koden. Koden for ESP8266 -modulen:

Trinn 5: Arduino

Etter å ha konfigurert WiFi -modulen, ser vi på programmet som skal brukes til å kontrollere motoren og servoen på RC -bilen. Bilen kommer til å reagere i henhold til en gråskala -informasjon fra den sentrale sensoren, også kjent som "Line Detector" i dette prosjektet. Den tar sikte på å holde informasjonen fra linjedetektoren nær en forhåndsinnstilt verdi som tilsvarer informasjonen som er registrert ved endringen mellom lys og mørk eller i dette prosjektet, hvitt og svart. Så hvis verdien skiller seg for mye unna, vil den tilsvarende utgangen til servoen styre bilen nær den forhåndsinnstilte verdien av linjen.

Programmet har to knapper som fungerer som en start- og stoppknapp for RC -bilen. Teknisk er "stopp" -knappen en "tilkobling" -knapp som i termer tilsvarer en PWM -verdi som sendes til motoren som får RC -bilen til å stoppe. Startknappen sender en PWM -verdi som tilsvarer RC -bilen som knapt beveger seg fremover siden den vil kjøre for fort hvis den får for mye fart.

En kollisjonsdetektor er lagt til fronten på RC-bilen for å oppdage om veien videre er klar eller blokkert. Hvis den er blokkert, stopper RC -bilen til hindringen er borte/fjernet. Det analoge signalet fra detektoren brukes til å avgjøre om noe blokkerer veien eller ikke, og er satt til et kriterium for å kunne gå videre og stoppe.

En sekundær gråskalsensor, "Romdetektor", brukes til å oppdage hvilket rom RC -bilen har kommet inn. Den fungerer på et lignende prinsipp som linjedetektoren, men den ser ikke etter endringen mellom lys og mørke, men heller etter verdier innenfor et bestemt område som tilsvarer forskjellige rom, avhengig av verdien sett fra romdetektoren.

Til slutt lager programmet en informasjonslinje fra sensorene for WiFi -modulen for å lese og deretter sende til MQTT -megleren. Informasjonslinjen opprettes som en streng og skrives til den tilhørende serien som WiFi -modulen er tilkoblet. Det er viktig at skrivingen til serien bare skjer så ofte som WiFi -modulen kan lese den innkommende meldingen, men husk å ikke bruke noen forsinkelser i denne koden siden det vil forstyrre RC -bilens evne til å følge linjen. Bruk i stedet "millis" siden det lar programmet kjøre uten forsinkelse, men etter at en definert mengde millis har gått siden Arduino ble slått på, vil det skrive en melding til føljetonen uten å blokkere koden på samme måte som forsinkelsen gjør.

Koden for Arduino Mega 2560:

Trinn 6: MySQL -database

WampServer er et webutviklingsmiljø for Windows som lar oss lage applikasjoner med PHP og en MySQL -database. PhpMyAdmin lar oss administrere databasene våre på en enkel måte.

For å komme i gang, gå til:

I dette prosjektet bruker vi versjon 3.17 x64 bits for Windows. Etter installasjonen må du kontrollere at alle tjenestene kjører, noe som betyr at det lille ikonet blir grønt i stedet for rødt eller oransje. Hvis ikonet er grønt, kan du få tilgang til PhpMyAdmin for å administrere MySQL -databasen din.

Få tilgang til MySQL ved hjelp av PhpMyAdmin og opprett en ny database. Nevn det noe passende som du kan huske, i dette prosjektet ble det kalt “line_follow_log”. Etter at du har opprettet databasen, bør du opprette en tabell i databasen. Sørg for at antall kolonner passer. I prosjektet bruker vi 4 kolonner. En kolonne er for et tidsstempel, og de tre siste brukes til å lagre data fra kjøretøyet. Bruk en riktig datatype for hver kolonne. Vi brukte "langtekst" for tidsstempelkolonnen og "mellomtekst" for resten.

Det burde være alt du trenger å gjøre i PhpMyAdmin og MySQL. Husk databasen din og tabellen for delen om Node-Red.

Trinn 7: Node-rød

For å håndtere datainnsamling bruker vi en ganske enkel flyt i Node-red. Den kobles til vår MQTT -server, og skriver til vår MYSQL -database.

For å gjøre dette trenger vi noen få paletter for at forskjellige funksjoner skal fungere, og vi trenger noen faktisk kode for at den skal kjøre.

Første ting først. Vi trenger følgende paller.

Node-red-contrib-mqtt-broker: Dette er koblingen til vår MQTT-megler.

Node-red-dashboard: Dashboardet vårt, nødvendig for å visuelt representere dataene som er samlet inn.

Node-red-node-mysql: Vår tilkobling til SQL-databasen.

Dette er ikke ment å være en fullverdig guide til Node-red, men jeg skal forklare hva Node-rød flyten gjør.

Tidlig hadde vi problemer med at MQTT -serveren vår valgte døende/frakoblet, tilsynelatende tilfeldig, noe som gjorde det å gjøre endringer til et frustrerende forsøk, da det var uklart om endringene hadde vært fordelaktige, eller ikke når vi ikke kunne se resultatet. Så knappen 'Død serveren?' injiserer 'Nei' følgende blokk injiserer den til vår MQTT -server. Hvis det ikke er dødt, vises "Nei" i feilsøkingsvinduet. Dette gjøres ikke bare for å teste, men for å tvinge Node-red til å prøve å koble til MQTT-serveren på nytt.

Teststrengen sender en kostymestreng til MQTT -megleren. Vi formaterte denne strengen til å være lik den vi ville få fra Arduino. Dette skulle ha en enklere tid med å konfigurere nettverket som dekoder meldingene, uten å måtte ha prosjektet i gang, og samle inn data.

Den siste flyten i arbeidsområdet kan deles inn i to segmenter. Den nederste grenen leser ganske enkelt de innkommende meldingene, legger dem ut i feilsøkingsvinduet og lagrer dem på SQL -serveren.

Det store nettverket av tilkoblede svitsjer som følger en funksjonsnode hvis der den virkelige 'magien' skjer.

Den videre funksjonen leser den innkommende strengen, deler den opp med hver semikolon og deler seksjonene ut på hver av utgangene. Følgende brytere ser etter en av to forskjellige innkommende biter av informasjon. En spesifikk informasjon blir alltid passert ut av den ene utgangen, det andre alternativet forlater den andre utgangen. Etter det er en andre gruppe bryterblokker. De vil bare aktivere med en bestemt inngang, og sende ut noe annet.

Et eksempel, "hinder", som alle de andre er et binært valg, er det enten klart å kjøre, eller så er det ikke det. Så den vil motta en 0, eller en 1. En 0 vil bli sendt til den "klare" grenen, en 1 vil bli sendt til den "hindrede" grenen. 'Clear', 'Obstructed' -bryterne vil, hvis de er aktivert, sende ut noe spesifikt, henholdsvis Clear eller blokkert. De grønne fortsettelsesblokkene legges ut i feilsøkingsvinduet, den blå skriver til dashbordet vårt.

Filene "status" og "plassering" fungerer nøyaktig det samme.

Trinn 8: MQTT -megler

En megler er en server som dirigerer meldinger fra klienter til passende destinasjonsklienter. En MQTT -megler er en der klientene bruker et MQTT -bibliotek for å koble seg til megleren over et nettverk.

For dette prosjektet opprettet vi en MQTT -megler ved bruk av CloudMQTT -tjenesten med gratis abonnement på en "Cute Cat" -versjon. Det har sin begrensning, men vi overskrider ikke de som er i dette prosjektet. WiFi -modulen kan koble til megleren, og megleren sender deretter meldingene til en passende destinasjonsklient. I dette tilfellet er klienten vår Node-Red. CloudMQTT -tjenesten setter opp et brukernavn og passord for serveren deres, så vi er garantert en høyere sikkerhet. I utgangspunktet betyr det at bare de med brukernavn og passord kan få tilgang til denne spesifikke CloudMQTT -tjenesten. Brukernavnet og passordet er avgjørende når du setter opp tilkoblingen på ESP8266-koden, så vel som Node-Red.

Den løpende statistikken for meldingene Broker mottar er en hyggelig funksjon, som kan brukes til å se hvor godt abonnementsplanen din håndterer informasjonen den sender.

En fin funksjon er muligheten til å sende meldinger fra megleren til WiFi -modulen, men vi brukte ikke dem i dette prosjektet.

Trinn 9: Hobbyelektronikk

Før vi begynte, visste vi fra et tidligere prosjekt at servostyringsservoen kunne styres fra en Arduino med et PWM -signal, som har lignende ledninger og kobler til forskjellige kanaler på samme lagerradiomottaker, antok vi elektronisk hastighetskontroll, (ESC fra nå), som styrer motoren, kan på samme måte styres via PWM fra Arduino.

For å teste denne teorien bruker vi en liten Arduino -skisse. Skissen leser en analog inngang fra et potensiometer, gjenspeiler verdien fra 0, 1024 til 0, 255 og sender den resulterende verdien til en PWM -pin, ved hjelp av analogWrite () mens R/C -bilen var på en liten boks, og hadde hjul fjernet.

Etter å ha feid gjennom rekkevidden på grytemåleren, så det ut til at ESC våknet, og vi kunne stryke den opp og ned, vi lot også Arduino skrive ut verdiene til den serielle tilkoblingen, slik at vi kunne overvåke dem.

ESC syntes ikke å like verdier under en viss terskel, i dette tilfellet 128. Den så på signalet 191 som nøytral gass, og 255 var maksimal gass.

Vi trengte ikke å variere hastigheten på kjøretøyet, og vi hadde det perfekt med den laveste hastigheten som ville få den til å bevege seg. 192 var den laveste verdien som ville slå motoren, men vi har ennå ikke satt sammen alt og er usikre på om denne effekten ville være nok til å flytte kjøretøyet etter sluttmontering, men det bør være trivielt å angi en litt større verdi.

Å omgå potensiometeret og sette inn fast verdi i koden fungerte imidlertid ikke. ESC -aksjen blinker ganske enkelt og vil ikke snurre motoren, 'juster gasspjeldet' i henhold til manualen.

Rasende feilsøking, kaste forskjellige verdier på det, bruke forskjellige ledninger og til og med eksperimentere med å endre PWM -frekvensen som Arduino bruker, resulterte i mer raritet.

Det så ut til å være et intermitterende problem, noen ganger kjørte det, andre ganger nektet det å gjøre noe. Det fortsatte ganske enkelt å blinke. En test med den originale kontrolleren og mottakeren bekreftet at ESC fremdeles fungerte akkurat slik den var beregnet, noe som gjorde problemene enda merkeligere. Høyere verdier, den ignorerte og fortsatte å blinke, lavere verdier ESC gikk tilbake til å skinne en lykkelig grønn, men svingte fortsatt ikke.

Hva var forskjellig fra oppsettet med potensiometeret, eller aksjesenderen og mottakeren, og versjonen som ga faste verdier?

Noen ganger overlapper egentlig ikke det som er ment og det fungerer som forventet mye på Venn -diagrammet. I dette tilfellet, som et leketøy, bør det ikke være noen sjanse for at modellen bare tar av eller knekker fingre eller får hår fanget i hjulene eller drivliner når modellen slås på, selv om noe som å holde senderen på en merkelig måte har gasspaken inne annen posisjon enn nøytral.

'Juster gasspjeldet', det er akkurat det det betyr. ESC venter et nøytralt signal når den slås på, før den får at den ikke vil gjøre noe. Normalt vil senderen alltid være i nøytral når ESC er slått på, og derfra vil den gjerne kjøre. Hvis det ikke er det, er det sannsynligvis tilbake på nøytral minst en gang da modellen er fast på bakken og føreren føler seg klar til å løpe.

Mens vi brukte potensiometeret, feide vi gjennom områder, og da begynte det å fungere. Det bare bevæpnet da potensiometeret feide forbi nøytral posisjon, og så fungerte det.

Lavere intervaller syntes imidlertid fortsatt å misnøye ESC. Dette viser seg å være et produkt av PWM -driftssyklusene.

Enten etter design eller gjort av en teknisk årsak, ignorerer både styreservoen og ESC signaler under 50% driftssykluser. Dette kan være i tilfelle mottakeren/senderen slutter å fungere eller går tom for strøm, vil modellen gå tilbake til nøytral og ikke ta av i avstanden på full revers gass. På samme måte roterer servoen bare 180 grader og trenger ikke hele rekkevidden.

Med denne nye kunnskapen i hånden, ble en ny Arduino -skisse opprettet. Den første versjonen godtar strenger som er lagt inn i seriell skjerm, konverterer den til et heltall og flytter den til PWM -pinnen ved hjelp av servobiblioteket og skriver ()*. Hvis en ny verdi er angitt i den serielle skjermen, oppdateres skrive () -verdien.

Under testing ble Traxxas ESC lager erstattet med en Mtroniks G2 Micro, men de burde fungere det samme, selv om eksakte verdier kan være litt forskjellige.

Dette biblioteket behandler ESC som en servo, dette er tilsynelatende fint. Skrive () -funksjonen fra Servo.h -biblioteket går fra 0 til 180, det forventede tilkoblingssignalet forventes å være rundt midten.

G2 Micro -armene skriver () i en rekke verdier nær 90, men det var vanskelig å finne ut, da det ser ut til å "huske" å ha vært bevæpnet.

Traxxas VXL-s3 forventes å aktivere til en skrive () verdi på 91.

Etter tilkoblingssignalet godtok enten ESC PWM -signaler med glede, uansett hvilke Arduino -funksjoner som ble kalt for å generere dem, og styrer motoren deretter.

Apropos funksjoner; standard analogWrite (), samt write () og writeMicroseconds () fra Servo.h -biblioteket kan alle brukes om hverandre, bare husk hva som gjør hva, og til syvende og sist er det ikke annet enn pliktssyklus som betyr noe. WriteMicroseconds () kan brukes hvis større granularitet er nødvendig, bare husk at området her er fra 1000 til 2000, med tilkobling eller 'nøytral' forventet å være på 1500. Med standard analogWrite () forventes det brukbare området til være fra 128 til 255 med rundt 191 som nøytrale.

Anbefalt: