Indholdsfortegnelse:

UCL Embedded - B0B Linefollower: 9 trin
UCL Embedded - B0B Linefollower: 9 trin

Video: UCL Embedded - B0B Linefollower: 9 trin

Video: UCL Embedded - B0B Linefollower: 9 trin
Video: How To Make A DIY Arduino Obstacle Avoiding Car At Home 2024, Juli
Anonim
UCL Embedded - B0B Linefollower
UCL Embedded - B0B Linefollower

Dette er B0B.*

B0B er en generisk radiostyret bil, der midlertidigt tjener grundlaget for en robot, der følger en linje.

Som så mange Line-følgende robotter før ham, vil han gøre sit bedste for at blive på en linje forårsaget af en overgang mellem gulvet og et kontrastmateriale, i vores tilfælde gaffatape.

I modsætning til så mange andre Line-følgende robotter indsamler B0B også data og sender dem via WiFi.

Helt overkill for et hobbyprojekt, det involverer en række emner, du måske synes er interessante. Denne vejledning beskriver hans fødsel, hans funktioner og hvordan du kan få en til at ligne ham.

Det indebærer også at være vred på forskellige elektronikker for ikke at fungere som vi ville have dem, og de skridt vi tog for at overvinde disse vanskeligheder, (jeg ser på dig ESP 8266-01).

Der er 2 koder til at få projektet til at fungere. Den første kode er til ESP8266 -modulet, som vi bruger Arduino som programmerer, og den anden kode vil køre på Arduino.

Trin 1: Komponenter

Til dette projekt skal du bruge:

Hardware:

• 1x radio controller bil, (skal have ESC og styreservo).

Vi brugte en hovedsagelig Traxxas 1/16 E-Revo VXL, mest fordi det var det, vi havde, og var ganske sikre på, at vi ville kunne styre det med en Arduino. Også fordi det ender med en ikke ubetydelig mængde ekstra hardware, var vi overbeviste om, at dette ikke ville være et problem for 1/16 E-Revo.

De fleste radiostyrede biler (der let kan skilles ad) kunne dog sandsynligvis bruges i stedet, og processen vil være meget ens.

• Et ton gaffatape.

Farven skal kontrastere gulvet så meget som muligt. I vores testmiljø brugte vi hvid tape på et mørkt gulv.

• 1x Arduino Mega 2560.

Mindre Arduino'er er sandsynligvis også fine, men du bliver presset efter stifter.

• 1x stort brødbræt.

Den ene er nok, men vi havde også en mindre til at adskille de andre spændingsledninger for at reducere risikoen for brugerfejl.

• 1x TCRT5000 IR analog sensor (bruges til at undgå kollision).

Det nøjagtige mærke/model er ligegyldigt, om det er Arduino -kompatibelt og måler afstand. Søg efter søgeord som f.eks. “Distance”, “hinder” sensor. Teknisk ville en digital sensor også fungere med mindre kodeændringer, men vi bruger en analog.

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

Den ene er en nødvendighed for linjefølgeren. Den nøjagtige model er ligegyldig, så længe den ser på intensiteten af reflekteret lys og udsender et analogt signal. Det andet for 'rum' -registrering det fungerede ikke så godt som forventet og kan udelades, eller et alternativ, ligesom en RGB -farvesensor kan findes, formodentlig for bedre effekt. Vi mangler endnu at teste dette.

• 1 x ESP 8266-01.

Der er mange versioner af ESP 8266 til rådighed. Vi har kun erfaring med 8266-01 og kan ikke garantere, at ESP-koden fungerer med en anden version.

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

Teknisk valgfrit, men hvis du ikke bruger dette, bliver alt, der involverer Wi-Fi-modulet, meget mere kompliceret. Guiden vil dog antage, at du har dette (hvis ikke, finder du vejledningerne online for korrekt tilslutning af ESP-01 til Arduino), da det kan gøre og sandsynligvis beskadige modulet, hvis du gør dette forkert.

• Batterier til selve køretøjet og batterier til strømforsyning af tilføjelseselektronikken.

Vi brugte et par 2,2 AH kapacitet, 7,4 V Lipo -batterier parallelt med at drive alt. Du bør være i stand til at bruge de batterier, du normalt ville bruge til dit køretøj. Hvis du er over 5V, men under 20V, er kapacitet vigtigere end nominel spænding.

• En masse jumperkabler.

Jeg har opgivet at tælle det nøjagtige antal af disse. Hvis du synes, du har nok, har du det sandsynligvis ikke.

• Til sidst skal du montere Arduino, sensorerne, brødbrættet (r) og Wi-Fi-modulet på det køretøj, du ønsker. Dit resultat vil variere afhængigt af, hvad du bruger som base, og hvilke materialer der er tilgængelige.

Vi brugte:

• Lynlåse.

• Noget superlim.

• Små stykker skrotpapir/harpiksrør havde vi med en passende diameter.

• En gammel Masonite bagplade fra en billedramme, skåret i størrelse.

• Lidt mere gaffatape.

• Alle nødvendige værktøjer til at arbejde på din radiostyrede bil efter eget valg.

Vi brugte mest et lille skruetrækkersæt med flere bits, men måtte lejlighedsvis trække det værktøjssæt, der fulgte med bilen, ud.

Software:

• Knude-rød

En vigtig del af dataindsamlingen.

• En MQTT -server.

Midtmanden mellem vores køretøj og Node-rød. Til at begynde med brugte vi test.mosquitto.org til test

Senere brugte vi:

• CloudMQTT.com

Dette var meget mere pålideligt, hvilket mere end kompenserede for at være lidt mere kompliceret at konfigurere.

• WampServer.

Den sidste del af dataindsamlingen. Specifikt vil vi bruge dens SQL -database til at gemme vores indsamlede data.

Trin 2: Elektrisk diagram

Elektrisk diagram
Elektrisk diagram

Trin 3: Fysisk konstruktion

Fysisk konstruktion
Fysisk konstruktion
Fysisk konstruktion
Fysisk konstruktion
Fysisk konstruktion
Fysisk konstruktion

Vores løsning har en ligetil tilgang til fysisk samling.

Den originale modtager og dens vandtætte kabinet blev fjernet fra RC -bilen, da den ikke er nødvendig.

Vi fandt ud af, at der var et passende sted mellem forhjulene til vores line follow -sensor, så vi holdt den på plads ved at sløjfe en lynlås over frontpladen.

Sensoren, vi bruger til antikollision, er på en måde klemt ind bag den forreste kofanger. Det er stadig beskyttet mod stød, og dets friktion passer. Det ender med at se fremad i en aldrig så lille opadgående vinkel. Det er perfekt.

Masonitpladen, (bagplade fra gammel billedramme), på toppen har små sektioner af papir/harpiksrør skåret i størrelse og limet på bunden. Disse flugter med holderne til kropsstolperne og sidder simpelthen ovenpå og holder alt sikkert. Forudsat at limen, der fastgør røret til pladen, holder, og at den ikke vipper for meget, forbliver dette på plads. Det er også værd at bemærke, at pladen er inden for den beskyttende sfære af hjulene og kofangerne. Arduino Mega og de to brødbrædder er blevet fastgjort til tallerkenen med enten dobbelt sidebånd, eller med en løkke med kanaltape, der er sløjfet rundt, limes ud.

Der er ikke truffet særlige foranstaltninger for at sikre WiFi-modulet. Det er ikke vores, så limning eller taping det blev anset for unødvendigt, da det er så let, at det ikke bevæger sig meget rundt, og ledningerne er nok til at holde det på plads.

Endelig har vi en sensor til at detektere 'rum', som blev ziptied til ophængskomponenterne af et af baghjulene. Under drift skal dette være væk fra den linjemarkering, som køretøjet bruger til at navigere.

Trin 4: ESP8266 -modul

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

WiFi -modulet, ESP8266, kræver to forskellige pin -opsætninger. Et setup skal bruges, når modulet blinker med et nyt program og bruger Arduino Mega 2560 som programmerer. Den anden opsætning er til modulet, når det er i brug og sender oplysninger til MQTT -mægleren.

Ved hjælp af Arduino IDE til at uploade kode til ESP8266 -modulet skal du installere en board manager og en ekstra boards manager

Under board manager installer esp8266 board manager. Det vil let blive fundet ved at søge "esp". Det er afgørende, at du installerer version 2.5.0, ikke ældre, ikke nyere.

Under indstillinger i yderligere boards manager URL'er skal du kopiere i denne linje:

arduino.esp8266.com/stable/package_esp8266c…

For at kunne uploade noget til ESP8266 -modulet skal du bruge en bestemt pin -opsætning, så du kan blinke modulet. Dette skal gøres hver gang du vil foretage en ændring af den aktuelle kode, der kører på modulet. Glem ikke at vælge det korrekte ESP8266 -modul fra board manager, før modulet blinker. I dette projekt valgte vi det generiske ESP8266 -bord. Pin -opsætningen til at blinke modulet findes på det første billede i dette segment.

Efter at have blinket ESP8266 -modulet skal du skifte pin -opsætningen. Du kan også vælge at bruge en adapter til at gøre opsætningen lettere for dig. I dette projekt valgte vi at have en adapter, når vi havde modulet kørende. Pin -opsætningen med adapter findes på det andet billede i dette segment.

Koden, der skal blinkes på ESP8266 -modulet, opsætter forbindelsen til en WiFi og en MQTT -mægler, i dette tilfælde med et brugernavn og en adgangskode, men kan gøres uden, hvis du foretager de nødvendige ændringer beskrevet i kodens kommentarer. Til dette projekt krævede vores mægler et brugernavn og en adgangskode for at fungere. Modulet læser indgående meddelelser fra den serielle port, som det er tilsluttet. Det vil læse hver ny linje oprettet af Arduino -koden, dechiffrere meddelelsen og genskabe meddelelsen. Derefter sender den beskeden til MQTT -mægleren, der er angivet i koden. Koden til ESP8266 -modulet:

Trin 5: Arduino

Efter at have konfigureret WiFi -modulet, ser vi på det program, der skal bruges til at styre motoren og servoen på RC -bilen. Bilen kommer til at reagere i henhold til en gråtonet information fra den centrale sensor, også kendt som "Line Detector" i dette projekt. Formålet er ganske enkelt at holde oplysningerne fra linjedetektoren tæt på en forudindstillet værdi, der svarer til de oplysninger, der er registreret ved skiftet mellem lys og mørke eller i dette projekt, hvide og sorte. Så hvis værdien adskiller sig for meget væk, vil det tilsvarende output til servoen styre bilen nær den forudindstillede værdi af linjen.

Programmet har to knapper, der fungerer som start- og stopknap til RC -bilen. Teknisk er "stop" -knappen en "tilkobling" -knap, der udtrykt svarer til en PWM -værdi, der sendes til motoren, der får RC -bilen til at standse. Startknappen sender en PWM -værdi, der svarer til RC -bilen, der næsten ikke bevæger sig fremad, da den vil køre for hurtigt, hvis den får for meget momentum.

En kollisionsforebyggelsesdetektor tilføjes til forenden af RC-bilen for at registrere, om vejen frem er fri eller blokeret. Hvis den er blokeret, stopper RC -bilen, indtil forhindringen er væk/fjernet. Det analoge signal fra detektoren bruges til at bestemme, om noget blokerer vejen eller ej, og det stilles som et kriterium for at kunne bevæge sig fremad og standse.

En sekundær gråskalsensor, "Rumdetektor", bruges til at registrere hvilket rum RC -bilen er kommet ind i. Det fungerer på et lignende princip som linjedetektoren, men det leder ikke efter ændringen mellem lys og mørke, men snarere efter værdier inden for et specifikt område, der svarer til forskellige rum afhængigt af værdien set fra rumdetektoren.

Endelig opretter programmet en informationslinje fra sensorerne til WiFi -modulet til at læse og derefter sende til MQTT Broker. Informationslinjen oprettes som en streng og skrives til den tilhørende serie, som WiFi -modulet er tilsluttet. Det er vigtigt, at skrivningen til føljetonen kun sker så ofte som WiFi -modulet kan læse den indgående meddelelse, men husk ikke at bruge nogen forsinkelser i denne kode, da det vil forstyrre RC -bilens evne til at følge linjen. Brug i stedet "millis", da det vil tillade programmet at køre uden forsinkelse, men efter at en bestemt mængde millis er gået siden Arduino blev tændt, vil det skrive en besked til føljetonen uden at blokere koden på samme måde som forsinkelse gør.

Koden til Arduino Mega 2560:

Trin 6: MySQL -database

WampServer er et webudviklingsmiljø til Windows, der giver os mulighed for at oprette applikationer med PHP og en MySQL -database. PhpMyAdmin giver os mulighed for at styre vores databaser på en nem måde.

For at komme i gang skal du gå til:

I dette projekt bruger vi version 3.17 x64 bit til Windows. Efter installationen skal du kontrollere, at alle tjenester kører, hvilket betyder, at det lille ikon bliver grønt i stedet for rødt eller orange. Hvis ikonet er grønt, kan du få adgang til PhpMyAdmin for at administrere din MySQL -database.

Få adgang til MySQL ved hjælp af PhpMyAdmin, og opret en ny database. Nævn det noget passende, som du kan huske, i dette projekt blev det kaldt “line_follow_log”. Efter oprettelse af databasen skal du oprette en tabel i databasen. Sørg for, at antallet af kolonner passer. I projektet bruger vi 4 kolonner. En kolonne er til et tidsstempel, og de sidste tre bruges til at gemme data fra køretøjet. Brug en korrekt datatype for hver kolonne. Vi brugte "langtekst" til tidsstempelkolonnen og "mellemtekst" til resten.

Det burde være alt hvad du skal gøre i PhpMyAdmin og MySQL. Husk din database og tabellen til afsnittet om Node-Red.

Trin 7: Node-rød

For at håndtere dataindsamling bruger vi et ret simpelt flow i Node-red. Den opretter forbindelse til vores MQTT -server og skriver til vores MYSQL -database.

For at gøre dette har vi brug for et par paletter til forskellige funktioner til at fungere, og vi har brug for en egentlig kode for at den kan køre.

Første ting først. Vi skal bruge følgende paller.

Node-red-contrib-mqtt-broker: Dette er forbindelsen til vores MQTT-mægler.

Node-red-dashboard: Vores Dashboard, der er nødvendigt for visuelt at repræsentere de indsamlede data.

Node-red-node-mysql: Vores forbindelse til SQL-databasen.

Dette er ikke beregnet til at være en fuldgyldig guide til Node-red, men jeg vil forklare, hvad Node-rød flow gør.

Tidligt havde vi problemer med vores MQTT -server, der valgte at dø/afbryde forbindelsen, tilsyneladende tilfældigt, hvilket gjorde at foretage ændringer til et frustrerende forsøg, da det var uklart, om ændringerne havde været gavnlige eller ej, da vi ikke kunne se resultatet. Så knappen 'døde serveren?' injicerer 'Nej' følgende blok injicerer den til vores MQTT -server. Hvis det ikke er dødt, vises 'Nej' i vinduet Debug. Dette gøres ikke kun for at teste, men for at tvinge Node-red til at forsøge at genoprette forbindelse til MQTT-serveren.

'Teststrengen' sender en kostumstreng til MQTT -mægleren. Vi formaterede denne streng til at ligne den, vi ville få fra Arduino. Dette skulle have en lettere tid til at konfigurere det netværk, der afkoder meddelelserne, uden at skulle have projektet til at køre, indsamle data.

Det sidste flow i arbejdsområdet kan opdeles i to segmenter. Den nederste gren læser simpelthen de indgående meddelelser, sender dem til fejlfindingsvinduet og gemmer dem på SQL -serveren.

Det store netværk af tilsluttede switche følger en funktionsnode, hvis den virkelige 'magi' sker.

Den videre funktion læser den indgående streng, deler den op med hver semikolon og sender sektionerne ud på hver af outputene. De følgende kontakter leder efter en af to forskellige indgående oplysninger. Et specifikt stykke information passeres altid ud af det ene output, den anden mulighed forlader det andet output. Efter det er en anden gruppe af switchblokke. De aktiveres kun med et specifikt input og sender noget andet ud.

Et eksempel, 'forhindring', ligesom alle de andre er et binært valg, er det enten klart at køre, eller det er det ikke. Så den vil modtage en 0 eller en 1. En 0 vil blive sendt til den 'klare' gren, en 1 vil blive sendt til den 'Obstruerede' gren. Omskifteren 'Ryd', 'Hæmmet' sender, hvis den er aktiveret, noget specifikt, henholdsvis klart eller forhindret. De grønne procedureblokke vil blive indsendt i fejlfindingsvinduet, den blå vil skrive til vores dashboard.

Filerne "status" og "placering" fungerer nøjagtig det samme.

Trin 8: MQTT -mægler

En mægler er en server, der sender beskeder fra klienter til de passende destinationsklienter. En MQTT -mægler er en, hvor klienterne bruger et MQTT -bibliotek til at oprette forbindelse til mægleren over et netværk.

Til dette projekt oprettede vi en MQTT -mægler ved hjælp af CloudMQTT -tjenesten med gratis abonnement på en "Cute Cat" -version. Det har sin begrænsning, men vi overskrider ikke dem i dette projekt. WiFi -modulet kan oprette forbindelse til mægleren, og mægleren sender derefter beskederne til en passende destinationsklient. I dette tilfælde er klienten vores Node-Red. CloudMQTT -tjenesten opretter et brugernavn og en adgangskode til deres server, så vi er garanteret en højere sikkerhed. Grundlæggende betyder det, at kun dem med brugernavn og adgangskode kan få adgang til denne specifikke CloudMQTT -service. Brugernavn og adgangskode er afgørende, når du opretter forbindelsen på ESP8266-koden samt Node-Red.

Den løbende statistik for de meddelelser, mægleren modtager, er en behagelig funktion, som kan bruges til at se, hvor godt din abonnementsplan håndterer de oplysninger, den sender.

En god funktion er muligheden for at sende beskeder fra mægleren til WiFi -modulet, men vi brugte dem ikke i dette projekt.

Trin 9: Hobbyelektronik

Inden vi begyndte vidste vi fra et tidligere projekt, at servostyringsservoen kunne styres fra en Arduino med et PWM -signal, med lignende ledninger og tilslutning til forskellige kanaler på den samme lagerradiomodtager, vi antog den elektroniske hastighedskontrol, (ESC fra nu), der styrer motoren, kunne på samme måde styres via PWM fra Arduino.

For at teste denne teori udarbejder vi en lille Arduino -skitse. Skitsen læser en analog indgang fra et potentiometer, ændrer værdien fra 0, 1024 til 0, 255 og sender den resulterende værdi til en PWM -pin ved hjælp af analogWrite (), mens R/C -bilen havde på en lille kasse, og havde den hjul fjernet.

Efter at have gennemgået rækkevidden på pulsmåleren syntes ESC at 'vågne', og vi kunne drosle det op og ned, vi havde også Arduino til at udskrive værdierne til den serielle forbindelse, så vi kunne overvåge dem.

ØSU syntes ikke at kunne lide værdier under en bestemt tærskel, i dette tilfælde 128. Det så signalet 191 som neutral gas, og 255 var maksimal gas.

Vi behøvede ikke at variere bilens hastighed og havde det perfekt til at køre med den laveste hastighed, der ville få det til at bevæge sig. 192 var den laveste værdi, der ville dreje motoren, men vi mangler endnu at samle alt og er usikre på, om denne ydelse ville være nok til at flytte køretøjet efter den sidste samling, men indtastning af en lidt større værdi burde være triviel.

At omgå potentiometeret og indsætte en fast værdi i koden fungerede dog ikke. Lagerets ESC blinkede simpelthen og ville ikke dreje motoren, 'juster gasspjældet' i henhold til manualen.

Rasende fejlfinding, kaste forskellige værdier på det, bruge forskellige ledninger og endda eksperimentere med at ændre PWM -frekvensen, Arduino bruger, resulterede i mere underlighed.

Det syntes at være et intermitterende problem, nogle gange ville det køre, andre gange nægtede det at gøre noget. Det fortsatte simpelthen med at blinke. En test med den originale controller og modtager bekræftede, at ESC stadig fungerede præcis efter hensigten, hvilket gjorde problemerne endnu fremmed. Højere værdier, det ignorerede og blev ved med at blinke, lavere værdier gik ESC tilbage til at skinne en glad grøn, men vendte stadig ikke.

Hvad var anderledes end opsætningen med potentiometeret, eller lagersenderen og modtageren, og den version, der gav faste værdier?

Nogle gange overlapper arbejdet efter hensigten og arbejdet som forventet ikke rigtig meget på Venn -diagrammet. I dette tilfælde, som et legetøj, bør der ikke være nogen chance for, at modellen simpelthen tager af eller knækker fingre eller får hår fanget i hjulene eller driver tog, når modellen tænder, selvom noget som at holde senderen underligt har gashåndtaget i enhver anden position end neutral.

'Juster gasspjældet', det er præcis, hvad det betyder. ØSU forventer et neutralt signal, når det tændes, før det får, at det ikke vil gøre noget. Normalt ville senderen altid være i neutral, når ESC er tændt og derfra med glæde vil køre. Hvis det ikke er tilfældet, er det sandsynligvis tilbage i neutral mindst en gang, da modellen er fast på jorden, og føreren føler sig klar til at køre.

Mens vi brugte potentiometeret, fejede vi gennem intervaller, og så begyndte det at fungere. Det aktiverede ganske enkelt, da potentiometeret fejede forbi den neutrale position, og derefter virkede det.

Lavere intervaller syntes dog stadig at være utilfredse med ESC. Dette viser sig at være et produkt af PWM -driftscyklusser.

Enten ved design eller udført af en teknisk årsag ignorerer både styreservoen og ESC signaler under 50% driftscyklusser. Dette kan være i tilfælde af, at modtageren/senderen holder op med at fungere eller løber tør for strøm, ville modellen vende tilbage til neutral og ikke starte i afstanden ved fuld omvendt gas. På samme måde roterer servoen kun 180 grader og behøver ikke hele området.

Med denne nye viden i hånden blev der skabt en ny Arduino -skitse. Den oprindelige version accepterer strenge, der er indtastet i den serielle skærm, konverterer det til et helt tal og flytter det til PWM -pin, ved hjælp af servobiblioteket og skriver ()*. Hvis der indtastes en ny værdi i den serielle skærm, opdateres værdien skrive ().

Under testning blev Traxxas ESC -lageret udskiftet med en Mtroniks G2 Micro, men de skulle fungere det samme, selvom de nøjagtige værdier kan være lidt forskellige.

Dette bibliotek behandler ESC som en servo, det er tilsyneladende fint. Funktionen write () fra Servo.h -biblioteket går fra 0 til 180, det forventede tilkoblingssignal forventes at være omkring midten.

G2 Micro -armene ved en skrivning () i en række værdier nær 90, men det var svært at identificere, da det ser ud til at 'huske' at have været bevæbnet.

Traxxas VXL-s3 forventes at aktivere til en skriveværdi () på 91.

Efter tilkoblingssignalet accepterede enten ESC gladeligt PWM -signaler, uanset hvilke Arduino -funktioner, der blev kaldt til at generere dem, og styrer motoren i overensstemmelse hermed.

Apropos funktioner; standard analogWrite (), samt write () og writeMicroseconds () fra Servo.h -biblioteket kan alle bruges i flæng, bare husk på, hvad der gør hvad, og i sidste ende ikke andet end duty cycle betyder noget. WriteMicroseconds () kunne bruges, hvis der kræves større granularitet, bare husk på, at intervallet her er fra 1000 til 2000, med tilkobling eller 'neutral' forventet at være på 1500. Med standard analogWrite () forventes det anvendelige område at være fra 128 til 255, hvor omkring 191 er neutrale.

Anbefalede: