Inhoudsopgave:

Webgestuurde Rover: 14 stappen (met afbeeldingen)
Webgestuurde Rover: 14 stappen (met afbeeldingen)

Video: Webgestuurde Rover: 14 stappen (met afbeeldingen)

Video: Webgestuurde Rover: 14 stappen (met afbeeldingen)
Video: Overzicht Google Apps for Business (Nederlands) 2024, November
Anonim
Webgestuurde Rover
Webgestuurde Rover
Webgestuurde Rover
Webgestuurde Rover

Bouwen en spelen met robots is mijn grootste guilty pleasure in het leven. Anderen spelen golf of skiën, maar ik bouw robots (omdat ik niet kan golfen of skiën:-). Ik vind het ontspannend en leuk! Om de meeste van mijn bots te maken, gebruik ik chassiskits. Het gebruik van kits helpt me te doen wat ik het liefste doe, de software en elektronica, en zorgt ook voor een beter chassis voor mezelf.

In deze Instructable zullen we kijken wat er nodig is om een eenvoudige maar robuuste wifi/webgestuurde rover te maken. Het gebruikte chassis is de Actobotics Gooseneck. Ik heb hem gekozen vanwege zijn grootte, uitbreidbaarheid en kosten, maar je kunt elk ander chassis naar eigen keuze gebruiken.

Voor een project als dit hebben we een goede solide single board computer nodig en voor deze bot heb ik ervoor gekozen om de Raspberry Pi (RPI) te gebruiken, een op Linux gebaseerde computer. De RPI (en Linux) geeft ons veel coderingsopties en Python zal worden gebruikt voor de coderingskant. Voor de webinterface gebruik ik Flask, een lichtgewicht webframework voor Python.

Om de motoren aan te drijven heb ik gekozen voor een RoboClaw 2x5a. Het maakt eenvoudige seriële communicatie mogelijk om het te besturen en werkt goed met de RPI en de motoren op de zwanenhals.

Ten slotte heeft het een webcam voor videofeedback van het POV-type om het op afstand te besturen. Ik zal elk onderwerp later in meer detail behandelen.

Stap 1: Benodigde hardware

Benodigde hardware
Benodigde hardware
Benodigde hardware
Benodigde hardware
Benodigde hardware
Benodigde hardware
Benodigde hardware
Benodigde hardware
  • Actobotics Gooesneck-chassis of een geschikte vervanger naar keuze
  • Raspberry Pi naar keuze (of kloon) - Een RPI-model B wordt gebruikt op deze bot, maar elke met ten minste twee USB-poorten zal werken
  • Standaard servoplaat B x1
  • 90 ° enkele hoek kanaalbeugel x1"
  • RoboClaw 2x5a motordriver
  • S3003 of vergelijkbare servo van standaardformaat
  • Klein breadboard of mini breadboard
  • Vrouwelijke naar vrouwelijke jumperdraden
  • Man-vrouw jumperdraden
  • Webcam (optioneel) - Ik gebruik een Logitech C110 en hier is een lijst met ondersteunde camera's voor de RPI
  • 5v-6v stroombron voor servovermogen
  • 7.2v-11.1v batterij voor aandrijfmotorvoeding
  • 5v 2600mah (of hoger) USB powerbank voor de RPI
  • USB Wifi-adapter

Op mijn bot gebruik ik 4 wielen om het een beetje meer All-Terrain-Indoor te maken. Voor deze optie heb je nodig:

  • 4 "Zwaar uitgevoerd wiel x2
  • 4 mm boring stelschroefnaaf (0,770 inch) x2

Stap 2: Het chassis monteren

Het chassis monteren
Het chassis monteren
Het chassis monteren
Het chassis monteren
Het chassis monteren
Het chassis monteren

Monteer eerst het chassis volgens de instructies die bij het chassis of de video zijn geleverd. Na het afronden zou je zoiets als de afbeelding moeten hebben. OPMERKING: Laat bij het monteren van het nekgedeelte de montagebeugel eraf.

Op mijn bot heb ik ervoor gekozen om de wielen waarmee het chassis werd geleverd te vervangen door 4 zware wielen. Dit is optioneel en niet nodig, tenzij je hetzelfde wilt doen.

Stap 3: De elektronica monteren

De elektronica monteren
De elektronica monteren
De elektronica monteren
De elektronica monteren
De elektronica monteren
De elektronica monteren

De Gooseneck heeft veel ruimte en mogelijkheden voor het monteren van je elektronica. Ik geef je deze foto's als richtlijn, maar je kunt kiezen hoe je het allemaal wilt indelen. U kunt afstandhouders, dubbelzijdige tape, klittenband of servotape gebruiken om het bord en de batterijen te monteren.

Stap 4: De webcam toevoegen

De webcam toevoegen
De webcam toevoegen
De webcam toevoegen
De webcam toevoegen
De webcam toevoegen
De webcam toevoegen

Neem de 90 graden beugel, lichtgewicht servo-hub en vier (4) van de.3125 -schroeven voor deze stap:

  • Neem de servo-hub en plaats deze aan één kant van de beugel en bevestig ze samen met de.2125 "schroeven zoals afgebeeld
  • Monteer vervolgens de servo in de servobeugel
  • Bevestig de 90 graden beugel met de servohoorn aan de servo-ruggengraat en gebruik de hoornschroef die bij de servo is geleverd om ze met elkaar te verbinden
  • Monteer nu de servo in beugel op de bovenkant van de zwanenhals met de resterende schroeven
  • Monteer de camera met kabelbinders of dubbelzijdig plakband op de 90 graden beugel

Gebruik indien nodig de afbeeldingen voor handleidingen.

Stap 5: Alles aansluiten

Alles aansluiten
Alles aansluiten
Alles aansluiten
Alles aansluiten
Alles aansluiten
Alles aansluiten
Alles aansluiten
Alles aansluiten

De bedrading is redelijk recht naar voren voor deze robot.

De motoren:

Soldeersnoeren op beide motoren als je dat nog niet hebt gedaan

Met de voorkant van de robot (het uiteinde met de zwanenhals) van je af gericht:

  • Sluit de motordraden op de linker motor aan op kanaal M1A en M1B
  • Sluit de motordraden op de rechter motor aan op het kanaal M2A en M2B

Massa (GND) aansluitingen:

  • Sluit een aardingspin op de RoboClaw aan op het grondjumperbord. De grondpinlijn op de RoboClaw is het dichtst bij het midden (zie foto)
  • Verbind PIN 6 op de RPI met het jumperbord. Zie de RPI-headerfoto voor pintoewijzingen.
  • Sluit de GND van het servobatterijpakket aan op een van de pinnen op het jumperbord.
  • Leid een jumperdraad van het jumperbord naar de GND-draad van de servo's.

RPI naar RoboClaw:

Sluit de RPI GPIO14 TXD-pin aan op de RoboClaw S1-pin

Stroom:

  • Sluit de POS-draad van de servobatterij aan op de POS-kabel van de servo
  • Sluit de POS-draad van de motoraccu aan op de POS (+) van de RoboClaw-motorvoedingsingang. We laten de GND-terminal voorlopig los.

Stap 6: De RPI instellen

De RPI instellen
De RPI instellen

Ik neem aan dat de gebruiker hier iets weet over Linux en de RPI. Ik behandel niet hoe je er een moet instellen of verbinden. Als je daarbij hulp nodig hebt, gebruik dan de onderstaande pagina's.

Bekijk de volgende pagina's om uw RPI-configuratie te krijgen:

  • RPI basisinstellingen
  • RPI Snelstartgids
  • NOOBS-configuratiegids

Voor algemene startpagina's zijn de RPI-hoofdpagina en de eLinux-pagina's geweldige plaatsen om te beginnen.

Zie deze link voor algemene wifi-instellingen van RPI.

Als je van plan bent een soort camera of webcam op de bot te gebruiken, bekijk dan deze pagina's om de benodigde basisbestanden te krijgen.

  • RPI-camera instellen
  • eLinix RPI-camera instellen

Streamingvideo:

Er zijn een paar manieren om videostreaming op een RPI te laten werken, maar de methode die ik verkies is het gebruik van Motion.

Om het op uw RPI te installeren, voert u dit uit: sudo apt-get install motion

Deze instructable gaat ook over het instellen voor streaming.

Stap 7: De RPI seriële poort configureren

We moeten de Linux-consolemodus uitschakelen voor het gebruik van de RX en TX omdat we vanaf deze poort met de RoboClaw-motorcontroller willen praten. Om dit te doen, kunt u deze methode of deze tool gebruiken. De keuze is aan jou over de methode, omdat ze uiteindelijk allebei hetzelfde doen.

Stap 8: De Python-modules installeren

U moet python op de RPI hebben geïnstalleerd, evenals het installatieprogramma pip van het python-pakket.

Om pip te installeren:

  1. sudo apt-get install python-setuptools
  2. sudo easy_install pip

Vervolgens:

  1. sudo pip install flask
  2. sudo pip install pyserial
  3. sudo pip installeer RPIO

Dit zijn alle modules die nodig zijn om de code uit te voeren.

Stap 9: De RoboClaw instellen

Ik heb de robotcode die met de RoboClaw praat in de standaard seriële modus op 19200 baud.

Om de RoboClaw hiervoor in te stellen:

  1. Druk op de "MODE"-knop op de RoboClaw
  2. Druk op de instelknop totdat de LED 5 (vijf) keer knippert tussen de vertragingen
  3. Druk op de knop "LIPO" om op te slaan
  4. Druk vervolgens op de "SET"-knop totdat de LED 3 (drie) keer knippert tussen de vertragingen
  5. Druk op de LIPO-knop om op te slaan

Dat is het voor het instellen van de motorcontroller. Zie de hierboven gelinkte pdf voor meer informatie indien nodig.

Stap 10: Het Rover-programma/bestanden installeren

Download en kopieer het rover.zip-bestand naar uw RPI in uw pi-gebruikersmap.

Als je Linux of een Mac gebruikt, kun je 'scp' gebruiken om dit te doen:

scp ~/location/of/the/file/rover.zip pi@your_rpi_ip:/~

Voor Windows kunt u pscp downloaden en gebruiken en vervolgens het volgende doen:

pscp /location/of/the/file/rover.zip pi@your_rpi_ip:/~

Zodra het zipbestand naar de RPI is gekopieerd, logt u in als de pi-gebruiker.

Voer nu uit:

unzip rover.zip

Dit zal de bestanden uitpakken naar een map met de naam 'rover' en het volgende onder die map hebben:

  • restrover.py (De python-code voor de robot)
  • statisch (bevat de afbeeldingsbestanden voor de knoppen op de bedieningspagina)
  • sjablonen (bevat het bestand index.htlm, de besturingswebpagina)

Als u een webcam gebruikt, wijzigt u de regel onderaan het bestand index.html in de sjabloonmap. Wijzig de URL in de IFRAME-regel zodat deze overeenkomt met de src-URL voor uw videostream.

Stap 11: De bot opstarten

De bot opstarten
De bot opstarten

Sluit de USB-voeding aan op de RPI.

Om de botcode op te starten, logt u in als de pi-gebruiker en voert u het volgende uit:

  • cd rover
  • sudo python restrover.py

Als alles in orde was, zou u een scherm moeten zien dat lijkt op de afbeelding in deze stap

Als u fouten of problemen ziet, moet u deze oplossen voordat u verder gaat.

Sluit nu de GND (-) draad aan op de NEG (-) aansluiting op de RoboClaw motor voedingsingang.

Stap 12: Toegang tot de Bot-besturingspagina

Toegang tot de Bot-besturingspagina
Toegang tot de Bot-besturingspagina
Toegang tot de Bot-besturingspagina
Toegang tot de Bot-besturingspagina

Nadat het python-script van de robot is uitgevoerd, schakelt u de RoboClaw in en navigeert u vervolgens naar het IP-adres van uw RPI zoals:

uw_rpi_ip

U zou de webbeheerpagina moeten zien verschijnen zoals in de afbeeldingen. Als dat niet het geval is, controleert u uw RPI-uitgangsterminal en zoekt u naar eventuele fouten en corrigeert u deze.

Eenmaal op de pagina bent u klaar om de bot te besturen.

De robot start in de instelling "Med run" en op gemiddelde snelheid.

De bot kan worden bediend via de knoppen op de pagina of met toetsen op het toetsenbord.

De sleutels zijn:

  • w - vooruit
  • z - achteruit/achteruit
  • a - lange bocht naar links
  • s - lange bocht naar rechts
  • q - korte bocht naar links
  • e - korte bocht naar rechts
  • 1 - pan camera links
  • 2 - pan camera rechts
  • 3 - pan helemaal links
  • 4 - pan helemaal rechts
  • / - home/center camera
  • h - robot stoppen/stoppen

Er is een vertragingsbuffer van een halve seconde tussen de verzonden commando's. Ik deed dit om ongewenste herhaalde commando's te elimineren. Je kunt dit natuurlijk uit de code verwijderen als je wilt (in index.html)

De rest van de bedieningselementen en de besturing ervan zouden voor zichzelf moeten spreken.

Stap 13: De Python/Flask-code

Deze bot maakt gebruik van Python en het Flask-webframework. Als je geïnteresseerd bent, kun je hier meer te weten komen over Flask.

Het grote verschil met een Flask-app en een normaal Python-script is @app.route class/method die wordt gebruikt om de URI-afhandeling uit te voeren. Afgezien daarvan is het voor het grootste deel vrijwel normale Python.

#!/usr/bin/env python

# # Wifi/Web-gedreven Rover # # Geschreven door Scott Beasley - 2015 # # Gebruikt RPIO, pyserial en Flask # import time import serial from RPIO import PWM from bottle import Flask, render_template, request app = Flask (_name_, static_url_path = '') # Maak verbinding met de comm-poort om met de Roboclaw-motorcontroller te praten. Probeer: # Wijzig hier de baudrate als deze anders is dan 19200 roboclaw = serial. Serial ('/dev/ttyAMA0', 19200) behalve IOError: print ("Comm-poort niet gevonden") sys.exit (0) # Snelheids- en aandrijfregelvariabelen last_direction = -1 speed_offset = 84 turn_tm_offset = 0.166 run_time = 0.750 # Servo neutrale positie (home) servo_pos = 1250 servo = PWM. Servo () servo.set_servo (18, servo_pos) # Een beetje stilstaan om de tijd tot rust te brengen time.sleep (3) # # URI-handlers - alle acties op de botpagina worden hier gedaan # # Stuur de bots-besturingspagina (startpagina) @app.route ("/") def index (): return render_template ('index.html', naam = Geen) @app.route ("/forward") def forward (): global last_direction, run_ti me print "Forward" go_forward () last_direction = 0 # sleep 100ms + run_time time.sleep (0.100 + run_time) # Indien niet continu, stop dan na vertraging als run_time > 0: last_direction = -1 stop () return "ok" @ app.route ("/backward") def backward (): global last_direction, run_time print "Backward" go_backward () last_direction = 1 # sleep 100ms + run_time time.sleep (0.100 + run_time) # Indien niet continu, stop dan na vertraging if run_time > 0: last_direction = -1 halt () return "ok" @app.route ("/left") def left (): global last_direction, turn_tm_offset print "Left" go_left () last_direction = -1 # sleep @1 /2 seconde time.sleep (0.500 - turn_tm_offset) # stop halt () time.sleep (0.100) return "ok" @app.route ("/right") def right (): global last_direction, turn_tm_offset print "Right" go_right () # sleep @1/2 seconde time.sleep (0.500 - turn_tm_offset) last_direction = -1 # stop stop () time.sleep (0.100) return "ok" @app.route ("/ltforward") def ltforward (): globale laatste_richting, turn_t m_offset print "Left forward turn" go_left () # sleep @1/8 second time.sleep (0.250 - (turn_tm_offset / 2)) last_direction = -1 # stop stop () time.sleep (0.100) return "ok" @app.route ("/rtforward") def rtforward (): global last_direction, turn_tm_offset print "Right forward turn" go_right () # sleep @1/8 second time.sleep (0.250 - (turn_tm_offset / 2)) last_direction = -1 # stop stop () time.sleep (0.100) return "ok" @app.route ("/stop") def stop (): global last_direction print "Stop" stop () last_direction = -1 # sleep 100ms time.sleep (0.100) return "ok" @app.route ("/panlt") def panlf (): global servo_pos print "Panlt" servo_pos -= 100 if servo_pos 2500: servo_pos = 2500 servo.set_servo (18, servo_pos) # slaap 150ms tijd. sleep (0.150) return "ok" @app.route ("/home") def home (): global servo_pos print "Home" servo_pos = 1250 servo.set_servo (18, servo_pos) # sleep 150ms time.sleep (0.150) return "ok" @app.route ("/panfull_lt") def panfull_lt (): global servo_pos print "Pan full l eft" servo_pos = 500 servo.set_servo (18, servo_pos) # sleep 150ms time.sleep (0.150) return "ok" @app.route ("/panfull_rt") def panfull_rt (): global servo_pos print "Pan volledig rechts" servo_pos = 2500 servo.set_servo (18, servo_pos) # sleep 150ms time.sleep (0.150) return "ok" @app.route ("/speed_low") def speed_low (): global speed_offset, last_direction, turn_tm_offset speed_offset = 42 turn_tm_offset = 0.001 # Update huidige richting om nieuwe snelheid te krijgen if last_direction == 0: go_forward () if last_direction == 1: go_backward () # sleep 150ms time.sleep (0.150) return "ok" @app.route ("/speed_mid") def speed_mid (): global speed_offset, last_direction, turn_tm_offset speed_offset = 84 turn_tm_offset = 0.166 # Update huidige richting om nieuwe snelheid te krijgen if last_direction == 0: go_forward () if last_direction == 1: go_backward () # sleep 150ms time.sleep (0.150) return "ok" @app.route ("/speed_hi") def speed_hi (): global speed_offset, last_direction, turn_tm_offset speed_offset = 126 tur n_tm_offset = 0.332 # Update huidige richting om nieuwe snelheid te krijgen if last_direction == 0: go_forward () if last_direction == 1: go_backward () # sleep 150ms time.sleep (0.150) return "ok" @app.route ("/continuous ") def continuous (): global run_time print "Continuous run" run_time = 0 # sleep 100ms time.sleep (0.100) return "ok" @app.route ("/mid_run") def mid_run (): global run_time print "Mid run" run_time = 0.750 stop () # sleep 100ms time.sleep (0.100) return "ok" @app.route ("/short_time") def short_time (): global run_time print "Short run" run_time = 0.300 stop () # sleep 100ms time.sleep (0.100) return "ok" # # Motor drive functies # def go_forward (): global speed_offset if speed_offset != 42: roboclaw.write (chr (1 + speed_offset)) roboclaw.write (chr (128 + speed_offset)) else: roboclaw.write (chr (127 - speed_offset)) roboclaw.write (chr (255 - speed_offset)) def go_backward (): global speed_offset if speed_offset != 42: roboclaw.write (chr (127 - speed_offset)) roboclaw.wri te (chr (255 - speed_offset)) else: roboclaw.write (chr (1 + speed_offset)) roboclaw.write (chr (128 + speed_offset)) def go_left (): global speed_offset if speed_offset != 42: roboclaw.write (chr (127 - speed_offset)) roboclaw.write (chr (128 + speed_offset)) else: roboclaw.write (chr (1 + speed_offset)) roboclaw.write (chr (255 - speed_offset)) def go_right (): global speed_offset if speed_offset != 42: roboclaw.write (chr (1 + speed_offset)) roboclaw.write (chr (255 - speed_offset)) else: roboclaw.write (chr (127 - speed_offset)) roboclaw.write (chr (128 + speed_offset)) def halt (): roboclaw.write (chr (0)) if _name_ == "_main_": app.run (host = '0.0.0.0', poort = 80, debug = True)

Als u geen foutopsporingsinformatie van Flask wilt of nodig hebt, stelt u debug in op 'false' op de regel app.run.

if _name_ == "_main_":

app.run (host = '0.0.0.0', poort = 80, debug = False)

Je kunt hier ook de poort wijzigen waarop de Flask http-server luistert.

Stap 14: Andere hardware gebruiken

Als je andere hardware wilt gebruiken, zoals een ander type SBC (Single Board Computer), zou je weinig problemen moeten hebben om Python en Flask op andere boards zoals de Beagle Bone, PCDuino enz. lay-out en gebruik de servo-aandrijfmogelijkheden van het nieuwe bord.

Om een ander type motordriver te gebruiken, hoeft u alleen maar de functies go_forward, go_backward, go_left, go_right en stop te wijzigen om te doen wat de vervangende motordriver nodig heeft om de motor die specifieke functie te laten doen.

Aanbevolen: