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
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
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
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
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.
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
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
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
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:
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
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
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
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
Ä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
Editera filen genom att skriva
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
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
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
- 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
- Ändra hastighet till 115 200
- 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
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.
Detta installerar PIP som är en installationshanterare för paket till python
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
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
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
Du har nu kompilerat RTKRCV, för att testa programmet kör det genom att skriva
Om du vill använda en annan branch, kolla på denna länken: eller gör på följande sätt:
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
för att öka upp hastigheten till max sedan
När detta är gjort kan vi kontrollera att vi får utdata i RAW-format. Då kör vi
alt.
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
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:
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 -
För att starta programmet kör vi
i konsolen rtkrcv> kör vi sedan
Nu behöver du skriva
för att aktivera konfigurationen. Då får vi ett
rtk server restart
Nu kan vi köra
och se om det funkar. Sedan kör vi
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
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.
Då om jag stänger ner min aktiva sessionen och startar en ny och kö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.
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
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
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:
Fått följande koordinater med FIX:
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 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
Sätt rättigheter så den blir körbar
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
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.
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
Aktivera tjänsten
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
Starta tjänsten nginx genom
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 -
För att sedan installera och komma åt GPIO-pinnarn med PWM från pajen behöver vi 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
NU ska vi ändra index filen till http servern - som standard lagras den här
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