EnglishSvenska

Bränn Arduino bootloader till Atmega328-PU

Jag köpte ett gäng nya Atmega328-PU. Eftersom det finns två varianter av detta mikrochip nämligen Atmega328p-pu och Atmega328-pu. P efter 328 innebär "pico-power" vilket betyder att den drar mindre ström. När man försöker bränna en bootloader ett icke pico-power-chip så får man felmeddelande om ogiltig signatur:

Expected signature for ATMEGA328P is 1E 95 0F Double check chip, or use -F to override this

Snabbaste sättet att lösa detta är att lägga till non-pico-power som en Arduino-typ. Gå till mappen där Arduino IDE är installerat. Öppna filen /hardware/tools/avr/etc/avrdude.conf. Lägg till detta:

#------------------------------------------------------------
# ATmega328
#------------------------------------------------------------

part
    id     = "m328";
    desc   = "ATMEGA328";
    has_debugwire = yes;
    flash_instr   = 0xB6, 0x01, 0x11;
    eeprom_instr = 0xBD, 0xF2, 0xBD, 0xE1, 0xBB, 0xCF, 0xB4, 0x00,
       0xBE, 0x01, 0xB6, 0x01, 0xBC, 0x00, 0xBB, 0xBF,
       0x99, 0xF9, 0xBB, 0xAF;
    stk500_devcode = 0x86;
    # avr910_devcode = 0x;
    signature    = 0x1e 0x95 0x14;
    pagel    = 0xd7;
    bs2      = 0xc2;
    chip_erase_delay = 9000;
    pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1",
     "x x x x x x x x x x x x x x x x";

    chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x",
     "x x x x x x x x x x x x x x x x";

    timeout  = 200;
    stabdelay = 100;
    cmdexedelay = 25;
    synchloops = 32;
    bytedelay  = 0;
    pollindex = 3;
    pollvalue = 0x53;
    predelay = 1;
    postdelay = 1;
    pollmethod  = 1;

    pp_controlstack =
 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F,
 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F,
 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B,
 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00;
    hventerstabdelay = 100;
    progmodedelay = 0;
    latchcycles   = 5;
    togglevtg   = 1;
    poweroffdelay = 15;
    resetdelayms = 1;
    resetdelayus  = 0;
    hvleavestabdelay  = 15;
    resetdelay   = 15;
    chiperasepulsewidth  = 0;
    chiperasepolltimeout = 10;
    programfusepulsewidth = 0;
    programfusepolltimeout = 5;
    programlockpulsewidth = 0;
    programlockpolltimeout = 5;

    memory "eeprom"
 paged   = no;
 page_size = 4;
  size    = 1024;
 min_write_delay = 3600;
 max_write_delay = 3600;
 readback_p1 = 0xff;
 readback_p2 = 0xff;
 read = " 1 0 1 0 0 0 0 0",
         " 0 0 0 x x x a9 a8",
         " a7 a6 a5 a4 a3 a2 a1 a0",
         " o o o o o o o o";

  write = " 1 1 0 0 0 0 0 0",
         " 0 0 0 x x x a9 a8",
   " a7 a6 a5 a4 a3 a2 a1 a0",
   " i i i i i i i i";

 loadpage_lo = " 1 1 0 0 0 0 0 1",
         " 0 0 0 0 0 0 0 0",
         " 0 0 0 0 0 0 a1 a0",
         " i i i i i i i i";

 writepage = " 1 1 0 0 0 0 1 0",
       " 0 0 x x x x a9 a8",
       " a7 a6 a5 a4 a3 a2 0 0",
       " x x x x x x x x";

 mode    = 0x41;
 delay   = 20;
 blocksize = 4;
  readsize  = 256;
    ;

    memory "flash"
 paged   = yes;
  size    = 32768;
  page_size = 128;
  num_pages = 256;
  min_write_delay = 4500;
 max_write_delay = 4500;
 readback_p1 = 0xff;
 readback_p2 = 0xff;
 read_lo = " 0 0 1 0 0 0 0 0",
     " 0 0 a13 a12 a11 a10 a9 a8",
     " a7 a6 a5 a4 a3 a2 a1 a0",
     " o o o o o o o o";

 read_hi = " 0 0 1 0 1 0 0 0",
     " 0 0 a13 a12 a11 a10 a9 a8",
     " a7 a6 a5 a4 a3 a2 a1 a0",
     " o o o o o o o o";

 loadpage_lo = " 0 1 0 0 0 0 0 0",
         " 0 0 0 x x x x x",
         " x x a5 a4 a3 a2 a1 a0",
         " i i i i i i i i";

 loadpage_hi = " 0 1 0 0 1 0 0 0",
         " 0 0 0 x x x x x",
         " x x a5 a4 a3 a2 a1 a0",
         " i i i i i i i i";

 writepage = " 0 1 0 0 1 1 0 0",
       " 0 0 a13 a12 a11 a10 a9 a8",
       " a7 a6 x x x x x x",
       " x x x x x x x x";

 mode    = 0x41;
 delay   = 6;
  blocksize = 128;
  readsize  = 256;

    ;

    memory "lfuse"
 size = 1;
 min_write_delay = 4500;
 max_write_delay = 4500;
 read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0",
        "x x x x x x x x o o o o o o o o";

 write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0",
          "x x x x x x x x i i i i i i i i";
    ;

    memory "hfuse"
 size = 1;
 min_write_delay = 4500;
 max_write_delay = 4500;
 read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0",
        "x x x x x x x x o o o o o o o o";

 write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0",
          "x x x x x x x x i i i i i i i i";
    ;

    memory "efuse"
 size = 1;
 min_write_delay = 4500;
 max_write_delay = 4500;
 read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0",
        "x x x x x x x x x x x x x o o o";

 write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0",
          "x x x x x x x x x x x x x i i i";
    ;

    memory "lock"
  size = 1;
 min_write_delay = 4500;
 max_write_delay = 4500;
 read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0",
        "x x x x x x x x x x o o o o o o";

 write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x",
          "x x x x x x x x 1 1 i i i i i i";
    ;

    memory "calibration"
 size = 1;
 read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x",
        "0 0 0 0 0 0 0 0 o o o o o o o o";
    ;

    memory "signature"
  size = 3;
 read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x",
        "x x x x x x a1 a0 o o o o o o o o";
    ;
;

Hitta därefter filen /hardware/arduino/boards.txt och lägg till:

##############################################################

uno328.name=Arduino Uno w/ ATmega328 (non-P)
uno328.upload.protocol=arduino
uno328.upload.maximum_size=32256
uno328.upload.speed=115200
uno328.bootloader.low_fuses=0xff
uno328.bootloader.high_fuses=0xde
uno328.bootloader.extended_fuses=0x05
uno328.bootloader.path=optiboot
uno328.bootloader.file=optiboot_atmega328.hex
uno328.bootloader.unlock_bits=0x3F
uno328.bootloader.lock_bits=0x0F
uno328.build.mcu=atmega328
uno328.build.f_cpu=16000000L
uno328.build.core=arduino
uno328.build.variant=standard

Därefter ska det från Arduinos IDE se ut såhär:

 

Komponenter finns här:

Du kan också köpa Atmega med Arduino bootloader och klisterlapp:
Tagged with: , , ,

Gjorde min egen bootloader ISP till Arduino

Eftersom jag inte har en egen programmerare för att bränna bootloaders till Atmega-chip valde jag att göra en egen. Såhär blev den:

Eftersom jag använder en dip-socket kan jag lätt programmera massvis av chip efter varandra om jag vill. Det är bara att knäppa loss och stoppa i nästa.

En fördel med att ha en dedikerad programmerare till Arduino är att man inte behöver dra kablar från en officiell Uno varje gång som man vill bootloada en ny Atmega.

Arduinos webbplats har också några egna guider som beskriver mer utförligt: http://arduino.cc/en/Tutorial/ArduinoISP

 

Komponenter finns här:

Du kan också köpa Atmega med Arduino bootloader och klisterlapp:
Tagged with: , , ,

2D Bilspel i Android (hjälp gärna till att färdigställa)

För ett tag sedan började jag programmera ett spel till android. Eftersom jag inte har tid att göra klart det så tänkte jag här visa hur långt jag kommit och vad som är kvar att göra. Allt är open source och ligger på Github: https://github.com/sebnil/Sketchy-Truck

Jag ser väldigt gärna att spelet blir klart istället för att det ligger och samlar damm i ett privat repository.

Uppdateringar

[2012-06-03] Build path i Eclipse IDE ska fungera. Tidigare behövdes vissa inställningar göras för att få igång spelet.

Sammanfattning

Spelet är ungefär som MX Mayhem fast med en monstertruck istället för en cykel.
Denna video visar den senaste koden:

Bibliotek och teknik som använts

- Andengine
- Box2d extension
- Fysikeditor http://www.physicseditor.de

Fungerar just nu

- Andengine och box2d extension.
- Grundläggande fysik. Bilen beter sig ganska bra men förbättringar kan göras.
- Lutning av bilen med mobilens accelerometer. Tippa telefonen åt vänster och höger kommer att lägga en liten roterande moment på bilen.
- Världens skapas från att redigera XML-filer. Jag har skapat en XML-struktur för att lättare skapa nya världar. Denna generator kan behöva några förbättringar.

Spagettikod

Du är fri att göra förbättringar i kodstruktur om du vill. Jag skulle rekommendera en rengöring eftersom detta var mitt första medelstora projekt till android.

Separation mellan nivåerna och spelmotor

Just nu har jag bara lägga till en ny mapp att lägga till en ny bana till spelet. Däri läggs XML-och bildfiler och på så sätt kommer man att kunna skapa nya banor utan att röra spelmotor. Se world.xml för ett exempel:
https://github.com/sebnil/Sketchy-Truck/blob/master/assets/levels/level1/world.xml

Exempel på resterande struktur: https://github.com/sebnil/Sketchy-Truck/tree/master/assets/levels/level1
shapes.xml innehåller shapes från physicseditor. World.xml innehåller föremål och bakgrund. GFX innehåller grafik. Ganska enkelt.

Testat på

Jag har testat på HTC Desire, Google Galaxy Nexus och Samsung S2. Borde fungera på det mesta.

Källkod och copyright

Allt är på GitHub. Använd koden till det du tycker blir bäst men hjälp till att göra den bättre. Om du gör en förändring som är bra så se till att skicka in den till Github-projektet. Målet med att jag lägger ut allt är för att spelet ska bli närmre klart. Om du använder koden till något annat (exempelvis som material i en 2d andengine tutorial) så lämna en referens till den här bloggen.

Och tack till Emanuele Feronato för det exemplet du skrev om hur man använder box2d för att göra en bil med bra fysik.

Föreslagen todo:

- Ta bort oanvända tillgångar. typsnitt, bilder, ljud etc.
- Menyer ser inte bra ut.
- Lägg z-index för parallax backgrounds. Ange i xml med "zindex = #".
- Olika hastigheter på parallax bakgrunder. Ange i xml.
- Motorljud låter inte bra.
- Formen för bilen verkar vara en liten felaktig. När man rullar med bilen blir kontaktpunkterna inte ok.
- Ta bort laddningstiden vid omstart.
- Att trycka på menyknappen ska pausa spelet och öppna menyn.
- När man klickar på knappen Bakåt ingame ska man komma tillbaka till menyn.
- Lägg till stoppuret och lista bästa tider. Highscore.

CakePHP Database Logger

I needed to replace the default file log in CakePHP with one based on mysql instead. I shared the project on Bitbucket if someone else would like to do something similar.

https://bitbucket.org/sebnil/cakephp-database-logger/wiki/Home

Why is this better than file log?

  1. Easier to search
  2. Handles large amount of logging much better
  3. Has better performance (at least in some cases)
Tagged with: , ,

Sök och ersätt sträng i MySQL

Jag behövde nyligen söka i en tabell och ersätta kolumnvärden. Exempelvis kan detta användas för att över en hel blogg ersätta ett visst ord eller fras med något annat.

UPDATE table_name SET column_name = REPLACE(column_name,'original_string','replace_string');

Ny mycket renare version

eventghost_webserver_optimization_3

Tyckte att den tidigare versionen var för slö trots att jag gjort vad jag kunnat för att optimera koden. Gjorde ett försök med att slänga ut jQuery Mobile och då gick det genast mycket bättre. I den nya versionen har jag tagit inspiration från Windows Phone 7. Jag har dock skippat allt med Metro och kör bara på en svart bakgrund och knappar med vit ram. Jag tycker att det ser bättre ut när det är minimalistiskt men det viktigaste är endå att den nya versionen är sjukt mycket snabbare än den gamla.

Gå till Demo

Koden får du från https://bitbucket.org/sebnil/eventghost-web-gui/get/tip.zip.

Instruktioner för att sätta upp allt

Några förbättringar:

  1. Rensade bort all seg kod från jQuery Mobile. Less is more!
  2. Endast 4 http request per sidvisning. Toksnabba sidvisningar är resultatet.
  3. Ingen onödig javascript. Tog bort ganska mycket av min egen kod.
  4. Lättare html. jQuery Mobile gjorde många enkla saker svåra. I den nya versionen så borde en nybörjare inom html-programmering kunna lista ut hur man ska göra egna gränssnitt. Det är i alla fall min förhoppning.

Youtube-video:

Kontrollera Roomba från en webbplats med hjälp av Arduino

Vem har inte velat dammsuga när man inte är hemma? Den tekniken jag kommer använda är fulhack med att plocka isär fjärrkontrollen till Roomba och koppla in den på en Arduino UNO. För att styra Arduino från datorn via USB använder jag Messenger och låter Eventghost sköta all kommunikation med Serieport-pluginet.

Video:

Hur du gör

1. Skruva isär fjärrkontroll. Löd fast trådar på de knappar som du vill styra.
roomba_hacking_arduino_2

2. Jordad knapp betyder nedtryckt knapp. Jag kopplade ihop jord på Arduino och jord i fjärrkontrollen. Mellan utportarna på Arduino och knapparna satte jag transistorer. En 1:a (5 V) ut från Arduino sätter transistorn i till-läge. Transistorn sluter då mellan den sammankopplade jorden och knappen. Fjärrkontrollen kommer att uppfatta jord på en tryckknapp och luras att tro att det är en knapptryckning. [Uppdatering 2012-06-14] Skrev en förbättrad guide för hårdvara.
roomba_hacking_arduino_1

3. Ladda över kod. Allt är från Messenger till Arduino. Lägger upp en kopia här . Programmet jag kör är väldigt enkelt. Med serieporten skriver man vilken port man vill sätta hög exempelvis "w d 9 1" för write digital port 9 on.

4. Konfigurera Eventghost. Lägg till Serieport-plugin. Kommer inte gå igenom detta detaljerat men bilderna här nedan borde förklara tillräckligt:
serial_out_roomba_arduino
serial_out_roomba
serial_out_roomba_2

5. Förklarar inget om webbservern och gui heller eftersom jag gjort ett inlägg om det tidigare.

 

Tagged with: , ,

433 Mhz RF Nexa. Sändare och mottagare med Arduino.

Arduino-projekt för att skicka och ta emot RF signaler på 433 Mhz. Avkodar samma protokoll som Nexa använder.

Komponenter:
Arduino UNO
Velleman TX433N https://www.electrokit.com/rx433n-mottagarmodul-433-9-mhz.45095
velleman RX433N https://www.electrokit.com/tx433n-sandarmodul-433-9-mhz.45094
Går också att använda 433MHz RF transmitter and receiver link kit från mät.se vilka är billigare.

Styr en Nexa PB-3.

Kod för att läsa fjärkontrollen från Nexa:
http://arduino.cc/playground/Code/HomeEasy
(AM-HRR3 receiver test)

För att skicka till Nexa-brytare:
https://code.google.com/p/homeeasyhacking/source/browse/#svn/trunk/Arduino

Lägger också koden här ifall de andra länkarna slutar fungera:

Instruktioner för hemmaserver, tellstick, nexa och ir-sändare

[Uppdaterad 2012-02-13. Ny version som är mycket enklare att konfigurera]
[Uppdaterad 2012-04-01. Nytt gränssnitt är snabbare.]

Klicka här för att gå till en demo.

eventghost_webserver_optimization_2 eventghost_webserver_optimization_3

Många har bett mig göra en mer detailjerad beskrivning av hur jag satt upp min hemautomation så här kommer den.

Materiel:

Installation

  • Koppla upp dator
  • Koppla in tellstick och installera tillsammans med Telldust mjukvara
  • Installera alla nexa-brytare du vill använda
  • Sätt ir-sändaren så att den når det du vill styra. Lägg dit ir-repeterare om signalen inte når hela hemmet.

Testa tellstick

  1. Öppna Telldus Center
  2. Lägg till en enhet genom att klicka på Ny.
  3. Välj enhet.
  4. Lär upp.
  5. Det fungerar när du kan släcka och tända lampor genom att klicka på de små ikonerna.

Eventghost

  1. Installera http://www.eventghost.org/
  2. Jag har för mig att du inte behöver ett plugin för att köra tellstick och usb-uirt. Det ska bara fungera.
  3. Testa dig fram till hur eventghost fungerar. Jag tänker inte förklara det i detalj men mekron är en kombination av händelser. I varje makro behöver man ha actions vilka bestämmer när ett makro ska köras. Exempelvis kanske man vill köra ett visst makro som tänder en lampa när en knapp på fjärrkontrollen trycks (läses från ir-mottagaren). Makron kan placeras i mappar.

Webbservrar

Nu till det lite svårare nämligen webbserver. Jag rekommenderade tidigare "dynamic web server" men denna har blivit gammal och fungerar inte lika bra som den vanliga webbservern i Eventghost. Se till att du har senaste versionen av Eventghost för att också ha den senaste versionen av webbserver-plugin.

  1. Du lägger till webbservern som en plugin i Eventghost. Autostart->Lägg till plugin->Webserver,
  2. Ställ in en port och en dokumentrot. Porten valde jag till 8080. Dokumentroten "C:UsersSebastianDocumentsEventghost webserver" men båda dessa kan givetvis vara annorlunda.
  3. Lägg all min kod i dokumentroten ( "C:UsersSebastianDocumentsEventghost webserver" i mitt fall). Koden får du från https://bitbucket.org/sebnil/eventghost-web-gui/get/tip.zip.
  4. Navigera till http://localhost:8080/index.html för att se att det fungerar. Om det fungerar så ser du gränssnittet. Testa i olika webbläsare eftersom det finns risk för att det ser lite dåligt ut i Internet Explorer. Om du inte får igång webbservern så börja felsök i Eventghost. Testa annan port och annan dokumentrot. Skype ligger på port 80 vilket kan ge problem om du valde den porten.
  5. Testa att du kan skicka kommandon till eventghost genom att skriva localhost:8080/?foo=bar. Om det syns till vänster i Log i Eventghost så är det ok.
  6. Testa att klicka på knappar i gränssnittet på http://localhost:8080 får att se om de registrerar i Eventghost. Om du kör Chrome kan du högerklicka och trycka Granska komponent, välja Nätverk och se om det skickas några kommandon till eventghosts webbserver.

Den stora förändringen med den nya versionen är att man inte behöver ställa in lika mycket för att få servern att fungera. Om du har senaste versionen av Eventghost och senaste versionen av min kod ska det räcka med att köra webbserver i Eventghost (och inte som det var tidigare då man även behövde köra en php-server i Wamp).

Gör gränssnittet personligt

Jag antar nu att du fått igång mitt gränssnitt och att det ligger uppe på din webbserver. Konfigurationen jag gjort ligger i /js/script-and-config.js. Ändra i denna endast om du känner att du vill fixa något i bakomliggande teknik.

/index.html är huvudsidan. De andra sidorna ligger under i samma dokumentrot. Grundläggande kunskap i html är nödvändig men du kanske klarar dig på att redigera filerna och testa dig fram. Den action som skickas till Eventghost bestäms av data-action=x. Det borde vara allt. Som sagt, testa dig fram och se vad som fungerar och blir bra. Det är så jag gjorde.

Komma åt hemautomation utifrån (över internet)

Om du gjort alla steg innan detta så är du egentligen klar men det kan finnas vissa saker kvar att göra om du vill komma åt webbservern utifrån (alltså att styra hemautomationen när du inte är hemma). Jag går inte igenom detta detaljerat eftersom det skiljer sig från system till system. Några saker att komma ihåg är dock:

  1. Ta reda på extern ip från exempelvis mittip.nu
  2. [Frivilligt] Fixa ett domännamn kopplat till ditt ipnummer. De flesta har dynamiskt ip som byter och därför behöver man en tjänst som uppdaterar regelbundet exempelvis http://www.no-ip.com/. Istället för att koppla upp sig mot något som http://213.100.33.42 så får du http://hem.zapto.org eller http://hem.servehttp.com. Lättare att komma ihåg helt enkelt.
  3. Gör en port forward i routern.
  4. Öppna brandväggen i operativet + eventuella övriga brandväggar.
  5. Glöm inte bort att lägga in skydd från att andra kommer åt din hemautomation!

Det vore kul att se vad ni lyckas göra med min mjukvara och hur den modifieras så lägg gärna en kommentar och berätta vad du gjort. Projektet ligger som öppen källkod på https://bitbucket.org/sebnil/eventghost-web-gui/overview. Lycka till!

Getting Andengine to work

This is a basic tutorial for how to get the AndEngineExamples working.

  1. Use Eclipse. Download and install the mercurial plugin.
  2. Clone AndEngine and all the AndEngine extensions. The list of projects to clone is below this list. Clone them all to the same directory.
  3. Open the AndEngineExamples project. Remove all references to libraries. Use the cloned projects as libraries instead since they are newer. To link source right click on the project and choose Build path, Link source. Link andengine and all the extensions. Use different names. See image to see how I organized it.andengine_eclipse_project
  4. When you have no error warnings you should be able to compile the project. I got some problems with the physics plugin. RealMayo on the andengine forum got it working by putting a missing file in the libs folder. See his answer on http://www.andengine.org/forums/bugs/crash-when-running-the-totorials-t4640.html

Read more ›