Inhoudsopgave:

Een 4WD-robot aangedreven via een externe USB-gamepad - Ajarnpa
Een 4WD-robot aangedreven via een externe USB-gamepad - Ajarnpa

Video: Een 4WD-robot aangedreven via een externe USB-gamepad - Ajarnpa

Video: Een 4WD-robot aangedreven via een externe USB-gamepad - Ajarnpa
Video: Amazing arduino project 2024, Juni-
Anonim
Image
Image

Voor mijn volgende robotica-project moest ik door onvoorziene omstandigheden mijn eigen robotplatform ontwerpen/ontwerpen.

Het doel is om hem autonoom te laten zijn, maar eerst moest ik zijn basisrijvaardigheid testen, dus ik dacht dat het een leuk nevenproject zou zijn om je te gedragen en te besturen alsof het een RC (radiografisch bestuurbaar) voertuig was, maar gebruik in plaats daarvan een USB-gamepad.

De resultaten zijn ongeveer net zo goed of beter dan ik had verwacht.

Het voordeel van de USB Gamepad-route, met veel programmering, is dat ik het kan aanpassen en toevoegen aan wat ik al heb gedaan. Ik heb geen echte ervaring met het bouwen van een RC-voertuig, maar ik kan me voorstellen dat men vrijwel vastzit met wat de RC-zender (joysticks/knoppen, enz.) En de RC-ontvanger ook is.

Ik heb bijvoorbeeld enige herkenning toegevoegd dat de robot een muur heeft geraakt, gewoon door de software hoge stromen en lage encodersnelheidswaarden te laten detecteren.

Optioneel kan men enkele USB-webcams aan de robot toevoegen, afhankelijk van het aantal en hun plaatsing, kan men de robot door de woonkamer en naar een andere kamer rijden, terwijl men ergens anders voor de computer zit waarop de USB-gamepad is aangesloten het.

Dit Instructable zal geen echte, gedetailleerde, allesomvattende, stapsgewijze how-to zijn, maar ik zal proberen zoveel mogelijk details te geven.

Benodigdheden

Voorgestelde onderdelen: Het meeste hiervan heb ik verkregen van Servo City (Actobotics).

2 - 13.5 U-kanalen, voor de zijkanten van het basisframe. Hierop zijn de motoren gemonteerd. Ik ging voor iets korters en mijn motoren zijn op de uiterste hoeken gemonteerd, en het maakte het moeilijk om ze te monteren.

2 - 12 U-kanalen voor de voor- en achterkant van het basisframe.

2 - 15 U-kanalen voor de bumpers, voor en achter

2 - 7 (of was het 7,5 ?) U-kanalen voor de voorste kolommen. Dit is niet al te kritisch, de lengtes kunnen variëren. Het hangt ervan af hoe hoog de achterste kolommen zijn en op welke hoogte u ervoor kiest om de schuine U-kanaal dat hen verbindt.

2 - (lengte?) U-kanalen voor de hoekbalk, van voor naar achter, die de opstaande kolommen verbindt. Deze is van cruciaal belang, omdat Servo City / Actobotics voor dit doel panelen of beugels onder een hoek van 45 graden verkoopt, maar je zult wat wiskunde / trig moeten doen om ervoor te zorgen dat je de juiste lengtes krijgt.

2 - (lengte?) U-kanalen om te dienen als zijbumpers op een hoger niveau, ook deze zijn afhankelijk van wat je met de basis doet

2 - (lengte?) U-kanalen om te dienen als hoger geplaatste voor- en achterbumpers, idem kwestie naar boven.

1 - (lengte?) U-kanaal om als bovenste balk te dienen, overspant over de achterste kolommen. Deze is misschien niet al te kritisch, omdat je hem bovenop, of voor / achter de staande kolommen kunt monteren.

12 (ca.) L-kanalen of beugels. Deze dienen voor meerdere doeleinden, maar bieden in wezen structurele integriteit/sterkte aan de hoeken van het basisframe EN de rechtopstaande kolommen.

4 (+?) 3-gats tot 5-gats platte kanalen. Deze bieden ook structurele sterkte aan de robot.

ServoCity verkoopt twee hoofdsoorten flatpanels met een groot oppervlak, handig voor gebruik als skid-pan aan de onderkant, of als bovenkant waar uw batterij en / of controllers zouden komen, of zelfs voor een hoger oppervlak voor sensoren.

Er is een 4 (4,5?)" X 12"-paneel, en ik denk dat de andere een 9 (9,5?)" X 12-paneel is.

Dit is waar dingen interessant worden, en verwarrend en prijzig kunnen zijn (kleine onderdelen tellen op). Via deze verbindingsstukken, waarvan er MEERDERE zijn, kunnen alle kanalen etc aan elkaar worden bevestigd. Dit is waar het spijt me dat ik geen uitgebreide, gedetailleerde, specifieke onderdelenlijst heb.

En het punt is… je weet niet echt welke je nodig hebt, of hoeveel… omdat er zoveel manieren zijn waarop je deze stukken in elkaar kunt passen.

Ik kan opnoemen wat ik heb gebruikt:

www.servocity.com/90-quad-hub-mount-c

www.servocity.com/side-tapped-pattern-moun…

www.servocity.com/90-quad-hub-mount-d

De volgende twee zijn erg handig en ik zou deze gewoon inslaan:

www.servocity.com/enkele-schroefplaat

www.servocity.com/dual-screw-plate

Het volgende is alle schroeven (bouten). Ik begon met een pakket van ELKE maat, en ik heb de meeste ervan doorgenomen. Ik gebruikte langere schroeven waar de maat er niet toe deed, en reserveerde de kortere voor waar ze VEREIST waren omdat geen andere lengte zou werken.

Als laatste zou je 1 zak van deze moeten krijgen:

www.servocity.com/6-32-nylock-nuts-pack

Ik heb er niet zoveel gebruikt, maar ze zijn (denk ik) van cruciaal belang om ervoor te zorgen dat je motoren na verloop van tijd niet los van het frame gaan trillen. Er zouden er maar twee per motor werken, vanwege het U-kanaal

Je hebt er minimaal 4 nodig, misschien krijg je er nog een extra als je er een beschadigt (geloof me, misschien zet je de motoren een paar keer aan / uit):

www.servocity.com/heavy-duty-clamping-shaf…

Motorassen zijn doorgaans 6 mm en assen 1/4 (0,25 inch).

Ik zou wat zwarte schroeven nemen, zogenaamd sterker, en ze gebruiken voor de bovenstaande klemmen, en NIET de schroeven gebruiken die bij de klemmen worden geleverd:

(Volgens mij zijn dit degenen):

4 - 1/4 "(0,25") diameter lagers

1 - zakje zwarte 1/4 spacers

4 - D-hubs vastklemmen

www.servocity.com/0-770-clamping-d-hubs

4 - D-assen (#6340621.375" (1-3/8")

4 - 6 zwaarlastwielen

www.servocity.com/6-heavy-duty-wheel

Merk op dat ik dol ben op deze wielen, maar ze hebben een harde rubberen rand. Ze lijken het goed te doen op harde vloeren en tapijt, en waarschijnlijk op harde betonnen wandelingen. Doet het niet goed op gras, zand, enz.

OOK, ze zullen de neiging hebben om je tapijt uit te vegen!!!

4 - motoren:

www.servocity.com/motors-actuators/gear-mo…

Ik ging met de 223 RPM, goede topsnelheid binnenshuis, kon mijn robot (zwaar met 2 SLA 12V-batterijen) ook vrij gemakkelijk in slow motion bewegen.

2 - motor-encoders voor de motoren. (De Roboclaw van Servo City kan slechts 2 encoders aan)

1 - Roboclaw 2X45A motorcontroller, zorg ervoor dat u degene krijgt met de groene aansluitblokken erop, niet de pinnen …. tja… elk heeft zijn voordelen. Achteraf gezien.. Ik heb misschien de pinnen gekregen.

Ik denk dat dat het is van Servo City.

SparkFun verkoopt Arduino Uno (dat heb ik gebruikt), en ook Redboard Artemis als je drivemanager.

U wilt een Raspberry Pi 3 (of 4?) Als uw "brein" en interface op hoog niveau voor u.

Je hebt bedrading, schakelaars, zekeringen en een zeer robuuste "flyback"-diode nodig.

Ik heb een Duracell 12V 14AH deep-cycle SLA-batterij gebruikt, maar je kunt alles gebruiken.

WAARSCHUWING! Het ontwerp van deze robot (TALL, en WIDE, maar SHORT), gaat uit van een soort zwaar zwaartepunt, zoals een SLA-batterij zou bieden. Het doet het misschien niet goed met die andere soorten batterijpakketten met nieuwere technologie. LiPo, Lion, enz. Het kan gemakkelijk omvallen.

Van Pololu kreeg ik een paar barrel plug-adapters, zodat ik de Arduino en/of de Redboard onafhankelijk van stroom kon voorzien, ook al zouden ze via USB op de Raspberry worden aangesloten, omdat ik niet op de stroom van de Raspberry wilde vertrouwen. (Vooral het monteren van camera's, sensoren, enz.)

Je hebt een 12-naar-5V step-down spanningsregelaar nodig, minimaal 5A (?) Voor de Raspberry. De anderen kunnen alles aan tussen 7 en 15V dus direct naar de SLA-accu.

Dat is het zowat voor onderdelen.

Wat ik NIET zou doen - 90 graden afgeschuinde tandwieloverbrenging.

Nogmaals, er zijn veel video's in mijn Robotics youtube-afspeellijst die de meeste van het bovenstaande beschrijven.

Stap 1: constructie

Eerlijk gezegd zijn al mijn bouwstappen al in de vorm van youtubes. Je kunt die zien in mijn Robotics-afspeellijst, te beginnen bij "Wallace Robot 4". De vorige (Wallace II, Wallace III) hebben ook goed materiaal

www.youtube.com/playlist?list=PLNKa8O7lX-w…

Stap 2: Test de Roboclaw, motoren en encoders

De makers van Roboclaw (BasicMicro) hebben een Windows-applicatie die je kunt gebruiken om ervoor te zorgen dat je de motoren en encoders correct hebt aangesloten op de Roboclaw. Je sluit motoren aan dezelfde kant parallel aan de Roboclaw aan. U kunt ervoor kiezen om de encoderdraden te gebruiken, alleen op de achterste motoren, of de voorste motoren, of misschien nog beter - DIAGONAAL.

De reden voor mijn suggestie heeft te maken met het (later) controleren op een vastzittende robot. Het hebben van een diagonaal status of de voor-/achterwielen wel/niet draaien is misschien beter dan alleen de voorkant, of alleen de achterkant.

OPMERKING: wat ik NIET heb gedaan, is om de Arduino te gebruiken om ook verbinding te maken (via GPIO-pinnen) met de encoders - als je dat deed, zou je de Roboclaw 2 encoders kunnen laten behandelen en dan de Arduino de andere twee laten afhandelen, en gewoon vraag de Roboclaw om zijn twee encoderwaarden (en snelheden).

OPMERKING: ik heb de BasicMicro-applicatie gebruikt om de Roboclaw vooraf te configureren voor Ramping Up / Ramping Down. Dit is goed voor de bescherming van de hardware en de elektronica. Daar staat een video over in mijn Robotics-afspeellijst.

Ik was het bijna vergeten: ik heb ook een aantal bullet-connectorkabels gekocht die tussen de motorkabels en de Roboclaw gaan. LET OP: als je dit doet, zul je merken dat de totale kabellengte ECHT LANG is. Maar ik wilde niet hoeven te snijden als het niet nodig was. Ik heb (voor latere stappen) communicatieproblemen ondervonden met de USB tussen de Raspberry en de Arduino, waarschijnlijk als gevolg van EMI-ruis … maar ik heb daar softwarematig omheen gewerkt.

Als het een probleem wordt, kun je de draden kort knippen - je kunt ook metalen afscherming kopen (van Amazon, 1 diameter).

Laatste ding: dit moet ik nog doen --- de Roboclaw automatisch laten configureren of automatisch afstemmen (met behulp van encoders) zodat zowel de linker- als de rechtermotor met dezelfde snelheid bewegen en de robot rechtdoor gaat.

De mijne buigt heel licht over ongeveer 12 voet, maar niet genoeg dat ik de behoefte voelde om er iets aan te doen.

Stap 3: De Arduino toevoegen en programmeren

Je hebt de barrelplug en wat bedrading nodig, ook een USB-kabel. Zorg ervoor dat u de juiste krijgt voor de Arduino-connector.

U moet de Arduino IDE downloaden.

Hier bij Github is de nieuwste schets voor het besturen van de robot:

github.com/elicorrales/wallace.robot.ardui…

Je sluit de Arduino aan op je computer waarop de IDE draait, en op basis van hoe de schets is geschreven, zou je pinnen 10 en 11 op de Arduino gebruiken voor seriële communicatie (Software Serial) met de Roboclaw.

Ik ontwikkelde een eenvoudig communicatieprotocol tussen de Raspberry Pi en de Arduino.

Het is gebaseerd op ASCII-tekens, wat het eenvoudiger maakt om fouten op te sporen en te testen door gewoon het "seriële monitor"-venster van de Arduino IDE te gebruiken.

De commando's beginnen bij nummer "0" (nul) en gaan gewoon omhoog als dat nodig is

De commando's die beginnen in de "20" zijn directe Roboclaw-commando's, en de commando's onder dat nummer zijn strikt Arduino-gerelateerde commando's.

Vanwege de EMI-ruis heb ik de opdrachtreeks verbeterd om een controlesom op te nemen.

Elke tekenreeks bevat dus:

# aantal tokens in string inclusief deze

de controlesom

Stel bijvoorbeeld dat u wilt dat de Arduino reageert met zijn menu met opdrachten:

4 0 12 16

"4" is vier tokens in string.

"0" is het MENU-commando.

"12" is het willekeurige nummer dat ik heb gekozen.

"16" is de som van 4 + 0 + 12.

Datzelfde MENU-commando kan anders zijn:

4 0 20 24

Omdat ik een ander willekeurig getal heb gekozen, is de controlesom ook anders.

Voorbeeld, stel dat u met 100 % snelheid vooruit wilt gaan:

5 29 0 134 100

"5" vijf fiches

"29" het FORWARD-commando

"0" het willekeurige nummer

"134" de controlesom

"100" de parameter 1 (de snelheid in dit geval)

Als de Arduino die inkomende string niet kan verifiëren, laat hij deze gewoon vallen / negeert deze, geen reactie.

Als de Arduino geen volgend bewegingscommando met X milliseconden ontvangt, stuurt hij een STOP-motor naar de Roboclaw.

De Arduino start op en begint een automatische status naar de USB-poort te sturen… tenzij hem wordt gevraagd daarmee te stoppen.

Op dit punt zou je klaar moeten zijn om de Roboclaw te besturen en de motoren te zien draaien, gewoon door de "Seriële Monitor" op de IDE te gebruiken.

Stap 4: De Raspberry Pi toevoegen en programmeren (node.js)

Nogmaals, als je naar mijn Robotics-afspeellijst kijkt, zelfs vanaf het begin, heb ik elke stap doorlopen om de Raspberry aan de gang te krijgen.

Het enige dat ik misschien heb verdoezeld, is dat je een 5V-regelaar nodig hebt en er op de een of andere manier een USB-kabel voor construeert, knippen / wijzigen of de Raspberry op een andere manier van stroom voorziet.

Hier bij Github is alles wat je nodig hebt in de Raspberry om via USB met de Arduino te communiceren.

github.com/elicorrales/wallace.robot.raspb…

Er zijn zelfs testscripts.

Je kunt de node.js-servercode bekijken en je zult zien hoe de Raspberry de beknopte numerieke instructies omzet in url-strings van het REST-type. U kunt "curl" gebruiken om testcommando's te verzenden.

Voorbeeld:

uw RP3 IP-adres:8084/arduino/api/forward/50

zal ervoor zorgen dat de motoren de wielen even naar voren draaien.

Als je dat in een shellscript-loop plaatst, zou je zien dat de wielen blijven draaien.

De node.js-code (server.js) bevat een functie voor opnieuw verbinden in het geval dat seriële communicatie naar de Arduino verloren gaat. U kunt dit testen door de Arduino los te koppelen van de Raspberry en deze opnieuw aan te sluiten.

Zorg ervoor dat de seriële baudrate tussen beide overeenkomt.

Omdat de Arduino slechte datapakketten laat vallen en omdat op node.js-niveau en op browser javascript-niveau alles is gecodeerd om veel "drive" -commando's te verzenden, ben ik in staat geweest om zo hoog als 2 000 000 baud te draaien (2 Mbps).

Als je de testscripts laat draaien en je ziet de wielen draaien, dan ben je klaar voor de volgende stap.

Stap 5: Laatste stap - Programmeren / gebruiken van de webpaginaclient

Inbegrepen in de Github-link naar het Raspberry-gedeelte van dit alles, zijn de clientbestanden.

index.html. index.js. p5.min.js.

Ze verwerken de USB Gamepad via de Gamepad API (browsergebaseerd) en je zou de verschillende knoppen en schuifregelaars ook op de webpagina moeten zien.

De javascript-code bevraagt (peilt) de X- en Y-aswaarden voor een van de joysticks.. (afhankelijk van welke joysticks/gamepad je hebt, moet je misschien de code aanpassen). Het peilt zeer snel en het vuurt al die waarden af naar de node.js-server die luistert naar 8084.

De ruwe X- en Y-aswaarden van de joysticks liggen tussen 0 en 1.

Maar de Roboclaw-motorcontroller-bibliotheekfunctie die in de Arduino wordt gebruikt om de motoren aan te drijven, verwacht een waarde tussen -100 tot 0 (achteruit) of (0 tot 100) vooruit.

Zoo…. dat is het doel van het opnemen van de p5.min.js. Het heeft toevallig deze erg leuke, handige map()-functie waar je het de onbewerkte waarde, het onbewerkte (huidige) bereik en het nieuwe, gewenste bereik geeft. En het converteert de onbewerkte waarde naar de waarde op het nieuwe, toegewezen bereik.

Nog een punt: op 100 snelheid kan de robot erg lastig zijn. Ik liep constant tegen iets aan. Maar zelfs als je daar beter in wordt, is het nog steeds gevoelig als je naar links of rechts draait.

Iets voor u om toe te voegen zou vergelijkbaar zijn met de huidige schuifregelaar voor maximale snelheid op de webpagina. Die schuifregelaar bepaalt wat de hoogste of maximale waarde is waaraan u de joysticks Xs en Ys wilt toewijzen.

Voorbeeld:

Stel dat u 0 -> 1 tot 0 -> 100 in kaart brengt. Wanneer u de joystick volledig indrukt, bent u bij 100. Gevoelig. Misschien te snel.

Maar als je die schuifregelaar voor maximale snelheid een beetje naar achteren schuift, breng je nu 0 -> 1 naar 0 -> 80 of 70 in kaart.

Dat betekent dat je meer speelruimte hebt om je joystick te bewegen zonder dat er zo'n grote verandering in de snelheid naar de node.js (en naar de Arduino) wordt gestuurd.

En een toevoeging die je zou kunnen maken, is om de X's (naar links of rechts draaien) van de Y's (vooruit of achteruit) te scheiden in hun eigen maximale beschikbare snelheden.

U kunt de Y's dus op 0 tot 100 laten staan, van 0 tot -100 voor snelle lineaire beweging, maar de maximale snelheid van Xs verlagen voor een meer gecontroleerde rotatiebeweging. Beste van twee werelden.

Stap 6: Optioneel: Robot besturen met muisbewegingen en/of aanraakgebeurtenissen

Als je zo ver bent gekomen, weet je dat de softwarelagen, beginnend vanuit de browser en door het Javascript naar de Raspberry node.js-server gaan, uiteindelijk naar de Arduino, de X- en Y-coördinaten van de Gamepad-joystick converteert naar de " vooruit" (of "achteruit", enz.) commando's (en hun snelheidswaarde).

Verder weet je dat, terwijl de X'en en Y's van de joysticks min 1, tot en met nul, tot plus 1 zijn, die moeten worden geconverteerd tussen nul en 100. Welnu, de max hangt af van de maximale snelheidsinstelling op de webpagina.

Soo … het enige dat u hoeft te doen om de muis te gebruiken of gebeurtenissen aan te raken (zoals op een smartphone), is om die gebeurtenissen vast te leggen, de X's en Y's te pakken.

MAAR ---- die X'en en Y's liggen NIET tussen min 1 en 1. Ze beginnen met 0 en nemen positief toe, omdat ze in wezen de pixels of relatieve schermcoördinaten zijn van een HTML-element (zoals een bootstrap-paneel) of een canvas.

Dus nogmaals, de "map()"-functie van de Js-bibliotheek van de P5 is erg handig om opnieuw toe te wijzen aan wat we nodig hebben.

Ik heb de code aangepast om twee verschillende webpagina's te hebben, een voor desktop met de Gamepad en een andere voor mobiel, met behulp van de aanraakgebeurtenissen.

Zodra de X'en en Y's opnieuw zijn toegewezen, worden ze ook in dezelfde codeketen ingevoerd, enz., Net als de X'en en Y's van de Gamepad.

Aanbevolen: