真夜中の工作室 midnight craftcenter

電子工作とカメラ、写真の趣味のブログ

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


pin配置は、こうなる。


電源は、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単体は自分が探した限り日本では売っていない。ついに海外通販を使うしかないか。