Inhoudsopgave:
- Stap 1: Installeer Raspbian en stel een statisch IP-adres in
- Stap 2: Motion installeren en configureren
- Stap 3: Apache installeren en webbeheerpagina instellen
- Stap 4: Stel de code in en test deze
- Stap 5: Montage
- Stap 6: De Python-code starten bij opstarten / afmaken
Video: Browsergestuurde Roomba-robot met de Raspberry Pi Model 3 A+ - Ajarnpa
2024 Auteur: John Day | [email protected]. Laatst gewijzigd: 2024-01-30 11:17
Overzicht
Deze Instructable zal zich richten op hoe je een dode Roomba een nieuw brein (Raspberry Pi), ogen (webcam) kunt geven en een manier om alles vanuit een webbrowser te besturen.
Er zijn veel Roomba-hacks die bediening via de seriële interface mogelijk maken. Ik heb niet het geluk gehad om een Roomba tegen te komen met de huidige firmware of een werkend moederbord. Of de Roomba is te oud of de Roomba is dood. Ik vond de Roomba die ik voor dit project gebruikte in een lokale kringloopwinkel voor $ 5. Het had nog steeds een behoorlijke batterij, maar een dood moederbord. (Ik vond de webcam ook in dezelfde kringloopwinkel voor ongeveer $ 5). Alles wat ik gebruik van de originele Roomba zijn de motoren, het chassis en de batterij. U hoeft voor dit project geen Roomba te gebruiken. Je kunt desgewenst verschillende motoren, wielen en chassis gebruiken. Ik heb gewoon zin om van een stuk rommel iets bruikbaars te maken.
Voor deze build heb ik de Raspberry Pi Model 3 A+ en een Riorand-motorcontroller gebruikt. Ik gebruik code van de Dexter Industries Browser Controlled Robot die ik heb aangepast. De Dexter Industries-versie stelt de Pi in als een websocket-server waarmee je hun robot (brick pi-platform) kunt besturen vanuit een client-html-bestand dat op een andere computer draait.
Ik heb de code gewijzigd om de GPIO-pinnen te gebruiken en een manier toegevoegd om de Pi uit te schakelen wanneer op een knop wordt geklikt / wanneer de escape-toets in de browser wordt ingedrukt. Ik heb ook enkele wijzigingen aangebracht in de besturingswebpagina om een bewegingsstream via een iframe te kunnen bekijken, terwijl ik de robot allemaal binnen één pagina bestuur. Ik heb de Pi ingesteld met een statisch IP-adres om het clientbestand te hosten, zodat ik verbinding kon maken met elke computer of elk apparaat in mijn netwerk.
Ik documenteer het proces hier in de hoop te laten zien hoe je een eenvoudige, goedkope basisrobot kunt maken.
Gebruikte onderdelen
Raspberry Pi 3 A+ (Adafruit Link) $30
Riorand Dual Motor Driver Controller H-Bridge (Amazon Link) $ 22
12V-batterij voor motoren (Amazon Link) $ 19
5V-batterij voor de Raspberry Pi (Amazon Link) $ 10
8 GB Micro SD-kaart (Amazon Link) $ 5
Jumperdraden (Amazon Link) $ 7
Roomba 500-serie
Alles bij elkaar net onder de $ 100.
Stap 1: Installeer Raspbian en stel een statisch IP-adres in
Ik gebruikte Raspbian Stretch Lite. Ik zag geen behoefte aan de desktop, maar je kunt de desktopversie installeren als je dat liever hebt.
Ik ga ervan uit dat je al weet hoe je Raspbian moet installeren. Als je hulp nodig hebt, kun je hier de handleiding van de Raspberry Pi Foundation vinden.
Zodra u Raspbian in gebruik hebt, logt u in en voert u het raspi-config-programma uit.
pi@raspberrypi:~ $ sudo raspi-config
Stel uw wifi-verbinding in raspi-config in
Selecteer
2 netwerkopties
Selecteer
N2 wifi
Selecteer een land, voer uw SSID in en voer uw wachtwoordzin in
SSH instellen in raspi-config
Nadat ik de eerste configuratie had uitgevoerd, gebruikte ik SSH om alles headless in te stellen. (U kunt dit overslaan als u een monitor gebruikt. Het was voor mij gemakkelijker om wijzigingen in de code aan te brengen zonder de robot te moeten stoppen en op een monitor aan te sluiten.)
Terug naar het hoofdmenu van raspi-config
Selecteer
5 interface-opties
Selecteer
P2 SSH
Selecteer
Ja
Terug in het hoofdmenu van raspi-config selecteer
Controleer of u bent verbonden met uw netwerk
pi@raspberrypi:~ $ ifconfig
U zou een uitvoer moeten ontvangen die vergelijkbaar is met deze. (Let op het IP-adres; je hebt het misschien later nodig, bijvoorbeeld 192.168.1.18)
wlan0: vlaggen = 4163 mtu 1500
inet 192.168.1.18 netmask 255.255.255.0 broadcast 192.168.1.255 inet6 fe80::c74f:42ec:8cd3:2fda prefixlen 64 scopeid 0x20 ether b8:27:eb:6a:a4:95 txqueuelen 1000 (Ethernet) RX-pakketten 484774396 5,5 MiB) RX-fouten 0 weggevallen 0 overschrijdingen 0 frame 0 TX-pakketten 30530 bytes 39740576 (37,8 MiB) TX-fouten 0 weggevallen 0 overschrijdingen 0 vervoerder 0 botsingen 0
Controleer of u internet kunt bereiken.
pi@raspberrypi:~ $ ping google.com
U zou een uitvoer moeten ontvangen die vergelijkbaar is met deze.
PING google.com (216.58.194.110) 56(84) bytes aan gegevens.
64 bytes van dfw06s48-in-f14.1e100.net (216.58.194.110): icmp_seq=1 ttl=54 tijd=18.2 ms 64 bytes van dfw06s48-in-f14.1e100.net (216.58.194.110): icmp_seq=2 ttl =54 tijd=19.4 ms 64 bytes van dfw06s48-in-f14.1e100.net (216.58.194.110): icmp_seq=3 ttl=54 tijd=23.6 ms 64 bytes van dfw06s48-in-f14.1e100.net (216.58.194.110): icmp_seq=4 ttl=54 tijd=30,2 ms ^C --- google.com ping-statistieken --- 4 pakketten verzonden, 4 ontvangen, 0% pakketverlies, tijd 3004 ms rtt min/avg/max/mdev = 18,209/ 22.901/30.267/4.715 ms
Een statisch IP instellen
Om consistent verbinding te kunnen maken met uw robot met hetzelfde adres in uw netwerk, moet u een statisch IP-adres instellen.
Haal uw huidige netwerkadres op, bijvoorbeeld 192.168.1.18
Ik gebruik het adres dat automatisch werd toegewezen door DHCP toen de Pi verbinding maakte met mijn netwerk. U kunt dit wijzigen in wat u maar wilt, zolang het maar overeenkomt met uw netwerk en niet conflicteert met andere toegewezen adressen.
Open dhcp.conf in een teksteditor. (ik gebruik nano)
pi@raspberrypi:~ $ sudo nano /etc/dhcpcd.conf
Scrol omlaag naar #Example statische IP-configuratie en wijzig de volgende regels.
#interface eth0
#static ip_address=192.168.11.13 #static routers=192.168.11.1 #static domain_name_servers=192.168.11.1 8.8.8.8
Wijzig deze zodat deze overeenkomt met uw netwerk en verwijder de # aan het begin van elke regel.
Voorbeeld:
interface wlan0
statisch ip_address=192.168.1.18 statische routers=192.168.1.1 statisch domain_name_servers=192.168.1.1 8.8.8.8
Opslaan en afsluiten.
Start opnieuw op en maak verbinding met de Pi via SSH
pi@raspberrypi:~ $ sudo reboot
Maak verbinding vanaf een andere computer via SSH. Windows-gebruikers kunnen PuTTY of het Windows-subsysteem voor Linux (Windows10) gebruiken.
ian@computer:~$ ssh [email protected]
Voer uw wachtwoord in (de standaardinstelling is framboos).
[email protected]'s wachtwoord:
Je zou nu bij de opdrachtprompt van je Pi moeten zijn.
pi@raspberrypi:~$
Stap 2: Motion installeren en configureren
Motion is een programma dat in veel beveiligingscamera-/webcamprojecten wordt gebruikt. Beweging heeft veel functies. We stellen het echter in om eenvoudig video van de webcam naar poort 8081 te streamen.
Test je webcam
Sluit uw webcam aan en vermeld aangesloten USB-apparaten (mogelijk moet u opnieuw opstarten nadat u verbinding hebt gemaakt).
pi@raspberrypi:~ $ lsusb
U zou een uitvoer moeten krijgen die vergelijkbaar is met deze. Let op de Logitech C210.
Bus 001 Apparaat 002: ID 046d:0819 Logitech, Inc. Webcam C210
Bus 001 Apparaat 001: ID 1d6b:0002 Linux Foundation 2.0 root-hub
Als uw camera niet wordt weergegeven, is deze mogelijk niet compatibel of moet u mogelijk extra stuurprogramma's installeren.
Beweging installeren
Pakketten bijwerken.
pi@raspberrypi:~ $ sudo apt-get update
Installeer beweging.
pi@raspberrypi:~ $ sudo apt-get install motion -y
Nadat Motion is geïnstalleerd, bewerkt u het configuratiebestand.
pi@raspberrypi:~ $ sudo nano /etc/motion/motion.conf
Wijzig de volgende regels zodat ze hieronder overeenkomen.
daemon aan
breedte 640 hoogte 480 framerate 100 output_pictures off ffmpeg_output_movies off text_right stream_port 8081 stream_quality 100 stream_localhost uit webcontrol_localhost uit
Start de Motion Daemon bij opstarten
Open het /etc/default/motion-bestand.
pi@raspberrypi:~ $ sudo nano /etc/default/motion
Veranderen naar
start_motion_daemon=ja
Sla het bestand op en sluit af
Opnieuw opstarten
pi@raspberrypi:~ $ sudo reboot
Nadat de Pi opnieuw is opgestart, opent u de browser en controleert u of u videostreaming hebt in de browser op poort 8081
Voorbeeld:
192.168.1.18:8081
Problemen met de bewegingsdaemon oplossen
Ik kwam problemen tegen om de bewegingsdaemon bij het opstarten te laten starten terwijl ik verschillende opties in het bestand motion.conf uitprobeerde.
Als u beweging start vóór de bewegingsdaemon in Raspian Stretch, zult u waarschijnlijk problemen tegenkomen om het later bij het opstarten te laten starten. Door "sudo motion" uit te voeren zonder de daemon te configureren om dit te doen, wordt eerst de map /var/log/motion gemaakt zonder de gebruiker schrijfrechten te geven.
Stap 3: Apache installeren en webbeheerpagina instellen
Apache is de webserver voor de besturingswebpagina van de robot. We gaan het standaard Apache index.html-bestand vervangen door een bestand dat is gedownload van github. Je zult ook een aantal regels code wijzigen om de bewegende videostream weer te geven en toe te wijzen waar de commando's naartoe moeten worden gestuurd om de robot te besturen.
Apache en Git. installeren
pi@raspberrypi:~ $ sudo apt-get install apache2 git -y
Zodra apache en git zijn geïnstalleerd, downloadt u de bestanden.
pi@raspberrypi:~ $ git-kloon
Open de roombarobot-map.
pi@raspberrypi:~ $ cd roombarobot
Vervang het bestand index.html in de map /var/www/html door het bestand index.html in het bestand /home/pi/roombarobot
pi@raspberrypi:~/roombarobot $ sudo cp index.html /var/www/html
Bewerk het index.html-bestand
Open het bestand index.html met een teksteditor.
pi@raspberrypi:~/roombarobot $ sudo nano /var/www/html/index.html
Zoek de deze twee lijnen
var host = "ws://YOURIPADDRESS:9093/ws";
Wijzig "UWIP-ADRES" in het statische IP-adres dat u in stap 1 hebt ingesteld en sla het bestand op.
Voorbeeld:
var host = "ws://192.168.1.18:9093/ws";
Open op een andere computer een browser en voer het IP-adres van je Pi in. U zou de bedieningswebpagina moeten zien met een vak aan de linkerkant, streaming video van uw webcam en de webbedieningsknoppen aan de rechterkant.
Stap 4: Stel de code in en test deze
Deze code is geschreven in python en vereist de tornado-bibliotheek. De code gebruikt de bibliotheek om een server in te stellen om te luisteren naar opdrachten van de besturingswebpagina via websockets op poort 9093.
Installeer PIP en de Tornado-bibliotheek
pip installeren
pi@raspberrypi:~ $ sudo apt-get install python-pip
Installeer tornado-bibliotheek
pi@raspberrypi:~ $ sudo pip install tornado
Start het Roombabot-programma en test de verbinding
Start het roombabot.py-programma
pi@raspberrypi:~$ sudo python /home/pi/roombarobot/roombabot.py
Eenmaal uitgevoerd, zou u "Klaar" in de terminal moeten zien. Open de besturingswebpagina in een browser en klik op verbinden. Klik vervolgens op een van de richtingsknoppen op de pagina. U kunt ook de pijltjestoetsen op uw toetsenbord gebruiken.
U zou een uitvoer in de terminal moeten zien die er ongeveer zo uitziet.
Klaar
verbinding geopend… verbinding geopend… ontvangen: u 8 Lopend Voorwaarts verbinding geopend… ontvangen: l 6 Draaien naar links verbinding geopend… ontvangen: d 2 Draaien Omgekeerde verbinding geopend… ontvangen: r 4 Draaien naar rechts
Druk op ctrl+c om het programma te stoppen.
Als je klaar bent met het testen, zet je de Pi uit.
pi@raspberrypi:~$ sudo poweroff
Bugs
Ik heb een probleem opgemerkt met de afsluitknop op de bedieningswebpagina. Soms doet de afsluitknop niets wanneer erop wordt geklikt of getikt. Ik heb niet kunnen achterhalen wat dit veroorzaakt, maar er is een oplossing. Als u de robot wilt uitschakelen en de afsluitknop werkt niet, laad de pagina dan opnieuw, klik / tik op de verbindingsknop en klik / tik vervolgens op de afsluitknop. Het zou moeten uitschakelen.
Stap 5: Montage
Zoals eerder vermeld hoef je voor dit project geen Roomba te gebruiken. Alles met twee motoren, twee wielen en een frame zou werken. Ik heb de Roomba uit elkaar gehaald en alles verwijderd behalve de wielmodules en de batterij.
Wielmodules
De wielen en motoren van Roomba zijn samen gehuisvest in een verwijderbare module. Elke module heeft een blauwe buitenbehuizing met daarin de motor, versnellingsbak, wiel, ophangveer en interfacekaart.
Interfacekaart
Elke interfacekaart heeft zes draden die ernaartoe lopen. Er zijn twee draden (Rood [+], Zwart [-]) die de motor draaien, één datadraad voor een hall-effectsensor, één draad voor de wielvalschakelaar, één 5V-draad en één GND-draad om de sensor van stroom te voorzien. U moet de module uit elkaar halen om toegang te krijgen tot de interfacekaart. Ik heb alles terug naar de motor verwijderd en nieuwe [+] en [-] draden aan de motor gesoldeerd (zie foto's). Het is aan jou of je de sensoren wilt behouden of niet.
Ophangveren
Zodra u het vacuümgedeelte verwijdert, wordt het gewicht van de Roomba weggegooid. Als u de veren niet verwijdert, zal de Roomba schuin gaan zitten. Ik heb deze oorspronkelijk verwijderd, maar heb ze toen weer toegevoegd toen ik merkte dat het moeite had om over tapijt te rollen. Door de veer terug te plaatsen was het probleem verholpen.
Bedrading van de motoren naar de motorcontroller
De motoren zijn van elkaar af gericht. Dat betekent dat om de Roomba vooruit te laten rijden, de ene motor naar voren moet draaien en de andere achteruit. Ik dacht hier niet veel over na totdat ik alles had aangesloten. Uiteindelijk heb ik gewoon de code geschreven over hoe ik de motoren in eerste instantie had aangesloten. Dit was een gelukkig ongeluk, want telkens wanneer de Raspberry Pi wordt in- of uitgeschakeld, is er spanningsuitgang naar de GPIO-pinnen. Zoals ik dingen heb aangesloten, draait de Roomba totdat de Raspberry Pi is opgestart (ongeveer dertig seconden) en draait hij bij het afsluiten totdat de stroom wordt verwijderd. Als het anders bedraad zou zijn, zou het mogelijk naar voren / achteren rollen, wat irritant zou zijn. Ik ben van plan dit uiteindelijk op te lossen met een eenvoudige schakelaar voor de motorcontroller.
De motoren en batterij aansluiten op de motorcontroller
Voeding- - - - - - - - - - - - - - - - 12V [+]- - - - - - - - - - - - -Roomba Accu [+]
Motor 2- - - - - - - - - - - - - - - Zwart- - - - - - - - - - - - - Linker motor [-] Motor 2- - - - - - - - - - - - - - - Rood- - - - - - - - - - - - - - -Linker Motor [+] Motor 1- - - - - - - - - - - - - - - Zwart- - - - - - - - - - - - - -Rechter Motor[-] Motor 1- - - - - - - - - - - - - - - Rood- - - - - - - - - - - - - - -Rechter Motor[+] GND- - - - - - - - - - - - - - - - - 12V [-]- - - - - - - - - - - - -Roomba Accu [-]
De motorcontroller aansluiten op de Raspberry Pi
Motor Controller Pins Draadkleur (zie foto's) Raspberry Pi Pins
GND- - - - - - - - - - - - - - - - - Zwart- - - - - - - - - - - - - -GND PWM 2- - - - - - - - - - - - - - - - Blauw - - - - - - - - - - - - - -GPIO 18 DIR 2- - - - - - - - - - - - - - - - Groen- - - - - - - - - - - - - -GPIO 23 PWM 1- - - - - - - - - - - - - - - - Geel - - - - - - - - - - - - -GPIO 24 DIR 1- - - - - - - - - - - - - - - - Oranje - - - - - - - - - - - - -GPIO 25 5V - - - - - - - - - - - - - - - - - Rood- - - - - - - - - - - - - - -5V
De elektronica monteren
Er komt niet veel bij kijken om alles in elkaar te zetten. Ik heb de roomba uit zijn chassis gehaald. Als de kap is verwijderd, kunt u eenvoudig de bestaande plastic afstandhouders afknippen en gaten boren om de elektronica te monteren. Er zijn bestaande poorten om kabels van de motoren te laten lopen. Als u de standaard Roomba-batterij gebruikt, is er al een uitsparing voor toegang tot de batterijpolen.
Batterijen
Ik gebruikte aparte batterijen voor de Raspberry Pi en de motorcontroller. De batterij van de Pi is slechts een 5V-batterijpakket dat wordt gebruikt om mobiele telefoons te stimuleren. Voor de motorcontroller heb ik de originele Roomba-batterij gebruikt die erbij zat. De accupolen zijn niet gelabeld, dus het is het beste om de spanning te controleren met een voltmeter voordat u deze aansluit op de motorcontroller. Om de draden aan de Roomba-batterij te bevestigen, heb ik vier neodymium-magneten gebruikt (zie foto's). Ik heb twee van de magneten aan de draden gesoldeerd en de andere twee heb ik aan de batterijpolen geplakt. Solderen demagnetiseert de magneten. De coating aan de buitenkant kan echter nog steeds aan de magneten op de klemmen hechten en elektriciteit geleiden. Dit maakt het aansluiten en loskoppelen van de accu een fluitje van een cent.
Testen
Als je alles bij elkaar hebt, controleer dan of je alles correct hebt aangesloten, zet je robot ergens op (zodat hij niet wegrolt) en zet hem aan.
Log in en start het roombabot.py-programma
pi@raspberrypi:~$ sudo python /home/pi/roombarobot/roombabot.py
Ga naar de webcontrolepagina en test het uit. Als alles correct is aangesloten, moeten de wielen in de juiste richting draaien wanneer de knoppen worden ingedrukt / de pijltjestoetsen worden ingedrukt (vergeet niet op verbinden te klikken).
Stap 6: De Python-code starten bij opstarten / afmaken
Het laatste wat we moeten doen is Raspbian vertellen om het python-programma bij het opstarten te starten. Om dit te doen gaan we een script maken en plannen om het te laten draaien bij het opnieuw opstarten met behulp van crontab.
Maak het script
Maak een nieuw scriptbestand met de naam startrobot.sh in de pi-gebruikersmap
pi@raspberrypi:~ $ sudo nano startrobot.sh
Kopieer de volgende regels naar het bestand
#!/bin/sh
#startrobot.sh cd / cd /home/pi/roombarobot sudo python roombabot.py cd /
Sla het bestand op en sluit af
Maak het startrobot.sh-bestand uitvoerbaar
pi@raspberrypi:~$ sudo chmod 755 startrobot.sh
Test het uit (Druk op ctrl + c om te stoppen)
pi@raspberrypi:~$ sh startrobot.sh
Bewerk het crontab-bestand
pi@raspberrypi:~$ sudo crontab -e
Voeg de volgende regel toe aan de onderkant van het bestand:
# m h dom mon dow commando
@reboot sh /home/pi/startrobot.sh
Opslaan en afsluiten
Het roombabot.py-programma zou nu moeten starten wanneer de Pi opnieuw wordt opgestart of wordt uitgezet.
Afronden
Op dit punt zou u een functionele robot moeten hebben die u kunt besturen met behulp van de browser vanaf elk apparaat in uw netwerk. Ik heb dit een beetje verder gegaan sinds de oorspronkelijke bouw en het instellen van een VPN om toegang te krijgen tot de robot als ik niet thuis ben. Ik ben van plan om in de toekomst nog enkele wijzigingen aan te brengen. Ik ben van plan om het autonoom te maken en mogelijk bewegingen te volgen terwijl ik toch de besturing kan overnemen wanneer ik wil.