ALPHA-KLAR! Robotgräsklippare med autopilot och cylinder!

Berätta om dina pågående projekt.
Henke_83
Inlägg: 227
Blev medlem: 20 oktober 2007, 09:17:41
Ort: Ekerö
Kontakt:

ALPHA-KLAR! Robotgräsklippare med autopilot och cylinder!

Inlägg av Henke_83 »

Vad kul att du tittar in här - du kommer få ta del av min resa till en robotgräsklippare.
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:-
Senast redigerad av Henke_83 25 april 2019, 14:07:05, redigerad totalt 32 gånger.
Användarvisningsbild
Lennart Aspenryd
Tidigare Lasp
Inlägg: 12607
Blev medlem: 1 juli 2011, 19:09:09
Ort: Helsingborg

Re: Robotgräsklippare med autopilot och cylinder!

Inlägg av Lennart Aspenryd »

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? :humm:
Henke_83
Inlägg: 227
Blev medlem: 20 oktober 2007, 09:17:41
Ort: Ekerö
Kontakt:

Re: Robotgräsklippare med autopilot och cylinder!

Inlägg av Henke_83 »

Senast uppdaterad: 2020-09-15
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.
WP_20150909_11_10_28_Pro.jpg
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
under advanced options finns ett alternativ att aktivera i2c, gör det men starta inte om RPI.
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
lägg till följande på varsin rad längst ner i filen.
i2c-bcm2836
och
i2c-dev
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.
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
Nu har vi uppdaterat RPI och modulen för I2C kommer laddas, starta om RPI. Skriv

Kod: Markera allt

sudo reboot
När detta är gjort behöver du installera bibliotek så vi kommer åt HMC5883L från python. Vi behöver två bibliotek för detta quick2wire och i2clibraries from ThinkBowl. Spara ner dessa i en lämplig katalog. Du behöver även installera git så att vi kan ladda ner desas bibliotek. Kör

Kod: Markera allt

sudo apt-get install git
Gå till katalogen du valt och kör

Kod: Markera allt

git clone https://github.com/quick2wire/quick2wire-python-api.git
Skapa en miljövariabel för quick2wire så python kan hitta biblioteket när det behöver det.

Kod: Markera allt

nano setup.env
i denna filen lägger du till följande:
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
Setup.env behöver köras varje gång du startar om RPI.
Skapa en katalog där du ska skapa ditt program och gå in i den katalogen

Kod: Markera allt

sudo mkdir program
cd program
Här ska vi nu ladda ner i2clibraries som har funktioner för HMC5883L.

Kod: Markera allt

git clone https://bitbucket.org/thinkbowl/i2clibraries.git
Nu har vi gjort mjukvarudelen för HMC5883L och RPI, nu ska vi koppla ihop RPI och HMC5883L.
Stäng av RPI genom att ta bort strömförsörjningen eller skriv

Kod: Markera allt

sudo shutdown -h now
Här har vi HMC5883L utgångar - det som är intressant för oss här är VCC - GND - SCL - SDA. Dessa kontakter ska kopplas ihop med RPIns GPIO-portar för att få kommunikationen att fungera.
wp_20150911_12_15_28_pro (1).jpg
Här har vi Raspberry Pi:s 2 - GPIO-utgångar.
Raspberry-Pi-GPIO-Layout-Model-B-Plus.png
Nu borde detta göra det enkelt för oss att koppla samman detta. Men första frågan är ska det vara 3.3V eller 5V matning till HMC5883L. Det ska vara 3.3V det finns alltså bara en port VCC kan kopplas till och det är GPIO NR1. Så om följande schema följs kommer det funger:

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
WP_20150918_13_24_53_Pro.jpg
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
Följande skärm kommer visas med en markering på 1e om du gjort rätt.
i2cdetect.PNG
Nu ska vi skriva lite kod för att kunna få ut utdata från HMCL5883L.
Skapa en fil som heter t.ex

Kod: Markera allt

nano compass.py
i denna filen skriver du in följande:
#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
Du kommer nu få följande utdata om allt är rätt:
compass.PNG
Då har vi fått kontakt mellan HMC5883L och Rasperry Pi :tumupp:
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!
WP_20150917_13_04_52_Pro (1).jpg
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
Nu ska vi avaktivera en funktion i cmdline.txt detta gör i genom att editera filen

Kod: Markera allt

sudo nano /boot/cmdline.txt
Ändra

Kod: Markera allt

dwc_otg.lpm_enable=0 console=ttyAMA0,115200 kgdboc=ttyAMA0,115200 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline rootwait
till

Kod: Markera allt

dwc_otg.lpm_enable=0 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait
Det vi har gjort är att inaktiverat två funktioner.
!!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
Editera filen genom att skriva

Kod: Markera allt

sudo nano /etc/inittab
Nästan längst ner i filen hittar du följande rad
#Spawn a getty on Raspberry Pi serial line
T0:23:respawn:/sbin/getty -L ttyAMA0 115200 vt100
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.
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)
WP_20150918_13_41_50_Pro (1).jpg
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
Efter att programmet är installerat ska vi starta denna tjänst genom att skriva

Kod: Markera allt

sudo service gpsd start
För att se om GPSen fungerar skriver vi nu följande kommando som startar upp ett gränssnitt där vi kan se var vi befinner oss och vilka satelliter vi har kontakt med så kör följande

Kod: Markera allt

cgps -s
Om det blir timeout när du startar denna beror det troligtvis på att du inte har fått en "fix" ännu. Om GPS:en inte blinkar grönt konstant med ca 1s intervall så har du ingen fix på GPSen.

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
Här kommer det spottas ut NMEA meningar även om du inte fått en fix på din position.

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!
Jag har även kontribuerat med material till OpenStreetMap

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
Detta installerar PIP som är en installationshanterare för paket till python

Kod: Markera allt

sudo pip install pyserial
Detta är modulen så vi kan kommunicera seriellt i python.
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)
Klart!

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)
Klart!

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
sedan kan du köra följande kommando

Kod: Markera allt

git clone https://github.com/tomojitakasu/RTKLIB.git
Källkoden är ca 60 MB. Detta kommer laddas ner i en mapp som heter RTKLIB. Kommandoradsinterfacet som gör realtidspositionering i RTKLIB kallas RTKRCV och det är det vi ska kompilera. Så gå in i katalogen $HOME\RTKLIB\app\rtkrcv\gcc genom att skriva

Kod: Markera allt

cd \RTKLIB\app\rtkrcv\
I denna katalog finns det en fil som heter makefile, här ska vi ändra så att vi kompilerar för Raperry PI 2. I filen finns ett ställe som heter CTARGET ändra denna rad till följande:
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
RPI 1: CTARGET = -march=armv6 -mtune=arm1176jzf-s -mfpu=vfp -mfloat-abi=hard -ffast-math
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 kommando

Kod: Markera allt

make -j 4
Du har nu kompilerat RTKRCV, för att testa programmet kör det genom att skriva

Kod: Markera allt

./rtkrcv
Om du vill använda en annan branch, kolla på denna länken: eller gör på följande sätt:

Kod: Markera allt

git clone URL

Kod: Markera allt

cd in i katalogen

Kod: Markera allt

git checkout "branch" 
FÄRDIGT!https://stackoverflow.com/questions/229 ... h-gitKLART!

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
för att öka upp hastigheten till max sedan

Kod: Markera allt

sudo python raw.py
När detta är gjort kan vi kontrollera att vi får utdata i RAW-format. Då kör vi

Kod: Markera allt

cat /dev/ttyAMA0
alt.

Kod: Markera allt

gpscat /dev/ttyAMA0
förutsatt att vi har GPSen kopplad via UART. Vi kan även kontrollera så att hastigheten är rätt inställd genom att köra

Kod: Markera allt

stty -F /dev/ttyAMA0 -a
Det första som står är speed och där ska nu stå 115200 baud. Nu är RAW-data aktiverat. För att vi ska kunna använda rtkrcv behöver vi sätta rätt attribut på filen rtkshut.sh och rtkstart.sh, det gör vi på följande sätt:

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      =
För att starta programmet kör vi

Kod: Markera allt

./rtkrcv
i konsolen rtkrcv> kör vi sedan

Kod: Markera allt

load 7m.conf
Nu behöver du skriva

Kod: Markera allt

restart
för att aktivera konfigurationen. Då får vi ett
rtk server restart
Nu kan vi köra

Kod: Markera allt

status
och se om det funkar. Sedan kör vi

Kod: Markera allt

solution 1
då kommer du få massa GPS-data om du har tillräckligt med satteliter låsta till GPSen.
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.
gps.jpg
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:
rtk-gps.JPG
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
För att starta basstationen och starta en TCP-server har jag gjort med följande kommando

Kod: Markera allt

