Categories
Programming

Realtidssystem med OSEK och Lego Mindstorms NXT

Bakgrund

Ännu en gång har vi fått leka med Lego på skoltid, första gången var i en tidigare kurs i Distribuerade System för cirka ett och ett halvt år sedan. Senast så utförde vi projektet med hjälp av Lejos NXT och Java, den här gången använde vi nxtOSEK och programmeringsspråket C.

Vår uppgift var att genomföra lite småuppgifter med en robot som vi konstruerade och avsluta med att göra en robot som följer ett streck på marken. I och med att det är en kurs i realtidssystem så måste det finnas något moment av realtid i det hela, så samtidigt som den ska följa ett streck ska den hela tiden avläsa avståndet till en robot som kommer köra framför och hålla 20cm avstånd.

OSEK är en implementation av ett RTOS (real time operating system) som är skapat av ett samarbete av tyska biltillverkare. NXT-implementationen hjälper sedan till med kopplingen mot hårdvaran, dvs sensorer och motorer.

Programmen skrivs i C och har en tillhörande .OIL-fil som innehåller en beskrivning av systemet med alla events, timers osv. Du använder sedan en rad verktyg för att kompilera ihop dessa och få in den på din Lego Mindstorms NXT.

Vår uppgift

Den ska som sagt följa ett streck och samtidigt hålla ett konstant avstånd till roboten framför. Uppgiften var hyfsat enkel att genomföra när vi fått klart för oss hur nxtOSEK fungerade, kommit ihåg hur API:erna till roboten fungerade och vilka saker man ska tänka på.

För att nämna några av utmaningarna vi har haft:

  • Hur definieras mörker?
  • Hur hanterar man en bana som har kurvor? (Skarpa och/eller långa?)

Algoritm

Vår algoritm för att hålla oss på banan är mycket enkel och bygger på att vi har en fast arm som vår sensor sitter fast på.

  1. Vi har ett task (LightTask) som läser av ljuset mot backen
  2. Har ljuset ändrats sedan sist? Isf, läs av och kolla om den är högre eller lägre
  3. Är det ljust så ändra så ena hjulet (hjul 1) går exempelvis 50 och det andra hjulet (hjul 2) går 20
  4. Är det mörkt så ändra så hjul 1 går i 20 och hjul 2 går i 50.
  5. Börja om

Vi har gjort lite justeringar på detta så att den kör med en faktor när den räknar ut hur fort den ska köra. Detta för att den ska ha möjlighet att “smyga” framåt om det är ganska nära.

Demonstration

Källkod

Finns på GitHub

Categories
Programming

Hett tips för Androidutvecklare, trådlös ADB

För alla er som utvecklar för Android och har en rootad telefon, kolla in adbWireless som är en gratis programvara för att kunna köra ADB trådlöst över wifi.

Underskatta inte känslan av att kunna testa och köra ADB trådlöst!

Categories
Programming

Använd Mogenerator med Core Data och Xcode

Sedan i början av sommaren har jag jobbat med att utveckla iOS-applikationer och har spenderat en hel del tid de senaste månaderna med Objetive-C, Xcode och Core Data. Core Data är utvecklat av Apple och har funnits med sedan ett par releaser av iOS tillbaka. Core Data är enkelt uttryckt Apples svar på modell-delen i MVC-paradigmen (Model View Controller). Det hanterar migreringar, serialisering av data och manipulation samt läsning av data i databasen.

Det funkar riktigt bra för det mesta, däremot har jag dragit mig för att göra vissa ändringar i modellen för att det blir så rörigt med mina “custom entity files”. Då kan vi passa på att säga välkommen till Mogenerator!

mogenerator generates Objective-C code for your Core Data custom classes. Unlike Xcode, mogenerator manages two classes per entity: one for machines, one for humans. The machine class can always be overwritten to match the data model, with humans’ work effortlessly preserved

Xmo’d seamlessly integrates mogenerator into Xcode

Mogenerator hjälper oss med att generera nya entity filer utifrån vår modell, nu slipper jag alltså göra det manuellt (och ofta göra fel på vägen). Dessa filer håller sig synkroniserade och uppdaterade mot min modell.

Börja med att installera Mogenerator från webbplatsen.

Installera i Xcode

  • Öppna projektinställningarna, skapa ett nytt target (“Add Target”)
  • Skapa ett “Aggregate target”, finns under Other.
  • Välj ett namn och tryck “Done”.
  • Välj det target som du nyss skapade och tryck “Add Build Phase” och sedan “Add Run Script”.
  • Fyll i följande information i scriptet, justera såklart med vad som gäller för din modell:
cd dinapp/coredata/
mogenerator -m app.xcdatamodeld/app.xcdatamodel/

Nu kan du sedan välja detta target uppe i vänstra hörnet och trycka Command+B (Build) och luta dig tillbaka medans Mogenerator skapar dina filer.

Glöm inte bort att välja samma klassnamn i fältet för “Class” när du modifierar din entity i modellen, annars genererar inte Mogenerator några filer. Första gången du skapar dina modeller kommer du behöva lägga till filerna i Xcode manuellt, sedan sköts detta genom att filerna bara skrivs över.

För mer information om fördelarna med att använda Mogenerator så rekommenderar jag följande inlägg: Getting Started with Mogenerator.