Obsah:
- Krok 1: Potřebný hardware
- Krok 2: Sestavení podvozku
- Krok 3: Montáž elektroniky
- Krok 4: Přidání webové kamery
- Krok 5: Zapojte vše
- Krok 6: Nastavení RPI
- Krok 7: Konfigurace sériového portu RPI
- Krok 8: Instalace modulů Pythonu
- Krok 9: Nastavení RoboClaw
- Krok 10: Instalace programu/souborů Rover
- Krok 11: Spuštění robota nahoru
- Krok 12: Přístup na stránku ovládání robota
- Krok 13: Kód Pythonu/baňky
- Krok 14: Použití jiného hardwaru
Video: Web Controlled Rover: 14 kroků (s obrázky)
2025 Autor: John Day | [email protected]. Naposledy změněno: 2025-01-13 06:57
Stavění a hraní si s roboty je moje hlavní životní vina. Ostatní hrají golf nebo lyžují, ale já stavím roboty (jelikož neumím hrát golf ani lyžovat:-). Přijde mi to relaxační a zábavné! K výrobě většiny svých robotů používám podvozkové sady. Používání sad mi pomáhá dělat to, co mě baví víc, software a elektroniku, a také přispět k lepšímu podvozku pro mé vlastní palce.
V tomto Instructable se podíváme na to, co je potřeba k vytvoření jednoduchého, ale robustního roveru ovládaného Wifi/webem. Použitým podvozkem je Actobotics Gooseneck. Vybral jsem si to kvůli velikosti, rozšiřitelnosti a ceně, ale můžete použít jakýkoli jiný podvozek podle vlastního výběru.
Pro takovýto projekt budeme potřebovat dobrý solidní jednodeskový počítač a pro tohoto robota jsem zvolil použití počítače Raspberry Pi (RPI) jako Linux. RPI (a Linux) nám dává spoustu možností kódování a pro kódovací stránku bude použit Python. Pro webové rozhraní používám Flask, odlehčený webový framework pro Python.
K pohonu motorů jsem zvolil RoboClaw 2x5a. Umožňuje jednoduchou sériovou komunikaci pro jeho ovládání a funguje dobře s RPI a motory na Goosenecku.
Konečně má webovou kameru pro video zpětnou vazbu typu POV pro dálkové ovládání. Každému tématu se budu podrobněji věnovat později.
Krok 1: Potřebný hardware
- Podvozek Actobotics Gooesneck nebo vhodná náhrada podle vašeho výběru
- Raspberry Pi podle vašeho výběru (nebo klon) - Na tomto robotu je použit model RPI B, ale každý s alespoň dvěma USB porty bude fungovat
- Standardní servo deska B x1
- 90 ° držák jednoho úhlu kanálu x1
- Ovladač motoru RoboClaw 2x5a
- Servo S3003 nebo podobné standardní velikosti
- Malé prkénko nebo Mini prkénko
- Propojovací vodiče mezi ženami a ženami
- Propojovací vodiče mezi muži a ženami
- Webová kamera (volitelně) - Používám Logitech C110 a zde je seznam podporovaných kamer pro RPI
- Napájecí zdroj 5v-6v pro servo napájení
- 7,2v-11,1v baterie pro napájení hnacího motoru
- 5v 2 600 mAh (nebo vyšší) USB power banka pro RPI
- USB Wifi adaptér
Na mém botu používám 4 kola, aby to bylo trochu více All-Terrain-Indoor. Pro tuto možnost budete potřebovat:
- 4 "těžké kolo x2
- Šroubový náboj se 4 mm vrtáním (0,770 palce) x2
Krok 2: Sestavení podvozku
Nejprve sestavte šasi podle pokynů přiložených k šasi nebo videu. Po dokončení byste měli mít něco jako obrázek. POZNÁMKA: Při montáži části krku ponechte montážní držák vypnutý.
Na svém botovi jsem se rozhodl vyměnit kola, s nimiž podvozek přišel, za 4 těžká kola. Toto je volitelné a není nutné, pokud nechcete dělat to samé.
Krok 3: Montáž elektroniky
Gooseneck má spoustu prostoru a možností pro montáž vaší elektroniky. Tyto obrázky vám dávám jako vodítko, ale můžete si vybrat, jak byste to celé chtěli rozložit. K montáži desky a baterií můžete použít distanční podložky, oboustrannou pásku, suchý zip nebo servopásku.
Krok 4: Přidání webové kamery
K tomuto kroku vezměte 90stupňový držák, lehký servo náboj a čtyři (4) šrouby.3125 :
- Vezměte servo náboj a umístěte jej na jednu stranu držáku a zajistěte je šrouby.2125 "jako na obrázku
- Poté namontujte servo do držáku serva
- Připevněte 90stupňový držák se servo houkačkou k páteři serva a pomocí šroubu klaksonu, který byl dodán se servem, je spojte dohromady
- Nyní namontujte servo v držáku na horní část husího krku pomocí zbývajících šroubů
- Namontujte kameru pomocí zipů nebo oboustranné pásky na držák 90 stupňů
V případě potřeby použijte obrázky pro průvodce.
Krok 5: Zapojte vše
Zapojení je u tohoto robota docela těsné.
Motory:
Pokud jste tak ještě neučinili, pájejte vývody na obou motorech
S roboty vpředu (konec s husím krkem) směrem od vás:
- Připojte vodiče motoru na levém motoru ke kanálu M1A a M1B
- Připojte vodiče motoru na pravém motoru ke kanálu M2A a M2B
Uzemnění (GND):
- Připojte jeden zemnící kolík na RoboClaw k desce zemnící propojky. Uzemňovací čára na RoboClaw je nejblíže středu (viz obrázek)
- Připojte PIN 6 na RPI k propojovací desce. Přiřazení pinů najdete na obrázku záhlaví RPI.
- Připojte GND ze sady servo baterií k jednomu z kolíků na propojovací desce.
- Veďte propojovací vodič z propojovací desky na vodič GND serva.
RPI pro RoboClaw:
Připojte pin RPI GPIO14 TXD ke kolíku RoboClaw S1
Napájení:
- Připojte POS kabel ze serva baterie k POS kabelu serv
- Připojte vodič POS z baterie motoru k POS (+) na svorce napájení motoru RoboClaw. Terminál GND zatím necháme odpojený.
Krok 6: Nastavení RPI
Předpokládám, že uživatel zde ví něco o Linuxu a RPI. Nezabývám se tím, jak jej nastavit nebo se k němu připojit. Pokud s tím potřebujete pomoci, použijte níže uvedené stránky.
Chcete -li získat nastavení RPI, podívejte se na následující stránky:
- Základní nastavení RPI
- Rychlý průvodce RPI
- Guilde instalace NOOBS
Pro obecné skokové stránky jsou skvělým místem, kde začít, hlavní stránka RPI a stránky eLinux.
Na tomto odkazu najdete obecné nastavení Wifi pro RPI.
Pokud máte v plánu použít nějaký fotoaparát nebo webovou kameru na botu, podívejte se na tyto stránky a získejte základní potřebné soubory.
- Nastavení kamery RPI
- Nastavení kamery eLinix RPI
Streamování videa:
Existuje několik způsobů, jak zajistit streamování videa na RPI, ale já dávám přednost použití Motion.
Chcete-li jej nainstalovat do RPI, spusťte toto: sudo apt-get install motion
Tento instrukční program jde také o nastavení pro streamování.
Krok 7: Konfigurace sériového portu RPI
Abychom mohli mluvit s ovladačem motoru RoboClaw z tohoto portu, budeme muset vypnout režim konzoly Linux pro používání RX a TX. K tomu můžete použít tuto metodu nebo tento nástroj. Metoda je na vás, protože oba nakonec dělají totéž.
Krok 8: Instalace modulů Pythonu
Budete potřebovat python nainstalovaný na RPI a také pip installer balíčku python.
Chcete -li nainstalovat pip, postupujte takto:
- sudo apt-get install python-setuptools
- sudo easy_install pip
Pak:
- sudo pip install baňka
- sudo pip install pyserial
- sudo pip install RPIO
To budou všechny moduly potřebné ke spuštění kódu.
Krok 9: Nastavení RoboClaw
Mám kód robota, který mluví s RoboClaw ve standardním sériovém režimu při 19200 baudech.
Chcete -li RoboClaw nastavit pro toto, postupujte takto:
- Na RoboClaw stiskněte tlačítko „MODE“
- Stiskněte tlačítko set, dokud LED dioda mezi prodlevami 5krát (pětkrát) nezabliká
- Uložte kliknutím na tlačítko „LIPO“
- Dále stiskněte tlačítko „SET“, dokud LED dioda nebliká 3 (třikrát) mezi zpožděními
- Uložte stisknutím tlačítka LIPO
To je vše pro nastavení ovladače motoru. V případě potřeby naleznete další informace v pdf uvedeném výše.
Krok 10: Instalace programu/souborů Rover
Stáhněte a zkopírujte soubor rover.zip do svého RPI ve vašem uživatelském adresáři pi.
Pokud používáte Linux nebo Mac, můžete k tomu použít 'scp':
scp ~/location/of/the/file/rover.zip pi@your_rpi_ip:/~
Pro Windows si můžete stáhnout a použít pscp a poté:
pscp /location/of/the/file/rover.zip pi@your_rpi_ip:/~
Jakmile je soubor zip zkopírován do RPI, přihlaste se do něj jako uživatel pí.
Nyní spusťte:
rozepnout rover.zip
Tím rozbalíte soubory do složky s názvem „rover“a v této složce budete mít následující:
- restrover.py (Python kód pro robota)
- static (uchovává obrazové soubory pro tlačítka na ovládací stránce)
- šablony (obsahuje soubor index.htlm, kontrolní webovou stránku)
Pokud používáte webovou kameru, upravte řádek v dolní části souboru index.html ve složce šablony. Změňte adresu URL v řádku IFRAME tak, aby odpovídala adrese src vašeho video streamu.
Krok 11: Spuštění robota nahoru
Připojte napájení USB k RPI.
Chcete -li spustit kód robota, přihlaste se jako uživatel pi a spusťte:
- cd rover
- sudo python restrover.py
Pokud bylo vše v pořádku, měli byste vidět obrazovku podobnou obrázku v tomto kroku
Pokud uvidíte nějaké chyby nebo problémy, budete je muset opravit, než budete pokračovat.
Nyní připojte vodič GND (-) ke svorce NEG (-) na vstupu motoru RoboClaw.
Krok 12: Přístup na stránku ovládání robota
Poté, co se spustí skript pythonu robota, zapněte RoboClaw a poté přejděte na IP svého RPI jako:
your_rpi_ip
Měli byste vidět vyskakovací stránku pro web jako na obrázcích. Pokud ne, zkontrolujte výstupní terminál RPI a vyhledejte případné chyby a opravte je.
Jakmile jste na stránce, jste připraveni ovládat robota.
Robot se spustí v nastavení „Střední běh“a při střední rychlosti.
Robota lze ovládat pomocí tlačítek na stránce nebo pomocí kláves na klávesnici.
Klíče jsou:
- w - vpřed
- z - vzad/vzad
- a - dlouhá zatáčka doleva
- s - dlouhá pravá zatáčka
- q - krátké odbočení doleva
- e - krátké odbočení doprava
- 1 - otočná kamera vlevo
- 2 - panoramatická kamera vpravo
- 3 - pánev úplně vlevo
- 4 - pánev zcela vpravo
- / - domácí/ středová kamera
- h - zastavit/zastavit robota
Mezi odeslanými příkazy je půlsekundová vyrovnávací paměť zpoždění. Udělal jsem to, abych eliminoval nechtěné opakované příkazy. Toto můžete samozřejmě z kódu odstranit, pokud chcete (v index.html)
Zbytek ovládacích prvků a jejich ovládání by mělo být samozřejmé.
Krok 13: Kód Pythonu/baňky
Tento robot používá Python a webový framework Flask. Pokud máte zájem, můžete se o baňce dozvědět více zde.
Velkým rozdílem od aplikace Flask a běžného skriptu Pythonu je třída/metoda @app.route, která se používá k manipulaci s URI. Kromě toho je to většinou normální Python.
#!/usr/bin/env python
# # Wifi/webem poháněný Rover # # Napsal Scott Beasley - 2015 # # Používá RPIO, pyserial a Flask # čas importu sériového importu z RPIO import PWM z importu baňky Flask, render_template, žádost app = Flask (_name_, static_url_path = '') # Připojte se ke komunikačnímu portu a promluvte si s ovladačem motoru Roboclaw zkuste: # Zde změňte přenosovou rychlost, pokud se liší od 19200 roboclaw = serial. Serial ('/dev/ttyAMA0', 19200) kromě IOError: print („Comm port not nalezeno ") sys.exit (0) # Proměnné řízení rychlosti a pohonu last_direction = -1 speed_offset = 84 turn_tm_offset = 0,166 run_time = 0,750 # Servo neutrální poloha (home) servo_pos = 1250 servo = PWM. Servo () servo.set_servo (18, servo_pos) # Malé zdržení pro ustavení času. spánek (3) # # obslužné rutiny URI - zde se provádějí všechny akce stránky robota # # odešlete stránku pro ovládání robotů (domovská stránka) @app.route ("/") def index (): return render_template ('index.html', name = None) @app.route ("/forward") def forward (): global last_direction, run_ti vytisknu "Vpřed" go_forward () last_direction = 0 # spánek 100ms + doba_času běhu.spánek (0,100 + doba_běhu) # Pokud to není souvislé, pak se zastaví po zpoždění, pokud run_time> 0: last_direction = -1 zastaví () vrátí "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) # Pokud není nepřetržitý, pak se zastaví po zpoždění pokud 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 second.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 second time.sleep (0,500 - turn_tm_offset) last_direction = -1 # stop halt () time.sleep (0.100) return "ok" @app.route ("/ltforward") def ltforward (): global last_direction, turn_t m_offset tisk "Otočení doleva" go_left () # sleep @1 /8 second time.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 "Right forward turn" go_right () # sleep @1/8 second time.sleep (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) return "ok" @app.route ("/panlt") def panlf (): global servo_pos tisk "Panlt" servo_pos -= 100 if servo_pos 2500: servo_pos = 2500 servo.set_servo (18, servo_pos) # spánek 150ms čas. 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 (): globální tisk servo_pos "Pan full l eft "servo_pos = 500 servo.set_servo (18, servo_pos) # spánek 150ms time.sleep (0.150) return" ok " @app.route ("/panfull_rt ") def panfull_rt (): global servo_pos tisk" Pan full right "servo_pos = 2500 servo.set_servo (18, servo_pos) # spánek 150ms time.sleep (0.150) návrat "ok" @app.route ("/speed_low") def speed_low (): global speed_offset, last_direction, turn_tm_offset speed_offset = 42 turn_tm_offset = 0,001 # Aktualizujte aktuální směr, abyste získali novou rychlost, pokud 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 (): globální speed_offset, last_direction, turn_tm_offset speed_offset = 84 turn_tm_offset = 0,166 # Aktualizujte aktuální směr, abyste získali novou rychlost, pokud 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 # Aktualizujte aktuální směr, abyste získali novou rychlost, pokud last_direction == 0: go_forward () if last_direction == 1: go_backward () # sleep 150ms time.sleep (0.150) return "ok" @app.route ("/continuous ") def continual (): 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 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 () # spánek 100ms čas.spánek (0,100) návrat "ok" # # Funkce motorového pohonu # def go_forward (): globální 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 - offset rychlosti)) roboclaw.write (chr (128 + offset rychlosti)) else: roboclaw.write (chr (1 + offset rychlosti)) 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', port = 80, debug = True)
Pokud nechcete nebo nepotřebujete informace o ladění z baňky, nastavte ladění na 'false' na řádku app.run.
if _name_ == "_main_":
app.run (host = '0.0.0.0', port = 80, debug = False)
Také zde můžete změnit port, na kterém server Flask http naslouchá.
Krok 14: Použití jiného hardwaru
Pokud chcete použít jiný hardware, například jiný typ SBC (jednodeskový počítač), měli byste mít malé problémy se spuštěním Pythonu a Flasku na jiných deskách, jako je Beagle Bone, PCDuino atd … Budete muset změnit kód tak, aby odpovídal GPIO rozvržení a využití schopností servopohonu nové desky.
Chcete -li použít jiný typ ovladače motoru, stačí upravit funkce go_forward, go_backward, go_left, go_right a halt, aby cokoli, co náhradní ovladač motoru potřebuje, aby motor vykonával danou funkci.