./str2str -in serial://ttyAMA0:115200#ubx -out tcpsvr://:50021
För rovern använder jag:
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:
outstr1-type=file
outstr1-format=nmea
För att få ut en TCP-ström har jag ändrat följande i .conf filen:
outstr2-type=tcpcli
outstr2-format=nmea
outstr2-path=192.168.1.xxx:50002
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:

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()
Nu kommer jag kunna fortsätta på autopiloten igen.. :)

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
Delprojekt 16 - Använda L298N tillsammans med RPI (klart)
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..
Office Lens_20160210_101741_processed.jpg
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()
Delprojekt 17 - Styra L298N med PWM från RPI
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()
Delprojekt 18 - Styra PWM baserat på compassometer med en fixed variabel
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
Då om jag stänger ner min aktiva sessionen och startar en ny och kör

Kod: Markera allt

screen -r
kan jag se att rtkrcv går i bakgrunden. För att komma ut från screen används kommandot ctrl+a och d. Då disconnectar man sessionen och den går i bakgrunden. Med screen -r hoppar du in i bakgrundsessionen. Vill du avsluta en session använder du kombinationen ctrl+a och k - som står för kill.

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. :D

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..
gräsklippare.JPG
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:
IMG_20170408_174856.jpg
Tyvärr så fungerade det inte.
Så här ser klipparen ut nu - då jag fått kapa bort hela staget. :
IMG_20170409_135335.jpg
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.
IMG_20170412_190604.jpg
Här är själva 3d-printen som används.
IMG_20170412_191259.jpg
Här är printen monterad på hjulet - passformen är perfekt!
IMG_20170412_191416.jpg
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.
IMG_20180807_204805.jpg
IMG_20180807_204818.jpg
Här även monterat motorcontroller se bild
IMG_20180811_224429.jpg
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.
rtk-gps.JPG
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
För att starta basstationen och starta en TCP-server har jag gjort med följande kommando

Kod: Markera allt

./str2str -in serial://ttyAMA0:115200#ubx -out tcpsvr://:50021
Detta skickar data i samma format som den får in data i alltså UBX och det är vad jag vill.
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
Mina koordinater är: 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
Allt går så mycket snabbare med högre frekvens på datan som ska behandlas. Har just nu bara sett att det är jättestor sklillnad från 1 till 5hz på Rovern. Så antar att det kommer gå mycket snabbare nu när jag kör även 5hz på basstationen. Ska testa mer ikväll..

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
utan denna kommer du aldrig få en Float eller Fix position.
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
Har fått en väldigt hög precision på BAS-stationen när den är korrelerad mot SWEPOS, men får inga höga AR-tal och väldigt få FIX-positioner.
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
Fått följande koordinater med FIX:

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
Hur ska jag göra detta program?
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
Sätt rättigheter så den blir körbar

Kod: Markera allt

sudo chmod +x /usr/local/bin/str2str
Nu kan du starta str2str från vilken katalog som helst

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
I den här filen har jag även valt att lägga till:

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
För att få RAW-data ut direkt från GPS-modulen utan att behöva göra något mer.

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
Var tvungen att göra om lite så jag för på följande sätt då jag inte fick .cmd filen att fungera som tänkt.

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
och i denna fil ligger följande:

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
Flytta service filen till katalogen där systemd har tillgång till den:

Kod: Markera allt

sudo  mv rawgps.service /lib/systemd/system/
Gör filen körbar med 644 eller +x

Kod: Markera allt

sudo chmod 644 /lib/systemd/system/rawgps.service
Aktivera att filen finns i katalogen

Kod: Markera allt

sudo systemctl daemon-reload
Aktivera tjänsten

Kod: Markera allt

sudo systemctl enable rawgps.service
Detta fungerar bra och när jag kör Str2STR fungerar det utmärkt. Ska även försöka implementera så att STR2STR med argument körs när vi startat Pajen.
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
Sedan har jag lagt till tjänsten precis som med RAW-outputen. Fungerar bra. Hade problem med att den inte puttade ut data i 5hz utan bara 1Hz.
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 &
Får se det här som klart också!

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
Starta tjänsten nginx genom

Kod: Markera allt

sudo service nginx start
Nu kan du testa från webläsare att gå till din ip du har på gräsklipparen och du kommer mötas en sida som säger att du inte är färdigkonfad än
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
För att sedan installera och komma åt GPIO-pinnarn med PWM från pajen behöver vi PIGPIO

Kod: Markera allt

sudo apt-get install pigpio

Kod: Markera allt

npm install pigpio
Vi behöver skapa en websocket så att vi kan kommunicera med pajen i realtid, därav valet av NodeJS där detta finns integrerat.
Då behöver vi installera socket.io som fungerar till Node.JS

Kod: Markera allt

npm install socket.io
NU ska vi ändra index filen till http servern - som standard lagras den här

Kod: Markera allt

/var/www/html/
Skapa en socket som du kan kommunicera med som en JS fil.
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()
Delprojekt 36 - Markera ut en slinga med GPS-koordinator där gräsklipparen får röra sig
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
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
Senast redigerad av Henke_83 15 september 2020, 17:42:03, redigerad totalt 131 gånger.
Henke_83
Inlägg: 227
Blev medlem: 20 oktober 2007, 09:17:41
Ort: Ekerö
Kontakt:

Re: Robotgräsklippare med autopilot och cylinder!

Inlägg av Henke_83 »

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? :humm:
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.
Användarvisningsbild
Sverige
Inlägg: 2711
Blev medlem: 12 augusti 2014, 08:49:05
Ort: Örebro
Kontakt:

Re: Robotgräsklippare med autopilot och cylinder!

Inlägg av Sverige »

Kul projekt :tumupp:
Användarvisningsbild
netrunner
Inlägg: 5510
Blev medlem: 4 februari 2005, 12:26:05
Ort: 127.0.0.1

Re: Robotgräsklippare med autopilot och cylinder!

Inlägg av netrunner »

Ska du knuffa en cylindergräsklippare framåt med två motorer på 24Watt? Eller har cylindergräsklipparen en egen motor inbyggt?

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
danielr112
Inlägg: 8044
Blev medlem: 18 januari 2009, 00:48:24
Ort: Alvesta, Småland

Re: Robotgräsklippare med autopilot och cylinder!

Inlägg av danielr112 »

Låter som du har något klena motorer i testet.
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.
Användarvisningsbild
orvar-e
EF Sponsor
Inlägg: 5957
Blev medlem: 9 mars 2007, 09:01:32
Ort: Borlänge

Re: Robotgräsklippare med autopilot och cylinder!

Inlägg av orvar-e »

Intressant projekt.

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?
Henke_83
Inlägg: 227
Blev medlem: 20 oktober 2007, 09:17:41
Ort: Ekerö
Kontakt:

Re: Robotgräsklippare med autopilot och cylinder!

Inlägg av Henke_83 »

netrunner
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.
Användarvisningsbild
orvar-e
EF Sponsor
Inlägg: 5957
Blev medlem: 9 mars 2007, 09:01:32
Ort: Borlänge

Re: Robotgräsklippare med autopilot och cylinder!

Inlägg av orvar-e »

Om du använder dig av 2 motorer så betyder det att så länge klipparen går rakt fram så så driver de cylindern lika, men om du ska svänga så får den motorn som går fortast ta all last.
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.
danielr112
Inlägg: 8044
Blev medlem: 18 januari 2009, 00:48:24
Ort: Alvesta, Småland

Re: Robotgräsklippare med autopilot och cylinder!

Inlägg av danielr112 »

Hur bred är klippen? Jag tänker mig en sådan puttklippare. Dom är tröga att driva i tomme. Har dock inga belägg för hur mycket kraft som faktiskt går åt.
Användarvisningsbild
Hedis
Inlägg: 2487
Blev medlem: 8 december 2003, 15:10:44
Ort: Vänersborg
Kontakt:

Re: Robotgräsklippare med autopilot och cylinder!

Inlägg av Hedis »

Behövs det inte en fastmonterad referenspunkt och sedan kommunikation mellan referensen och rovern för att få den precisionen med RTK? (nu var det iofs. ett tag sedan jag kollade på det där)
asklepios
Inlägg: 131
Blev medlem: 15 juni 2009, 21:55:59
Ort: Värmland

Re: Robotgräsklippare med autopilot och cylinder!

Inlägg av asklepios »

Jag vill också ha en gräsklippare som navigerar med koordinater och ej med elledning. Gör en klippare åt mig också!
Henke_83
Inlägg: 227
Blev medlem: 20 oktober 2007, 09:17:41
Ort: Ekerö
Kontakt:

Re: Robotgräsklippare med autopilot och cylinder!

Inlägg av Henke_83 »

Svar på vissa frågor ovan..

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..
Användarvisningsbild
Sverige
Inlägg: 2711
Blev medlem: 12 augusti 2014, 08:49:05
Ort: Örebro
Kontakt:

Re: Robotgräsklippare med autopilot och cylinder!

Inlägg av Sverige »

Då kan den backa om batteriet blir för dåligt och åka och ladda...

Hur fort behöver cylinderklipparen rotera för att klippa bra?
Skriv svar