You can control LEGO Power Function using Scrach as you can see on this video.

To achieve this follow these few steps:

  • Download S4A (Scratch For Arduino)
  • Download modified S4A firmware - 09 S4A LEGO IR Power Function.zip - I found it on this site.
  • Optionally: to test if your Arduino board work witch S4A you can check original S4AFirmware.
  • Extract files and copy three of them to directory named S4AFirmware14_LEGO_PF_IR:
    • S4AFirmware14_LEGO_PF_IR.ino
    • PowerFunctions.cpp
    • PowerFunctions.h
  • I've changed pin from D5 to D12 (it depends on hardware)

    int IR_pin = 12; // LEGO PF IR channel
    
  • Use Arduino (or similar software) tu compile and upload S4AFirmware14_LEGO_PF_IR.ino (during uploading you have to close S4A because it can interrupt communication)
  • Connect IR diode to pin (D12 in my case) - I've prepared simple board (in KiCAD) for Arduino Nano

Now You can make your first program:

it is a bit tricky: analog 5 mean "RED" channel and analog 6 mean "BLUE" one, values are

  • 0 - float
  • 1-7 forward (1-low, 7-fast)
  • 100 - break
  • 101-107 - reverse (101-low, 107-fast)

So this program does: FWD, wait 1s, Stop, wait 1s, REV, wait 1s, Stop, wait 1s for both channels/engines

Have fun!

I have a very old Lego RCX 1.0 but I couldn't program it. I supposed it was because of incompatibility, virtualized XP, or not supported USB<->RS232. I decided to build "new" tower. First I tried to use project from robotics.sk based on 555 timer, but all these capacitors, potentiometers and oscilloscope to calibrate... hello it's XXI century we have microcontrollers everywhere.

I've used arduino nano (some clone) only to generate 38kHz signal - based on comment in PWM at 38KHZ with Arduino article.

The IR receiver pinout is from TSOP4838 (GND in the middle) not TSOP1238 (Vs in the middle).

The whole program looks like this:

#define IR_CLOCK_RATE    38000L
#define pwmPin      11   // IR Carrier 

void setup()  { 
  // toggle on compare, clk/1
  TCCR2A = _BV(WGM21) | _BV(COM2A0);
  TCCR2B = _BV(CS20);
  // 36kHz carrier/timer
  OCR2A = (F_CPU/(IR_CLOCK_RATE*2L)-1);
  pinMode(pwmPin, OUTPUT);
} 

void loop()  { 
}

Now I wanted to check if it works with my RCX birck, so I've downloaded Bricx Command Center 3.3 and installed it based on Programming Lego Robots using NQC tutorial.

Next I founded firm0328.lgo file, the RCX firmware version 3.28. It is one version for RCX 1.0, 1.1 and 2.0. You can google for it or check this sites:

This file is need when you lost power (ie. change batteries) - you can do this (based on bricxcc) using Tools -> Download firmware. It takes some time.

Now I was able to program and control my RCX brick again.

Zrobiłem upgrade w projekcie sterowania frezarką - wymieniłem procesor z ATmega88 na ATmega168PA, ale Eclipse mi od razu krzyczał, że AVRdude nie obsługuje ATmega168P (tak go wykrywał). Rozwiązałem problem dość brutalnie. W pliku /etc/avrdude/avrdude.conf skopiowałem sekcję opisującą procesor ATmega168 i nazwałem ją ATmega168P. zmieniłem tylko następujące linie:

    id              = "m168p";
    desc            = "ATMEGA168P";
    signature        = 0x1e 0x94 0x0b;

po restarcie Eclipse'a zaczęło działać.

W dystrybucji Mandriva 2010.2 program avr-size z paczki cross-avr-binutils-2.20.51.0.4 nie potrafił pokazać procentowej zajętości pamięci (dla danego procesora) - nie obsługiwał przełącznika -C.

Obszedłem problem ściągając binutils 2.20.1 który rozpakowałem

wget http://ftp.gnu.org/gnu/binutils/binutils-2.20.1.tar.bz2
tar -xjf binutils-2.20.1.tar.bz2
cd binutils-2.20.1

i na który nałożyłem łatkę (zapisałem ją sobie jako avr-size.patch):

patch -p0 < avr-size.patch

niestety część rzeczy musiałem łatać sam, bo łatka nie była dokładna (nic poważnego tylko białe znaki się nie zgadzały) a następnie skompilowałem

./configure --target=avr
make

czy się udało mogłem sprawdzić poleceniem binutils/size --help które pokazało miedzy innymi:

 The options are:
  -A|-B|-C  --format={sysv|berkeley|avr}
            --mcu=<avrmcu>     MCU name for AVR format only

Kolejnym krokiem było skopiowanie pliku do miejsca w którym nowy plik będzie miał "pierwszeństwo" przed oryginalnym. Ja wybrałem /usr/local/bin, więc polecenie (uruchomione jako root) wyglądało tak:

cp binutils/size /usr/local/bin/avr-size

W konsoli nawet zadziałało. ale okazało się, że Eclipse ma własne ustawienia więc musiałem zmienić we właściwościach projektu w C/C++ Build > Settings > Tool Settings > Print Size dwie rzeczy: zawartość pola Command z

-avr-size

na pełną ścieżkę

-/usr/local/bin/avr-size

oraz Expert settings > Command line pattern z

${COMMAND} ${FLAGS} ${INPUTS}

na

${COMMAND} ${FLAGS} -C ${INPUTS} --mcu=${AVRTARGETMCU}

(AVRTARGETMCU jest "magiczną" zmienną dostępną w Eclipse z dodatkiem AVR Eclipse Plugin) i w końcu po wciśnięciu Build zobaczyłem:

AVR Memory Usage
----------------
Device: atmega88

Program:    5456 bytes (66.6% Full)
(.text + .data + .bootloader)

Data:        744 bytes (72.7% Full)
(.data + .bss + .noinit)

Firma Advanced Micro Tools udostępniła za darmo emulator wybranych procesorów AVR (oraz ST6) VMLAB. Nie jest to nowy produkt (wersja 3.15 powstała prawdopodobnie gdzieś w latach 2003 - 2009) ale za to działa pod WINE . W sieci można też znaleźć inne opisy po polsku.

Posiada wbudowany "oscyloskop" pokazujący stan wyjść oraz zestaw urządzeń peryferyjnych, jak np. wyświetlacz LCD, który można "podłączyć" do emulowanego procesora. Cenną cechą jest otwartość na nowe komponenty które można "dorobić". Można też ściągnąć ciągle rozwijane gotowe biblioteki.

Wspierane modele rodziny AVR to:ATiny11, ATiny12, ATiny15, ATiny22, AT90S2343, AT90S2323, AT90S1200, AT90S2313, AT90S4433, AT90S4414, AT90S8515, AT90S4434, AT90S8535, ATmega8, ATmega16, ATmega161, ATmega162, ATmega32, ATmega64, ATmega128, ATmega48, ATmega88, ATmega168, ATmega8515, ATmega8535.

Dla ST6 to: ST6200, 01, 03, 08, 09, 10, 15, 20, 25.

Innym przydatnym drobiazgiem może być "kalkulator AVR" - nie sprawdzałem, ale podobno pomaga w liczeniu timerów do RC5.

Chciałem porównać czy kod bootloadera, który miałem jako plik HEX na dysku jest zgodny z tym który był używany. Nie mogłem porównać w post kodu, bo bootloader miałem bez źródeł (dokładnie to bez toolchain'a), a poza tym on był już wgrany na ok 100 urządzeniach i zmiana była kłopotliwa (nie wchodziła w grę). Niestety program wczytany z procesora (ATmega163)

avrdude -pm163 -cavrisp2 -Pusb -Uflash:r:/tmp/wsad.hex:i

był w formacie (zwanym Intel 8, I8HEX, Intel lub po prostu HEX w przeciwieństwie do np.: Intel 16, I16HEX lub INHX16 ale zawierający po 32 bajty na wiersz, a kod który miałem jako wzorzec miał 16 bajtów na wiersz.

Niby prosta sprawa można sobie napisać prosty programik który to zrobi, tylko po co? Taki program już istnieje (SRecord dedykowany do operowania na plikach wsadowych EPROM), a ponadto wystarczy uzyć polecenia '''objcopy''':

objcopy -I ihex -O binary /tmp/wsad.hex /tmp/wsad.bin
objcopy -I binary -O ihex /tmp/wsad.bin /tmp/wsad-new.hex

, które daje wynik w żądanej postaci po 16 bajtów na wiersz.

Zaktualizowana instrukcją instalacji: do listy stron z oprogramowaniem należy dodać jeszcze http://avr-eclipse.sourceforge.net/updatesite/ i zainstalować AVR Eclipse Plugin.

Programowy (software) reset można uzyskać za pomocą programatora wysyłając polecenie połączenia, bez podawania polecenia zapisania lub odczytu pamięci procesora, np.:

avrdude -pm163 -cavrisp2 -Pusb

przydaje się podczas rozwijania oprogramowania na płytkach które nie mają

Just my blog...

Mon Tue Wed Thu Fri Sat Sun
          1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31            
eZ Publish™ copyright © 1999-2024 eZ Systems AS