Innholdsfortegnelse:

Webstyrt Rover: 14 trinn (med bilder)
Webstyrt Rover: 14 trinn (med bilder)

Video: Webstyrt Rover: 14 trinn (med bilder)

Video: Webstyrt Rover: 14 trinn (med bilder)
Video: Squid game #shorts 2024, November
Anonim
Webstyrt Rover
Webstyrt Rover
Webstyrt Rover
Webstyrt Rover

Å bygge og leke med roboter er min viktigste skyldglede i livet. Andre spiller golf eller ski, men jeg bygger roboter (siden jeg ikke kan spille golf eller stå på ski:-). Jeg synes det er avslappende og morsomt! For å lage de fleste av robotene mine bruker jeg chassis -sett. Å bruke kits hjelper meg med å gjøre det jeg liker å gjøre mer, programvaren og elektronikken, og gir også et bedre chassis for meg selv.

I denne instruksen vil vi se på hva som trengs for å lage en enkel, men robust Wifi/web -kontrollert rover. Chassiset som brukes er Actobotics svanehals. Jeg valgte den for størrelsen, utvidelsesmuligheten og kostnaden, men du kan bruke et hvilket som helst annet chassis du ønsker.

For et prosjekt som dette trenger vi en god solid enkelkort -datamaskin, og for denne boten valgte jeg å bruke Raspberry Pi (RPI) en Linux -basert datamaskin. RPI (og Linux) gir oss mange kodingsalternativer, og Python vil bli brukt for kodingsiden. For webgrensesnittet bruker jeg Flask, et lett webrammeverk for Python.

For å kjøre motorene valgte jeg en RoboClaw 2x5a. Den gir enkel seriell kommunikasjon for å styre den og fungerer godt med RPI og motorene på svanehalsen.

Til slutt har den et webkamera for POV -type video tilbakemelding for å kjøre det eksternt. Jeg vil dekke hvert tema mer detaljert senere.

Trinn 1: Nødvendig maskinvare

Maskinvare nødvendig
Maskinvare nødvendig
Maskinvare nødvendig
Maskinvare nødvendig
Maskinvare nødvendig
Maskinvare nødvendig
Maskinvare nødvendig
Maskinvare nødvendig
  • Actobotics Gooesneck -chassis eller en passende erstatning etter eget valg
  • Raspberry Pi av ditt valg (eller klon) - En RPI -modell B brukes på denne boten, men alle med minst to USB -porter vil fungere
  • Standard servoplate B x1
  • 90 ° enkeltvinkel kanalbrakett x1
  • RoboClaw 2x5a motorfører
  • S3003 eller lignende standardstørrelse servo
  • Lite brødbrett eller Mini brødbrett
  • Jumper til hunn til hunn
  • Stikkontakter fra mann til kvinne
  • Webkamera (valgfritt) - Jeg bruker en Logitech C110, og her er en liste over støttede kameraer for RPI
  • 5v-6v strømkilde for servokraft
  • 7.2v-11.1v batteri for drivmotor
  • 5v 2600mah (eller høyere) USB -strømbank for RPI
  • USB Wifi -adapter

På min bot bruker jeg 4 hjul for å gjøre det litt mer terreng-innendørs. For dette alternativet trenger du:

  • 4 "kraftig hjul x2
  • 4 mm boresettskruenav (0,770 tommer) x2

Trinn 2: Montering av chassiset

Montering av chassiset
Montering av chassiset
Montering av chassiset
Montering av chassiset
Montering av chassiset
Montering av chassiset

Monter først chassiset etter instruksjonene som følger med chassiset eller videoen. Etter endt bør du ha noe som bildet. MERK: Når du monterer halsdelen, må du bare la monteringsbraketten være av.

På min bot valgte jeg å bytte ut hjulene som chassiset kom med for 4 kraftige hjul. Dette er valgfritt og ikke nødvendig med mindre du vil gjøre det samme.

Trinn 3: Montering av elektronikken

Montering av elektronikken
Montering av elektronikken
Montering av elektronikken
Montering av elektronikken
Montering av elektronikken
Montering av elektronikken

Svanehalsen har mye plass og alternativer for montering av elektronikken din. Jeg gir deg disse bildene som en veiledning, men du kan velge hvordan du vil legge alt ut. Du kan bruke stand-offs, dobbeltsidig tape, borrelås eller servotape for å montere brettet og batteriene.

Trinn 4: Legge til webkameraet

Legger til webkamera
Legger til webkamera
Legger til webkamera
Legger til webkamera
Legger til webkamera
Legger til webkamera

Ta 90 -graders brakett, lett servohub og fire (4) av.3125 -skruene for dette trinnet:

  • Ta servohubben og legg den på den ene siden av braketten og fest dem sammen med.2125 "skruene som på bildet
  • Monter deretter servoen i servobeslaget
  • Fest 90 graders braketten med servohornet til servos ryggraden og bruk hornskruen som fulgte med servoen for å koble dem sammen
  • Monter nå Servoen i braketten på toppen av gåsehalsen med de resterende skruene
  • Fest kameraet med glidelåser eller dobbeltsidig tape på 90-graders braketten

Bruk bildene som guider om nødvendig.

Trinn 5: Koble til alt

Kabling av det hele
Kabling av det hele
Kabling av det hele
Kabling av det hele
Kabling av det hele
Kabling av det hele
Kabling av det hele
Kabling av det hele

Ledningen er ganske rett frem for denne roboten.

Motorer:

Loddetinn på begge motorene hvis du ikke allerede har gjort det

Med robotene foran (enden med gåsehalsen) vendt bort fra deg:

  • Koble motortrådene på venstre motor til kanalen M1A og M1B
  • Koble motortrådene på høyre motor til kanalen M2A og M2B

Jordforbindelser (GND):

  • Koble den ene jordpinnen på RoboClaw til bakkekortet. Jordpinnelinjen på RoboClaw er nærmest sentrum (se bilde)
  • Koble PIN 6 på RPI til jumperkortet. Se RPI -toppteksten for pin -tildelinger.
  • Koble GND fra servobatteripakken til en av pinnene på startkortet.
  • Kjør en jumper wire fra jumper board til servo GND wire.

RPI til RoboClaw:

Koble RPI GPIO14 TXD -pinnen til RoboClaw S1 -pinnen

Makt:

  • Koble POS -ledningen fra servobatteriet til servos POS -ledning
  • Koble POS -ledningen fra motorbatteriet til POS (+) på RoboClaw -motorens inngangsterminal. Vi lar GND -terminalen være frakoblet for nå.

Trinn 6: Konfigurere RPI

Sette opp RPI
Sette opp RPI

Jeg antar at brukeren her kan litt om Linux og RPI. Jeg dekker ikke hvordan jeg konfigurerer eller kobler til en. Hvis du trenger hjelp til det, kan du bruke sidene nedenfor.

For å få RPI -oppsettet ditt, ta en titt på følgende sider:

  • RPI grunnleggende oppsett
  • RPI Hurtigstartguide
  • NOOBS oppsettguilde

For generelle hopp-sider er RPI-hovedsiden og eLinux-sidene gode steder å starte.

Se denne lenken for RPI generelt Wifi -oppsett.

Hvis du planlegger å bruke et slags kamera eller webkamera på boten, kan du se på disse sidene for å få de grunnleggende filene du trenger.

  • Oppsett av RPI -kamera
  • eLinix RPI -kameraoppsett

Strømme video:

Det er noen få måter å få videostrømming til å fungere på en RPI, men metoden jeg foretrekker er å bruke Motion.

For å installere den på RPI-en din, kjør denne: sudo apt-get install motion

Denne instruktøren går også over å sette den opp for streaming.

Trinn 7: Konfigurering av RPI -seriell port

Vi må deaktivere Linux -konsollmodusen for å bruke RX og TX, ettersom vi vil snakke med RoboClaw -motorstyringen fra denne porten. For å gjøre dette kan du bruke denne metoden eller dette verktøyet. Valget er ditt på metoden ettersom de begge gjør det samme til slutt.

Trinn 8: Installere Python -modulene

Du trenger python installert på RPI så vel som installasjonspipen for python -pakken.

Slik installerer du pip:

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

Deretter:

  1. sudo pip installere kolbe
  2. sudo pip installer pyserial
  3. sudo pip installer RPIO

Dette vil være alle modulene som trengs for at koden skal kjøre.

Trinn 9: Sette opp RoboClaw

Jeg har robotkoden som snakker med RoboClaw i standard seriell modus på 19200 baud.

Gjør følgende for å sette opp RoboClaw:

  1. Trykk på "MODE" -knappen på RoboClaw
  2. Trykk på set -knappen til LED -lampen blinker 5 (fem) ganger mellom forsinkelsene
  3. Trykk på "LIPO" -knappen for å lagre
  4. Trykk deretter på "SET" -knappen til LED -lampen blinker 3 (tre) ganger mellom forsinkelsene
  5. Trykk på LIPO -knappen for å lagre

Det er det for å sette opp motorstyringen. Se pdf -lenken ovenfor for mer informasjon om nødvendig.

Trinn 10: Installere Rover -programmet/filene

Last ned og kopier rover.zip -filen til RPI -en i pi -brukerkatalogen.

Hvis du kjører Linux eller Mac, kan du bruke 'scp' for å gjøre det:

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

For Windows kan du laste ned og bruke pscp og deretter gjøre:

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

Når zip -filen er kopiert til RPI -en, logger du på den som pi -brukeren.

Kjør nå:

pakke ut rover.zip

Dette vil pakke ut filene til en mappe som heter 'rover' og ha følgende under den mappen:

  • restrover.py (Python -koden for roboten)
  • statisk (inneholder bildefilene for knappene på kontrollsiden)
  • maler (inneholder index.htlm -filen, kontrollnettstedet)

Hvis du bruker et webkamera, må du endre linjen nær bunnen av index.html -filen i malmappen. Endre nettadressen på IFRAME -linjen slik at den samsvarer med src -nettadressen for videostrømmen.

Trinn 11: Start Bot Up

Starter Bot Up
Starter Bot Up

Koble USB -strømmen til RPI.

For å starte botkoden, logg på som pi -bruker og kjør:

  • cd rover
  • sudo python restrover.py

Hvis alt var OK, bør du se en skjerm som ligner på bildet i dette trinnet

Hvis du ser noen feil eller problemer, må du fikse dem før du fortsetter.

Koble nå GND (-) ledningen til NEG (-) terminalen på RoboClaw motorens inngang.

Trinn 12: Få tilgang til Bot Control -siden

Få tilgang til Bot Control -siden
Få tilgang til Bot Control -siden
Få tilgang til Bot Control -siden
Få tilgang til Bot Control -siden

Etter at robotens pythonscript er i gang, slår du på RoboClaw og deretter navigerer du til RPI -en din som:

din_rpi_ip

Du bør se webkontrollsiden dukke opp som på bildene. Hvis ikke, sjekk RPI -utgangsterminalen og se etter eventuelle feil og korriger dem.

Når du er på siden, er du klar til å kontrollere boten.

Roboten starter i "Med run" -innstillingen og med middels hastighet.

Boten kan styres via knappene på siden eller med tastene på tastaturet.

Nøklene er:

  • w - fremover
  • z - bakover/bakover
  • a - lang venstresving
  • s - lang høyresving
  • q - kort venstresving
  • e - kort høyresving
  • 1 - panoreringskamera igjen
  • 2 - panorering kamera til høyre
  • 3 - panne helt til venstre
  • 4 - panne helt til høyre
  • / - hjem/ senterkamera
  • h - stopp/stopp robot

Det er et halvt sekund forsinkelsesbuffer mellom kommandoer som sendes. Jeg gjorde dette for å eliminere uønskede gjentatte kommandoer. Du kan selvfølgelig fjerne dette fra koden hvis du vil (i index.html)

Resten av kontrollene og kontrollen bør være selvforklarende.

Trinn 13: Python/Flask -koden

Denne boten bruker Python og Flask webramme. Du kan lære mer om Flask her hvis du er interessert.

Den store forskjellen fra en Flask -app og normalt Python -skript er @app.route class/method som brukes til å utføre URI -håndteringen. Annet enn det er det stort sett vanlig Python for det meste.

#!/usr/bin/env python

# # Wifi/Web -drevet Rover # # Skrevet av Scott Beasley - 2015 # # Bruker RPIO, pyserial og Flask # importtid importserie fra RPIO import PWM fra kolbeimportflaske, render_template, forespørsel app = Flask (_name_, static_url_path = '') # Koble til kommandoporten for å snakke med Roboclaw -motorstyringen. Prøv: # Endre overføringshastigheten her hvis den er forskjellig fra 19200 roboclaw = serial. Serial ('/dev/ttyAMA0', 19200) unntatt IOError: print ("Komm.port ikke funnet ") sys.exit (0) # Hastighets- og drivstyringsvariabler last_direction = -1 speed_offset = 84 turn_tm_offset = 0.166 run_time = 0.750 # Servo nøytral posisjon (home) servo_pos = 1250 servo = PWM. Servo () servo.set_servo (18, servo_pos) # Et lite opphold for å sette seg ned i tid. sove (3) # # URI -behandlere - alle handlingene på botsiden utføres her # # Send ut bots -kontrollsiden (hjemmesiden) @app.route ("/") def index (): return render_template ('index.html', name = None) @app.route ("/forward") def forward (): global last_direction, run_ti meg skrive ut "Forover" go_forward () last_direction = 0 # sleep 100ms + run_time time.sleep (0.100 + run_time) # Hvis ikke kontinuerlig, så stopp etter forsinkelse hvis run_time> 0: last_direction = -1 halt () returner "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) # Hvis ikke kontinuerlig, så stopp etter forsinkelse hvis run_time> 0: last_direction = -1 halt () returner "ok" @app.route ("/left") def left (): global last_direction, turn_tm_offset print "Left" go_left () last_direction = -1 # sleep @1 /2 sekund 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 () # søvn @1/2 sekund sekund. søvn (0,500 - turn_tm_offset) last_direction = -1 # stopp stopp () time.sleep (0,100) returner "ok" @app.route ("/ltforward") def ltforward (): global last_direction, turn_t m_offset print "Venstre sving forover" go_left () # sleep @1/8 andre gang. sleep (0.250 - (turn_tm_offset / 2)) last_direction = -1 # stop halt () time.sleep (0.100) return "ok" @app.route ("/rtforward") def rtforward (): global last_direction, turn_tm_offset print "Høyre forover sving" go_right () # sleep @1/8 andre gang. sov (0.250 - (turn_tm_offset/2)) last_direction = -1 # stop halt () time.sleep (0.100) return "ok" @app.route ("/stop") def stop (): global last_direction print "Stop" halt () last_direction = -1 # sleep 100ms time.sleep (0.100) returner "ok" @app.route ("/panlt") def panlf (): global servo_pos print "Panlt" servo_pos -= 100 hvis servo_pos 2500: servo_pos = 2500 servo.set_servo (18, servo_pos) # søvn 150 ms tid. 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) retur "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 full right "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 # Oppdater nåværende retning for å få ny hastighet hvis 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 # Oppdater nåværende retning for å få ny hastighet hvis last_direction == 0: go_forward () if last_direction == 1: go_backward () # søvn 150 ms tid. sove (0,150) returner "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 # Oppdater nåværende retning for å få ny hastighet hvis last_direction == 0: go_forward () if last_direction == 1: go_backward () # sleep 150ms time.sleep (0.150) return "ok" @app.route ("/kontinuerlig ") def kontinuerlig (): 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" Midt run "run_time = 0.750 halt () # 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 halt () # sove 100ms time.sleep (0,100) returner "ok" # # Motordrevfunksjoner # 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)) hvis _name_ == "_main_": app.run (host = '0.0.0.0', port = 80, debug = True)

Hvis du ikke vil eller trenger feilsøkingsinformasjon fra Flask, setter du feilsøking til "false" på linjen app.run.

hvis _name_ == "_main_":

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

Du kan også endre porten som Flask http -serveren lytter til her også.

Trinn 14: Bruke annen maskinvare

Hvis du vil bruke annen maskinvare, som en annen type SBC (Single Board Computer), bør du ha små problemer med å få Python og Flask til å kjøre på andre brett som Beagle Bone, PCDuino etc … Du må endre koden for å matche GPIO layout og bruk servokjørmulighetene til det nye brettet.

For å bruke en annen type motordriver, trenger du bare å endre funksjonene go_forward, go_backward, go_left, go_right og stopp for å gjøre det som erstatningsmotordriveren trenger for å få motoren til å utføre den aktuelle funksjonen.

Anbefalt: