ikkei blog

電子工作やパズルのブログです。主にLEDを使った電子工作をやっています。

ikkeiplexing

2010年02月13日 23時58分42秒 | Arduino
ikkeiplexing ( Charlieplexing by ikkei )をオシロで見て実測してみました。
すると、各セグメントの電流は最小8.7mA、最大10.7mAしか流れていませんでした。しかもその差がたった2mAですから、輝度差が無かったはずです。しかし、「8」の時はアノード側に60mAくらい流れているはずで、よく流せる物だと思います。
ACアダプタを使うと、最小11.7mA、最大12.3mAですから、確かにその差は0.6mAと小さくはなっているので、効果が有ることが分かります。

と言うことで、もっと電流を流せば、もっと効果が分かるだろうと、抵抗値を180Ωから100Ωに替えて、配線を整理しました。


回路はオリジナルから少し変更しています。8個まではDPのラインをコモンのドライブに使用しません。
こうすることによってDPを使用しない場合に、単純にDPの配線を外して、8本に出来ます。



ところが、やはりトランジスタの効果はあまり顕著に見えません。おそらくAVRのドライブ能力が高いのだと思われます。恐るべしAVR。

とりあえず、表示ドライバの様なものを作ってみました。
配列に入れた内容をタイマ割り込みで各桁を表示するようにしてみました。
動画のアップロードがうまくいかないので、ちょっと長いですがスケッチだけでも上げておきます。

/* 
 Charlieplexing by ikkei
 7segment display  2010.02.14
*/

#include <MsTimer2.h>

#define line1 12
#define line2 11
#define line3 10
#define line4 9
#define line5 8
#define line6 7
#define line7 6
#define line8 5
#define line9 4


const byte LINE[ 8 ][ 9 ] = { 
{ line1, line2, line3, line4, line5, line6, line7, line8, line9 },
{ line2, line1, line3, line4, line5, line6, line7, line8, line9 },
{ line3, line1, line2, line4, line5, line6, line7, line8, line9 },
{ line4, line1, line2, line3, line5, line6, line7, line8, line9 },
{ line5, line1, line2, line3, line4, line6, line7, line8, line9 },
{ line6, line1, line2, line3, line4, line5, line7, line8, line9 },
{ line7, line1, line2, line3, line4, line5, line6, line8, line9 },
{ line8, line1, line2, line3, line4, line5, line6, line7, line9 } };
//                      ABCDEFG.
const byte SEG[17] = { B11111100,  //    -A-
                      B01100000,  //   F   B
                      B11011010,  //   |-G-|
                      B11110010,  //   E   C
                      B01100110,  //    -D-
                      B10110110,
                      B10111110,
                      B11100000,
                      B11111110,
                      B11110110,
                      B11101110,
                      B00111110,
                      B10011100,
                      B01111010,
                      B10011110,
                      B10001110,
                      B00000000 };

byte DIGIT[8] = { 0, 0, 0, 0, 0, 0, 0, 0};
int count;
char data;
int i;
byte segment;
long m = 0;


void digit_out( int digit, byte data ){
 digitalWrite( LINE[ digit ][ 0 ], HIGH);
 pinMode( LINE[ digit ][ 0 ], OUTPUT);  
 if ( data > 15 ){
   data = 16;
 }  
 segment = SEG[ data ];
 for ( i=0; i <8; i++){ 7 ){
   count = 0;
 }
}

void setup(){
 alloff();
 count = 0;
 MsTimer2::set( 1, LED_digit); // 1msごとにLEDの桁を表示
 MsTimer2::start();
}

void loop(){
 store (m);
 m++;
}