Talaan ng mga Nilalaman:

Kontroladong Web Rover: 14 Mga Hakbang (na may Mga Larawan)
Kontroladong Web Rover: 14 Mga Hakbang (na may Mga Larawan)

Video: Kontroladong Web Rover: 14 Mga Hakbang (na may Mga Larawan)

Video: Kontroladong Web Rover: 14 Mga Hakbang (na may Mga Larawan)
Video: Штукатурка стен - самое полное видео! Переделка хрущевки от А до Я. #5 2024, Nobyembre
Anonim
Kontroladong Web Rover
Kontroladong Web Rover
Kontroladong Web Rover
Kontroladong Web Rover

Ang pagbuo at paglalaro ng mga robot ay ang aking pangunahing kasiyahan sa pagkakasala sa buhay. Ang iba ay naglalaro ng golf o ski, ngunit bumubuo ako ng mga robot (dahil hindi ako maaaring maglaro ng golf o mag-ski:-). Natagpuan ko itong nakakarelaks at nakakatuwa! Upang masulit ang aking mga bot, gumagamit ako ng mga chassis kit. Ang paggamit ng mga kit ay tumutulong sa akin na gawin ang nais kong gawin nang higit pa, ang software at electronics at gumagawa din para sa isang mas mahusay na chassis para sa sarili kong all-thumbs.

Sa Instructable na ito, titingnan namin kung ano ang kinakailangan upang makagawa ng isang simple ngunit matatag na Wifi / web na kinokontrol na rover. Ang ginamit na chassis ay ang Actobotics Gooseneck. Pinili ko ito para sa laki, pagpapalawak ng kakayahan at gastos ngunit maaari mong gamitin ang anumang iba pang mga chassis na gusto mo.

Para sa isang proyekto na tulad nito, kakailanganin namin ng isang mahusay na solong solong board computer at para sa bot na ito pinili ko na gamitin ang Raspberry Pi (RPI) isang computer na nakabatay sa Linux. Ang RPI (at Linux) ay nagbibigay sa amin ng maraming mga pagpipilian sa pag-coding at Python ay gagamitin para sa panig ng pag-coding. Para sa web interface ay gumagamit ako ng Flask, isang magaan na balangkas ng web para sa Python.

Upang himukin ang mga motor, pumili ako ng isang RoboClaw 2x5a. Pinapayagan nito ang simpleng serial komunikasyon para sa pag-uutos nito at gumagana nang maayos sa RPI at sa mga motor sa Gooseneck.

Panghuli, mayroon itong webcam para sa uri ng POV na video feedback para sa pagmamaneho nito nang malayuan. Saklaw ko ang bawat paksa nang mas detalyado sa paglaon.

Hakbang 1: Kailangan ng Hardware

Kailangan ng Hardware
Kailangan ng Hardware
Kailangan ng Hardware
Kailangan ng Hardware
Kailangan ng Hardware
Kailangan ng Hardware
Kailangan ng Hardware
Kailangan ng Hardware
  • Mga chassis ng Actobotics Gooesneck o isang angkop na kapalit na iyong pinili
  • Raspberry Pi na iyong pinili (o clone) - Isang modelo ng RPI na B ang ginagamit sa bot na ito, ngunit ang anumang may hindi bababa sa dalawang mga USB port ay gagana
  • Karaniwang Servo Plate B x1
  • 90 ° Single Angle Channel Bracket x1
  • RoboClaw 2x5a driver ng motor
  • S3003 o katulad na karaniwang laki ng servo
  • Maliit na breadboard o Mini breadboard
  • Babae sa Babae na jumper wires
  • Mga wires ng jumper ng Lalaki hanggang Babae
  • Web cam (opsyonal) - Gumagamit ako ng isang Logitech C110, at narito ang isang listahan ng mga suportadong cam para sa RPI
  • 5v-6v na mapagkukunan ng kuryente para sa lakas ng servo
  • 7.2v-11.1v na baterya para sa pagpapatakbo ng pagpapatakbo ng motor
  • 5v 2600mah (o mas mataas) na USB power bank para sa RPI
  • Adapter ng USB Wifi

Sa aking bot, gumagamit ako ng 4 na mga gulong upang gawin itong medyo higit pang All-Terrain-Indoor. Para sa pagpipiliang ito kakailanganin mo:

  • 4 "Heavy Duty Wheel x2
  • 4mm Bore Set Screw Hub (0.770 pulgada) x2

Hakbang 2: Pagtitipon ng Chassis

Pagtitipon ng Chassis
Pagtitipon ng Chassis
Pagtitipon ng Chassis
Pagtitipon ng Chassis
Pagtitipon ng Chassis
Pagtitipon ng Chassis

Ipunin muna ang chassis kasunod ng mga tagubiling kasama sa chassis o video. Matapos ang pagtatapos dapat kang magkaroon ng isang bagay tulad ng imahe. TANDAAN: Kapag pinagsasama ang bahagi ng Leeg, iwanan lamang ang mounting bracket.

Sa aking bot, pinili kong palitan ang mga gulong kasama ng tsasis para sa 4 na mabibigat na gulong. Ito ay opsyonal at hindi kinakailangan maliban kung nais mong gawin ang pareho.

Hakbang 3: Pag-mount ng Elektronika

Pag-mount sa Elektronika
Pag-mount sa Elektronika
Pag-mount sa Elektronika
Pag-mount sa Elektronika
Pag-mount sa Elektronika
Pag-mount sa Elektronika

Ang Gooseneck ay may maraming silid at mga pagpipilian para sa pag-mount ng iyong electronics. Ibinibigay ko sa iyo ang mga larawang ito bilang isang linya ng gabay, ngunit maaari kang pumili kung paano mo nais na ilatag ang lahat. Maaari kang gumamit ng mga stand-off, double-sided tape, Velcro o servo-tape upang mai-mount ang board at mga baterya.

Hakbang 4: Pagdaragdag ng Webcam

Pagdaragdag ng Webcam
Pagdaragdag ng Webcam
Pagdaragdag ng Webcam
Pagdaragdag ng Webcam
Pagdaragdag ng Webcam
Pagdaragdag ng Webcam

Kunin ang 90 degree bracket, magaan na servo hub at apat (4) ng.3125 na mga tornilyo para sa hakbang na ito:

  • Kunin ang servo hub at ilagay ito sa isang gilid ng bracket at i-secure ang mga ito kasama ng.2125 "na mga tornilyo tulad ng nakalarawan.
  • Susunod na mai-mount ang servo sa bracket ng servo
  • Ikabit ang 90 degree bracket na may servo sungay sa servos spine at gamitin ang sungay ng tornilyo na kasama ng servo upang ikonekta silang magkasama
  • Ngayon i-mount ang Servo sa bracket papunta sa tuktok ng gansa-leeg na may natitirang mga turnilyo
  • I-mount ang camera na may mga zip-kurbatang o dobleng panig na tape sa 90 degree na bracket

Gamitin ang mga larawan para sa mga gabay kung kinakailangan.

Hakbang 5: Ang Kable Nito Lahat

Kable Nito ang Lahat
Kable Nito ang Lahat
Kable Nito ang Lahat
Kable Nito ang Lahat
Kable Nito ang Lahat
Kable Nito ang Lahat
Kable Nito ang Lahat
Kable Nito ang Lahat

Ang mga kable ay medyo makitid pasulong para sa robot na ito.

Ang Mga Motors:

Nangunguna ang solder sa parehong mga motor kung hindi mo pa nagagawa

Sa harap ng mga robot (ang dulo na may gansa-leeg) na nakaharap sa iyo:

  • Ikonekta ang mga wire ng motor sa kaliwang motor sa channel M1A at M1B
  • Ikonekta ang mga wire ng motor sa tamang motor sa channel M2A at M2B

Mga koneksyon sa ground (GND):

  • Ikonekta ang isang ground pin sa RoboClaw sa ground jumper board. Ang linya ng ground pin sa RoboClaw ay pinakamalapit sa gitna (Tingnan ang larawan)
  • Ikonekta ang PIN 6 sa RPI sa jumper board. Tingnan ang RPI header pic para sa mga takdang-aralin sa pin.
  • Ikonekta ang GND mula sa pack ng baterya ng servo sa isa sa mga pin sa board ng jumper.
  • Patakbuhin ang isang jumper wire mula sa board ng jumper patungo sa servos GND wire.

RPI sa RoboClaw:

Ikonekta ang pin ng RPI GPIO14 TXD sa RoboClaw S1 pin

Lakas:

  • Ikonekta ang wire ng POS mula sa baterya ng servo patungo sa lead ng servos POS
  • Ikonekta ang wire ng POS mula sa baterya ng motor sa POS (+) ng RoboClaw motor power terminal ng pag-input. Iiwan namin ang terminal ng GND na nakakakonekta sa ngayon.

Hakbang 6: Pag-set up ng RPI

Pag-set up ng RPI
Pag-set up ng RPI

Ipinapalagay ko na ang gumagamit dito ay may alam tungkol sa Linux at sa RPI. Hindi ko saklaw kung paano mag-setup o kumonekta sa isa. Kung kailangan mo ng tulong sa gayon gawin ang mga pahina sa ibaba.

Upang makuha ang iyong pag-set up ng RPI, tingnan ang mga sumusunod na pahina:

  • Pangunahing Pag-set up ng RPI
  • Patnubay sa mabilis na pagsisimula ng RPI
  • NOOBS setup guilde

Para sa pangkalahatang mga pahina ng jump-off, Ang pangunahing pahina ng RPI at ang mga pahina ng eLinux ay magagandang lugar upang magsimula.

Tingnan ang link na ito para sa pag-setup ng pangkalahatang Wifi ng RPI.

Kung plano mong gumamit ng ilang uri ng camera o web cam sa bot, tingnan ang mga pahinang ito upang makuha ang pangunahing kinakailangang mga file.

  • Pag-setup ng RPI cam
  • pag-setup ng eLinix RPI cam

Streaming video:

Mayroong ilang mga paraan upang magawa ang streaming ng video sa isang RPI, ngunit ang pamamaraan na gusto ko ay ang paggamit ng Motion.

Upang mai-install ito sa iyong RPI patakbuhin ito: sudo apt-get galaw ng pag-install

Ang itinuturo na ito ay napupunta sa pag-set up nito para sa streaming din.

Hakbang 7: Pag-configure ng RPI Serial Port

Kakailanganin naming huwag paganahin ang mode ng Linux console para sa paggamit ng RX at TX na nais naming kausapin ang RoboClaw motor controller mula sa port na ito. Upang magawa ito, maaari mong gamitin ang pamamaraang ito o ang tool na ito. Ang pagpipilian ay sa iyo sa pamamaraan habang pareho silang gumagawa ng pareho sa huli.

Hakbang 8: Pag-install ng Mga Modyul ng Python

Kakailanganin mo ang naka-install na sawa sa RPI pati na rin ang python package installer pip.

Upang mai-install ang pip do:

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

Pagkatapos:

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

Ito ang magiging lahat ng mga module na kinakailangan para tumakbo ang code.

Hakbang 9: Pag-set up ng RoboClaw

Mayroon akong robot code na nakikipag-usap sa RoboClaw sa Standard Serial Mode sa 19200 baud.

Upang maitakda ang RoboClaw para sa gawin na ito:

  1. Pindutin ang pindutang "MODE" sa RoboClaw
  2. Pindutin ang pindutan ng itinakda hanggang ang LED flashes 5 (limang) beses sa pagitan ng mga pagkaantala
  3. Pindutin ang pindutang "LIPO" upang maiimbak
  4. Susunod na pindutin ang pindutang "SET" hanggang sa ang LED flashes ng 3 (tatlong) beses sa pagitan ng mga pagkaantala
  5. Pindutin ang pindutan ng LIPO upang maiimbak

Iyon lang para sa pagse-set up ng motor controller. Tingnan ang naka-link na pdf sa itaas para sa karagdagang impormasyon kung kinakailangan.

Hakbang 10: Pag-install ng Program / mga file ng Rover

I-download at kopyahin ang rover.zip file sa iyong RPI sa iyong direktoryo ng pi.

Kung nagpapatakbo ka ng Linux o isang Mac, maaari mong gamitin ang 'scp' upang gawin ito:

scp ~ / lokasyon / ng / ang / file / rover.zip pi @ your_rpi_ip: / ~

Para sa Windows, maaari kang mag-download at gumamit ng pscp at pagkatapos ay gawin:

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

Kapag ang zipfile ay nakopya sa RPI, mag-log in dito bilang pi user.

Patakbuhin ngayon:

i-unzip ang rover.zip

Tatanggalin nito ang mga file sa isang folder na pinangalanang 'rover' at ang mga sumusunod ay nasa ilalim ng folder na iyon:

  • restrover.py (Ang python code para sa robot)
  • static (hinahawakan ang mga file ng imahe para sa mga pindutan sa control page)
  • mga template (hawak ang index.htlm file, ang control web page)

Kung gumagamit ka ng isang web cam, baguhin ang linya malapit sa ilalim ng index.html file sa folder ng template. Baguhin ang URL sa linya ng IFRAME upang tumugma sa src URL para sa iyong stream ng video.

Hakbang 11: Simula sa Bot Up

Simula sa Bot Up
Simula sa Bot Up

Ikonekta ang lakas ng USB sa RPI.

Upang simulan ang bot code up, mag-log in bilang pi user at patakbuhin:

  • cd rover
  • sudo python restrover.py

Kung ang lahat ay OK, dapat mong makita ang isang screen na katulad ng imahe sa hakbang na ito

Kung nakakita ka ng anumang mga error o isyu, kakailanganin mong ayusin ang mga ito bago magpatuloy.

Ngayon, ikonekta ang GND (-) wire sa NEG (-) terminal sa RoboClaw motor power input.

Hakbang 12: Pag-access sa Pahina ng Pagkontrol ng Bot

Pag-access sa Pahina ng Pagkontrol ng Bot
Pag-access sa Pahina ng Pagkontrol ng Bot
Pag-access sa Pahina ng Pagkontrol ng Bot
Pag-access sa Pahina ng Pagkontrol ng Bot

Matapos tumakbo ang script ng python ng robot, paganahin ang RoboClaw at pagkatapos ay mag-navigate sa ip ng iyong RPI tulad ng:

your_rpi_ip

Dapat mong makita ang pahina ng pagkontrol ng Web na pop up tulad ng sa mga imahe. Kung hindi, suriin ang iyong terminal ng output ng RPI at hanapin ang anumang mga error at iwasto ang mga ito.

Kapag nasa pahina, handa ka nang kontrolin ang bot.

Magsisimula ang robot sa setting na "Med run" at sa katamtamang bilis.

Ang bot ay maaaring makontrol sa pamamagitan ng mga pindutan sa pahina o ng mga pindutan sa keyboard.

Ang mga susi ay:

  • w - pasulong
  • z - baligtad / paatras
  • a - mahabang kaliwa
  • s - mahaba ang kanang pagliko
  • q - maikling pagliko sa kaliwa
  • e - maikling kanang liko
  • 1 - pan naiwan sa camera
  • 2 - i-pan ang camera nang tama
  • 3 - pan buong kaliwa
  • 4 - pan buong tama
  • / - camera sa bahay / gitna
  • h - itigil / itigil ang robot

Mayroong kalahating segundo na buffer ng antala sa pagitan ng ipinadala na mga utos. Ginawa ko ito upang matanggal ang mga hindi nais na paulit-ulit na utos. Maaari mo syempre itong alisin mula sa code kung nais mo (sa index.html)

Ang natitirang mga kontrol at pagkontrol dito ay dapat na nagpapaliwanag sa sarili.

Hakbang 13: Ang Python / Flask Code

Gumagamit ang bot na ito ng Python at ang Flask web framework. Maaari kang matuto nang higit pa tungkol sa Flask dito kung interesado ka.

Ang malaking pagkakaiba mula sa isang Flask app at normal na script ng Python ay @ app.route class / pamamaraan na ginamit upang gawin ang paghawak ng URI. Maliban sa ito ay medyo normal na Python para sa pinaka-bahagi.

#! / usr / bin / env python

# # Wifi / Web driven Rover # # Isinulat ni Scott Beasley - 2015 # # Gumagamit ng RPIO, pyserial at Flask # import time import serial mula sa RPIO import PWM mula sa flask import Flask, render_template, request app = Flask (_name_, static_url_path = ") # Kumonekta sa comm port upang makausap ang Roboclaw motor controller subukan: # Baguhin ang rate ng baud dito kung naiiba kaysa sa 19200 roboclaw = serial. Serial ('/ dev / ttyAMA0', 19200) maliban sa IOError: print ("Comm port not natagpuan ") sys.exit (0) # Bilis at drive control variable last_direction = -1 speed_offset = 84 turn_tm_offset = 0.166 run_time = 0.750 # Servo neutral na posisyon (home) servo_pos = 1250 servo = PWM. Servo () servo.set_servo (18, servo_pos) # Kaunting tirahan para sa pag-aayos ng oras ng oras. pagtulog (3) # # Mga tagapangasiwa ng URI - lahat ng mga pagkilos na pahina ng bot ay tapos na dito # # Ipadala ang pahina ng kontrol ng bot (home page) @ app.route ("/") def index (): return render_template ('index.html', name = Wala) @ app.route ("/ forward") def forward (): global last_direction, run_ti me print "Forward" go_forward () last_direction = 0 # sleep 100ms + run_time time.sulog (0.100 + run_time) # Kung hindi tuloy-tuloy, huminto pagkatapos ng pagka-antala kung run_time> 0: last_direction = -1 halt () ibalik ang "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) # Kung hindi tuloy-tuloy, ihinto pagkatapos ng pagkaantala kung run_time> 0: last_direction = -1 halt () ibalik ang "ok" @ app.route ("/ left") def left (): global last_direction, turn_tm_offset print "Left" go_left () last_direction = -1 # sleep @ 1 / 2 pangalawang oras.s Sleep (0.500 - turn_tm_offset) # stop stop () time.s Sleep (0.100) ibalik ang "ok" @ app.route ("/ kanan") def kanan (): global last_direction, turn_tm_offset print "Right" go_right () # pagtulog @ 1/2 pangalawang pagkakataon. pagtulog (0.500 - turn_tm_offset) last_direction = -1 # stop stop () time.s Sleep (0.100) ibalik ang "ok" @ app.route ("/ ltforward") def ltforward (): pandaigdigang huling_direksyon, turn_t m_offset print "Kaliwa pasulong na liko" go_left () # pagtulog @ 1/8 pangalawang oras. pagtulog (0.250 - (turn_tm_offset / 2)) last_direction = -1 # stop stop () time.s 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 pangalawang pagkakataon. tulog (0.250 - (turn_tm_offset / 2)) last_direction = -1 # ihinto ang pagtigil () time.s Sleep (0.100) ibalik ang "ok" @ app.route ("/ stop") def stop (): pandaigdigang huling_direction print na "Stop" stop () last_direction = -1 # sleep 100ms time. sleep (0.100) ibalik ang "ok" @ app.route ("/ panlt") def panlf (): global servo_pos print "Panlt" servo_pos - = 100 kung servo_pos 2500: servo_pos = 2500 servo.set_servo (18, servo_pos) # pagtulog 150ms oras. tulog (0.150) ibalik ang "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 full right "servo_pos = 2500 servo.set_servo (18, servo_pos) # sleep 150ms time.s 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 # I-update ang kasalukuyang direksyon upang makakuha ng bagong bilis kung last_direction == 0: go_forward () kung last_direction == 1: go_backward () # sleep 150ms time.s Sleep (0.150) ibalik ang "ok" @ app.route ("/ speed_mid") def speed_mid (): global speed_offset, last_direction, turn_tm_offset speed_offset = 84 turn_tm_offset = 0.166 # I-update ang kasalukuyang direksyon upang makakuha ng bagong bilis kung last_direction == 0: go_forward () kung last_direction == 1: go_backward () # sleep 150ms time.sulog (0.150) ibalik ang "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 # I-update ang kasalukuyang direksyon upang makakuha ng bagong bilis kung last_direction == 0: go_forward () kung last_direction == 1: go_backward () # sleep 150ms time. sleep (0.150) ibalik ang "ok" @ app.route ("/ tuloy-tuloy ") def tuluy-tuloy (): pandaigdigan run_time print" Patuloy na patakbuhin "run_time = 0 # pagtulog 100ms oras. pagtulog (0.100) ibalik ang" ok "@ app.route (" / mid_run ") def mid_run (): pandaigdigang run_time print na" Mid patakbuhin ang "run_time = 0.750 ihinto () # pagtulog 100ms oras. tulog (0.100) ibalik" ok "@ app.route (" / short_time ") def short_time (): pandaigdigang run_time print na" Short run "run_time = 0.300 ihinto () # oras ng pagtulog 100ms. tulog (0.100) ibalik ang "ok" # # Mga pagpapaandar ng motor drive # def go_forward (): pandaigdigan na speed_offset kung 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 kung speed_offset! = 42: roboclaw.write (chr (127 - speed_offset)) roboclaw.wri te (chr (255 - speed_offset)) iba pa: roboclaw.write (chr (1 + speed_offset)) roboclaw.write (chr (128 + speed_offset)) def go_left (): global speed_offset kung speed_offset! = 42: roboclaw.write (chr (127 - speed_offset)) roboclaw.write (chr (128 + speed_offset)) iba pa: roboclaw.write (chr (1 + speed_offset)) roboclaw.write (chr (255 - speed_offset)) def go_right (): global speed_offset kung speed_offset! = 42: roboclaw.write (chr (1 + speed_offset)) roboclaw.write (chr (255 - speed_offset)) iba pa: roboclaw.write (chr (127 - speed_offset)) roboclaw.write (chr (128 + speed_offset)) def halt (): roboclaw.write (chr (0)) kung _name_ == "_main_": app.run (host = '0.0.0.0', port = 80, debug = True)

Kung hindi mo nais o kailangan ng impormasyon ng pag-debug mula sa Flask, itakda ang debug sa 'maling' sa linya ng app.run.

kung _name_ == "_main_":

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

Maaari mo ring baguhin ang port na nakikinig din ang Flask http server dito.

Hakbang 14: Paggamit ng Iba Pang Hardware

Kung nais mong gumamit ng iba pang mga hardware, tulad ng isa pang uri ng SBC (Single Board Computer) dapat mayroon kang maliit na mga isyu sa pagtakbo ng Python at Flask sa iba pang mga board tulad ng Beagle Bone, PCDuino atbp … Kailangan mong baguhin ang code upang tumugma sa GPIO layout at gamitin ang servo kakayahan sa pagmamaneho ng bagong board.

Upang magamit ang isa pang uri ng driver ng motor, kailangan mo lamang baguhin ang go_forward, go_backward, go_left, go_right at ihinto ang mga function upang gawin kung ano ang kailangan ng kapalit na driver ng motor upang gawin ng motor ang partikular na pagpapaandar.

Inirerekumendang: