Tag: LCD

  • Sanntid hjemme: Følg Ruter hjemmefra med Arduino og Python

    Sanntid hjemme: Følg Ruter hjemmefra med Arduino og Python

    Sanntidsskjermene som Ruter har satt opp ved flere t-bane, trikk og bussholdeplasser har blitt et kjærkomment bidrag til informasjonen du som reisende får om avganger. Ikke bare kan du ha stålkontroll over hvilke avganger som går, og i hvilken rekkefølge, du blir også oppdatert om estimert ankomsttid slik at du vet at du mista bussen du løp for å rekke eller om bussen har blitt forsinka i rush-trafikken.

    I tillegg til skjermene på holdeplassene som opplyser om sanntid, kan du få tak i app-er til mobiltelefonen og du kan også se dataene på forskjellige tredjepartsløsninger som f.eks på informasjonsskjermene ved Instiutt for informatikk ved Universitetet i Oslo. At dataene kan vises på mange forskjellige steder er mulig siden Ruter legger ut all ruteinformasjon til fri bruk (noen restriksjoner gjelder) på nettet. Det er dette vi kan benytte oss av når vi skal lage vårt eget sanntidssystem.

    Informasjonsskjerm med sanntidsinformasjon

    Vårt ferdige produkt vil være et sanntidssystem, ikke ulikt det man kan finne på holdeplassene. Selvsagt blir vårt produkt mindre robust og pålitelig, men i prototypings-fasen er dette helt greit. Skjermen skal vise hvilken linje neste avgang gjelder, hvilket navn det er på denne linjas endestasjon og hvor mange minutter det er til ankomst/avgang. For å få til dette benytter vi oss av en “dum” skjerm og av programvare som skriver teksten til denne. Skjermen vi bruker kobler vi til datamaskinen igjennom et Arduino grensesnitt. Vi bruker datamaskinen for å gjøre det meste av jobben, og vi legger mest mulig kompleksitet hit.

    Informasjonsskjermen

    Arduino er et veldig bra sted å begynne for å lære elektronikk, og hvordan vi kan kombinere dette med datamaskiner. Arduino har mange pedagogiske resursser tilgjengelig, og er laget for å være enkelt å komme igang med samt fleksibelt nok til å kunne skreddersys med egne komponenter.

    Alle komponentene vi trenger følger med i Arduino innførings-pakke (Starter Kit). Vi tar utgangspunkt i oppgave 11, hvor vi skal lage en krystall-kule. Vi benytter oss av skjema-tegningene for å koble en LCD-skjerm til Arduino-brettet.

    På Arduinobrettet laster vi opp følgende Sketch:

    #include
    
    LiquidCrystal lcd(12,11,5,4,3,2);
    
    char a;
    
    void setup() {
      Serial.begin(9600);
      lcd.begin(16,2);
      lcd.print("Ready for");
      lcd.setCursor(0,1);
      lcd.print("duty!");
    }
    
    void loop() {
      while (Serial.available() > 0 ){
        a = Serial.read();
        if (a == '!') {
          lcd.clear();
          lcd.setCursor(0,0);
        } else if (a == '?') {
          lcd.setCursor(0,1);
        } else {
          lcd.print(a);
        }
      }
    }

     

     

    Ardino-editor
    Arduino-editoren

    Vi benytter oss av LiquidCrystal biblioteket som følger med Arduino for å gjøre det enklere å skrive til brettet. Vi setter opp en Seriell-forbindelse og skriver en velkomstmelding til LCD-skjermen. Når LCD-skjermen er initialisert er det i hovedsak tre metoder vi benytter: print, clear og setCursor. Førstnevnte skriver en melding til skjermen, clear fjerner all tekst. setCursor benytter vi for å hoppe mellom skjermens to linjer. Metoden setCursor(0,0) setter skrivehodet øverst til venstre, og setCursor(0,1) setter skrivehodet til venstre i nedre rad.

    Det er veldig lite kompleksitet på dette nivået, det eneste vi ønsker å gjøre er å kunne skrive, flytte mellom linjene og fjerne all tekst fra skjermen. Så lenge det er data i seriell-bufferet leser vi et tegn, og skriver dette til skjerm med mindre det er et spesialtegn. For dette programmet er “!” og “?” definert til å ha spesielle funksjoner. Utropstegnet fjerner all tekst og resetter skrivehodet til øvre venstre posisjon, spørsmålstegnet flytter skrivehodet til nedre venstre posisjon.

    Skrive til skjerm

    Når LCD-skjermen er satt opp og Arduino-koden er lastet opp kan man skrive til skjermen. Bruk CoolTerm (kan lastes ned her) og koble denne til Arduinobrettet (la brettet være koblet til via USB porten). Nå kan du skrive tekst som dukker opp på skjermen, samt kontrollere at spesialtegnene fungerer. Fungerer det? Kult, la oss koble oss opp mot Trafikanten/Ruter.

    Trafikkdata fra Ruter

    Ruter har offentliggjort mye av sin reiseinformasjon, og de har lagt ut sanntidsinformasjonen i tillegg til reiseplanleggeren, avvik og mye annet snasent. Les mer på Ruter sine API-sider

    Vi skal benytte oss av to datasett fra Ruter, først må vi finne vår stasjons-ID ved hjelp av en kommaseparert fil med oversikt over alle stasjonene. Denne semi-statiske filen har meta-data som vi trenger for å kunne finne riktig stasjon fra REST JSON sanntids-APIet.

    Finne stasjons-ID

    For å finne riktig stasjon gjorde jeg en pragmatisk avgjøre om å ikke parse CSV-fila med alle stasjons-IDene. Jeg bare åpnet fila i TextMate (som jeg benytter for å redigere kode), og søkte etter Blindern T som ligger i nærheten av både jobb og hjem. Jeg fant ut Blindern T sin stasjons-ID er: 3010360

    Hente og parse trafikkinformasjon

    Oversiktlig, men maskinlesbar JSON strøm. Alle data vi trenger
    Oversiktlig, men maskinlesbar JSON strøm. Alle data vi trenger

    Ved å gå til datapunktet for sanntidsinformasjon ved denne IDen får jeg en JSON strøm/fil tilbake med alle avanger fra denne stasjonen: Blindern datapunkt.

    I denne strømmen får vi mange objekter med avganger, og alle avganger har masse data vi kan bruke. JSON strømmen er ikke lett å lese og forstå, men så er den heller ikke laget for mennesker. Jeg benytter programmet VisualJSON for å lese JSON-filer.

    Visual JSON is a handy tool for getting a more human readable representation of the data in the JSON stream
    Visual JSON er et praktisk verktøy for å gjøre JSON-strømmer mer menneskevennlige

    I VisualJSON kan vi se hvilke verdier i hver oppføring vi ønsker å ta vare på. DestinationDisplay inneholder navnet på endestasjonen, og LineRef inneholder linjenummeret. Praktisk å ta vare på disse. I tillegg trenger vi å lese ExpectedArrivalTime som har et noe merkelig tidsformat: “/Date(1378070709000+0200)/”.

    Se hele implentasjonen? Mot slutten av siden finner du scriptet som henter, bearbeider, mellomlagrer og sender dataene skjermen.

    Bearbeiding av datoene

    De fleste dataene for hvert avgangsobjekt er klare for visning, men når det gjelder datoene trenger vi å gjøre noen endringer. Formatet vi fikk disse i er vanskelig å forstå for mennesker. Datamaskiner kan enkelt regne ut hvor mange sekunder som har passert siden torsdag 1 January 1970 (tidsformatet Epoch time), men for mennesker er dette vanskeligere. Vi parser derfor epoch formatet til datetime, og i fra dette formatet finder vi time delta (tidsdifferansen) mellom når avgangen er forventet og nå. Når vi tar denne tidsdifferansen og gjør den om til minutter har vi antall minutter til avgangen som vises.

    Mellomlagring av data

    Jeg har valgt å lage en klasse som inneholder de nødvendige dataene for hver avgang. Objektene vi oppretter av denne klassen legger jeg inn i en liste, hvor jeg henter ut ett og ett element. Når lista er tom går jeg til nett-tjenesten for å hente nye data. Det er fint å slippe å gå til tjenesten hele tiden for å hente data, samtidig må vi også bli oppdatert på eventuelle forsinkelser eller dersom antatt ankomsttid skulle flyttes framover i tid. Jeg syntes at å lagre alle avgangene i en kø for så å hente nye data når denne er tømt er en god løsning på denne utfordringen.

    Formatere data for LCD-skjerm

    For at dataene skal vises riktig må vi formatere de. Måten jeg har valgt å gjøre dette på er ved å lage setninger for hver linje. Altså først sende en melding om at skjermen må tømmes og resettes, deretter øverste linje med linjenummer og endestasjonsnavn. Når dette er sendt, venter jeg 0.2 sekund før jeg sender linjeskift-kommandoen (“?”), og linje nummer to. Jeg venter 0.2 sekunder mellom hver melding for å ikke mate skjermen med for mye informasjon samtidig. Når all tekst vises lar jeg denne stå i 4 sekunder før jeg går videre til neste avreise.

    Implementasjon av programvaren

    Nedenfor finner du hele scriptet som henter data fra Ruter, og som sender dette til Arduinobrettet

    import urllib2, json, datetime, re, serial, time
    from pprint import pprint
    
    class TrafficInfo:
      def __init__(self, line_ref, destination, arrival_minutes, monitored, platform):
        self.line_ref = line_ref
        self.destination = destination
        self.arrival_minutes = arrival_minutes
        self.monitored = monitored
        self.platform = platform
    
    
    def days_hours_minutes(td):
      return td.days, td.seconds//3600, (td.seconds//60)%60
    
    def fetchTrafficFromStation(station_id):
      url_loc = "http://reis.trafikanten.no/reisrest/realtime/getrealtimedata/%s" % station_id
      response = urllib2.urlopen(url_loc)
      data = response.read()
      return data
    
    station_id = "3010360"
    ser = serial.Serial("/dev/tty.usbmodemfa131", 9600)
    arr = []
    
    while(True):
      if len(arr) == 0:
        print "Fetching new data"
      data = json.loads(fetchTrafficFromStation(station_id))
    
      for el in data:
        timecode = el["ExpectedArrivalTime"]
      m = re.split("(\d{13})\+(\d{4})",timecode)
      dt = datetime.datetime.fromtimestamp(float(m[1])/1000)
      tn = datetime.datetime.now()
      d = dt - tn
      td_human = days_hours_minutes(d)
      minutes = False
      if (d.seconds < (3600 - 1)): minutes = td_human[2]
        ti = TrafficInfo(el["LineRef"], el["DestinationDisplay"], minutes, el["Monitored"], el["DeparturePlatformName"])
      arr.append(ti)
    
      time.sleep(1)
      ar = arr.pop(0)
      time.sleep(1)
      ser.write("!")
      time.sleep(0.3)
      over_str = "%s : %s" % (ar.line_ref,ar.destination)
      ser.write(over_str)
      time.sleep(0.3)
      ser.write("?")
      time.sleep(0.3)
      under_str = "%s %s" % (str(ar.arrival_minutes), "Minutes")
      ser.write(under_str)
      time.sleep(4)
    

     

     

    Du trenger ikke nødvendigvis en LCD-skjerm for å hente trafikkdata fra Ruter, og du trenger ikke nødvendigvis å vise trafikkdata dersom du har en LCD-skjerm. Det er bare fantasien som setter grenser. Hva med for eksempel værdata fra yr.no, eller temperaturen i kjøleskapet? Arduino er et flott sett for å leke med noen av mulighetene elektronikk og informatikk gir deg.

    Appropos Arduino: I forrige uke var jeg med på en workshop med Tom Igoe, som har skrevet boken Making things Talk. Jeg har selv ikke lest denne boka, men har hørt at den er en god kilde til kunnskap og inspirasjon. Check it out!

  • Planlegg gaming-TV kjøpet

    Prisene på TV-apparater har sunket dramatisk, og apparater som for bare et par år siden virket utenfor rekkevidde er nå tilgjengelig for alle. Det er ofte fristende å velge det dyreste og det beste på første besøk i butikken, men dersom du forbereder deg og tenker over hva du virkelig trenger er det mye penger å spare.

    Når du skal kjøpe ny TV er utvalget av som møter deg i butikken overveldende. Med sterke farger og skarpe linjer skal du overbevises om at akkurat Sony, Philips eller Sharp er merket for deg. Problemet når du skal velge i dagens TV-marked, sammenlignet med tidligere, er at produksjonen av apparatene og funksjonene de inneholder i stor grad er standardiserte og i liten grad skiller seg fra hverandre. Å velge en TV produsent over en annen har derfor mindre å si enn for eksempel å velge mellom et Android eller iOS produkt. Når du skal kjøpe en gaming-TV er det derfor andre kravspesifikasjoner du må bestemme deg for, noen av disse spesifikasjonene er personlige som for eksempel hvordan du liker at fjernkontrollen ligger i hånda eller vinkelen på de avrundede hjørnene rundt skjermen, men det er også en del tekniske, objektive spesifikasjoner som det kan være lurt å følge.

    Før du går til butikken for å se hva de har tilgjengelig bør du ha forberedt deg hjemme og tenkt over et par ting:
    – Hvor mørkt er rommet du ønsker å sitte i?
    – Hvor nær Tven kommer du til å sitte?
    – Hvor mange eksterne apparater kommer du til å koble til (konsoller, dekodere, medieavspillere)
    – Vil du benytte lyd gjennom apparatet eller har du eget anlegg for lyd.

    Disse spørsmålene vil hjelpe deg å finne ut av hvor sterk bakgrunnsbelysning du vil trenge, hvor stor skjerm du kommer til å trenge, hvilken oppløsning du burde velge, hvor mange innganger du kommer til å trenge, og om du burde påkoste en TV med bedre lyd. Det som er viktig å huske på er at ved å gjøre et valg utelukker du andre alternativer eller øker prisen du må gi for å få en TV som dekker dine ønsker og behov.

    Plasma eller LCD

    Et valg som må bestemmes er hvorvidt du skal velge en TV med plasma eller LCD visningsteknologi. Tradisjonelt har plasma blitt tilskrevet å ha bedre fargegjengivelse og spesielt på mørke farger. Dette skyldes at LCD, liquid crystal display eller flytende krystall skjermer, hittil har benyttet en hvit lyskilde bak eller på siden av fargeflaten. I dag blir dette bakgrunnslyset i stor grad blir avgitt fra LED-punkter (derav navnet LED-TV), som har tatt over for mer strømslukende og varmeutviklende teknologier. LED, som står for light emitting diode eller lysavgivende diode, er en stadig mer populær lysteknologi som gir mye lys og bruker lite strøm. Dette har resultert i slankere apparater. Det er per i dag flere teknologier som forsøker å fjerne baklys-metoden og LCD-flaten med fargepunkter som også avgir lys. På CES-messen i Las Vegas tidligere i år viste Sony fram sine Crystal LED-skjermer og flere produsenter viste fram skjermer basert på Organisk LED. For begge disse teknologiene er det hvert fargepunkt som også avgir lys og i forhold til aparater som bruker baklys får du et større fargespekter, bedre fargemetning og du slipper noen av problemene bakbelysning fører med seg. I tillegg sies det at disse teknologiene er enklere å tegne til, og derfor vil Tven bruke mindre tid fra å ha motatt signalet til dette er vist på skjermen.

    Størrelse

    Size does matter, og skjermstørrelsen spiller definitivt inn på hva slags TV mange ser for seg, men også her kan det være lurt å ta et bevisst valg. Er størst mulig TV alltid det beste? Dersom du blir sittende for nære en stor skjerm kan dette være slitsomt for øyet som stadig må bevege seg for å endre fokusområde på skjermen. Samtidig er det viktig å huske at oppløsningen på signalet skal fordeles utover hele skjermen og at antall punkter per kvaderatcentimeter reduseres med størrelsen. Skal du sitte plassert et lite stykke unna apparatet kan en stor TV være en god idè, men dersom du trenger en TV til det 10 kvaderatmeter-store spill-rommet burde du nok ikke gå for en 70-tommer.

    Vi har så vidt nevnt oppløsning, og selv om dette har vært et veldig viktig aspekt tidligere har vi nå kommet til et punkt hvor de fleste Tver selges med full-HD. Full HD vil si at skjermen kan vise 1080 horisontale linjer ved et bildesideforhold på 16:9. Dette er den høyeste standardiserte oppløsningen som komersielle Tver har for øyeblikket. Alternativet, som ofte kalles HD-ready eller 720 har tilsvarende en oppløsning på 720 linjer.

    Tilkoblinger

    Som gamer er tilkoblinger viktig. Det er ikke kun èn boks som skal kobles til, men ofte mange forskjellige enheter. Mange har en tuner for TV-signalene, en DVD eller Blueray-spiller, en avspiller for digitale filer, kanskje en kabel liggende for tilkobling til laptop, og flere spillkonsoller. Med mindre du ønsker å måtte fysisk flytte fram TVen for så å tråkke i kabelsalaten kan det være greit å velge en TV hvor du kan koble til alt du måtte ha av nye og gamle spill konsoller. Hvis du velger et apparat med tre-fire HDMI-innganger og et par Scart-innganger kan du ved hjelp av fjernkontrollen switche mellom Gears of War på Xboxen, og Zelda: Occarina of Time på din Nintendo 64. Når du først har koblet flere enheter på Tven kan det være lurt å samtidig tenke litt på hvordan alt skal høres ut.

    Lyd

    Det visuelle spiller helt klart en stor rolle i spillopplevelsen, men det blir ingen helhetsfølelse uten lyd. Alle Tver kommer med innbygde høytalere og forsterkere, men også her er det stor forskjell på apparatene. Ettersom masseproduserte skjermenheter har blitt relativt standardiserte og rimlige legger mange produsenter sin prestisje i lyd-delen, samtidig har hjemmekinotrenden virkelig fått fart på salg av avanserte surround-systemer, og kanskje du allerede har et lydsystem som kan brukes. I såfall burde du sjekke at Tven du ønsker å kjøpe har en utgang som støtter digitallyd. Både Playstation 3 og Xbox 360 leverer 5.1 dolby sourround, og dersom metoden din for å koble TV-apparatet til forsterkeren din er gjennom hodetelefonutgangen går du glipp av mye opplevelse. Her kan du også spare penger ettersom lyd aspektet av apparater med veldig god lyd blir overflødig dersom du bruker et separat hjemmekinoanlegg som lydkilde.

    Smart-TV

    Hittil har datamaskinene gjort sin inntreden i både mobiltelefoner og tablets, og det var bare et spørsmål om tid før også Tvene ble smarte. Ideen er ganske enkel: Plasser innmat fra en datamaskin i en hvilkensomhelst annen teknologi, lag en måte å styre programvaren og koble til en skjerm. Som gamer kommer du nok oftest til å se skjermbildet fra din konsoll, men når spill i større grad er tilkoblet Internet, og oppdaterer resultater og sosiale aspekter til verdensveven kan det være praktisk å kunne se disse dataene igjennom Tven.

    Alt klart

    Å investere i en TV har blitt enklere og mindre risikabelt ettersom prisene har har sunket og de brede, masseproduserte skjermenhetene har fått et forholdsvis godt innslagspunkt kvalitetsmessig. Prisene er ofte høyere dersom du velger apparater med cutting-edge teknologi, og det kommer til å bli dyrt for de første apparatene med OLED eller krystal LED. Ofte vil du også oppleve at en TV nå er mye mer enn bare skjerm-enheten som er plassert i boksen. Software med forskjellige grensesnitt, ambilight, minnekortlesere og annet småsnacks er også ting produsentene har plassert i apparatene for å gjøre de mer ettertraktet og for å skille de fra konkurrentenes. Det kan ofte være lurt å sjekke de objektive fakta med apparatenes spesifikasjoner, størrelse, responstid og oppløsning er bare noe produsentene klisterer med fancy farger og under fine logoer på skjermen. En god innkjøpsstrategi kan være å la produsentene forsvare prisen på produktet, og sammenligende argumentasjonene mot dine ønsker og krav. Er apparatetet dyrt fordi det inneholder en stor og fin forsterker som leverer gromlyd er dette irrelevant dersom du ønsker å bruke hjemmekinoanlegget til lyd. Ved å være bevist på dine egne krav, ønsker og muligheter kan du spare mye penger, penger som du kanskje ville ha brukt dersom du hadde kjøpt det beste og feteste på markedet, men som du aldri ville ha utnyttet til fulle.

     

    Bildet er tatt av Duncan Rawlinson (thelastminute) og publisert på Flickr under en Creative Commons lisens. Her kan du finne bilde.