EnglishSvenska

Andra steget till en självbalanserande robot

Jag har nu fått tillräckligt många delar för att börja montera roboten.

Jag blev tvungen att borra upp hålen något för att få dem att passa M3.

Accellerometern sätts så nära motoraxeln som möjligt.

Smart grej för att dra åt alla muttrar är att ta en skruvdragare, en bit tejp och därefter snurra den gängade stången. Håll fast muttern med fingrarna och låt borrmaskinen göra jobbet. Annars tar det ett bra tag att få dit alla 24 muttrar.

Såhär ser den ut just nu:

Tagged with:

Ytmonterad Arduino Uno med TQFP32 adapter

Jag ville testa att löda ytmonterat och köpte mig därför adapter från TQFP32 till vanlig dip att sätta i breadboard.

Skaffa adapter från TQFP32 till dip. Chip att löda fast är i det här fallet en Atmega328P-AUR.

Tänk på att det är lättare att löda med flux:

Såhär ser det ut när man alla ben och headers sitter på plats:

Montera på breadboard och bränn in Arduino Uno bootloader:

Klart. Atmega328P-AUR på en breadboard med Arduino Uno bootloader:

Äntligen vettig backup i molnet!

Vad skulle hända vid en förlust av laptop? Skulle fortfarande alla semesterbilder vara kvar? Lösningen är för många att säkerhetskopiera till en exten hårddisk. Att inbilla sig en otur några nivåer värre skulle kunna vara att någon bryter sig in i hemmet och stjäl alla datorer inklusive den externa hårddisken med alla säkerhetskopior. Det enda som håller din data säker skulle i så fall vara att ha den duplicerad på annan ort. Jag har testat ett antal kombinationer av backuplösningar och tror mig nu har funnit en som är bättre än det mesta. Backblaze tar 4 usd i månaden och lovar då att lagra all data från en dator. Installera programmet, markera de hårddiskar som har viktig data och låt den tugga några dagar. I mitt fall är det 150Gb som den måste ladda upp vilket jag har förståelse för tar ett tag. Efter att första backupen är gjord kommer den självklart bara att uppdatera de filer som ändras, tas bort eller läggs till. Vissa tjänster är bra nog att få gratisreklam.

Förbättrad hårdvara för att styra Roomba

Förbättrade nyligen hårdvaran för att fjärrstyra min dammsugare över internet. Tidigare använde jag ett helt Arduino Uno-kort vilket är overkill. Bättre och snyggare blir det att göra det direkt på en breadboard. Video när det fungerar (med lite annan hårdvara).

1. Koppla upp Atmega328 på breadboard för att få en Arduino Uno.

2. Dra kablar från varje knapp på fjärrkontrollen.

3. Sätt dit ett gäng transistorer. En för varje knapp du vill fjärrstyra. Kom ihåg att kombinera jord för breadboard och fjärrkontrollen. Jag satte också dit några lysdioder för att lättare se vilket kommando som skickas.

4. Tejpa kablarna så att de sitter på plats.

5. Tejpa fast breadboard på fjärrkontrollen. Detta gör den mer intakt och risken för att kablar lossnar minskar.

6. Koppla in till datorn och konfigurera eventghost till att styra roomba.

Tagged with: , ,

Installing Zend Server CE in Ubuntu 12.04 (on Amazon EC2)

There already are some guides of how to setting up Zend Server in Ubuntu and one good example is one from Informasjonsviteren.

I used an Ubuntu 12.04 x64 on Amazon EC2 in this guide:

sudo vim /etc/apt/sources.list
add this at the bottom:
deb http://repos.zend.com/zend-server/deb server non-free

wget http://repos.zend.com/zend.key -O- |sudo apt-key add -
sudo apt-get update
sudo apt-get install zend-server-ce-php-5.3
sudo vim /etc/apache2/httpd.conf
add this at the bottom:
ServerName localhost

sudo apt-get install lynx
sudo /etc/init.d/apache2 restart
sudo /usr/local/zend/bin/zendctl.sh restart

To show status of zend server:
sudo /usr/local/zend/bin/zendctl.sh status

sudo chown ubuntu -R /var/www
sudo nano /etc/profile
add this at the bottom:
PATH=$PATH:/usr/local/zend/bin
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/zend/lib
source /etc/profile
sudo chown ubuntu /etc/apache2 -R

Try accessing the site on http://#PUBLIC-DNS# for example http://ec2-xxx-xx-xxx-xxx.eu-west-1.compute.amazonaws.com

If it shows you a page saying "It's working" then you are ready to upload your php files to /var/www. If it did not work check the Security group settings in EC2 (if you are running on EC2 ofcourse). Also check status of the zend server (as descibed in the guide)

Visit https://ec2-xxx-xx-xxx-xxx.eu-west-1.compute.amazonaws.com:10081 to get to the Zend Server Installation guide. Remember to open 10081-10082 in firewall (Security group setting in EC2). Only open theese ports for your ip.

Use /etc/apache2/sites-available/default for configuring the apache server.

For installing mysql aswell:
sudo apt-get install mysql-server
sudo apt-get install mysql-client-core-5.5

 

Första steget till en självbalanserande robot

Nu ikväll gjorde jag cad och beställde delar till att göra en egen självbalanserande robot. Kommer att använda Arduino som mikroprocessor och en liten 6 degrees of freedom som tilt-sensor.

Cadden på bilderna är inte helt klar men jag tror att de flesta delar är på sin rätta plats.

Uppdatterar med nya blogginlägg allt eftersom framsteg blir gjorda.

[Uppdatering 2012-06-12] Skruvförband på plats

La till skruvförband till motorfäste, hjul och de stängerna. Uppdaterade bilder:

Tagged with:

Hur man flyttar en EC2 Instance till ett annat konto

Det går tyvärr inte att ändra ägandeskapet för en EC2 instance så det man får göra är att dela den och skapa på nytt. Guide för flytt av EC2 Instance från Konto A till Konto B:

  1. Konto A. Create snapshot.
  2. Konto A. Create image from snapshot
  3. Konto A. AMIs. Edit permissions.
  4. Konto B. Gå till https://aws-portal.amazon.com/gp/aws/developer/account?ie=UTF8&action=payment-method och se account number i hörnet.
  5. Konto A. Skriv in account number utan bindesstreck i edit permissions.
  6. Konto B. AMIs. Välj Private Images. Det kan ta ett tag innan den dyker upp.
  7. Konto B. Launch. Välj din AMI. Sätt upp servern som vanligt.

Om servern har en webbserver behöver man låta båda servrarna köras parallellt ett tag för att ge dns-servrarna en chans att förnya sin cache:

  1. Konto B. Associera en ny Elastic ip till den nya servern.
  2. Konto A. Koppla databasen mot den nya servern. På detta sätt låter man endast en databas vara aktiv.
  3. Ändra dns-installningarna för domännamn. Peka mot det nya ip-nummret.
  4. Kontrollera att båda servrarna är igång och går att komma åt från webbläsaren. Efter något dygn kommer alla endast att besöka den nya servern. Gör då Terminate på instancen i Konto A.

Standalone Arduino med en Atmega328

Att sätta ihop sin egen Arduino på en labbplatta är ingen större konst. Visar här några illustrationer som förklarar hur man gör. Du kan köpa ett arduino-kit från mät.se för att få allt du behöver.

Enklaste konfigurationen som kräver en ftdi-kabel:

Vill man kunna mata denna koppling med ström från ett batteri lägger man bara till en några få komponenter. Finns att köpa här.

Istället för en ftdi-kabel kan man sätta dit en usb-modul såhär. Länk till usb-modul.

Klistermärken till Atmega328P-PU, Atmega328P-PN

För att snabbare se vilka portar som är vilka. Skriv ut arket nedan:
Klistermärke Arduino Atmega328

Komponenter finns här:

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

För att göra detta själv så är det bara att klippa ut och klistra på:

Tagged with: ,

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: , , ,