真夜中の工作室 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単体は自分が探した限り日本では売っていない。ついに海外通販を使うしかないか。

ドーグボット大東京 デバイスダンボールコンテスト対決

コンテストについては、ライバル一組と一騎打だった。
しかもコンテストはドークボット開始5分後。トップバッターで緊張した。
開催者側もまだばたばたしており、時間が来ても何もアナウンスがないので、もうやってもいいいんですかと主催者に聞きにいくところからスタート。「こっちの挨拶してから」と、舞台の袖で開催宣言を聞いて、プレゼン開始。
ノートPCにキーボードの写真とArduino+YMZ294+16bit拡張IO*8+DIPSW9個

とだけ書いたのでプロジェクターに映そうかと思っていたのだが、主催者の挨拶中にパワーセーブに入ったのかすぐに映せなくなったのであっさり諦めた。
で、一人で説明するのは思った以上に難しかった。
あんまりつまらなすぎると、主催者にも申し訳ないなあと余計な心配をして見たり自分なりにいろいろ考えてはきたのだが。
まず、見た目で変人ぶりをアピール。
1.2mからなるキーボードを斜めに背中に背負い、最後のネタの為にゴーグルをして登場。出待ちの写真しかないがかなりの変人ぶり。


プレゼンの概要は、
・電子部品は小型化しても人間が扱う以上、適正なサイズというのがある。
 でも、軽くて持ち運びしやすいのに越したこととない。
 そんなものの一つに楽器があると考え、軽量のダンボールキーボードを作った。
・マライヤを超えるため8オクターブに対応したが、1kgに満たないほど軽量。
・演奏しようと思うが、自分には演奏の技術がないことに気づいた。
オクターブを変えながら輪唱でも自動演奏しようかと考え、社長に相談したら、自動演奏と言えば、”サーカスのギャロップ”に昔から決まっていると怒られる。
・PSGなので同時に3音しかだせないので、無理。
・そこで、新開発の超小型MP3PLAYERを内蔵して、自動演奏を実現!小型だから軽いまま。
・スピーカーを変更できるのもDIYの醍醐味。
・プロペラ付きスピーカーに換装。制御が難しいので、安全のためゴーグルをお勧めします。


という内容だったが、反省点はたくさん。
まず、操作しながらマイクを持ち続けることができなかった。
そもそも活ぜつが悪いので台詞が聞き取りにくかった。
原稿も全部読めてなかった。
キーボードは薄いのが売りだが、机に置くと客席からはほとんど見えなかった。
鳥目なのでゴーグルをしたまま原稿が読めなかった。
のっけから「読めない」とゴーグルを外すハプニング。
(これは逆にうけていたのでよかったが)
こんだけでかいのに結局MP3playerで自動演奏かよ!ってネタなのが伝わりにくかった。
もうちょっとキーボードを弾いた方が良かった。
最後の空飛ぶスピーカはすぐに落ちすぎた。
等々。
でもいい勉強になった。
プレゼン終了後も司会の方がちょっといじってくれたんで救われた。
2回目のプレゼンのリハーサルにもなったし。
勝敗は、プレゼン中にお客が携帯で投票サイトにアクセスして投票、リアルタイムに集計され、総投票数の多いほうが勝ち。ただし、一人で何度でも投票できるので、関係者が多いほうが断然有利。
自分も5人の仲間の支えで勝つことが出来たと思っている。
相手は、TVを被って登場された時は肝を冷やしたが、内容はちょっと地味だったかなという印象。
僅差で勝ったので偉そうなことは言えないが。
キーボードは神村工業のブースで展示。何人かは不思議そうに見てくれて良かった。

8オクターブダンボールキーボードハード概略

かなり遅くなったけど・・・。

ドークボットでコンテストに出したキーボード。
畳が良く似合うと思う。

マイコンは、Arduino一個。音源はMSXでお馴染みのPSG YMZ294
8オクターブあるので、キーが97個いる。
16bit拡張IOを8個使って12本ずつキーを割り当てている(8個目だけ13本)。
4ポートづつIOを余らせているが、この方がsketchが簡単だったので。
基本は各オクターブに割り当てられた拡張IOのスイッチを見て、対応した音を出すというシンプルな仕組み。
ブロック図はこんな感じ。

sketch自体は後日ちょっと直してからupする。

拡張IOでLEDMATRIX

 拡張IOの勉強のため、+LEDMATRIXでアニメをSketch。

送信者 工作

これは、ドークボットの神村工業ブースでも参考に展示したので先に書いておく。

 Arduinoのソフト開発はこれまでの組み込みマイコンに比べて格段に難易度を下げた。
オープンソースハードなので多少の知識があればハードしては、小型のクローンが用意に作成出来るし、特にソフトはポート設定も含め、ソースもそのまま流用出来るのでありがたい。
自分にとってはちょっとハードルが高いデバイスを制御しようと思った場合も、調べるてみると先人が既にArduinoで動作させてくれてたりして、参考になったり、そのまま使えたりする。
AVR328対応等プログラム容量も増えたものが出てきた。
でも、すぐに足りなくなるのはポート数ではないかと思う。
デフォルトのskecthにもあるように初回はまず、LEDを光らせところから始める方が多いのではないかと思うが、その延長で20個以上のLEDを光らせるとなると、プログラムは簡単でも、pinが足りなくなる。
例えば、秋月電子では100円で8*8のLEDMATRIXが売っていてこれを表示デバイスにしてみようと考えた場合、LEDMATRIXだけで16本pinが必要なので、SWで制御など考えてもかなり制限が出てしまう。
http://akizukidenshi.com/catalog/g/gI-00963/

そこで、IOpin拡張について考えてみた。
LEDMATRIXに限って言えば、標準ライブラリでMatrixがあるが、LEDドライバ高価だし、入力には使えない。通常のIOとして使いたい場合、、
Arduinoの亜流、Sanguinoを使えば32本IOがあるが、Pro mini並みに小型なものは自分は知らない(作ろうとは思っている)。
PLD等を組み合わせてSPIやI2Cで通信できれば、デバイス次第でいくらでもpinが増やせるが、PLDを使うとなるとVerilogなり、VHDLなりで開発する必要がありこれもちょっと敷居が高い
pin拡張のためだけのICで容易に入手できるところがないかと探したところ、マイクロファンで16本拡張できる専用ICを扱っていたので買ってみた。通信フォーマットはI2CとSPIの2種あったが、好みでSPIのにした。
MCP23S17
http://www.microfan.jp/shop/51_155.html
仕様書はこちら。
http://ww1.microchip.com/downloads/en/DeviceDoc/21952b.pdf

今回は、MCP23S17の16本は全てLEDMATRIXに割り当てた。
LEDMATRIXのpin配置は物理的制限から行列で綺麗に並んでいないので、MCP23S17との接続の際に、COL1-8はGPA[7:0]、ROW1-8はGPB[7:0]に順番に割り当てた。
ブロック図は下記。


この方が後の制御が楽になると思う。
ちなみにこのLEDMATRIXはCOL:L、ROW:Hに設定したドットが光る。
2進数で発光パターンを作った場合、発光したい部分を1としたら、COLがは~で反転した方が分かりやすいと思う。
LEDなので電流制限抵抗が必要。今回仮に360Ωとしたが、コネクタにして簡単に変更できるようにしておいた。


MCP23S17とArduino(今回は168 Pro mini 8MHz 3.3V)の接続はSPI。
拡張IOのSCK、SI、SOに繋がるpinはAVRの仕様で決まっているが、CSは任意のpinで可能、今回は10pinに割り当てた。
RESETはArduinoと共用とした。

SPIについては、本でもWEB上でもあちこちで説明されているのでここでは割愛。
自分が特に参考になったのは、
AVRマイコン・リファレンス・ブック
http://www.amazon.co.jp/AVR%E3%83%9E%E3%82%A4%E3%82%B3%E3%83%B3%E3%83%BB%E3%83%AA%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9%E3%83%BB%E3%83%96%E3%83%83%E3%82%AF%E2%80%95AVR%E3%81%AECPU%E3%82%A2%E3%83%BC%E3%82%AD%E3%83%86%E3%82%AF%E3%83%81%E3%83%A3%E3%80%81%E8%B1%8A%E5%AF%8C%E3%81%AA%E5%86%85%E8%94%B5%E5%91%A8%E8%BE%BA%E6%A9%9F%E8%83%BD%E3%82%92%E8%A9%B3%E7%B4%B0%E8%A7%A3%E8%AA%AC-%E3%83%9E%E3%82%A4%E3%82%B3%E3%83%B3%E6%B4%BB%E7%94%A8%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA-%E5%B1%B1%E6%A0%B9-%E5%BD%B0/dp/4789837300/ref=pd_bxgy_b_img_a
のSPIインターフェイスについて書かれた160-161ページ
SPIは汎用的な規格だが、制限が緩いのでデバイスごとに設定を変えてやる必要がある。
特に、
 CSの極性。
 MSBかLSBか。
 クロック極性、クロック位相
に注意。
MCP23S17はCS:lowactive、MSB first、CLKはH極性で立ち上がりでラッチ。通信速度はArduinoの最高速でも受け付けてくれるので4MHzにした。マスタかスレーブは当然Arduinoがマスタになる。
なので、設定は、
SPCR:0b01010000
SPSR:0b00000001
とした。
良くわからなくても、全く同じデバイスを使用するならこの設定で問題ない。
もっと興味がある人はオシロスコープでCSで同期を掛けてDATAとCLの波形を一度見るとわかりやすいと思う。

参考にもう少し詳しく書くと、
SPCR[7]:SPIE SPI割り込みイネーブル
SPCR[6]:SPE SPIイネーブル(0:SPI OFF/1:SPI ON)
SPCR[5]:DORD データ・オーダ(0:MSB/1:LSB)
SPCR[4]:MSTR マスタ/スレーブ(0:スレーブ/1:マスタ)
SPCR[3]:CPOL クロック極性(0:H/1:L)
SPCR[2]:CPHA クロック位相(0:Rising/1:falling)
SPCR[1]:SPR1 クロックレート選択ビット
SPCR[0]:SPR0 クロックレート選択ビット
(SPR[1:0]、00が最速、11が最遅)

SPSR[0]:SPI2X SPI2倍速ビット(0:*1/1:*2)

クロックを最速にしたいなら、SPI2X:1、SPR[1:0]:00とすればよい(fOSC/2となる)。
これはターゲットデバイスの通信速度によっては遅くする必要がある。

で、sketchはこちら。4つの画面を順番に光らせている。

/* 
  EXIO-SPI + LEDMATRIX
  MCP23S17
  CS:LowActive
  MSB first
  SCK rising
  Ver 0.02
*/


//SPI IF
#define DATAOUT 11//MOSI
#define DATAIN  12//MISO 
#define SPICLOCK  13//sck
#define SLAVESELECT 10//ss
#define HWADD 0x40

char address=0;
char data =0; 

#define WAIT 3000

char i=0,j=0,k=0;

//Pattern
char pat[4][8]={
{
0b01001100,
0b00101100,
0b00011101,
0b00001111,
0b00001100,
0b00010010,
0b00010010,
0b00100010
},
{
0b00000000,
0b00011001,
0b00011111,
0b00011100,
0b00101100,
0b01011110,
0b10010001,
0b00100010
},
{
0b10011000,
0b10011000,
0b01111110,
0b00011001,
0b00011001,
0b00100100,
0b01100100,
0b00000010
},
{
0b00011000,
0b00011001,
0b01111110,
0b10011000,
0b00011000,
0b00100100,
0b00100010,
0b01000000
}

};

//SPI 関数
char spi_transfer(volatile char data)
{
  SPDR = data;                    // Start the transmission 
  
  while (!(SPSR & (1<<SPIF)))     // Wait the end of the transmission
  {
  };
  
  return SPDR;                    // return the received byte
}
 

void setup()
{

//pinmode 設定  
  pinMode(DATAOUT, OUTPUT);
  pinMode(DATAIN, INPUT);
  pinMode(SPICLOCK,OUTPUT);
  pinMode(SLAVESELECT,OUTPUT);
  digitalWrite(SLAVESELECT,HIGH); //disable device

//SPI設定
  // SPCR = 01010000
  //interrupt disabled,spi enabled,msb 1st,master,clk low when idle,
  //sample on rising edge of clk,system clock/2 rate (fastest)
  SPCR = 0x50;
  SPSR = 0x01; // SPI2X:1
 
 //MCP23S17 初期化
	digitalWrite(SLAVESELECT,LOW);
  		spi_transfer(HWADD);   //send MSByte address first
  		address=0x0A;
  		spi_transfer(address);   //send MSByte address first
		data = 0x20;
  		spi_transfer(data);      //send MSByte DATA
  	digitalWrite(SLAVESELECT,HIGH); //release chip

	digitalWrite(SLAVESELECT,LOW);
  		spi_transfer(HWADD);   //send MSByte address first
  		address=0x0B;
  		spi_transfer(address);   //send MSByte address first
		data = 0x20;
  		spi_transfer(data);      //send MSByte DATA
  	digitalWrite(SLAVESELECT,HIGH); //release chip
  
	digitalWrite(SLAVESELECT,LOW);
  		spi_transfer(HWADD);   //send MSByte address first
  		address=0x00;
  		spi_transfer(address);   //send MSByte address first
		data = 0x00;
  		spi_transfer(data);      //send MSByte DATA
  	digitalWrite(SLAVESELECT,HIGH); //release chip

	digitalWrite(SLAVESELECT,LOW);
  		spi_transfer(HWADD);   //send MSByte address first
  		address=0x01;
  		spi_transfer(address);   //send MSByte address first
		data = 0x00;
  		spi_transfer(data);      //send MSByte DATA
  	digitalWrite(SLAVESELECT,HIGH); //release chip

 
 	digitalWrite(SLAVESELECT,LOW);
  		spi_transfer(HWADD);   //send MSByte address first
  		address=0x12;
  		spi_transfer(address);   //send MSByte address first
		data = 0xFF;
  		spi_transfer(data);      //send MSByte DATA
  	digitalWrite(SLAVESELECT,HIGH); //release chip

 	digitalWrite(SLAVESELECT,LOW);
  		spi_transfer(HWADD);   //send MSByte address first
  		address=0x13;
  		spi_transfer(address);   //send MSByte address first
		data = 0x00;
  		spi_transfer(data);      //send MSByte DATA
  	digitalWrite(SLAVESELECT,HIGH); //release chip
  
}
  
void loop(){
  for(j=0;j<4;j++){
     for(k=0;k<32;k++){
      data = 0x01;
        for(i=0;i<8;i++){ 
    
 	digitalWrite(SLAVESELECT,LOW);
  		spi_transfer(HWADD);   //send MSByte address first;
  		spi_transfer(0x12);   //send MSByte address first
  		spi_transfer(~pat[j][i]);      //send MSByte DATA
  	digitalWrite(SLAVESELECT,HIGH); //release chip 

   	digitalWrite(SLAVESELECT,LOW);
  		spi_transfer(HWADD);   //send MSByte address first
  		spi_transfer(0x13);   //send MSByte address first
  		spi_transfer(data);      //send MSByte DATA
  	digitalWrite(SLAVESELECT,HIGH); //release chip  
  
        data = data<<1;
        delayMicroseconds(WAIT);
        }//i 
     }//k
  }//j

}//loop

実際の通信は、spi_transfarで送っている。
8bit毎にデータを送る。
今回はLEDを光らせるのみなので、SPIは送信のみ。
SOは繋がなくても良い。
仕様書をみてちょっと戸惑ったのが、デバイスごとに固有のアドレスがあること。
1アドレス分送る場合の例だと、
”デバイスのアドレス”、”アドレス”、”データ”の3byte単位で送る必要がある。デバイスのアドレスはA[2:0]がALL0なら、0x40となる。
理解すると便利なことが分かる。つまり、デバイスアドレスを変えてやれば、一本のCSでもデバイスを8個まで区別して通信できるのだから。
複数個使わないなら設定によりハードアドレスを無視することもできるので今回は無視する設定。
後はアドレスとデータの値を任意に設定すれば仕様書通り動作させられるので簡単。
ただ、このデバイス、入力割り込みや、アドレス自動インクリメントや、極性反転機能など思ったより多機能。
今回出力のH/L切り替えだけなので、最低限の設定だけ使っている。
アドレスも分かりやすく1アドレス単位での通信とした。BANKも0扱いである。
オープンドレインは使わず、Hだけ出している。
個人的にはなかなか使い勝手が良く、価格も262円と個人で買う分にはコストパフォーマンスが高いと思う。
このICの入力を使って、キーボードも作った。

ドーグボット大東京 神村工業出展

デバイスダンボールコンテストは、真夜中の工作室のsakehitoが一人で出た。
しかし、以前からものづくり交流のあった3人で神村工業を本格的に立ち上げ、
手芸デバイスコンテストで”kumP3player”を発表。ブースもだした。
ブログも立ち上げて、ここと相互リンクしてある。

・神村工業
http://d.hatena.ne.jp/kamimura_industries/
当初一人で出る予定だったのが、メンバーに相談するとトントン拍子で話が進み、プレゼント出展でチームで協力することで非常に楽しい時を過ごすことができた。
ドークボット1回、Make2回を経て遂に自分もプレゼン、出展することが出来たので夢がまたひとつかなった。
バイトで店番しくれた友人2人も感謝。

ドークボット大東京 デバイスダンボール・コンテスト

デバイスダンボール・コンテスト優勝しました。
とりあえず報告です。
投票してくれた方ありがとうございました。
作り方はシンプルですが、後日公開したいと思います。

CRduino


なんとなく思い立って、Arduinoのクローンを作ってみた。


一番のネックはbootloaderの書き込みと思っていたら、
愛用している秋月のUSB-シリアル変換ICだけで書き込めることがわかった。
http://www.geocities.jp/arduino_diecimila/avr-writer/index.html#top


AVRはスイッチサイエンスから、328のQFPが500円で売っていたので、それを購入。
http://www.switch-science.com/products/detail.php?product_id=184
Sanhayatoの変換基板QFP-83に実装。
http://www.sunhayato.co.jp/products/details.php?u=193&id=07011


基本的に、Arduino Pro Mini 328 3.3V 8MHz互換。
異なるのは、
電源は、CR2032を採用し、レギュレータ削除。
電源LEDも削除。
RESETスイッチも削除
SCKに繋がるLEDも削除、だが動作がわかる様に写真ではディスクリートのLEDを半田付けして光らせている(デフォルトのskechで動作)。
lilypad互換にすればセラロックも削除できるが、起動が遅くなりそうなのであえて実装した。
見た目スクエアで綺麗なのでLilypadの亜流といえなくも無いが、CR2032専用ということで、”CRduino”と名づけてみた。
ちょっとパチスロっぽいのでもっといいネーミングを募集。
DC-DCと単4一本タイプも簡単に出来そう。


電池ホルダとパスコン、RESETの10kは裏面に実装。
今回の実装状態だとpin配列はこうなる。


bootの書き込みは端子を設けず半田付け、最初の一回だけだから問題なし。


書き込み手順は上記のリンクの手順で問題ないが、
fusebitは328の8MHz用に設定する必要がある。
今回であれば、Arduino IDE
..\hardware\boards.txt
に記載されているように、
high_fuses=0xDA
low_fuses=0xFF
extended_fuses=0x05
を選択。

bootは、
..\hardware\bootloaders\atmega

ATmegaBOOT_168_atmega328_pro_8MHz.hex
を書き込む。

開発用端子は、2列6pinとした。


Lilypadと同等、Prominiの3倍くらいの面積ではあるが、小型組み込み用に適していると思う。
半田付けが苦でない人には、簡単に安価なクローンが作れる。
個人的には電子工作だからと何でもブレッドボードを持ち出すのは嫌い。
半田付けせずして電子工作無しと思っている。


・主な部品表
 AVR,ATMEGA328,500円,ATMEL,スイッチサイエンス
 QFP変換基板,QFP-83,588円,Sanhayato,マルツパーツ他
 セラロック,CSTLS8M00G53(8MHz),40円,村田製作所,秋月電子
 CR2032電池フォルダ,CH-7410-2032LF,60円,秋月電子
 0.1uF*4
 10uF*1
 10kΩ(Reset用)
 その他、ISCP用コネクタ

1000円ちょっとで作れる。