WindWiz

En GSM-uppkopplad vindmätare

Google vs WindWiz 1-0

Visste ni att en tillsynes spartansk hemsida som Google.se har en helt groteskt stor indexsida (filstorlek)? Ialla fall från en stackars liten Arduinos perspektiv. Försök ladda ner och tolka ett HTML-dokument på 10+ KB på en device med 2 KB ram och gör något vettigt med det. I dare you! I double-dare you motherf*cker! .. Jag blev rätt ”ägd” ialla fall.

Veckorna sen senast har varit köriga men några timmar jag ändå hittat till programmering. GSM-prylarna i vindmätaren är nu uppdelad i två modulen, en Telit-modul som innehåller allt hårdvarunära kring den GSM-modul jag använder, och en annan portabel AT-modul som sköter kommunikation enligt AT-standarden (nåväl, nära nog..). Denna separering har gjort det möjligt att bygga mer strukturerade testfall för AT-modulen som nu kan köra precis lika bra på min arbetsstation som i vindmätarhårdvaran. När modulen kör på min arbetsstation tunnlas trafiken över en serieport till modemet medan AVR-processorn hålls i resetläge. När modulen kör på vindmätaren exekverar koden på AVR-processorn och pratar direkt med modemet. I båda fallen är in/ut-data från modemet ”live” och korrekt. Tack vare detta har jag kunnat göra en hel del viktiga buggrättningar och även kunnat utöka funktionalitet utan att störas av tråkig felsökning som lätt uppstår när man jobbar med dessa ettriga småprocessorer.

Status just nu är att jag kan ansluta TCP-sockets och även göra datautbyte av enklare sort (tillståndslöst). T.ex en HTTP-fråga. Mer än så behövs egentligen inte för vindmätaren, den skall koppla upp, skicka sin data och på sin höjd ta emot ett kvitto. Eller om det nu blir ett e-post (se föregående inlägg). Måste nog suga lite mer på den nöten.

Något jag noterat under tiden jag jobbat med modemet via sitt ”tunnel-läge” är att jag hittills inte drabbats av några konstiga resetfel eller ominitieringar. Förvisso är underliggande system på min PC brutalt mycket kraftigare och det vore ganska naivt att jämföra t.ex. timing eller buffertstorlekar mellan en AVR och en PC, men ändå. Inga problem! Vilket tyder på att det antingen finns en bugg i annan del av min kod, eller att det verkligen är ett hårdvarufel. Säkringen på Arduinon kanske slår till? Hur undersöker man sånt?! Jag har labbat lite med avlyssning på RESET-signalen mha mitt sprillans nya PicoScope (USB-oscilliskop) och hittills inte sett några dippar i signalen. Big need på en riktig elektronikingenjör.. Jag i egenskap av kodapa kommer inte långt här.

För tillfället väljer jag att blunda för dessa problem och fortsätta jobba i tunnel-läge och försäkra mig om att kommunikationskoden är korrekt. Nästa steg blir att implementera en modul för sockets, som inkapslar uppkoppling och hantering av TCP-sessioner via AT-modulen på ett snyggt och lätt sätt.

 

About these ads

7 svar till “Google vs WindWiz 1-0

  1. Karl-Petter Åkesson (@kallep) 2011/10/23 kl. 16:11

    Hej Magnus,

    du får hojta till om du vill ha tillgång till min mjukvara. Tror jag har kommit lite längre än dig för jag har nu ett fungerande REST API från Arduinon mot min lilla Rails test applikation. Så Arduinon kan nu via REST både posta och läsa data. Har inte lagt till något stöd för DELETE eller PUT dock men för vindmätare känns som POST och GET räcker långt.

    Jag har baserat min kod på GSM_Arduino_lib http://wiki.groundlab.cc/doku.php?id=gsm_arduino_library samt NewSoftSerial 11 http://arduiniana.org/2011/01/newsoftserial-11-beta/ men fick göra om stora delar av GSM libbet delvis för jag kör på en Arduino Pro Mini som bara har 1 Kb RAM samt det finns en bugg i malloc med.

    Dock är inte min kod speciellt städad men har kommenterat väl i den dock. Har du kört genom Arduino utv miljön eller kör du via ngt annat? Det kanske kan ställa till lite problem i så fall om du är intresserad av koden.

    /Kalle

    • blastur 2011/10/23 kl. 16:25

      Tack för erbjudandet! Kul att du kommit vidare. Jag utvecklar inte med Arduinos mjukvarukomponenter även om jag använder deras hårdvara (eller åtminstone en klon..). För tillfället har jag nästan all nätverkskod på plats.

      • Karl-Petter Åkesson (@kallep) 2011/10/23 kl. 21:17

        Oki, vilken version av AVR libc kör du med? Den som kommer med Arduino miljön(1.6.4) har som sagt en bugg i malloc. Finns en fix som finns med i 1.7.0. Såg någonstans i dina gamla inlägg att du haft stabilitets problem, om du fortfarande har det, byt libc! Men detta kanske var något du hade koll på…. Eller kör du med några andra lib helt o hållet?

        I vilket fall, höll på att göra mig galen tills jag hittade detta för några veckor sedan. Och idag igen trodde jag skulle bli galen, la in en strstr() rad och plötsligt gick allt bazooka… Visade sig att jag kört slut på RAM. Hade inte koll på att strängen i en Serial.print(”test”); konsumerar RAM minne. Trodde det var implementerat så att strängen lästes från flash(finns ju inget behov annat än möjligen tillfälligt kopiera strängen till RAM men den ligger i RAM så har man mycket debug-utskrifter förlorar man mycket RAM. Det var dagens lilla läxa:)

        Förresten har du fått upp någon fart mellan ATmegan och Telit-chippet? Kör jag över 1200 baud börjar jag tappa tecken nämligen. Nu har jag inget direkt behov av fart dock… men lite irriterande allt.

  2. blastur 2011/10/24 kl. 06:39

    Givetvis använder jag libc, men dock utan heap-allokeringar. Framför allt för att det inte lämpar sig på små system som dessa, men också för att det ger en helt annan spårbarhet. Jag kan t.ex. under runtime skriva ut hur mycket RAM som finns tillgängligt och avgöra om jag övertrasserat några gränser.

    Ett tips är att du använder _P-varianterna av libc funktionerna, t.ex. printf_P(), så strängar läses in dynamiskt vid stränghantering, på så vis slipper du använda permanent-allokera RAM till konstanter. Då får du det beteende som du verkar antagit tidigare.

    Jag kör 38400 baud mellan Arduino och Telit-modemet, fungerar bra. Har även kört den i 115 200 baud utan problem, men har valt att sänka hastigheten för att få ihop klockdivsionen med andra subsystem på ett effektivt sätt. Som du säger finns inget behov av snabba överföringar till/från modem.

  3. Karl-Petter Åkesson (@kallep) 2011/11/15 kl. 22:25

    Det verkar inte som mailnotifieringarna kommer fram, har kryssat i rutan under men får aldrig ngr mail, så missar att kolla upp om du svarat. Blir lite sporadiska svar:(

    Nu har jag iaf fått allt att funka bra på Arduinon. Såg dock ditt svar först nu efter att fått det att funka:( men får se nu hur långtidsstabilt det är. Kanske skall nyttja dina tips om jag behöver skriva om delar eller utöka. Nu gör den så att när Arduinon startar så kör den hela rutninen mot Teliten, sätter upp en IP kontext och sedan skickar en förfrågan mot servern om just dess IMEI nummer finns registrerat. Gör det det så får den tillbaka sitt ID nummer, om inte registrerar den sig. Sedan sätter den gång och mäta vind o riktning under 5 min, rapporterar till servern nyttjandes sitt id så jag kan ha flera stationer igång samtidigt, och sedan börjar den mäta igen.

    Så nu skall jag ta tag i att presentera det hela, just nu är det inte mkt till presentation http://remote-wind.heroku.com/measures :)

  4. Karl-Petter Åkesson (@kallep) 2011/11/15 kl. 22:34

    Ignorera vad jag skrev om mailnotifieringarna, skit bakom tangentbordet:) Hjälper ju om man fyller i en korrekt mailadress:)

  5. Ping:Vår&sommar 2012 « WindWiz

Kommentera

Fyll i dina uppgifter nedan eller klicka på en ikon för att logga in:

WordPress.com Logo

Du kommenterar med ditt WordPress.com-konto. Logga ut / Ändra )

Twitter-bild

Du kommenterar med ditt Twitter-konto. Logga ut / Ändra )

Facebook-foto

Du kommenterar med ditt Facebook-konto. Logga ut / Ändra )

Google+ photo

Du kommenterar med ditt Google+-konto. Logga ut / Ändra )

Ansluter till %s

Följ

Få meddelanden om nya inlägg via e-post.

%d bloggers like this: