CRduino 644 6.0V 16MHz
前回AVR328でArduinoのクローンを作ったが、
本当に作りたかったのは、Sanguinoの小型版。
QFPを探したら、マイクロファンにAtmega644が売っていたので購入。
http://www.microfan.jp/shop/9_145.html
Atmega644Pじゃなかったのに気づかなかったのはちょっと失敗。
pinちょっとが増えても、手順は前回と変わらない。
変換基板も前回と同じでpinが足りる。
Aruduino IDEはSanguinoに対応させておく必要がある。
http://sanguino.cc/softwareforwindows
boot書き込み時のfusebitは、
..\hardware\boards.txt
に記載されているように、
high_fuses=0xDC
low_fuses=0xFF
extended_fuses=0xFD
を選択。
bootは、
..\hardware\bootloaders\sanguino
の
ATmegaBOOT_644.hex
を書き込む。
ここまでは順調。
問題は、Arduino IDE
sanguinoを選択してもエラーになる。
Atmaga644Pにしか対応していないようだ。
幸い、ちょっとboards.txtファイルを修正すれば対応することが出来た。
下記をboard.txtに足して、sanguino644を選択すればOK。
##############################################################
sanguino.name=Sanguino644
sanguino.upload.protocol=stk500
sanguino.upload.maximum_size=63488
sanguino.upload.speed=38400
sanguino.bootloader.low_fuses=0xFF
sanguino.bootloader.high_fuses=0xDC
sanguino.bootloader.extended_fuses=0xFD
sanguino.bootloader.path=atmega644
sanguino.bootloader.file=ATmegaBOOT_644.hex
sanguino.bootloader.unlock_bits=0x3F
sanguino.bootloader.lock_bits=0x0F
sanguino.build.mcu=atmega644
sanguino.build.f_cpu=16000000L
sanguino.build.core=sanguino
sanguino.verbose=false
電源は、REGをつけても良かったが、CRduinoと命名したので、
CR2032にこだわった。仕様書を見ると、推奨電源電圧は5.5Vだが、最大定格は6Vなので、CR2032 2個直列としてみた。
これでIO32本の小型Arduinoが手軽に使える。
繋ぐデバイスが6V対応か注意する必要があるが、LED光らせるくらいなら問題なし。
そこで、16*16のLEDMATRIXを光らせてテロップを作ってみた。
32pin必要なので、全pin使ってしまうが、AVRのPORTを意識して接続すれば
非常にシンプルにskecthも出来た。
LEDMATRIXは秋月のもの。
赤色LEDドットマトリクス(16×16) C-2AA0SRDT
http://akizukidenshi.com/catalog/g/gI-00789/
700円もしたのに、2個も画素欠陥があった。初期不良か自分で壊したのか分からないが。今回の接続は下記のようにした。
PORTAとPORTBは逆の方が上下が分かりやすかったと後で後悔。
発光パターンは、EXCELで簡単な変換シートを作っておくと、便利だと思う。
例えば、こんな感じ。
http://dl.getdropbox.com/u/673668/CRduino/16-16LEDMARIX_PATTERN_v00.xls
sketchは以下。パターンを変えるだけでテロップが作れる。
MAXLでパターンにあわせてline数設定し、SPEEDで流れる速さを変えられる。
送信者 工作 |
/* CRduino Atmega644 16MHz 6V LEDMATRIX 16*16 v0.05 */ int i=0,j=0,s1=0,s2=0,k=0; word HLINE_C = 0x0001; word PORTBA = 0x0000; #define WAIT 300 #define MAXL 180 //pattern maxline #define SPEED 16 //scroll speed char pat[MAXL]={ 0b00111100,0b00010000, 0b00000000,0b00010000, 0b11111110,0b11111110, 0b00000010,0b10010010, 0b00000010,0b10010010, 0b00000010,0b11111110, 0b00000010,0b10010010, 0b00000010,0b10010010, 0b01111110,0b11111110, 0b00010000,0b00010000, 0b00010000,0b00010000, 0b00010000,0b00010000, 0b00010000,0b00010000, 0b00010000,0b00010000, 0b00010000,0b00010000, 0b00010000,0b00010000, 0x00,0x00, 0x00,0x00, 0b00010000,0b00010000, 0b00010000,0b00010000, 0b01111100,0b11111100, 0b00010000,0b00010000, 0b00010000,0b00010000, 0b01010100,0b01010000, 0b01010100,0b01010000, 0b01010100,0b01010000, 0b01010100,0b01010000, 0b01010100,0b01010000, 0b00010000,0b00010000, 0b00010000,0b00010000, 0b00010000,0b00010000, 0b00010000,0b00010000, 0b00010000,0b00010000, 0b00010000,0b01110000, 0x00,0x00, 0x00,0x00, 0b00000000,0b00000000, 0b00000000,0b00000000, 0b01111111,0b11111100, 0b00000001,0b00000000, 0b00000001,0b00000000, 0b00000001,0b00000000, 0b00000001,0b00000000, 0b00000001,0b00000000, 0b00000001,0b00000000, 0b00000001,0b00000000, 0b00000001,0b00000000, 0b00000001,0b00000000, 0b00000001,0b00000000, 0b00000001,0b00000000, 0b11111111,0b11111110, 0b00000000,0b00000000, 0x00,0x00, 0x00,0x00, 0b00000010,0b10000000, 0b00001010,0b10100000, 0b00001010,0b10100000, 0b01111111,0b11111100, 0b00000100,0b01000000, 0b00111111,0b11111000, 0b00000001,0b00000000, 0b00011111,0b11110000, 0b00000001,0b00000000, 0b00001111,0b11100000, 0b00000001,0b00000000, 0b01111111,0b11111100, 0b00000001,0b00000000, 0b00010001,0b00010000, 0b00010001,0b00010000, 0b00010001,0b00010000, 0x00,0x00, 0x00,0x00, 0b00000000,0b00000000, 0b00000000,0b10000000, 0b00000001,0b11000000, 0b00001111,0b11100001, 0b00111111,0b11110001, 0b01111111,0b11111011, 0b11111111,0b11111111, 0b00111111,0b11110011, 0b01111111,0b11110001, 0b00111111,0b11100001, 0b00000001,0b01000000, 0b00000000,0b00000000, 0b00000000,0b00000000, 0b00000000,0b00000000, 0b00000000,0b00000000, 0b00000000,0b00000000, 0x00,0x00, 0x00,0x00 }; void setup() { // initialize ports: DDRA = 0xFF; DDRB = 0xFF; DDRC = 0xFF; DDRD = 0xFF; PORTA = 0xFF; PORTB = 0xFF; PORTC = 0x00; PORTD = 0x00; } void loop() { for (j=0 ; j<MAXL ; j = j+2){ for(k=0; k<SPEED ; k++){ HLINE_C = 0x0001; for(i=0;i< 32;i=i+2){ s1 =i + j; if (s1==MAXL) {s2=0;} else if (s1 > MAXL) {s2=s2+2;} else {s2=s1;} PORTC = pat[s2]; PORTD = pat[s2+1]; PORTBA = ~HLINE_C; PORTB = PORTBA; PORTA = PORTBA >>8; HLINE_C = HLINE_C << 1; delayMicroseconds(WAIT); }//i PORTB = 0xFF; PORTA = 0xFF; }//k }//j }
ここまでくると、CRduino MEGAを作りたくなるが、Atmega1280のchip単体は自分が探した限り日本では売っていない。ついに海外通販を使うしかないか。