ALPHA-KLAR! Robotgräsklippare med autopilot och cylinder!
ALPHA-KLAR! Robotgräsklippare med autopilot och cylinder!
Ouchhh... vilken tid detta tog. Har fått barn och byggt hus... så det har ju blivit lite andra prioriteringar.
Tanken är väl ändå att jag ska bli klar år 2018. Vi får se hur det blir med det.
Blev ju klar med Alphan 2018
Att göra - i prioriteringsordning
1. Printa ett skal till basstationen för GPS som är väderskyddat - så den kan vara utomhus 24/7 - 365 - med strömkabel.
2. Montera motorerna på ett bra sätt så att kraften utnyttjas maximalt
3. Köpa batterier för att driftsätta motorerna på "riktigt"
4. Rita en hållare för RPI, antenn och kompassometer som ska printas ut
Senast uppdaterad: 2019-04-25
Har köpt nya GPS-moduler som heter NEO M8N.
Gjort färdigt web-interface för styrningen.
FÖRSTA KÖRNINGEN PÅ GRÄSMATTAN OCH KLIPPT GRÄS!
Monteringslösning för RPI, antenn och kompass dit.
Pågående projekt:Jag kommer uppdatera inlägg 3 med uppdatering och även i tråden med nya inlägg och fortskridande status på projektet. Detta för att underlätta för mig vid uppdateringen av tråden. För dig som vill se från start - mål när detta är klart räcker det att gå till Inlägg 3.
Frågor och input: Ställs i forumdelen där jag besvarar dessa.
Om projektet:
Jag har tänkt bygga en robotgräsklippare - skillnaden mot robotgräsklipparna som finns på marknaden idag och min är att jag kommer använda mig av en autopilot som styrs via GPS och den är byggd på en cylinder istället för rotorer som är det vanliga idag. Möjlighet att ta över styrningen ska finnas så att en fjärrkontroll kan användas istället om man bara behöver kantklippa eller behöver finputsa något område på gräsmattan. På roboten kommer det även finnas en kamera som kan se en live-vy ifrån. Batteritiden har jag tänkt till mellan 30-60 min klipptid. Detta är i stora drag vad jag har tänkt åstadkomma och det är denna tråd till för er som är intresserade. I denna tråd kommer jag även lägga en komponentlista med priser längst ner för att se vad projektet kostar/kostat.
Tidsplan:
2015-07-23 – 2016-09-01 (2016-06-01 Första tidsplanen)
2015-07-23 - 2018-09-23 (här börjar ju gräset spira igen)
[ALPHA KLAR]
2015-07-23 - 2018-09-23!
Ekonomi:
Total budget för projektet är 2000:- kanske +/- någon krona. Men jag tror detta är realistiskt.
Totalt budget är nu uppe i nästan 3000:-... men kommer återkomma med en komplett lista när allt är klart.
Cylindergräsklippare:
Jag kommer använda mig av en redan befintlig gräsklippare som finns på marknaden idag - alltså inte bygga en. Detta för att kunna ägna mer tid åt programkoden och elektroniken som kommer behövas för att få detta att fungera. Anledningen till att jag valt cylindergräsklippare är att den är mer skonsam för gräsmattan och att det idag saknas automatiskt sådan (vad jag vet). Det jag har tagit hänsyn till när jag valt cylindergräsklippare är priset och vikten på ekipaget. Denna är redan inhandlad och det blev en AL-KO Comfort 38-5 för 300:-. Vikten på ekipaget är 6.0 kg och diametern på hjulen är 22 cm och klippbredd på 38 cm.
En riktigt bra upptäckt när jag fick hem gräsklipparen var att om ett hjul snurrar, snurrar cylindern och det andra däcket står still. Detta är viktigt att veta vid riktningsförändring. När gräsklipparen rullar bakåt, drivs inte cylindern - alltså frikopplar den vid backning. Också bra - då det krävs mindre energi vid backning än vid framåtåkning.
Hjärnan/Intelligensen:
En Rasperry PI version 3 kommer vara hjärnan som kommer arbeta med logiken och programspråket - till RPI kommer alla komponenter som behövs kopplas till GPIO-pinnanrna.
Programkoden kommer göras i Python och Java tillsammans Node.js då det finns bra bibliotek för mina ändamål och det är ett relativt simpelt språk för mig som är novis inom programmering.
GPS:
Som sagt kommer jag styra gräsklipparen med en GPS och en autopilot. Min tanke är att använda mig av koordinater på gräsmattan som gräsklipparen ska gå till. Beroende på hur långt det är kvar till nästa koordinat så ska den styra mot nästa koordinat. GPSerna har ju oftast en tillförlitlighet på ca någon meter men jag ska försöka komma till några dm eller t.o.m cm. Hur ska detta göras? Med hjälp av RTK och RAW-data från GPSen kan man komma ner till dm-precision, är det dessutom fri sikt för GPS-en ser jag att jag skulle kunna komma ner till cm-precision. Jag har köpt en U-blox Neo-7M-000 GPS Module för 120:-. Jag kommer vara tvungen att aktivera RAW-data ut från denna enhet eftersom det är inget som är i den köpta produkten. För att använda sig av "riktig" RTK behövs ytterligare en GPS-modul, så detta måste inhandlas. Har kontribuerat på openstreetmap hur aktivering av RAW-data från GPS-modulen fungerar - här är en länk för nyfikna. Har nu även gjort samma sak för Neo-8M modulerna. Behövde få ut RAW-datan från dessa här också och det är också upplagt på openstreetmap.
Kompass:
För att veta åt vilket håll ekipaget pekar åt kommer jag använda mig av en kompassometer som heter HMC5883L. Denna får man ut tre axlar ifrån X,Y,Z. Denna kommer hjälpa till att styra motorerna så att ekipaget svänger åt rätt håll.
Motorer:
Jag vill att ekipaget ska åka i ca 1m/s och har i en annan tråd här på forumet fått hjälp att räkna ut hur snabbt motorn ska snurra.Tråden för hjälp att välja motor.
Eftersom ekipaget kommer väga ca 7-8kg inkl. allt så behöver motorerna ha ordentligt med vridmoment. Även om det är lite lutning upp på gräsmattan kan det vara bra att ha lite extra kraft i motorn. Det kommer vara två motorer som driver hjulen, hjulen i sin tur driver cylindern på gräsklipparen.
Nedanstående motor fann jag till slut och har inhandlat 2 st - max kgcm 12,1/motor. Så det borde kunna bli 12,1*2=24,2kgcm i full kraft. 12V DC 100 RPM High Torque Gear Box Electric Motor for Speed Control för 310:-
Specar nedan:
Voltage: 12V DC
Gear ratio: 1/51
No-load speed: 100RPM
Rated Speed: 70RPM
Rated torque: 12.1kg.cm
Rated current: 2.1 Amp
Length of Motor(including spindle): 108mm
Diameter: 37mm
Shaft length: 20mm
Shaft diameter: 6mm
Motor drivare/styrkrets:
Jag har inhandlat en L293D för 31:-. Efter lite läsning upptäckte jag att denna max kan driva motorer på max 1A.
Så jag ska försöka hitta en ersättare för denna som passar till motorn. Min L293D har kommit väl till pass och jag har utfört experiment med RPI som controller och kunnat styra 2 st motorer med denna.
Min motordrivkrets kommer bli en L298N som enligt databladet ska klara peakar på 3A per kanal och den är ratad för att klara 2A per kanal. Mina motorer på peak är 2.1A så denna drivkrets bör klara det. Sedan återstår att se om den går koppla precis som L293D till RPI - för att använda den som kontroller istället för ett eget chip. Detta är ju min tanke.
Köpte enbart en IC krets L298N i min förhoppning om att denna skulle kunna användas direkt. Men till skillnad mot L293D som har inbyggda dioder har L298N inte det. Detta gör att när motorn stannar kan det finnas risk för att ström åker tillbaks från motorn in i IC-kretsen så att den brinner upp. Så jag beslutade mig för att köpa två kompletta satser ihopbyggda på ebay - dessa kostar enbart 20:- styck - och då är alla komponenter ihoplödda.
Batteri:
Alla komponenter kommer använda sig batterier, det kommer bli totalt 2 batterier. Ett batteri har inhandlats och det är för att strömsätta RPI med komponenter, det blev ett PowerBank 2200mAh Polymer Grade A för 100:-. Det kommer bli 1 batteri som strömsätter båda motorerna - detta för att underlätta vid uppladdning av batterierna och på så sätt minska vi vikten också. Kemin i batteriet kommer vara antinge Li-Ion eller Li-Ion polymer.
Ska även räkna ut hur länge PowerBank 2200mAh håller för mina komponenter och beroende på detta - bestämma hur mycket mAh det ska vara till motorerna.
Klipparen ska kunna vara ute i ca 1h. Då jag har 2 motorer på 12V och max.output är 2.1A - totalt 4.2A. För att räkna ut att jag ska denna i en timme att vara ute och köra så behöver jag ett batteri på 4.1/0,7= 5,85Ah Anledningen till att jag valt att dela med 0,7 är att batterierna inte orkar kräma ut allt som finns i dom. Så jag tror att ett batteri på 12V med minst 5850mAh ska räcka till mina motorer.
Batterier som är köpta är Samsung INR18650-25R 2500mAh - 20A
Jag har köpt 12st - tanken är att koppla dessa på i tre paralellea grupper och 4 i serier. Alltså ett 4S3P-pack.
Total kapacitet i energi är 7500mAh - beräknad för en timme var 5850mAh - så då har jag totalt 1650mAh kvar efter 1h körning.
Batterier köpta från https://eu.nkon.nl/.
Batterier kommer troligtvis köpas från https://eu.nkon.nl/ såg att någon annan här på forumet köpt därifrån.
[Batterimätning]
Behöver även mäta spänningen i batterierna så jag vet när laddaren "INTE" får vara ute mer för att inte förstöra cellerna. Då kommer gräsklipparen få köra till ett "speciellt" ställe och parkera sig där.
För att mäta kommer jag använda mig av PCF8591 ADC converter.
Montering:
Motorn sitter fäst i chassit på ovansidan, sedan har jag satt drevet i axeln. På drevet sitter det armar med kullager som snurrar hjul. På hjulen går det larvband, och här sitter även drivhjul för motorn och drivhjul för cylindern så att gräset kan klippas.
Köpta komponenter:
Raspberry PI ver2 - 378:- (cdon)
AL-KO Comfort 38-5 - 300:- (bollnäs bilvård)
DC-motor 100RPM - 310:- (ebay)
PowerBank 2200mAh Polymer Grade A - 100:-
1# U-blox Neo-7M-000 GPS Module – £8.56 (ebay.co.uk)- 120:-
2# U-blox Neo-7M-000 GPS Module – £8.56 (ebay.co.uk)- 120:- - denna försvann i postgången - har fått ersättning!
3# U-blox Neo-7M-000 GPS Module – £8.56 (ebay.co.uk)- 120:-
HMC5883L – Compass – $0.99 (ebay.com)- 9:-
L293D – motordrivkrets – 31:- (electrokit)
USB till seriell PL2303HX - 100:- (kjell)
Stiftlist 40x1 pin - 15:- (kjell)
L298N IC - motordrivkrest - 56:- (elfa)
Batterihållare för 8st AA 35:- (elfa)
Kontak till batterihållare - 13:- (elfa)
2 x L298N komplett - 40:- (ebay.com)
Pololu nav, 6 mm, M3 - 90:- (hobbytronik)
2 x Maxrad GPS-TMG-26N - 478:- (ebay.com)
2 x N male straight to IPX U.FL female 1.13 cable jumper pigtail 20cm - 78:- (ebay.com)
2 x Kopplingslåda extra hög 140 :- (clas ohlson)
1 x USB förlängning 5m - A-hane - A-hone -54:- (kopplat.se)
12 x 18650 Samsung INR 3,6V 2500mAh - 500:- (nkon.eu)
1 x PCF8591 - 69:- (tradera)
Totalt 24/10-2018: 3036:-
- Lennart Aspenryd
- Tidigare Lasp
- Inlägg: 12607
- Blev medlem: 1 juli 2011, 19:09:09
- Ort: Helsingborg
Re: Robotgräsklippare med autopilot och cylinder!
Jag gillar din åtgärdsplan på din hemsida, rätt tänkt och gjort.
Fråga, kommer cylindern att rotera med hjälp av framhjulen eller kommer det att vara en separat cylinderdrivning? Kommer cylindern att lyftas upp vid tomkörning och riktningsförändring?
Re: Robotgräsklippare med autopilot och cylinder!
ALPHA KLAR - 2018-09-23!
Genom hela projektet loggar jag in via DAG till min Raspberry Pi - så denna köra jag headless och använder min PC för att skriva all kod.
Innehåll
Delprojekt 0 - Installera Raspian på RPI (klart)
Delprojekt 1 - Löda pinnar till HMC5883L (klart)
Delprojekt 2 - Få Rasperry Pi att fungera med HMC5883L (klart)
Delprojekt 3 - Löda pinnar till Ublox Neo-7M(GPS-modul) (klart)
Delprojekt 4 - Få Rasperry Pi att fungera med Ublox Neo-7M (klart) (uppdaterad 2017-03-17)
Delprojekt 5 - RAW-data inställningar med Windows och U-center v.8.18 (klart)(redigering och bilder kommer)
Delprojekt 6 - RAW-data inställningar med Linux och CLI (klart)
Delprojekt 7 - Utdata från GPSen med Pynmea2 (klart)
Delprojekt 8a - Kompilera RTKLIB för Rasperry Pi med ver.2.4.2 med patch rev11 (klart)
Delprojekt 8b - Använda RTKRCV för GPS Neo-7M under Linux
Delprojekt 9 - Använda både GPS och kompass samtidigt från RPI? (klart)
Delprojekt 10 - Testa motorerna med batterier (klart)
Delprojekt 11 - Testa motor och se hur mycket de orkar (klart)
Delprojekt 12 - Vädertäta Raspberry Pi (klart)
Delprojekt 13 - Få RTKLIB i Linux med basstation att fungera (klart)
Delprojekt 14 - Ta emot TCP-ström i Python från RTKLIB (klart)
Delprojekt 15 - Använda RTKLIB med nya antenner och få fixed position (klart)
Delprojekt 16 - Använda L298N tillsammans med RPI (klart)
Delprojekt 17 - Styra L298N med PWM från RPI (klart)
Delprojekt 18 - Styra PWM baserat på compassometer med en fixed variabel (klart)
Delprojekt 19 - Skapa en RTKLIB basstation för utomhusbruk(klart)
Delprojekt 21 - Göra en ny basstation och korrelera mot SWEPOS(klart)
Delprojekt 22 - Montera motorn på cylinderklipparen (nerlagt - se Delprojekt 23 istället)
Delprojekt 23 - Montera motorn och på cylinderklipparen(klart)
Delprojekt 24 - Få gräsklipparen att röra på sig efter förändrad konstruktion av motorplacering(klart)
Delprojekt 31 - Prototyp 1 - ALPHA KLAR, tester (klart)
Delprojekt 34 - Starta basstationen automatiskt så fort den får ström(klart)
Delprojekt 35 - Göra ett grafiskt interface för att styra gräsklipparen från mobilen(klart)
Pågående projekt
Delprojekt 20 - Testa precision jag kan få trädgården med bas och en rover - och optimera konfigurationen
Delprojekt 25 - Montera övriga komponenter på cylinderklipparen
Ej färdiga kommande delar projektet
Delprojekt 32 - Styra PWM baserat på compassometer
Delprojekt 33 - Beräkna strömåtgång för 2st Raspberry Pi
Delprojekt 36 - Markera ut en slinga med GPS-koordinator där gräsklipparen får röra sig
Delprojekt 0 - Installera Raspian på RPI
För er som behöver hjälp att komma igång med RPI att starta upp och installera har jag gjort en tutorial på min hemsida.
Kommer inte skriva något omfattande om det här i den här tråden, det finns även ett flertal guider på nätet om det. Här kommer min:
Get Raspberry Pi up and running!
Delprojekt 1 - Löda pinnar till HMC5883L
Vad? - Löda fast pinnar på HMC5
Jag köpte en HMC5883L från ebay från Kina, det kom med pinnar som skulle lödas fast. När jag gjort tester med HMC5883L utan att löda har det varit svårt att få ordentlig kontakt med chipet och jag beslöt mig därför att löda fast pinnarna på chipet.
Min lödkolv är en 9W som går på tre AA-batterier och jag tror den duger gott för mig som aldrig kommer göra några större lödningar.
Så här är resultat av min första lödning - jag tyckte det blev rätt bra. Även om GDA och DRDY skulle kunna fått lite till lödtenn. Delprojekt 2 - Få Rasperry Pi att fungera med HMC5883L
HMC5833L använder sig av I2C så det första vi måste göra är att aktivera detta på Rpi, det gör vi genom att köra
Kod: Markera allt
sudo raspi-config
Vi behöver lägga till så att modulerna laddas från början, detta görs inte automatiskt när vi aktiverar i2c. Skriv
Kod: Markera allt
sudo nano /etc/modules
ochi2c-bcm2836
När du gjort detta tryck på CTRL och X tillsammans och svara sedan Y på frågan om du vill spara/skriva över filen.i2c-dev
Efter detta ska vi uppdatera RPI så att vi har allt som behövs för att använda HMC5883L till Python. Kör följande kommandon.
Kod: Markera allt
sudo apt-get update
sudo apt-get upgrade
sudo apt-get install i2c-tools
sudo apt-get install python-smbus
sudo apt-get install python3
Kod: Markera allt
sudo reboot
Kod: Markera allt
sudo apt-get install git
Kod: Markera allt
git clone https://github.com/quick2wire/quick2wire-python-api.git
Kod: Markera allt
nano setup.env
export QUICK2WIRE_API_HOME=~/project/quick2wire-python-api (här ska du ändra till den katalog du har valt att lägga denna i)
export PYTHONPATH=$PYTHONPATH:$QUICK2WIRE_API_HOME
Precis som innan i nano trycker CTRL + X för att avsluta och spara/ersätt filen med Y. Nu kan du skriva
Kod: Markera allt
. ./setup.env
Skapa en katalog där du ska skapa ditt program och gå in i den katalogen
Kod: Markera allt
sudo mkdir program
cd program
Kod: Markera allt
git clone https://bitbucket.org/thinkbowl/i2clibraries.git
Stäng av RPI genom att ta bort strömförsörjningen eller skriv
Kod: Markera allt
sudo shutdown -h now
HMC5883L -- RPI
VCC --> Pin nr 1
GND --> Pin nr 6,9,14,20,25,30,34 eller 39 (koppla bara GND till en av dessa)
SCL --> Pin nr 5
SDA --> Pin nr 3 När du kopplat ihop HMC5883L med RPI kan du starta upp RPI igen.
För att kontrollera om du har en kommunikation med HMC5883L finns ett program som heter i2cdetect.
Kör följande kommando:
Kod: Markera allt
i2cdetect -y 1
Skapa en fil som heter t.ex
Kod: Markera allt
nano compass.py
#Först ska vi importera biblioteket som vi tidigare laddade ner
from i2clibraries import i2c_hmc5883l
#Här anger vi vilken utport RPI ska använda, numret inom () är porten
hmc5883l = i2c_hmc5883l.i2c_hmc5883l(1)
#Kontinuerligt läge på HMC5883L
hmc5883l.setContinuousMode()
#Här är den magnetiska declinationen, dessa tal ska ändras till din egna
hmc5883l.setDeclination(5,43)
#Här anger vi att ska skriva ut HMC5883L värden som kommer från fjärde raden
print(hmc5883l)
Spara filen genom att trycka CTRL+X och svara Y för att spara/ersätta filen.
Skriv sedan följande för att köra programmet
Kod: Markera allt
python3 compass.py
Delprojekt 2 klart!
Delprojekt 3 - Löda pinnar till Ublox Neo-7M(GPS-modul)
Resultatet av gårdagens lödning ;( Blir troligtvis att jag gör om detta ikväll!
Delprojekt 4 - Få Rasperry Pi att fungera med Ublox Neo-7M
För att kommunicera med Ublox Neo-7M kommer jag att använda mig av seriell data, många guider på nätet föreslår USB. Eftersom RPI har ett GPIO interface med TX och RX tycker jag att detta ska användas. Vi har ju i tidigare del med HMC5883L kopplat in oss på I2C-kretsen. Nu ska vi koppla in oss på UART som det också heter.
RPI 1 och RPI 2
Serieporten på linux går under namnet /dev/ttyAMA0 och det är hit vi ska koppla vår GPS. Standard på RPI är att denna är kopplad så att du ska logga in med ett seriellt interface den vägen, men det ska vi inte göra. Så vi ska ta och avaktivera detta och göra den tillgänglig för GPS-chipet.
RPI 3
/dev/ttyAMA0 är nu upptagen av bluetooth som finns på RPI 3 - så nu har vår seriella port /dev/ttyS0 som namn istället. Som standard på RPI 3 är UART inaktiverad så vi behöver modifiera en fil som under /boot/config.txt och lägga till en rad som heter enable_uart=1.
Vi ska ändra i en fil som heter cmdline.txt så det första vi gör med denna fil är att vi tar en backup ifall något skulle bli fel.
Kod: Markera allt
sudo cp /boot/cmdline.txt /boot/cmdline.txt.backup
Kod: Markera allt
sudo nano /boot/cmdline.txt
Kod: Markera allt
dwc_otg.lpm_enable=0 console=ttyAMA0,115200 kgdboc=ttyAMA0,115200 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline rootwait
Kod: Markera allt
dwc_otg.lpm_enable=0 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait
!!VIKTIGT ATT INTE GÖRA NÅGRA RADBRYT HÄR - ALLT SKA VARA PÅ SAMMA RAD!!
Inittab är ersatt av systemd i nyare distar till RPI - så denna punkt är troligtvis inte nödvändig längre
Sedan ska vi inaktivera ytterligare funktioner i en annan fil som heter inittab så ta en backup på denna först genom att skriva
Kod: Markera allt
sudo cp /etc/inittab /etc/inittab.backup
Kod: Markera allt
sudo nano /etc/inittab
Framför den andra raden sätter du en hashtag så att det efteråt ser ut så här#Spawn a getty on Raspberry Pi serial line
T0:23:respawn:/sbin/getty -L ttyAMA0 115200 vt100
och nu kan vi stänga av RPI genom att ta ut sladden för vi ska koppla ihop Ublox NEO-7M med GPIO-portarna på RPI.#Spawn a getty on Raspberry Pi serial line
#T0:23:respawn:/sbin/getty -L ttyAMA0 115200 vt100
Här kommer hur jag har gjort. Anledningen till att jag gått via breadboardet är att jag inte hade några hona - hona kontakter så detta får duga.
Ublox Neo-7M-000 -- RPI
VCC --> Pin nr 1 (VCC)
GND --> Pin nr 6 (GND)
RX --> Pin nr 8 (TX)
TX --> Pin nr 10 (RX) När detta är gjort ska vi starta upp RPI och installera program för att se om vi har någon kontakt med modulen.
Vi ska installera ett program som heter gpsd och det finns några program som krävs ytterligare för att detta ska fungera så kör följande kommando
Kod: Markera allt
sudo apt-get install gpsd gpsd-clients python-gps
Kod: Markera allt
sudo service gpsd start
Kod: Markera allt
cgps -s
Om man är osäker på att det verkligen kommer utdata från GPSen kan prova följande kommando
Kod: Markera allt
(RPI,RPI2)gpscat /dev/ttyAMA0
(RPI3)gpscat /dev/ttyS0
Nu ska du få utdata från GPSen från RPI.
Delprojekt 5 - RAW-data inställningar med Windows och U-center v.8.18
Jag var osäker på vad som verkligen hände i Linux när jag skickade kommando till GPS-modulen. Det blev en stor osäkerhet och jag kände att jag var tvungen att ha koll på vad som kom ut ur GPS-modulen. Läste på nätet på olika forum om Ublox eget program U-center där inställningar kunde ställas in i modulen. För att kunna använda mitt chip till windows krävdes en USB-SERIELL kabel med ett chip som heter PL2303 för att använda något som kallas FTDI.
Därav mitt inköp av en USB-seriell kabel med ett PL chip, detta körde jag i Windows 10. Kabeln köpte jag på Kjell för att jag snabbt ville testa detta och se om det funkar. Finns billigare varianter på ebay men ville inte vänta 1 månad på att få en billig kabel. Denna kabel blev det Usb till seriell. Innnan jag köpte denna kabel googlade jag och såg om det fanns stöd för PL2303HX i Windows 10 64-bit - och det gjorde det INTE. Men som det ofta gör för det guider hur denna kabel kunde fungera under Windows 10. Där framkom det att krävdes en speciell version av Profilic driver Version 3.3.2.102 och med denna installerad och datorn omstartad så fungerade min kabel. Här är en länk till drivrutinen som jag använde mig av Drivrutin.
Efter detta installerade jag U-center v.8.18 - detta program finns att ladda ner från Ubloxs hemsida.
Nu skulle jag koppla ihop USB-kabel med GPS-modulen. Jag har ju som ni sett tidigare lött dit ben på GPS-modulen så detta underlättade mycket.
Kopplingen blev som följer (bild kommer)
GPS - USB-Seriell
GND - Svart
VCC - Röd
RX - Grön
TX - Vit
Sedan startade jag igång U-center. Där valde jag att programmet automatiskt skulle känna av hur snabbt hastigheten gick.
Detta funkade direkt och för att se om GPS-modulen spottar ut data kan man trycka på F6,F7 och F8 - då kommer olika fönster ut och du ser direkt vad GPS-modulen spottar ur sig.
Instruktioner för att få RAW-data från GPSen från U-center
- Starta först U-center
- Anslut genom att trycka på Connect uppe till höger
- Tryck sedan på F8 - du får nu upp textkonsol
- Tryck sedan på F9 - härifrån kan vi skicka kommando till chipet
- Tryck här på Custom - längst ner i trädmenyn
- Klistan in denna rad i fältet: B5 62 06 00 14 00 01 00 00 00 D0 08 00 00 00 C2 01 00 01 00 01 00 00 00 00 00 B8 42
- Tryck på Send
- Koppla sedan ner modulen
- Ändra hastighet till 115 200
- Anslut modulen igen
- Om modulen har tagit emot kommandot rätt, kommer du i Textkonsolen inte få några meddelanden alls nu
- Gå till Custom igen - vi ska skicka nedanstående kommando till modulen ett i taget
- B5 62 06 01 03 00 03 0A 01 18 5D
- B5 62 06 01 03 00 03 0F 01 1D 67
- B5 62 06 01 03 00 01 22 01 2E 87
- B5 62 06 01 03 00 01 30 01 3C A3
- Klart!
Delprojekt 6 - RAW-data inställningar med Linux och CLI
För att skicka inställningar till GPS-modulen via den seriella kontakten skrev jag ihop ett litet program i python som skickar data direkt till gps-chipet.
Jag använde mig av biblioteket serial och sedan skickade jag data till modulen. Jag har gjort två program för testets skulle men allt kan sitta ihop i ett program. Det första programmet skickar data i en hastighet av 9600 och aktiverar UBX och rätt hastighet på GPS-moudlen och det andra skickar i en hastighet av 115200 och aktiverar RAW-data från modulen. Du kan vara tvungen att installera serial paketet för python genom att köra. För att kunna installera pyserial behöver du köra följande kommandon.
Kod: Markera allt
sudo pip insall python-pip
Kod: Markera allt
sudo pip install pyserial
Här är koden för att sätta hastigheten.
Kod: Markera allt
import serial
ser = serial.Serial('/dev/ttyAMA0',9600)
print 'Sending set UBX out and speed 115200'
command = b'\xB5\x62\x06\x00\x14\x00\x01\x00\x00\x00\xD0\x08\x00\x00\x00\xC2\x01\x00\x01\x00\x01\x00\x00\x00\x00\x00\xB8\x42'
ser.write(command)
Kod: Markera allt
import serial
ser = serial.Serial('/dev/ttyAMA0',115200)
print 'Sending set TRK-TRKD5'
command = b'\xB5\x62\x06\x01\x03\x00\x03\x0A\x01\x18\x5D'
ser.write(command)
print 'Send set TRK-SFRBX'
command = b'\xB5\x62\x06\x01\x03\x00\x03\x0F\x01\x1D\x67'
ser.write(command)
print 'Sending set NAV-CLOCK'
command = b'\xB5\x62\x06\x01\x03\x00\x01\x22\x01\x2E\x87'
ser.write(command)
print 'Sending set NAV-SVINFO'
command = b'\xB5\x62\x06\x01\x03\x00\x01\x30\x01\x3C\xA3'
ser.write(command)
Delprojekt 7 - Utdata från GPSen med Pynmea2
För att kunna använda sig av datan från GPSen måste vi kunna parsa data - dett har jag gjort med hjälp av Pynmea först och efter lite testandet övergav jag pynmea till fördel för Pynmea2. Nu vet jag inte om jag kommer använda Pynmea2 då jag ska använda mig av RTKLIB, men här nedan är programmet så att jag fick ut datan från GPSen med Pynmea2.
Kod: Markera allt
import serial
import pynmea2
ser = serial.Serial('/dev/ttyAMA0',9600)
while 1:
data = ser.readline()
if (data.startswith("GPGGA")):
msg = pynmea2.parse(data)
print repr(msg.latitude)
print repr(msg.longitude)
Delprojekt 8a - Kompilera RTKLIB för Rasperry Pi med ver.2.4.2 med patch rev11
Det vi behöver från RTKLIB i Linux är ett program som kallas RTKRCV. Så jag ska visa hur jag gick tillväga för att kompilera detta. Ladda ner källkoden med git, för att installera GIT kör
Kod: Markera allt
sudo apt-get install git
Kod: Markera allt
git clone https://github.com/tomojitakasu/RTKLIB.git
Kod: Markera allt
cd \RTKLIB\app\rtkrcv\
RPI 3:CTARGET= -mcpu=cortex-a53 -mfpu=neon-fp-armv8 -mfloat-abi=hard
RPI 2:Ctarget= -march=armv7-a -mfpu=neon-vfpv4 -mfloat-abi=hard
Detta anpassar så att programmet är gjort för RPI 2. När vi kompilerar programmet använder vi kommandot make med variabel -j 4, detta gör att alla fyror kärnor används vid kompileringen. Kör följande kommandoRPI 1: CTARGET = -march=armv6 -mtune=arm1176jzf-s -mfpu=vfp -mfloat-abi=hard -ffast-math
Kod: Markera allt
make -j 4
Kod: Markera allt
./rtkrcv
Kod: Markera allt
git clone URL
Kod: Markera allt
cd in i katalogen
Kod: Markera allt
git checkout "branch"
Delprojekt 8b - Använda RTKRCV för GPS Neo-7M under Linux
Det vi behöver göra för att kunna använda sig av RKTRCV under Linux är först att se till att få RAW-data ut från GPSen. Detta gör vi med hjälp av tidigare script/program vi skapat tidigare i denna guide under delprojekt 6. Scripten kör vi på följande sätt
Kod: Markera allt
sudo python speed.py
Kod: Markera allt
sudo python raw.py
Kod: Markera allt
cat /dev/ttyAMA0
Kod: Markera allt
gpscat /dev/ttyAMA0
Kod: Markera allt
stty -F /dev/ttyAMA0 -a
Kod: Markera allt
chmod +755 rtkshut.sh
Kod: Markera allt
chmod +755 rtkstart.sh
Vi ska nu skapa en konfigurationsfil för Neo-7M - jag har valt att kalla min för 7m.conf. Denna behövs sedan när vi ska köra programmet - här ställer vi in vilken hastighet GPSen har vilken port den finns på och en hel del annat. Från början följder det med en fil som heter rtkrcv.conf - det är denna vi ska ändra eller kopiera. När vi kopierat filen kan vi ändra den. Vi ska ändra på några rader -
Kod: Markera allt
inpstr1-type=serial
Kod: Markera allt
inpstr1-path =ttyAMA0:115200:8:n:1:off
Kod: Markera allt
inpstr1-format =ubx
Kod: Markera allt
file-cmdfile1 =
Kod: Markera allt
./rtkrcv
Kod: Markera allt
load 7m.conf
Kod: Markera allt
restart
Nu kan vi körartk server restart
Kod: Markera allt
status
Kod: Markera allt
solution 1
Klart!
Delprojekt 9 - Använda både GPS och kompass samtidigt från RPI?
Kopplingsschema för att använda både GPS och kompass samtidigt. Delprojekt 10 - Testa motorerna med batterier
Detta test var för att se att motorerna fungerade och inte var trasiga. Även se så att de fick rätt spänning och ström.
Så 8 batterier på 1,5V kopplade direkt motorerna - fungerade bra. 12V till motorerna.
Delprojekt 11 - Testa motor och se hur mycket de orkar
Jag använde 1 motor koppplad till mina 8 batterier. Denna i sin tur var kopplad till ett av hjulen på gräsklipparen. Den orkade utan några konstigheter driva hjulet och även själva cylindern som klipper gräset. Med 2 motorer bör detta fungera utan några större problem.
Delprojekt 12 - Vädertäta Raspberry Pi
Det kommer vara 2 st RPI - en som fungerar som BASSTATION för RTKLIB och en som är hjärnan i gräsklipparen. Den som är basstation kommer vara monterad utomhus och kommer utsättas för mycket varierande väder. Delen som sitter på gräsklipparen kommer inte utsättas på samma sätt. Så det är det inte lika viktigt att det är helt hundra.
Har skrivit ut skalet till min RPI-basstation, och där har jag mellan RJ45-uttaget använt smältlim för att täta till så inget vatten kan läcka in. Likaså där micro-usb och antennsladden går in använt mig av smältlim för att täppa till alla öppningar in till rpin. Har även satt dit locket med en liten snäppfäste tillsammans med smältlim för hela locket, så inget vatten "bör" komma in. Vi får väl se om det är lyckat om ett år eller så, om den fortfarande lever min lilla rpi som sitter som basstation.
Delprojekt 13 - Använda RTKLIB i Linux med basstation och patchantenner
Hur får man RTKLIB att fungera i Linux med enbart CLI? Det är frågan som kommer besvaras här - jag har i nuläget inte en aning men den ska lösas..
Eftersom det finns ett tidigare projekt som är likt detta i följande tråd RTK-GPS och autostyrning- kikar jag där till en hjälp. Dessutom i manualen till RTKLIB.
Och wikin som är skapad för detta på WiKi RTK-GPS
Det ska finnas en basstation och en station som sitter på rovern - jag kommer testa mig fram för att få det rätt.
De program jag kan använda mig av är följande: RTKRCV, STR2STR, RNX2RTKP, CONVBIN.
Frågan är vilka jag ska använda - jag tror utan att veta att jag kommer använda mig av de tre första.
RTKRCV,STR2STR och RNX2RTKP. I manualen finns det ett fint diagram som visar vad jag ska göra - det ser ut så här: Har först kompilerat RTKRCV och STR2STR för RPI. Sedan har det vara ganska simpelt att få det att fungera.
Kommer använda mig av konfigurationen:
Kinematic - detta när jag har en rover som flyttar sig och har en bas som är stilla på ett och samma ställe
För basstationen använder jag:
STR2STR
I konfigurationen behöver jag välja varifrån datan kommen - GPS - som är ansluten till seriell UART på RPI 2.
Ska även välja vart utdatan ska ta vägen - och här väljer vi att vara TCP-server, testar även att skicka till en fil.
För att starta en basstation och skicka data eller konvertera till annat format använder jag följande kommando
Kod: Markera allt
./str2str -in serial://ttyAMA0:115200#ubx -out test.rtcm3#rtcm3
Kod: Markera allt
./str2str -in serial://ttyAMA0:115200#ubx -out tcpsvr://:50021
RTKRCV
I konfigurationen behöver jag välja varifrån datan kommer - GPS - som är ansluten till seriell UART på RPI B+.
Behöver även välja vilken basstation/server jag ska koppla ihop mig med.
I konfigurationen ligger även den statiska koordinaten till basstationen.
Kommer även göra en output som troligtvis kommer vara en TCP-ström som python får behandla för min autopilot.
Har tidigare bara lyckats få en single på RTKRCV idag fick ju även till så att det blev FLOAT. Kommer troligtvis inte få till att få en FIXED punkt då det krävs större än mina 1cm patchantenner och just nu står mina moduler knappt 30 cm ifrån varandra. Så större antenner och längre avstånd från varandra så ska nog detta gå också.
Får anse att denna punkt är klar tills jag har köpt nya antenner. Se projekt 20 för utveckling av detta..
KLART!
Delprojekt 14 - Ta emot TCP-ström i Python från RTKLIB
Har ändrat i min konfiguration för att få en utström i NMEA-format och detta fungerar utan problem.
Nu skickar jag data till en fil och den utströmmen ser precis ut som den datan jag tidigare använt mig av i mitt python-program.
Så det jag ska göra är att pythonprogrammet ska ta emot en tcp-ström och sedan som behandlar nmea-datan.
Ändrat på raderna i .conf filen på följande rader:
För att få ut en TCP-ström har jag ändrat följande i .conf filen:outstr1-type=file
outstr1-format=nmea
Håller på och gör ett enkelt program i Python som ska ta emot NMEA-data. Detta ska sedan implementeras in i autopiloten för att hålla kolla på var gräsklipparen befinner sig. Har just nu skapat en kommunikation mellan RTKLIB och python via en TCP förbindelse. Nu har jag även så att jag får utdata via strömmen i det lilla programmet. Här är den färdiga koden:outstr2-type=tcpcli
outstr2-format=nmea
outstr2-path=192.168.1.xxx:50002
Kod: Markera allt
import socket
import sys
HOST = '' # Symbolic name, meaning all available interfaces
PORT = 50002 # Arbitrary non-privileged port
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
print 'Socket created'
#Bind socket to local host and port
try:
s.bind((HOST, PORT))
except socket.error as msg:
print 'Bind failed. Error Code : ' + str(msg[0]) + ' Message ' + msg[1]
sys.exit()
print 'Socket bind complete'
#Start listening on socket
s.listen(10)
print 'Socket now listening'
while True:
# Wait for a connection
print 'waiting for a connection'
conn, addr = s.accept()
try:
print 'connection from', addr
while True:
data = conn.recv(128)
print 'received: %s' % data
except:
print 'error'
s.close()
KLART!
Delprojekt 15 - Använda RTKLIB och få fixed position med 2 Raspberry PI och riktiga antenner
Håller just nu på och testat RTKLIB på mina Raspberry PI. Har suttit och försökt få till det och när det är dåligt dokumenterat är det svårt att komma ihåg hur man gjort. Har kompilerat RTKRCV så det är det programmet jag ska använda nu.
Antenner som används är Maxrad GPS-TMG-26N. GPS-modulen jag har skickar en liten ström till antennen, så det är en aktiv antenn. Ingen modifiering behövde göras på GPSen utan det är standard.
Det är nämnt här i denna projekttråd att jag behöver ha minst 5st som har SNR äver 40, tror jag kommer få det att fungera.
Har sänkt elevation mask till 0grader, för att testa. Kommer trimma in och se hur bra precision det blir, har tidigare använt 15grader i elevation mask. Detta för att utesluta satelliter som ligger lågt på horisonten.
Det jag börjar med är basstationen - tänker även lägga upp min cfg fil som fungerar för detta här. Så jag själv slipper och försöka återskapa saker.
Behöver trimma in en egen basstation - tänkte därför logga position genom att samla data mellan 12-24h. Använder mig utav PPPstatic som tar fram medelpunkten av alla insamlade data, så ju längre den samlar in data, desto bättre precision i var basen befinner sig.
http://elektronikforumet.com/forum/view ... 15#p871126
Eftersom allt jag gör körs via ssh och jag vill samla in data i en fil har jag använt mig av programmet screen i Linux. Då kan processen gå i bakgrunden även när man kopplar ner SSH-sessionen. Annars avbryts programmet och det blir ingen insamling. För att komma ut och koppla från sessionen utan att stänga av den använder man kombinationen
Kod: Markera allt
ctrl+a och sedan d
I början av detta projekt trodde jag att mitt chip L293D skulle klara att styra mina motorer till detta projekt. Gjorde kopplingsscheman och fick allt att fungera med två små motorer. Efter att jag inhandlat mina motorer efter vad jag behövde insåg jag att L293D inte skulle räcka. Fick därför köpa L298N som ska klara uppgiften bra.
Så jag har gjort ett kopplingscchema hur jag kopplat ihop allt - i denna fas har jag använt mig av enbart 1 motor. Efter mycket googlande och lite eget trial-and-error fick jag L298N att fungera bra med RPI och lite pythonkod.
Någon bra hemsida som går igenom detta var inte lätt att hitta men jag har fått det att fungera som jag vill.
Kopplingscchemat.. Kod för att få motorn att snurra i 2 sek - detta är enbart en av motorerna
Kod: Markera allt
import RPi.GPIO as GPIO
from time import sleep
GPIO.setmode(GPIO.BOARD)
Motor1A = 16
Motor1B = 18
Motor1E = 32
GPIO.setup(Motor1A,GPIO.OUT)
GPIO.setup(Motor1B,GPIO.OUT)
GPIO.setup(Motor1E,GPIO.OUT)
print "Turning motor on"
GPIO.output(Motor1A,GPIO.HIGH)
GPIO.output(Motor1B,GPIO.LOW)
GPIO.output(Motor1E,GPIO.HIGH)
sleep(2)
print "Stopping motor"
GPIO.output(Motor1E,GPIO.LOW)
GPIO.cleanup()
För att kunna styra mina motorer mot rätt GPS-koordinat måste jag ha styrning av motorerna med PWM. På RPI finns det två utgångar för PWM och det är dessa jag kommer använda mig av. Det är GPIO12 och GPIO13.
Har precis tagit ett beslut att använda mig biblioteket det som finns inyggt i RPI.GPIO. Då det blir enklare att implementera koden och sedan får vi se hur det blir om det blir tillräckligt tillförlitligt. Annars byter jag ut biblioteket till RPIO.PWM istället.
Fick till koden med en stegrande ökning av hastigheten och tycker det funkar över förväntan. Sen är det inte helt steglös utan man märker olika förändringar så helt steglöst ska vi inte säga det är med en DC-motor och RPI.GPIO - vet inte om det skulle bli bättre med RPIO.PWM och tänker inte testa detta till att början med.
Utgått från koden i första testet med motorn och här är den:
Kod: Markera allt
import RPi.GPIO as GPIO
from time import sleep
GPIO.setmode(GPIO.BOARD)
Motor1A = 16
Motor1B = 18
Motor1E = 32
GPIO.setup(Motor1A,GPIO.OUT)
GPIO.setup(Motor1B,GPIO.OUT)
GPIO.setup(Motor1E,GPIO.OUT)
pwmMotor1 = GPIO.PWM(Motor1E, 150)
pwmMotor1.start(0)
print "Turning motor on"
GPIO.output(Motor1A,GPIO.HIGH)
GPIO.output(Motor1B,GPIO.LOW)
GPIO.output(Motor1E,GPIO.HIGH)
for dc in range(50, 100, 5):
pwmMotor1.ChangeDutyCycle(dc)
sleep(2.50)
sleep(2)
print "Stopping motor"
GPIO.output(Motor1E,GPIO.LOW)
pwmMotor1.stop()
GPIO.cleanup()
Nu har jag fått både compassometern och motorn fungera i python utan några större konstigheter. Nu är det dags att sätta tänderna i det lite svårare att implementera koden tillsammans. Detta för att kunna styra gräsklipparen så den åker åt rätt håll och svänger när det är tänkt. Det första i denna del är att jag ska se till att motorerna kan styras med hjälp av PWM och compassometern.
Har precis fått in min heading som en variabel.
Har fixerat mitt mål mot norr just för att få till koden och allt därikring.
Nästa problem, eller kanske inte problem utan utmaning är hur jag ska skriva in Norr som variabel med degrees och minuter.
Gjort en liten punktlisa hur jag ska bygga upp programmet:
Läsa av heading - nuvarande
Läsa av position - dit vi ska (här kommer jag använda NORR 0 som statisk punkt i detta program)
Detta sker i en loop så att vi håller rätt position.
Motorerna
Om heading=position ska båda motorerna gå på PWM=100
Om heading inte är lika med position och är mellan 180-355 - styr Motor1 PWM=60 Motor 2=100
Om heading inte är lika med position och är mellan 005-179 - styr Motor2 PWM=60 Motor 2=100
KLART!
Delprojekt 19 - Skapa en RTKLIB basstation för utomhussbruk
https://pixhawk.org/dev/rtk-basestation
Ok - Hur gör man detta? I min egen fantasi var detta verkligen enkelt men när jag började fundera blev saker inte så självklara längre som jag trodde det skulle vara. För att kunna använda sig av en pålitlig basstation och använda sig av antennen hur ska man göra. För om den står på ett och samma ställe och får olika koordinater även om den står på samma ställe blir det ju fel? Hur ska man då göra? Jag har letat efter guider där folk bygger sina egna basstationer men inte hittat några bra tips eller guider så jag fick läsa manualen och klura lite själv.
Vi kommer ha två antenner:
1 antenn - basstation
1 antenn - gräsklipparen/roboten
Funktion:
basstationen ska kommunicera med gräsklipparen och berätta exakt var den befinner sig
Om basstationen får olika koordinater hela tiden kommer gräsklipparen få en felaktig position också och det blir ju inte bra
Det finns "riktiga" basstationer i sverige man kan använda sig av via NTRIP-caster men det ska inte jag göra, jag ska ha min egen på taket.
Tillvägagångsätt i min teori för basstationen och vad jag läst mig till:
Starta igång min RPI med antenn som ska vara basstation och här ska jag samla in mätvärden för denna position i 24h. När den har samlat värden i 24h ska jag välja det sista värdet. Denna variant ska gå i PPP-static.
Efter detta har vi fått en POSITION som är OK och det är min basstation. Antennen måste fixeras på detta ställe och ska alltid vara på samma ställe.
PPP-static tar och gör beräkningar på alla inmatade värden och gör ett medelvärde på positionen, detta innebär att efter 24h ska värdet vara så pass bra att detta är min basstation.
I min konfigurationsfil för RTKRCV har jag ställt in att outputfilen ska vara llh och sedan sparas i en fil som heter basstation.gps. Då får jag in alla värden som skapas i filen.
Eftersom jag loggar in allt via ssh - krävs det även för att köra rtkrcv i bakgrunden, även om jag stänger ner sessionen. Detta har jag gjort med nohup kommandot på följande sätt.
Kod: Markera allt
screen
Kod: Markera allt
screen -r
Har nu testat min basstation och samlar i detta nu in värden som ska samlas i 24h. Om jag har förstått det är rätt krävs minst 24h insamlande av data för att få cm-precision, och det är vad jag vill åt. Vi får se hur exakt position det blir. Jag har fått en OTROLIGT exakt position på mina tidigare tester. För att det ska bli så korrekt som möjligt kräver det satellitter med snr >40. Nu ska vi testa Rover mode också och kommunicera detta.
Lite motgångar ska man ju också ha, upptäckte att snr som borde ligga enkelt över >40 inte gjorde det. Troligtvis är det någon kontakt inne i mitt vattentäta skal som har släppt, så det blir till att öppna upp och se vad det är. Felet är kabeln med N-hane och U.fl - testade in i samma modul med samma antenn, och fick direkt 7 st satelliter med SNR>40. Så en ny kabel ska ordnas till detta. För att komma vidare kommer jag använda en patch-antenn till rovern, tills jag har fått tag på en ny kabel. Direkt när jag kopplade in patch-antennen fick jag direkt 6 satelliter med SNR>40 utan problem.
I gräsklipparen ställer vi in basstationen som vi har fått ut efter att samlat in värden. Detta gör att vi har en position på basstationen och RTKLIB får sedan utifrån detta modifiera och korrigera så det blir korrekt.
Har fått in 12h mätvärden som jag kommer basera de första testerna på, vill egentligen ha minst 24h mätvärden. Har även startat ett issue på RTKLIB Github sida för att se om det är en bugg eller något annat problem.
Kommer göra en exakt beskrivning när jag är färdig med detta men med kanske enbart 1-2h mätvärden för att testa och se om detta blir ett korrekt sätt att göra det på.
Har även upptäckt att GPS-data man samlar in höjdmässigt inte stämmer alls - om man vill ha en "riktig" höjd över havet så behöver man slå in det på följande sida : https://www.unavco.org/software/geodeti ... lator.html . Då får man ut en mer korrekt höjd var GPS-faktiskt befinner sig.
http://grauonline.de/wordpress/?page_id=1468
Delprojekt 22 - Montera motorn på cylinderklipparen - förkastad ide - Se Delprojekt 23 (nerlagt)
Här är en sprängskiss på hur klipparen ser ut del för del Sprängskiss AL-KO Comfort 38-5. Här nedanför är även det som är intressant för detta projekt från sprängskissen.. Jag har tagit bort hjulet och kollat hur det ser ut. Själva staget som går rakt igenom klipparen är enbart för hållfasthet - så jag ska använda mitt multiverktyg för att kunna placera in motorn inifrån. Motorn får plats perfekt in i staget som är öppet - sedan kommer jag skruva fast motorn med 6 st skruvar utifrån i motorns hål som är gjorda för detta. Utanpå däcket kommer jag sedan ha en 3d-printad del för att kunna driva gräsklipparen framåt. I staget kommer jag borra ett litet hål så jag kan dra kablarna igenom och upp i mitten av gräsklipparen. Detta för att skydda kablarna så mycket det går. Jag hade en tanke att montera in motorn i staget och låta det sitta kvar - se bilden. Men motorn skulle inte få plats så jag var tvungen att kapa bort hela staget. Det här var min tanke: Tyvärr så fungerade det inte.
Så här ser klipparen ut nu - då jag fått kapa bort hela staget. : Har gjort modeller i Fusion 360 som en kollega skrivit ut i 3d - det börjar känna sig att det närmar sig mål med monteringen. Sedan kommer det vara en del finjusteringar allteftersom men detta är en bra start. Här är själva 3d-printen som används. Här är printen monterad på hjulet - passformen är perfekt! Här är hjulet monterad - upptäckte dock att det behövdes förlängas ca 2mm och även gjort ett hål in för att kunna fästa motorn mot metallen.
Testat den nya printen - dock var den för TIGHT - så jag fick borra i den. Bara för att se hur långt jag kunde komma. Med denna hade jag en plan att jag nu skulle fästa fast motorn i själva gräsklipparen. Hade inga M3-skruvar som behövdes för detta. Får köpa och återkomma.
Modifierad och förbättrad version skickad så jag hoppas den blir bra nu.
Det är svårare att montera motorn än vad jag trodde. Har nu skruvat i 3 st M3 skruvar i skruvhålen i växellådan på motorn utifrån från gräsklipparen.
Dock är stabiliteten i däcket inte ALLS bra - och jag tänkte faktiskt första göra tester för att se vad som händer när man nu startar motorn. Som några påpekat kanske gräsklipparen tippar och vill ha detta bekräftat hur det fungerar.
Håller på och funderar på konstruktion för att stabilisera upp hjulen.
Denna idé är förkastad av mig då motorerna var alldeles för NÄRA cylindern. Jag tror att ett litet gupp och sedan lite svaj i motorn och sedan var den ivägskickad av cylindern som roterar. Så nya tag och nya bilder i nästa projektdel.
Delprojekt 23 - Montera motorn på cylinderklipparen - ny idé
Har kommit fram till att motorerna kommer monteras ovanpå själva klippdelen. Då är motorerna skyddade mot cylindern och det är enkelt att dra kablar som behövs för att komma åt allt. Dels till batterierna och även till motorcontrollern. Här är två bilder på hur montaget ser ut. Här även monterat motorcontroller se bild Får inte plats mer bilder i detta inlägget...
Delprojekt 24 - Få gräsklipparen att röra på sig efter förändrad konstruktion av motorplacering
Gräsklipparen rör sig och den åker framåt, då utan att cylindern är igång. Men det fungerar -
MILSTOLPE!!!!!
Delprojekt 20 - Testa precision jag kan få trädgården med bas och en rover - pågående
Har ju i tidigare delprojekt 13 börjat göra tester men nu är det mer "riktiga" tester för att få ut inom vilka koordinatorer gräsklipparen ska åka. Jag har min basstation som är monterad och klar.
Det jag ska göra är att använda mig av STR2STR - det motsvarar STRSVR för Windows. Detta är basstationen.
Det andra programmet som används är RTKRCV - det motsvarar RTKNAVI för Windows. Detta är rovern/gräsklipparen.
Som bilden visar. Som tidigare nämnts för att använda STR2STR körs följande kommando, där konverteras också indata-till rtcm3 format:
Kod: Markera allt
./str2str -in serial://ttyAMA0:115200#ubx -out test.rtcm3#rtcm3
Kod: Markera allt
./str2str -in serial://ttyAMA0:115200#ubx -out tcpsvr://:50021
För att starta basstationen och starta en TCP-server, skickar GPS-koordinatorer och sedan skickar en del meddelande använder jag följande:
Kod: Markera allt
./str2str -in serial://ttyAMA0:115200#ubx -out tcpsvr://:50021 -p 59.27153435 17.81710243 47.879
För gräsklipparen använder jag:
RTKRCV
I konfigurationen behöver jag välja varifrån datan kommer - GPS - som är ansluten till seriell UART på RPI 2.
Behöver även välja vilken basstation/server jag ska koppla ihop mig med.
Här skriver jag på
inpstr2-type=tcpcli
inpstr2-path=10.0.0.200:50021
inptstr2-format=ubx
I konfigurationen ligger även den statiska koordinaten till basstationen. Det gör man på följande rader i konfigurationsfilen:
ant2-postype =llh # (0:llh,1:xyz,2:single,3:posfile,4:rinexhead,5:rtcm)
ant2-pos1 =35.87298031 # (deg|m)
ant2-pos2 =138.38966505 # (deg|m)
ant2-pos3 =1003.852 # (m|m)
Har även lagt till Kinematic som lösning på hur
pos1-posmode=kinematic
Startade upp min andra RPI tillsammans med GPS-modul och timing-antenna, fick snabbt en fix-position och nästan alla 9 satelliter hade en snr>40 direkt. Så riktigt bra förutsättningar för att det här ska fungera. Men som sagt i en annan projektdel har jag just nu lite problem med att jag får väldigt låga snr på basstationen som måste ordnas till först innan vi kan testa vidare med mer exakta koordinatorer. Testar med patch-antenn på rover-delen som fungerar alldeles utmärkt, men kommer senare byta ut denna.
Patch-antenn på gräsklipparen kommer INTE att fungera utan ett grundplan, därav kommer den inte att användas. Har däremot testat med min HELIX (mina inköpta antenner) och får riktigt bra och höga SNR-tal på gräsklipparen utan grundplan.
Nu är det mer hur bra kommunikation det är med det trådlösa nätet som är en begränsning. Har ordnat så att kommunikationen mot det trådlösa nätet också är tillfredsställande till den nivå jag behöver känns det som. Detta löstes enkelt genom en ny WiFi-adapter med extern antenn så fick jag genast mycket bättre täckning.
Ska även försöka optimera konfigurationen på delarna så att positionen blir mer korrekt.
Håller som bäst på att optimera in konfigurationen för basen - det finns en hel del inställningar. Jag håller på och prövar mig fram för jag behöver som sagt ha en ganska stabil och bra precision på GPS:en kontinuerligt. Kan jag hitta inställningar som fungerar tillfredställande har jag kommit en väldigt bra bit på vägen.
Har precis ökat upp frekvensen på rovern från 1Hz till 5Hz. Basstationen använder just nu 1Hz och tror jag behöver höja den till 5Hz också.
Kod: Markera allt
./str2str -in serial://ttyAMA0:115200#ubx -out tcpsvr://:50021 -c ../../../data/ubx_raw_5hz.cmd
Börjar fundera på om det är mycket buggar i RTKRCV som jag använder mig av. Testat att använda mig av RTKNAVI och tagit in strömmen från Basstationen både som ROVER och BAS. Då jag enbart har 4 satelliter låsta får jag en FIX-position på några få sekunder. Jag räknar inte med några få sekunder när gräsklipparen har antennen på sig. Men mitt nästa test blir till att köra str2str från gräsklipparen med och ta in det i RTKNAVI för att se om det fungerar bättre.
https://www.u-blox.com/sites/default/fi ... Public.pdf
https://github.com/tomojitakasu/RTKLIB/issues/99
https://github.com/tomojitakasu/RTKLIB/issues/166
Delprojekt 21 - Göra en ny basstation och korrelera mot SWEPOS (pågående)
Har testat att koppla upp mot SWEPOS - fungerar bra.
Fått position snabbt - några sekunder för att få en korrekt placering, har lite mer utmaningar att få en korrekt AR-fix.
Hade en del problem med att få in basstationens position, men hade missat att ändra att den kom med i RTCM meddelandet.
Detta gör man i konfigurationen under
Kod: Markera allt
ant2-postype =rtcm
När man kopplar upp sig mot SWEPOS måste man även skicka med GGA-meddeladet från NMEA och detta ställs in under
Kod: Markera allt
inpstr2-nmeareq =single
Men när jag har FLOAT får jag extremt hög precision och det är +/-1.5cm när jag kör mot SWEPOS.
Få till höga AR-tal verkar svårt..
Försöker optimera konfigurationen för att få bra fix även vid rörelser och höga AR-tal. Har svårt att få till det här men försöker och försöker.
Fått följande koordinater med FLOAT:
Kod: Markera allt
59.27153281 17.81710325 48.030
Kod: Markera allt
59.27153251 17.81710225 47.980
Anser mig KLAR med denna punkt.
Delprojekt 32 - Prototyp 1, tester (pågående)
Har utfört en hel del arbete som krävs för att kunna testa med prototyping, men jag tror jag är där nu - nästan i alla fall. Det jag kommer göra här är följande:
- Läsa av GPS-position
- Läsa av bäringen från en kompass
- Testa formler för att göra autopiloten
- Använda motorerna för att hålla bäringen
- Använda motorerna med PWM för att styra prototypen
Jag kommer använda mig av en fast GPS-koordinat. (variabel 1)
Denna programmeras statiskt i koden för denna prototyp.
Ekipaget kommer regelbundet uppdatera sin GPS-koordinat. (variabel 2)
Denna variabel kommer via en TCP-ström från RTKLIB. Detta är ett tidigare projekt jag gjort så då ska denna kod implementeras här.
Får bli via en funktions som anropas av variabeln antar jag.
När ekipaget startar känner den av åt vilket håll compassometern är riktad. (variabel 3)
Här är den enkla koden från HMC5883L som ska implementeras. Här anropas funktionen så att denna uppdateras kontinuerligt.
För att veta åt vilket håll ekipaget ska åka görs en beräkning av variabel 1 och variabel 2 - vi får då riktning. (variabel 4)
Här kommer jag använda mig av Geopy som får implementeras med en funktion.
Variabel 4 jämförs med variabel 3. Detta kommer sedan styra PWM för att svänga runt ekipaget åt rätt position mot variabel 4.
Hela tiden kollas hur långt det är mellan variabel 2 och variabel 1, när det är mindre än 50cm kvar stannar programmet som gör att motorerna stannar. (variabel 5)
Vad programmet gör på enkel svenska - detta för att underlätta kodandet
Delprojekt 33 - Styra PWM baserat på compassometer
Nu när jag har gjort i ordning programmet för att styra mot Norr ska jag göra ett där variabeln ändras allteftersom gräsklipparen förflyttar sig.
Delprojekt 34 - Beräkna strömåtgång för 2st Raspberry Pi
Delprojekt 35 - Starta basstationen automatiskt så fort den får ström(KLART)
Basstationen ska ju bara fungera för att strömma data till rovern så fort den är spänningssatt och startat så ska den starta sina tjänster automatiskt. Ingen ska behöva interagera med RPI om det inte är för annat än serviceunderhåll. För att få det att fungera tänker jag göra ett litet projekt av det också.
Behöver först kolla in i /boot/config.txt för att se att init_uart_baud=230400 eller högre. Så att modulerna kan kommunicera i den hastigheten.
Kompilera str2str med make som jag visat i tidigare projekttråd
Kopiera str2str till bin katalogen på PI som ska husera basstation
Kod: Markera allt
sudo cp str2str /usr/local/bin/str2str
Kod: Markera allt
sudo chmod +x /usr/local/bin/str2str
För att starta basstation och testa så det fungerar:
Kod: Markera allt
./str2str -in serial://ttyAMA0:230400#ubx -out tcpsvr://:50021 -c /home/pi/RTKLIB/data/ubx_raw_5hz.cmd
Kod: Markera allt
!UBX CFG-MSG 3 10 0 1 0 0 0 0
!UBX CFG-MSG 3 16 0 1 0 0 0 0
!UBX CFG-MSG 1 32 0 1 0 0 0 0
!UBX CFG-MSG 1 34 0 1 0 0 0 0
@
!UBX CFG-MSG 3 10 0 0 0 0 0 0
!UBX CFG-MSG 3 16 0 0 0 0 0 0
!UBX CFG-MSG 1 32 0 0 0 0 0 0
!UBX CFG-MSG 1 34 0 0 0 0 0 0
Nu ska vi göra ett script som autostartar när vi startar pajen.. och sen service som görs automatiskt när pajen startas.
För skriptet kör vi ett vanligt shell skript och för servicen använder vi systemctl
Skapa en ny fil
Kod: Markera allt
sudo nano str2str_start.sh
Skapar en tjänst som startar output av RAW-data med anrop av ett Pythonskript behöver då inte använda mig av någon .cmd fil i STR2STR outputen.
Kod: Markera allt
sudo nano rawgps.service
Kod: Markera allt
[Unit]
Description=My Sample Service
After=multi-user.target
[Service]
Type=idle
ExecStart=/usr/bin/python /home/pi/raw-output.py
[Install]
WantedBy=multi-user.target
Kod: Markera allt
sudo mv rawgps.service /lib/systemd/system/
Kod: Markera allt
sudo chmod 644 /lib/systemd/system/rawgps.service
Kod: Markera allt
sudo systemctl daemon-reload
Kod: Markera allt
sudo systemctl enable rawgps.service
Får göra en ny tjänst för enbart STR2STR som använder SYSTEMD och tänker mig följande:
Har lagt STR2STR som en tjänst i CRONTAB som startas efter en omstart av pajen.
Kod: Markera allt
[Unit]
Description=Run STR2STR after RAW-output has been started
[Service]
Type=idle
ExecStart=/home/pi/str2str_start.sh
[Install]
WantedBy=multi-user.target
Var tvungen att ha med path i shell-skriptet. Så det slutade så här:
Kod: Markera allt
#!/bin/bash
path="/home/pi/RTKLIB/"
# start task to collect rover data at 5 Hz
str2str -in serial://ttyAMA0:230400#ubx -out tcpsvr://:50021 -out test%Y%m%d%h%M.ubx -c /home/pi/ubx_raw_5hz.cmd -c /home/pi/ubx_raw_5hz.cmd &
Delprojekt 35 - Göra ett grafiskt interface för att styra gräsklipparen från mobilen(KLART)
Eftersom gräsklipparen har kontakt med vårt WiFI-nät tänker jag implementera styrning via smartphone i en mobil applikation på en webbsida för att inte blanda in mer radiosändare. Nu har vi två radiosändare, en för WIFI och en för GPS det får räcka tycker jag.
Min tanke är att använda mig av NGINX som jag har erfarenhet av sedan tidigare och tycker det är en bra plattform att bygga hemsidor på.
Börjar med att installera nginx på gräsklipparens paj
Kod: Markera allt
sudo apt-get install nginx
Kod: Markera allt
sudo service nginx start
Sen ska vi installer node.js som vi kan göra fantastiska saker med.
Kod: Markera allt
curl -sL https://deb.nodesource.com/setup_8.x | sudo -E bash -
Kod: Markera allt
sudo apt-get install -y nodejs
Kod: Markera allt
sudo apt-get install pigpio
Kod: Markera allt
npm install pigpio
Då behöver vi installera socket.io som fungerar till Node.JS
Kod: Markera allt
npm install socket.io
Kod: Markera allt
/var/www/html/
Starta sedan node med filen du skapade och testa.
Varför uppfinna hjulet när det redan finns, hittade Zerobot som hade precis vad jag behövde. Ett touchintrerface till en webbrowser.
Så skönt så fortsätter på den inslagna vägen från Zerobot för att göra ett grafiskt interface för att styra rovern..
Det är ju en del kod som ska till och har fått det att fungera bra. Ska ändra en del så att den blir anpassad till min gräsklippare.
Delprojekt 36 - Köra ett testmönster som en fyrkant med gräsklipparen för att samla in data till GPSEN
Förklaring kommer senare här är koden:
Kod: Markera allt
import RPi.GPIO as GPIO
from time import sleep
GPIO.setmode(GPIO.BOARD)
#Har två motorer och det finns tre ingångar på L298N för att styra
#1A och 1B är + och - och 1E är Enable, utan Enable så händer inget
#2A och 2b är + och - och 2E är Enable för motor 2
#När GPIO utgångarna har HIGH skickas en signal och LOW ingen signal, är både 1A och 1B samma HIGH eller LOW händer inget och 1E också är HIGH eller LOW
Motor1A = 16
Motor1B = 18
Motor1E = 32
Motor2A = 21
Motor2B = 23
Motor2E = 33
GPIO.setup(Motor1A,GPIO.OUT)
GPIO.setup(Motor1B,GPIO.OUT)
GPIO.setup(Motor1E,GPIO.OUT)
GPIO.setup(Motor2A,GPIO.OUT)
GPIO.setup(Motor2B,GPIO.OUT)
GPIO.setup(Motor2E,GPIO.OUT)
print "Turning motor on"
GPIO.output(Motor1A,GPIO.LOW)
GPIO.output(Motor1B,GPIO.HIGH)
GPIO.output(Motor1E,GPIO.HIGH)
GPIO.output(Motor2A,GPIO.HIGH)
GPIO.output(Motor2B,GPIO.LOW)
GPIO.output(Motor2E,GPIO.HIGH)
sleep(5)
GPIO.output(Motor1A,GPIO.HIGH)
GPIO.output(Motor1B,GPIO.LOW)
GPIO.output(Motor1E,GPIO.HIGH)
GPIO.output(Motor2A,GPIO.HIGH)
GPIO.output(Motor2B,GPIO.LOW)
GPIO.output(Motor2E,GPIO.HIGH)
sleep(1.25)
GPIO.output(Motor1A,GPIO.LOW)
GPIO.output(Motor1B,GPIO.HIGH)
GPIO.output(Motor1E,GPIO.HIGH)
GPIO.output(Motor2A,GPIO.HIGH)
GPIO.output(Motor2B,GPIO.LOW)
GPIO.output(Motor2E,GPIO.HIGH)
sleep(5)
GPIO.output(Motor1A,GPIO.HIGH)
GPIO.output(Motor1B,GPIO.LOW)
GPIO.output(Motor1E,GPIO.HIGH)
GPIO.output(Motor2A,GPIO.HIGH)
GPIO.output(Motor2B,GPIO.LOW)
GPIO.output(Motor2E,GPIO.HIGH)
sleep(1.25)
GPIO.output(Motor1A,GPIO.LOW)
GPIO.output(Motor1B,GPIO.HIGH)
GPIO.output(Motor1E,GPIO.HIGH)
GPIO.output(Motor2A,GPIO.HIGH)
GPIO.output(Motor2B,GPIO.LOW)
GPIO.output(Motor2E,GPIO.HIGH)
sleep(5)
GPIO.output(Motor1A,GPIO.HIGH)
GPIO.output(Motor1B,GPIO.LOW)
GPIO.output(Motor1E,GPIO.HIGH)
GPIO.output(Motor2A,GPIO.HIGH)
GPIO.output(Motor2B,GPIO.LOW)
GPIO.output(Motor2E,GPIO.HIGH)
sleep(1.25)
GPIO.output(Motor1A,GPIO.LOW)
GPIO.output(Motor1B,GPIO.HIGH)
GPIO.output(Motor1E,GPIO.HIGH)
GPIO.output(Motor2A,GPIO.HIGH)
GPIO.output(Motor2B,GPIO.LOW)
GPIO.output(Motor2E,GPIO.HIGH)
sleep(5)
print "Stopping motor"
GPIO.output(Motor1E,GPIO.LOW)
GPIO.output(Motor2E,GPIO.LOW)
GPIO.cleanup()
Markera waypoints och göra tracks
Latitude coordinate precision by the actual cartographic scale they purport:
decimal
places degrees distance
------- ------- --------
0 1 111 km
1 0.1 11.1 km
2 0.01 1.11 km
3 0.001 111 m
4 0.0001 11.1 m
5 0.00001 1.11 m
6 0.000001 0.111 m
7 0.0000001 1.11 cm
8 0.00000001 1.11 mm
http://www.gpsvisualizer.com/tutorials/waypoints.html
Re: Robotgräsklippare med autopilot och cylinder!
Lasp: Tack för frågorna, jag har updaterat innehållet vad gäller gräsklipparen och även motorerna. Vid riktningsförändring kommer cylindern klippa och min tanke jag har är att om det ska ske en ändring i riktning så ska det ena hjulet backa eller stå still och det andra gå framåt. Så det kommer i princip aldrig vara tomkörning utan det kommer vara klippning konstant så länge den rör på sig.Lasp skrev:Mycket bra och tydlig projektbeskrivning.
Jag gillar din åtgärdsplan på din hemsida, rätt tänkt och gjort.
Fråga, kommer cylindern att rotera med hjälp av framhjulen eller kommer det att vara en separat cylinderdrivning? Kommer cylindern att lyftas upp vid tomkörning och riktningsförändring?
Re: Robotgräsklippare med autopilot och cylinder!
Du "biter" över ganska mycket i projektet. Kanske är det bättre att välja en färdig autopilot och sen modifiera koden för gräsklippare.
Om du väljer APM 2.6 (firmware rover) så kan du dra nytta av 10'000 utveckling / test timmar och i alla fall ha mer än tillräckligt med jobb för att anpassa koden till "gräsklipper med två motorer". Sen kommer andra att kunna dra nytta av det jobb du gör.
http://www.ebay.com/itm/161795601910
-
- Inlägg: 8051
- Blev medlem: 18 januari 2009, 00:48:24
- Ort: Alvesta, Småland
Re: Robotgräsklippare med autopilot och cylinder!
För att ta exempel så är mina klippmotorer på 200watt styck på min klippare. En rotorklippare drar väl ganska mycket mera eller har jag fel?
Har för mig drivmotorerna är på nåt liknande men låter det vara osagt.
Annars sjukt skoj projekt. Jag skulle också nog titta på APM men det är ju dock inte lika skoj som att bygga själv Kör på! Testar man inte lär man sig inte.
Re: Robotgräsklippare med autopilot och cylinder!
Tycker också att klipp motorn verkar vara i svagaste laget. Det blir ju tyngre att klippa gräs än att inte göra det så att säga.
Kul ideé med cylindergräsklippare, länge sedan man jobbade med en sådan.
Hur många motorer ska du ha, tre?? två för framåtdriften och en för klippningen?
Re: Robotgräsklippare med autopilot och cylinder!
danielr112
orvar
Svar till er.
Intressant om motorerna!
Som skrivits tidigare kommer jag använda mig utav 2 motorer - 1 till varje hjul.
Jag har gjort en beräkning på en hemsida hur tungt ekipaget är och hur mycket max lutning är. Fått fram en MAX-TORQUE som motorerna ska klara och jag är långt över den tillsammans med motorerna. Där beräknar man kapaciteten på 65% av vad den ska klarar.
Jag har även räknat med friktion vid klippning.
Men jag säger inte emot er att motorerna är för svaga - det blir intressant att se när jag monterat dessa om ekipaget kommer röra sig överhuvudtaget.
Vad gäller autopiloten så är det mer för att förstå och lära sig hur den skulle kunna fungera. Mycket roligare att göra egen än att använda befintlig av den delen av projektet. Om jag lyckas vill säga.
Re: Robotgräsklippare med autopilot och cylinder!
Om den då inte orkar med klippcylindern så kanske det inte svänger så värst mycket, för du ska väl ha nån slags frihjulskoppling.
-
- Inlägg: 8051
- Blev medlem: 18 januari 2009, 00:48:24
- Ort: Alvesta, Småland
Re: Robotgräsklippare med autopilot och cylinder!
Re: Robotgräsklippare med autopilot och cylinder!
Re: Robotgräsklippare med autopilot och cylinder!
Re: Robotgräsklippare med autopilot och cylinder!
Klippen är 38 cm bred. Jag räknar med att gräsmattan blir ca 400m2 av trädgården, inte jättestort.
Gjorde lite tester i helgen hur tung den är när cylindern går i men det känns inte helt orimligt att dessa två motorer kommer fixa detta.
Frikopplar gör gräsklipparen när den går bakåt, så ett alternativ vid lägesförändring är att den får backa om inte en motor orka driva klippen.
Jag har tänkt använda mig av RTK och en basstation så det kommer krävas en GPS-mottagare till. Håller på och försöker se om Ublox NEO-7M verkligen kan spotta ut den data jag behöver till RTKLIB, verkar inte så. Läst på diverse forum om detta och har hållt på de senaste dagarna med detta...
Om jag får detta att fungera som jag tänkt kan det bli riktigt bra.. tror jag..
Re: Robotgräsklippare med autopilot och cylinder!
Hur fort behöver cylinderklipparen rotera för att klippa bra?