Innehållsförteckning:

UCL Embedded - B0B Lineföljaren: 9 steg
UCL Embedded - B0B Lineföljaren: 9 steg

Video: UCL Embedded - B0B Lineföljaren: 9 steg

Video: UCL Embedded - B0B Lineföljaren: 9 steg
Video: Beyond Neoliberalism: How to Think About Rebuilding the Capacity of the Democratic State 2024, Juli
Anonim
UCL Embedded - B0B Lineföljaren
UCL Embedded - B0B Lineföljaren

Detta är B0B.*

B0B är en generisk radiostyrd bil, som tillfälligt tjänar grunden för en linjeföljande robot.

Liksom så många Line-följande robotar före honom kommer han att göra sitt bästa för att hålla sig på en linje som orsakas av en övergång mellan golvet och ett kontrastmaterial, i vårt fall gaffatejp.

Till skillnad från så många andra linjeföljande robotar samlar B0B också in data och skickar den via WiFi.

Helt överkill för ett hobbyprojekt, det involverar ett antal ämnen som du kan tycka är intressanta. Den här guiden beskriver hans födelse, hans funktioner och hur du kan göra en precis som honom.

Det handlar också om att vara arg på olika elektroniker för att de inte fungerade som vi ville att de skulle göra, och de steg vi tog för att övervinna dessa svårigheter, (jag tittar på dig ESP 8266-01).

Det finns 2 koder för att få projektet att fungera. Den första koden är för ESP8266 -modulen som vi använder Arduino som programmerare, och den andra koden kommer att köras på Arduino.

Steg 1: Komponenter

För detta projekt behöver du:

Hårdvara:

• 1x radiokontrollbil, (måste ha ESC och styrservo).

Vi använde mestadels Traxxas 1/16 E-Revo VXL, mest för att det var vad vi hade och var ganska säkra på att vi skulle kunna styra det med en Arduino. Också eftersom det kommer att sluta med en inte obetydlig mängd extra hårdvara, var vi övertygade om att detta inte skulle vara ett problem för 1/16 E-Revo.

Men de flesta radiostyrda bilar (som enkelt kan tas isär) skulle troligen kunna användas istället, och processen kommer att vara väldigt lik.

• Massor av tejp.

Färgen ska kontrastera golvet så mycket som möjligt. I vår testmiljö använde vi vit tejp på ett mörkt golv.

• 1x Arduino Mega 2560.

Mindre Arduino är förmodligen också bra, men du kommer att pressas för stift.

• 1x stort brödbräda.

En räcker, men vi hade också en mindre för att skilja ut de andra spänningsledningarna för att minska risken för användarfel.

• 1x TCRT5000 IR analog sensor (används för att undvika kollisioner).

Det exakta märket/modellen spelar ingen roll om den är Arduino -kompatibel och mäter avstånd. Sök efter nyckelord som”Avstånd”,”hinder” -sensor. Tekniskt sett fungerar en digital sensor lika bra med mindre kodändringar, men vi använder en analog.

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

En är en nödvändighet för linjeföljaren. Exakt modell spelar ingen roll, så länge den tittar på intensiteten hos reflekterat ljus och matar ut en analog signal. Det andra för "rum" -detektering fungerade inte så bra som förväntat och kan utelämnas, eller ett alternativ, som att en RGB -färgsensor kan hittas, förmodligen för bättre effekt. Vi har ännu inte testat detta.

• 1 x ESP 8266-01.

Det finns många versioner av ESP 8266 tillgängliga. Vi har bara erfarenhet av 8266-01 och kan inte garantera att ESP-koden fungerar med en annan version.

• 1 x ESP8266-01 Wi-Fi-sköld.

Tekniskt valfritt, men om du inte använder detta blir allt som rör Wi-Fi-modulen mycket mer komplicerat. Guiden kommer dock att anta att du har detta (om inte, hitta guiderna online för korrekt anslutning av ESP-01 till Arduino), eftersom att göra detta på fel sätt kan och troligen kommer att skada modulen.

• Batterier för själva fordonet och batterier för att driva tilläggselektroniken.

Vi använde ett par 2,2 AH kapacitet, 7,4 V Lipo -batterier parallellt för att driva allt. Du bör kunna använda de batterier du normalt skulle använda med ditt valda fordon. Om du är över 5V men under 20V är kapaciteten viktigare än nominell spänning.

• Många bygelkablar.

Jag har gett upp att räkna det exakta antalet av dessa. Om du tror att du har tillräckligt, har du förmodligen inte.

• Slutligen, för att fästa allt, måste du montera Arduino, sensorerna, brödbrädorna och Wi-Fi-modulen till det fordon du väljer. Ditt resultat varierar beroende på vad du använder som bas och vilket material som finns tillgängligt.

Vi använde:

• Buntband.

• Lite superlim.

• Små bitar av pappers-/hartsrör vi hade med lämplig diameter.

• En gammal Masonite -bakplatta från en tavelram, kapad i storlek.

• Lite mer gaffatejp.

• Alla verktyg som behövs för att arbeta på din radiostyrda bil.

Vi använde mest en liten skruvmejselsats med flera bitar, men var ibland tvungen att dra ut verktygsuppsättningen som följde med bilen.

Programvara:

• Nodröd

En viktig del av datainsamlingen.

• En MQTT -server.

Mellanmannen mellan vårt fordon och Node-red. Till en början använde vi test.mosquitto.org för testning

Senare använde vi:

• CloudMQTT.com

Detta var mycket mer pålitligt vilket mer än kompenserade för att vara lite mer komplicerat att konfigurera.

• WampServer.

Den sista delen av datainsamlingen. Specifikt kommer vi att använda dess SQL -databas för att lagra vår insamlade data.

Steg 2: Elektriskt diagram

Elektrisk diagram
Elektrisk diagram

Steg 3: Fysisk konstruktion

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

Vår lösning har en rak metod för fysisk montering.

Den ursprungliga mottagaren och dess vattentäta hölje togs bort från RC -bilen, eftersom den inte behövs.

Vi fann att det fanns en lämplig plats mellan framhjulen för vår line follow -sensor, så vi höll den på plats genom att slinga en dragkedja ovanför den främre skidplattan.

Sensorn som vi använder för antikollision är liksom inklämd bakom den främre stötfångaren. Det skyddas fortfarande mot stötar och dess friktionspassning. Det slutar att se framåt i en någonsin så liten uppåtgående vinkel. Detta är perfekt.

Masonitplattan, (bakplatta från gammal bildram), på toppen har små sektioner av papper/hartsrör klippt till storlek och limmat på botten. Dessa ligger i linje med fästena för karossstolparna och sitter helt enkelt ovanpå och håller allt säkert. Antar att limet som fäster röret på plattan håller, och att det inte lutar för mycket, kommer detta att förbli på plats. Det är också värt att notera att plattan ligger inom skyddssfären på hjulen och stötfångarna. Arduino Mega och de två brödbrädorna har fästs på plattan med antingen dubbel tejp på sidan, eller med en ögla med gängtejp runt, limma ut.

Inga särskilda åtgärder har vidtagits för att säkra WiFi-modulen. Det är inte vårt, så att limma eller tejpa fast det ansågs onödigt eftersom det är så lätt att det inte rör sig mycket, och trådarna räcker för att hålla det på plats.

Slutligen har vi en sensor för att upptäcka "rum", som zippades till upphängningskomponenterna med ett av bakhjulen. Under drift måste detta vara borta från linjen som fordonet använder för att navigera.

Steg 4: ESP8266 -modul

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

WiFi -modulen, ESP8266, kräver två olika stiftkonfigurationer. En inställning ska användas när modulen blinkar med ett nytt program och använder Arduino Mega 2560 som programmerare. Den andra inställningen är för modulen när den används och skickar information till MQTT -mäklaren.

Om du använder Arduino IDE för att ladda upp kod till ESP8266 -modulen måste du installera en styrelsehanterare och en ytterligare styrelsehanterare

Under board manager installera esp8266 board manager. Det kommer lätt att hittas genom att söka "esp". Det är viktigt att du installerar version 2.5.0, inte äldre, inte nyare.

Under inställningar i ytterligare styrelsehanterares webbadresser, kopiera på den här raden:

arduino.esp8266.com/stable/package_esp8266c…

För att kunna ladda upp något till ESP8266 -modulen måste du använda en specifik pin -inställning så att du kan blinka modulen. Detta måste göras varje gång du vill göra en ändring av den aktuella koden som körs på modulen. Glöm inte att välja rätt ESP8266 -modul från korthanteraren innan du blinkar modulen. I detta projekt valde vi det generiska ESP8266 -kortet. Stiftinställningen för att blinka modulen finns på den första bilden i detta segment.

Efter att ha blinkat ESP8266 -modulen måste du byta stiftinställning. Du kan också välja att använda en adapter för att göra installationen enklare för dig. I detta projekt valde vi att ha en adapter när vi hade modulen igång. Stiftkonfigurationen med adapter finns på den andra bilden i detta segment.

Koden som ska blinkas till ESP8266 -modulen ställer in anslutningen till en WiFi och en MQTT -mäklare, i detta fall med ett användarnamn och lösenord, men kan göras utan om du gör de nödvändiga ändringar som beskrivs i kodens kommentarer. För detta projekt krävde vår mäklare ett användarnamn och lösenord för att fungera. Modulen läser inkommande meddelanden från den seriella porten som den är ansluten till. Den kommer att läsa varje ny rad som skapas av Arduino -koden, dechiffrera meddelandet och återskapa meddelandet. Därefter skickar det meddelandet till MQTT -mäklaren som har specificerats i koden. Koden för ESP8266 -modulen:

Steg 5: Arduino

Efter att ha konfigurerat WiFi -modulen tittar vi på programmet som kommer att användas för att styra motorn och servon på RC -bilen. Bilen kommer att reagera enligt en gråskalainformation från den centrala sensorn, även känd som "Line Detector" i detta projekt. Helt klart syftar den till att hålla informationen från linjedetektorn nära ett förinställt värde som motsvarar informationen som registrerats vid förändringen mellan ljus och mörk eller i detta projekt, vitt och svart. Så om värdet skiljer sig för mycket bort, kommer motsvarande utgång till servon att styra bilen nära det förinställda värdet på linjen.

Programmet har två knappar som fungerar som start- och stoppknapp för RC -bilen. Tekniskt är "stopp" -knappen en "tillkoppling" -knapp som i termer motsvarar ett PWM -värde som skickas till motorn som får RC -bilen att stanna. Startknappen skickar ett PWM -värde som motsvarar RC -bilen som knappt går framåt eftersom den kommer att köra för fort om den får för mycket fart.

En kollisionsundvikande detektor läggs till på framsidan av RC-bilen för att upptäcka om vägen framåt är klar eller blockerad. Om den är blockerad stannar RC -bilen tills hindret är borta/borttaget. Den analoga signalen från detektorn används för att avgöra om något blockerar vägen eller inte och ställs som kriterier för att kunna gå framåt och stoppa.

En sekundär gråskalsensor, "Room Detector", används för att upptäcka vilket rum RC -bilen har kommit in i. Det fungerar på en liknande princip som linjedetektorn, men det letar inte efter förändringen mellan ljus och mörker, utan snarare efter värden inom ett specifikt intervall som motsvarar olika rum beroende på värdet sett från rumsdetektorn.

Slutligen skapar programmet en rad information från sensorerna för WiFi -modulen att läsa och sedan skicka till MQTT -mäklaren. Informationsraden skapas som en sträng och skrivs till motsvarande följetong som WiFi -modulen är ansluten till. Det är viktigt att skrivningen till serien bara sker så ofta som WiFi -modulen kan läsa det inkommande meddelandet, men kom ihåg att inte använda några förseningar i denna kod eftersom det kommer att störa RC -bilens förmåga att följa linjen. Använd istället "millis" eftersom det tillåter programmet att köras utan dröjsmål men efter att en definierad mängd millis har gått sedan Arduino slogs på, kommer det att skriva ett meddelande till serien utan att blockera koden på samma sätt som fördröjning gör.

Koden för Arduino Mega 2560:

Steg 6: MySQL -databas

WampServer är en webbutvecklingsmiljö för Windows som gör att vi kan skapa applikationer med PHP och en MySQL -databas. Med PhpMyAdmin kan vi hantera våra databaser på ett enkelt sätt.

För att komma igång, gå till:

I detta projekt använder vi version 3.17 x64 bitar för Windows. Efter installationen se till att alla tjänster körs, vilket innebär att den lilla ikonen blir grön istället för röd eller orange. Om ikonen är grön kan du komma åt PhpMyAdmin för att hantera din MySQL -databas.

Öppna MySQL med PhpMyAdmin och skapa en ny databas. Nämn det något lämpligt som du kan komma ihåg, i detta projekt kallades det "line_follow_log". När du har skapat databasen bör du skapa en tabell i databasen. Se till att antalet kolumner passar. I projektet använder vi 4 kolumner. En kolumn är för en tidsstämpel och de tre sista används för att lagra data från fordonet. Använd en korrekt datatyp för varje kolumn. Vi använde "longtext" för tidsstämpelkolumnen och "mediumtext" för resten.

Det borde vara allt du behöver göra i PhpMyAdmin och MySQL. Kom ihåg din databas och tabellen för avsnittet om Node-Red.

Steg 7: Node-Red

För att hantera datainsamling använder vi ett ganska enkelt flöde i Node-red. Den ansluter till vår MQTT -server och skriver till vår MYSQL -databas.

För att göra detta behöver vi några paletter för att olika funktioner ska fungera, och vi behöver en faktisk kod för att den ska kunna köras.

Första sakerna först. Vi behöver följande pallar.

Node-red-contrib-mqtt-broker: Detta är kopplingen till vår MQTT-mäklare.

Node-red-dashboard: Vår instrumentpanel, som behövs för att visuellt representera den insamlade informationen.

Node-red-node-mysql: Vår anslutning till SQL-databasen.

Detta är inte avsett att vara en fullfjädrad guide till Node-red, men jag kommer att förklara vad det Node-röda flödet gör.

Tidigt hade vi problem med att vår MQTT -server valde att dö/kopplas ur, till synes slumpmässigt, vilket gjorde att göra några ändringar till en frustrerande strävan eftersom det var oklart om ändringarna hade varit fördelaktiga eller inte när vi inte kunde se resultatet. Så knappen "Döde servern?" injicerar "Nej" följande block injicerar det till vår MQTT -server. Om den inte är död visas "Nej" i felsökningsfönstret. Detta görs inte bara för att testa, utan för att tvinga Node-red att försöka återansluta till MQTT-servern.

Teststrängen skickar en kostymsträng till MQTT -mäklaren. Vi formaterade den här strängen för att likna den vi skulle få från Arduino. Detta var för att ha lättare att konfigurera nätverket som avkodar meddelandena, utan att behöva ha projektet igång, samla in data.

Det sista flödet i arbetsytan kan delas in i två segment. Den nedre grenen läser helt enkelt de inkommande meddelandena, skickar dem till felsökningsfönstret och sparar dem på SQL -servern.

Det stora nätverket av anslutna switchar som följer en funktionsnod om där den verkliga "magin" händer.

Fortsättningsfunktionen läser den inkommande strängen, delar upp den med varje semikolon och delar sektionerna ut på var och en av utgångarna. Följande switchar letar efter en av två olika inkommande bitar av information. En specifik information delas alltid ut från en utgång, det andra alternativet lämnar den andra utgången. Efter det följer en andra grupp switchblock. De kommer bara att aktiveras med en specifik ingång och mata ut något annat.

Ett exempel, "hinder", liksom alla andra är ett binärt val, är det antingen klart att köra, eller så är det inte. Så det kommer att få en 0, eller en 1. En 0 kommer att skickas till den "klara" grenen, en 1 kommer att skickas till den "Obstruerade" grenen. Omkopplarna 'Rensa', 'Obstruerade' kommer, om de är aktiverade, att mata ut något specifikt, tydligt eller blockerat. De gröna förloppsblocken läggs ut i felsökningsfönstret, det blå skriver till vår instrumentpanel.

Filerna "status" och "plats" fungerar exakt likadant.

Steg 8: MQTT -mäklare

En mäklare är en server som dirigerar meddelanden från klienter till lämpliga destinationsklienter. En MQTT -mäklare är en där klienterna använder ett MQTT -bibliotek för att ansluta till mäklaren via ett nätverk.

För detta projekt skapade vi en MQTT -mäklare med CloudMQTT -tjänsten med gratisabonnemang för en "Cute Cat" -version. Det har sin begränsning men vi överskrider inte dem i detta projekt. WiFi -modulen kan ansluta till mäklaren och mäklaren dirigerar sedan meddelandena till en lämplig destinationsklient. I det här fallet är klienten vår Node-Red. CloudMQTT -tjänsten ställer in ett användarnamn och lösenord för sin server, så vi garanteras en högre säkerhet. I grund och botten betyder det att bara de med användarnamnet och lösenordet kan komma åt denna specifika CloudMQTT -tjänst. Användarnamnet och lösenordet är avgörande när du ansluter anslutningen på ESP8266-koden och Node-Red.

Den löpande statistiken för meddelandena som mäklaren får är en trevlig funktion som kan användas för att se hur väl din prenumerationsplan hanterar den information den skickar.

En trevlig funktion är möjligheten att skicka meddelanden från mäklaren till WiFi -modulen men vi använde dem inte i det här projektet.

Steg 9: Hobbyelektronik

Innan vi började visste vi från ett tidigare projekt att servostyrningsservot kunde styras från en Arduino med en PWM -signal, med liknande kablar och ansluta till olika kanaler på samma lagerradiomottagare, vi antog elektronisk hastighetskontroll, (ESC från nu), som styr motorn, kan på samma sätt styras via PWM från Arduino.

För att testa denna teori använder vi en liten Arduino -skiss. Skissen läser en analog ingång från en potentiometer, gör om värdet från 0, 1024 till 0, 255 och matar ut det resulterande värdet till en PWM -stift med analogWrite () medan R/C -bilen hade på en liten låda och hade hjul borttagna.

Efter att ha svept genom intervallet på grytmätaren verkade ESC "vakna" och vi kunde strypa upp och ner, vi fick också Arduino att skriva ut värdena till den seriella anslutningen så att vi kunde övervaka dem.

ESC verkade inte gilla värden under ett visst tröskelvärde, i detta fall 128. Den såg signalen 191 som neutral gas, och 255 var maximal gas.

Vi behövde inte variera hastigheten på fordonet och hade det perfekt med det med den långsammaste hastigheten som skulle få det att röra sig. 192 var det lägsta värdet som skulle vända motorn, men vi har ännu inte monterat allt och är osäkra på om denna utgång skulle räcka för att flytta fordonet efter slutmontering, men att ange ett något större värde borde vara trivialt.

Att kringgå potentiometern och sätta in fast värde i koden fungerade dock inte. Lagerets ESC blinkade helt enkelt och skulle inte snurra motorn, "justera gasreglaget" enligt manualen.

Rasande felsökning, kasta olika värden på den, använda olika trådar och till och med experimentera med att ändra PWM -frekvensen som Arduino använder resulterade i mer konstigheter.

Det verkade vara ett intermittent problem, ibland skulle det köra, andra gånger vägrade det att göra någonting. Det fortsatte helt enkelt att blinka. Ett test med den ursprungliga styrenheten och mottagaren bekräftade att ESC fortfarande fungerade precis som det var tänkt, vilket gjorde problemen ännu konstigare. Högre värden, det ignorerade och fortsatte blinka, lägre värden ESC gick tillbaka till lysande en glad grön, men fortfarande inte vända.

Vad skilde sig från inställningen med potentiometern, eller lagersändaren och mottagaren, och versionen som gav fasta värden?

Ibland överlappar verkligen inte Venn -diagrammet att arbeta som tänkt och att fungera som förväntat. I det här fallet, som en leksak, borde det inte finnas någon chans att modellen helt enkelt tar av eller bryter fingrar eller får hår fast i hjulen eller kör tåg när modellen slås på, även om något som att hålla sändaren konstigt har gasen i någon annan position än neutral.

'Justera gasreglaget', det är precis vad det betyder. ESC förväntar sig en neutral signal när den slås på innan den får att den inte kommer att göra någonting. Normalt skulle sändaren alltid vara i neutralläge när ESC är påslagen och därifrån kommer den gärna att köra. Om det inte är det, är det förmodligen tillbaka i neutral minst en gång när modellen är stadigt på marken och föraren känner sig redo att tävla.

När vi använde potentiometern `` svepte '' vi genom intervall, och sedan skulle det börja fungera. Den aktiverades helt enkelt när potentiometern svepte förbi neutralläget och sedan fungerade det.

Lägre intervall tycktes dock fortfarande missnöja ESC. Detta visar sig vara en produkt av PWM -arbetscyklerna.

Antingen genom konstruktion eller av tekniskt skäl ignorerar både styrservo och ESC signaler under 50% driftscykler. Detta kan vara i fall mottagaren/sändaren slutar fungera eller tar slut på strömmen, modellen skulle återgå till neutralläge och inte lyfta in i avståndet på full backgas. På samma sätt roterar servon bara 180 grader och behöver inte hela räckvidden.

Med denna nya kunskap i handen skapades en ny Arduino -skiss. Den ursprungliga versionen accepterar strängar som har angetts i seriell bildskärm, konverterar den till ett heltal och flyttar den till PWM -stiftet, med hjälp av servobiblioteket och skriver ()*. Om ett nytt värde anges i seriell bildskärm uppdateras skrivvärdet ().

Under testningen ersattes Traxxas ESC med en Mtroniks G2 Micro, men de borde fungera likadant, även om exakta värden kan skilja sig något.

Detta bibliotek behandlar ESC som en servo, det är tydligen bra. Skrivfunktionen () från Servo.h -biblioteket går från 0 till 180, den förväntade tillkopplingssignalen förväntas ligga runt mitten.

G2 Micro -armarna vid en skrivning () i ett värdeområde nära 90 men det var svårt att identifiera eftersom det verkar "komma ihåg" att ha varit beväpnad.

Traxxas VXL-s3 förväntas aktivera ett skrivvärde () på 91.

Efter tillkopplingssignalen accepterade antingen ESC glatt PWM -signaler, oavsett Arduino -funktioner som kallas för att generera dem, och styr motorn därefter.

På tal om funktioner; standarden analogWrite (), liksom write () och writeMicroseconds () från Servo.h -biblioteket kan alla användas omväxlande, tänk bara på vad som gör vad och i slutändan inget annat än pliktcykeln spelar roll. WriteMicroseconds () kan användas om större granularitet krävs, tänk bara på att intervallet här är från 1000 till 2000, med tillkoppling eller 'neutral' förväntad till 1500. Med standard analogWrite () förväntas det användbara intervallet att vara från 128 till 255 med cirka 191 neutralt.

Rekommenderad: