Kategoriarkiv: Linux

Raspberry Pi og GPS, del 1

GlobalSat ND-100s GPS DongleEt mål med min RPi var å teste ut om jeg kunne bruke en GPS-dongle for å hente ut informasjon om lokasjon, fart og høyde osv. Klarer jeg det burde det ikke være noe problem å sende det via SMS for å rapportere evt. bevegelse eller noe sånt.

Da er det på tide å teste om det er mulig å få kontakt med GPS-dongelen min.  Det enkleste er å bare plugge den inn og se hva som skjer.

Jeg plugget GPS receiver i en ledig port på min PiHub, og sjekket i loggen (/var/log/messages) om noe ble rapportert, og sannelig dukket det opp treff der:

# tail -20 /var/log/message
Feb  7 23:18:13 raspberrypi kernel: [ 9701.726689] usb 1-1.3.2: new full-speed USB device number 7 using dwc_otg
Feb  7 23:18:13 raspberrypi kernel: [ 9701.832322] usb 1-1.3.2: New USB device found, idVendor=067b, idProduct=2303
Feb  7 23:18:13 raspberrypi kernel: [ 9701.832361] usb 1-1.3.2: New USB device strings: Mfr=1, Product=2, SerialNumber=0
Feb  7 23:18:13 raspberrypi kernel: [ 9701.832381] usb 1-1.3.2: Product: USB-Serial Controller D
Feb  7 23:18:13 raspberrypi kernel: [ 9701.832399] usb 1-1.3.2: Manufacturer: Prolific Technology Inc.
Feb  7 23:18:13 raspberrypi kernel: [ 9701.938148] usbcore: registered new interface driver pl2303
Feb  7 23:18:13 raspberrypi kernel: [ 9701.938347] usbserial: USB Serial support registered for pl2303
Feb  7 23:18:13 raspberrypi kernel: [ 9701.938486] pl2303 1-1.3.2:1.0: pl2303 converter detected
Feb  7 23:18:13 raspberrypi kernel: [ 9701.950444] usb 1-1.3.2: pl2303 converter now attached to ttyUSB3

Ergo ble GPS-receiveren registrert, og den kan adresseres som /dev/ttyUSB3.

Enn så lenge får jeg ikke gjort noe fornuftig med denne informasjonen, så jeg må installere noen GPS-programmer og -biblioteker for å få brukt dette til noe fornuftig:

# apt-get install gpsd gpsd-clients python-gps

En liste med programvarepakker blir installert.

Så må programmet som kommuniserer med GPSen startes. Kommandoen spesifiserer hvilken port som skal brukes, og hvilken fil som skal fungere som «socket» (for å kommunisere med enheten):

# gpsd /dev/ttyUSB3 -F /var/run/gpsd.sock

Du får ingen tilbakemelding på denne kommandoen hvis alt gikk ok.

Nå er det på tide å sjekke om jeg får lest ut noe fornuftig fra GPS’en. Dette gjøres med kommandoen cgps:

# cgps -s

Følgende informasjon vises hos meg:

┌───────────────────────────────────────────┐
│    Time:       2014-02-10T22:56:51.000Z   │
│    Latitude:    5X.YYYYYY N               │
│    Longitude:   1X.YYUUUU E               │
│    Altitude:   535.9 ft                   │
│    Speed:      0.0 mph                    │
│    Heading:    0.0 deg (true)             │
│    Climb:      0.0 ft/min                 │
│    Status:     3D FIX (324 secs)          │
│    Longitude Err:   +/- 43 ft             │
│    Latitude Err:    +/- 88 ft             │
│    Altitude Err:    +/- 155 ft            │
│    Course Err:      n/a                   │
│    Speed Err:       +/- 121 mph           │
│    Time offset:     1.089                 │
│    Grid Square:     JO59kw                │
└───────────────────────────────────────────┘
┌─────────────────────────────────┐
│PRN:   Elev:  Azim:  SNR:  Used: │
│  21    45    174    19      Y   │
│   2    08    042    13      Y   │
│  23    11    309    26      Y   │
│  31    34    220    28      Y   │
│  13    14    340    29      Y   │
│  29    59    087    27      Y   │
│   5    25    066    17      N   │
│  16    24    297    21      N   │
│                                 │
└─────────────────────────────────┘

Boksene oppdateres hvert sekund, og de vises egentlig ved siden av hverandre, men kolonnebredden på bloggen gjorde at jeg viser de under hverandre. Første boks viser min posisjon, fart og høyde, mens den andre boksen viser informasjon om satelittene GPS-dongelene plukker opp.

Konklusjon så langt: Det var ikke noe problem å hente ut automatisk oppdatert informasjon fra GPS-dongelen. Det som gjenstår er å hente ut et valgfrie verdier ved behov, så jeg f.eks. kan sende en SMS med posisjon og fart hvis enheten begynner å flytte på seg.

Raspberry Pi og GSM-modem, del 1: Sende SMS

Huawei_E173Det aller første jeg ville gjøre var å klargjøre min RPi og sjekke om jeg fikk sendt en SMS med GSM-dongelen min. Slik gjorde jeg dette:

Via http://www.raspberrypi.org/downloads lastet jeg ned NOOBS og installerte standard Raspian på SD-kortet mitt. Beskrivelse av det du trenger finnes på nevnte adresse.

Etter første gangs oppstart opprettet jeg en egen bruker for meg (liker å ha min egen bruker):

adduser MinBruker    (legger til brukeren)
passwd MinBruker    (setter nytt passord)
sudo cp -a /home/pi /home/MinBruker
sudo chown -R MinBruker:MinBruker /home/MinBruker

Å legge inn en egen bruker for meg er bare en «greie» jeg har, så miljøet blir mest mulig likt på denne enheten som de andre Linux-boksene jeg bruker. RPi kommer med en vanlig bruker som heter «pi» som er den som er ment brukt til alle vanlige oppgaver.

Deretter installerte jeg gammu, som er en programvarepakke som lar meg kommunisere med GSM-modemet og sende SMS.

$ sudo apt-get install gammu

(det installeres samtidig endel ekstra pakker pga dependencies/avhengigheter)

Jeg installerte også et par tilleggspakker, som strengt tatt ikke er nødvendige:

$ sudo apt-get install gammu-doc wammu

(det installeres samtidig endel ekstra pakker pga dependencies/avhengigheter)

Plugg inn USB-modem med SIM-kort på plass. Jeg har et Huawei E173, som skal fungere fint med RPi. Restart din RPi så denne scanner etter maskinvare og oppdager GSM-modemet.

Logg inn på din RPi med valgt bruker. Bytt til root-bruker for å få satt opp alt uten å måtte kjøre sudo hele tiden:

$sudo su -

Merk: Etter å ha byttet til root-bruker endrer kommandopromptet seg fra «MinBruker@raspberrypi ~$ » til «root@raspberrypi:/home# «. Den viktigste forskjellen er siste tegn i promptet – #. Dette tegnet indikerer at du er root.

Hva sier «dmesg»? Ble GSM-modemet funnet ved oppstart?

# dmesg | grep tty
 [    0.000000] Kernel command line: dma.dmachans=0x7f35 bcm2708_fb.fbwidth=1872 bcm2708_fb.fbheight=1168 bcm2708.boardrev=0xe bcm2708.serial=0xb3cf95db smsc95xx.macaddr=B8:27:EB:CF:95:DB sdhci-bcm2708.emmc_clock_freq=250000000 vc_mem.mem_base=0x1ec00000 vc_mem.mem_size=0x20000000  dwc_otg.lpm_enable=0 console=ttyAMA0,115200 kgdboc=ttyAMA0,115200 console=tty1 root=/dev/mmcblk0p6 rootfstype=ext4 elevator=deadline rootwait
 [    0.000000] console [tty1] enabled
 [    0.530054] dev:f1: ttyAMA0 at MMIO 0x20201000 (irq = 83) is a PL011 rev3
 [    0.872363] console [ttyAMA0] enabled
 [   15.580525] usb 1-1.3.4: GSM modem (1-port) converter now attached to ttyUSB0
 [   16.001385] usb 1-1.3.4: GSM modem (1-port) converter now attached to ttyUSB1
 [   16.290602] usb 1-1.3.4: GSM modem (1-port) converter now attached to ttyUSB2

Joda, dmesg viser også at GSM-modemet ble funnet ved boot, og at det har tre tilgjengelig porter (ttyUSB0, ttyUSB1 og ttyUSB2).

Sjekk om gammu også finner GSM-modemet ditt. Det er ikke mye hjelp i at Linux finner GSM-modemet hvis ikke gammu gjør det. Da er du like langt. Kjør kommandoen «gammu-detect» og se hva slags svar du får:

# gammu-detect
 ; Configuration file generated by gammu-detect.
 ; Please check The Gammu Manual for more information.

[gammu]
 device = /dev/ttyUSB0
 name = Phone on USB serial port HUAWEI_Technology HUAWEI_Mobile
 connection = at

[gammu1]
 device = /dev/ttyUSB1
 name = Phone on USB serial port HUAWEI_Technology HUAWEI_Mobile
 connection = at

[gammu2]
 device = /dev/ttyUSB2
 name = Phone on USB serial port HUAWEI_Technology HUAWEI_Mobile
 connection = at

opening socket: No such device

Ikke bry deg om feilmeldingen nederst – det viktigste er at GSM-modemet ble funnet.

Bruk kommandoen «gammu-config» for å konfigurere gammu-oppsettet. Du må f.eks. velge hvilket av de 3 oppdagede GSM-portene som skal benyttes:

# gammu-config

Du skal nå få opp et grensesnitt for å konfigurere gammu-programvaren:

ââââââââââââââââââââââââââââââââââââââââââââââââ
â Current Gammu configuration                  â
â                                              â
â  P Port                 (/dev/ttyUSB0)       â
â  C Connection           (at19200)            â
â  M Model                ()                   â
â  D Synchronize time     (yes)                â
â  F Log file             (/var/log/messages)  â
â  O Log format           (nothing)            â
â  L Use locking          ()                   â
â  G Gammu localisation   ()                   â
â  H Help                                      â
â  S Save                                      â
â                                              â
â                                              â
â          <Ok>              <Cancel>          â
â                                              â
ââââââââââââââââââââââââââââââââââââââââââââââââ

Begynn med «Port» og velg først at du vil bruke «/dev/ttyUSB0«.
Deretter velger du «Save» for å lagre inntillingen.
Det er mulig du må bekrefte lagring. Gjør i så fall det.

Etter at du har lagret kjører du kommandoen «gammu –identify» for å se om du valgte korrekt port, og at gammu klarer å hente ut informasjon fra SIM-kortet ditt. Dette skal i så fall ligne på dette:

# gammu --identify
Device               : /dev/ttyUSB0
Manufacturer         : Huawei
Model                : E173 (E173)
Firmware             : 11.126.15.02.00
IMEI                 : xxxxxxxxxxxxxxx   (anonymisert)
SIM IMSI             : xxxxxxxxxxxxxxx   (anonymisert)

Hos meg fant gammu SIM-kortet på første forsøk, på port «/dev/ttyUSB0«. Jeg har sett andre rapportere at det kan variere hvilken port som er korrekt. Det kan også variere med hvilken USB-port du bruker på din RPi (eller på tilkoblet USB-hub). Hvis gammu ikke finner SIM-kortet og viser inforomasjon om dette så repeterer du forrige avsnitt («gammu-config») og velger port «/dev/ttyUSB1» før du fortsetter med dette avsnittet. Får du heller ikke nå noe resultat repeterer du rutinen og velger port «/dev/ttyUSB2».

Sett SIM-kortets PIN-kode:

gammu --entersecuritycode PIN 9999    (erstatt "9999" med PIN)

(Merk: Du får ingen tilbakemelding når kommandoen er ferdig.)

Prøv å sende en SMS, med gammu sin kommandolinje:

# echo "Testmelding fra RPi, sendt via gammu" | gammu  \ --sendsms TEXT xxxyyzzz

(erstatt xxxyyzzz med riktig telefonnummer). Du skal nå få se fremdriften, og forhåpentligvis ser det ut som dette:

If you want break, press Ctrl+C...
Sending SMS 1/1....waiting for network answer..OK, message reference=-1

Meldingen er sendt, det er bare å vente…

Hurra! Meldingen kom fram:
Suksess! Første SMS kom fram.

Så hva gjenstår? Dette var en enkelt, frittstående SMS. Dette må samles i et script som kan kalles og kjøres hver RPi skal sende en SMS. Jeg må også lese meg opp på mottak av SMS, så GSM-dongelen kan ta imot kommandoer via SMS, utføre kommandoen og sende resultatet til min mobil.

Prosjekt: Raspberry Pi

RPi_Starter_KitProsjektet

Før jul kjøpte jeg meg en Raspberry Pi (RPi) for å se om den kunne brukes til noe morsomt. Inspirert av hva andre har gjort med denne lille dingsen var planen å teste den som mediesenter (OpenELEC), kartplotter (OpenCPN) og ellers sjekke ut om den kunne brukes som «vakt» i båten (sensorer, kamera og SMS-varsling) om vinteren.

Hva er RPi? En RPi er en liten datamaskin laget av The Raspberry Pi Foundation, litt større enn et kredittkort. Maskinen har utganger for lyd og bilde, og USB-porter for å koble til andre enheter. Den kan brukes til stort sett alt det en vanlig PC kan brukes til, men den er ikke spesielt kraftig, og den kan ikke kjøre Windows operativsystem. Den kan derimot kjøre flere forskjellige operativsystemer basert på Linux, android eller helt andre plattformer.

En av de store styrkene til RPi er at den er strømsnill, og den er liten og lett å gjemme bort i en stereobenk eller et rom i båt/bil. I tillegg til de vanlige tilkoblingsportene (USB, HDMI osv) har den flere litt mer spesielle muligheter (8 dedikerte GPIO pinner, UART, i2c buss, SPI buss, i2s audio m.m.).

Utstyr

I utgangspunktet bestilte jeg et Raspberry Pi Starter Kit fra MPX for å få alt jeg trengte for å komme igang i én enkelt pakke, og så installerte jeg en preview av Kano OS. Jeg har støttet Kano-prosjektet på Kickstarter og har dermed tilgang på deres programvare, men Kano OS var ikke noe å satse på for dette prosjektet.

OK, det første jeg ville teste var å sende SMS. Jeg bestilte derfor inn to Huawei E173 USB-baserte GSM-modemer via eBay. Disse USB-pinnene har både GSM-modem og en microSD-kontakt så man kan installere et ekstra minnekort hvis man trenger mer lagringsplass. Det var også flere som kunne bekrefte at de fungerer fint med Raspberry Pi.

Fordi GSM-modemet suger endel strøm fra USB-porten kjøpte jeg en PiHub fra Pimoroni. Dette er en USB-hub som har 3000mA strøm på deling mellom portene, så den kan drive enheter som RPi ikke klarer å drive alene. Den er også skreddersydd for RPi, så den kan både gi strøm til RPi og la RPi bruke den for å koble flere enheter til RPI’en. Noen USB-huber takler ikke at en RPi er koblet til i «loop», dvs at RPi både henter strøm fra PiHub via én port og kommuniserer med de andre USB-enhetene via en annen port (to kabler mellom RPi og PiHub). Jeg har tegnet et kontantkort-abonnement hos OneCall – det var det billigste jeg fant sånn i farta, og jeg kunne hente kortet på Narvesen eller 7-11 etter bare en times tid.

Etterhvert vil jeg også teste ut den USB-baserte GPS-pinnen jeg har liggende – en GlobalSat ND-100S GPS Dongle. Foreløpig er den testet med en vanlig PC med Windows 7 og OpenCPN, og den skal også fungere på Linux og Android.

Jeg har også en USB-dings fra Clas Ohlson som logger temperatur og luftfuktighet (http://www.clasohlso…ogger/36-4208-1). I utgangspunktet er den ment som frittstående logger, og lagrer alle verdier til internminne på pinnen, og så bruker man et Windows-basert program for å lese ut historiske data i ettertid. Jeg håper det er mulig å hente ut noe i sanntid (f.eks. med 5 minutters mellomrom), men det gjenstår å se.

Helt til slutt ser jeg også etter andre sensorer for tilkobling direkte på RPi’ens kretskort (dvs ikke via USB). Det gjenstår å se hva det blir. Foreløpig er det snakk om å få de nevnte USB-dingsene til å fungere.

 

Mine erfaringer med Windows XP Service Pack 3

Da var endelig Service Pack 3 til Windows XP ute, etter litt fram og tilbake med publisering, hurtig tilbaketrekking og påfølgende avisskriverier.

Hva er vel mer naturlig enn å teste programvaren, tenkte jeg, og lastet kjapt den ned fra adressen jeg fant i Computerworld Norge sin artikkel. Etter endt nedlasting var det bare å sette igang. Som nevnt i artikkelen om Vista SP1 så er jo backup bare for pyser, så jeg dobbeltklikket kjapt og greit på den nedlastede filen og holdt pusten.

Og problemene begynte med en gang. Her burde jeg kanskje tatt signalet, men må man teste, så må man teste. Feilmeldingen sa enkelt og greit følgende:

"Service Pack 3 cannot update a checked (debug) system with a free (retail) version of Service Pack 3 or vice versa."

Stort klarere kan man jo ikke si det, men jeg var like blank. Litt googling ga meg en mulig forklaring på problemet: Oppdateringspakken kan kun installere en "retail-SP" på "retail XP", og "checked-SP" på "checked XP". Pakken som var lastet ned var en checked versjon, og min XP-installasjon er en retail-installasjon. Derfor feilmeldingen.

Det er dog mulig å lure Windows, og det gjør man på denne måten (med engelsk XP, du får oversette selv):

  1. Velg FileRun – skriv inn "Regedit" og trykk Enter.
  2. Velg FileExport og lagre registeret for sikkerhets skyld.
  3. Gå til registernøkkelen HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion.
  4. Dobbeltklikk på verdien "CurrentType" for å redigere denne.
  5. Endre “Checked” til “Free”, eller  eventuelt “Multiprocessor Checked” til “Multiprocessor Free” hvis du har en multiprosessormaskin (Core2Duo regnes som multiprosessor utfra hva som sto i registeret hos meg).
  6. Lukk Regedit.

Nå kan du starte installasjonen av Service Pack 3.

For ikke å irritere dere med intetsigende skjermdumper av infovinduer skal jeg gjøre en lang historie kort: Man blir veiledet gjennom en serie vinduer, hvor alt man gjør er å akseptere betingelser og sitte og se på. Man lider seg gjennom lisensbetingelser og informasjon om backup, installasjon, fullføring og cleanup, og helt til slutt blir man bedt om å reboote maskinen.

MERK: Før du rebooter går du gjennom de seks stegene listet ovenfor og reverserer punkt 5. Så kan du reboote.

Så da gjør man vel det – rebooter altså. Jeg også. Og venter spent…

Jeg ser at maskinen rebooter, Windows XP sin splash screen vises i 10 sekunder, og så blafrer en BSOD over skjermen før maskinen restarter.

Og booter Ubuntu! Dette fordi jeg hadde testinstallert Ubuntu 8.04 i forrige uke, og grub booter Ubuntu som standard. Klarere kan det vel ikke sies? Dropp Windows og bruk Ubuntu!

Neida, problemer er til for å løses, så jeg rebootet igjen og valgte at Windows skal starte opp. Og får den illevarslende skjermen hvor man kan velge "Safe mode", "Safe mode with networking", "Safe mode with command prompt" osv. Jeg prøver å velge "Last known good configuration" uten hell. Og maskinen rebooter seg inn i Ubuntu en gang til. Jeg glemte enda en gang å velge at jeg vil inn i Windows. Høyere makter vil visst ikke la meg slippe taket i Ubuntu.

Ny reboot, og inn i Windows sin "her-gikk-noe-galt-bootmeny" enda en gang, og nå velger jeg "Safe mode". Her skal det repareres, og jeg henter over drivere osv fra den stasjonære maskinen for å sørge for at jeg har siste versjon av alt slikt for sikkerhets skyld. Og oppdager at alle stort sett alle drivere nå for tiden installeres med Windows Installer, og denne lar seg ikke kjøre i Safe mode. Så det kan jeg glemme. Jeg pakker ut hver enkelt driver og prøver med med bakveien – inn i Device Manager, høyreklikke på hver enhet jeg har oppdatert driver til og velge "Update driver". Etter at par feilslåtte forsøk innser jeg at selv på denne måten brukes Windows Installer. Ei heller høyreklikk på inf-filene og velge "Install driver" gir meg noe fornuftig.

I koffeinrus tyr jeg til Internet Explorer og Windows Updates etter å ha bootet meg inn i "Safe mode with networking), bare for å oppdage at ei heller dette er noen stor suksess. Supporten hos oss har disablet Windows Updates mot Microsoft sin server og kjører mot en lokal server. Dette er styrt med en Group Policy, og jeg orker ikke begynne å stresse med registeret for å prøve å pusle meg tilbake til en fullt fungerende Windows Update som kjører mot Microsoft. Windows Update kjører jo uansett Windows Installer når noe installeres, så det ville neppe fungert uten enda mer fikling i registeret.

Da gjenstår bare en ting: Avinstallasjon av Service Pack 3. Heldigvis er dette fullt mulig, og det går overraskende kjapt sammenlignet med tilsvarende operasjon med tidligere service packs. Og så blir jeg bedt om å reboote…

Den oppmerksomme leser vet nå hva som kommer til å skje, og det skjer: Ubuntu booter igjen, fordi jeg snudde meg vekk og jobbet litt på en annen maskin mens testmaskinen bootet. Så jeg må boote enda en gang. Og denne gangen husker jeg at jeg må velge Windows XP, og VOILA! så starter faktisk maskinen opp som den var før jeg begynte mine eskapader med Service Pack 3.

Så hva er konklusjonen av dette eventyret? Jo, jeg ser to muligheter:

  1. Ut med disken med Windows XP (og Ubuntu), og inn med Vista-disken min. Maskinen kom med preinstallert Vista Ulitmate, og den fungerte egentlig helt fint.
  2. Jeg beholder disken og lar grub fortsette å boote Ubuntu som standard. Og jeg beholder Ubuntu som arbeidsflate.

Jeg har en mistanke om at jeg velger punkt 1, men installerer nok Ubuntu også på Vista-disken så jeg gradvis kan la tanken om en maskin kun med Ubuntu modnes mens jeg leker/tester…

Uansett orker jeg neppe å fortsette med sentralstyrt Windows XP. Det er behagelig i endel tilfeller (skreddersydd programvaredistribusjon), men det er også en skikkelig pine av og til (fordi jeg ikke har fulle admin-rettigheter og fordi endel ting er låst ned av GPOer.

And that concludes todays lesson. Nå logger jeg av om en halvtimes tid og tar meg en seiltur. Jada, i dag starter årets serie med onsdagsregattaer, og jeg gleder meg som et lite barn!