2022年1月23日 (日)

大型7セグLEDを4個使った表示装置

Cimg9863

 先日Amazonで買った74HC595がたくさん余ってるので,以前デジットで1個100円で買った1.5inchの大型7セグLED(アノードコモン) 4個を使ってArduino用の4桁7セグLED表示装置を作ってみました。
回路はこのシールドをマネしてこんな感じ↓
Untitled-sketch_

a~gのセグメントはそれぞれLEDが2個直列になってるので電流制限抵抗がなくても それぞれ6mA程度しか流れませんでしたが,DpはLED1個なので,220Ωの電流制限抵抗を入れました。
Arduinoからは SDI,LAT,CLKの3本の線でコントロールできるから便利です。
参考スケッチ ↓

//大型7segLED4個 + 74HC595を2個でカウントアップ

#define SDI 8
#define LAT 9
#define CLK 10
const byte digit[] = //7seg 点灯パターン(アノードコモン)
{
 B00000011, // 0 ( abcdefgDp )
 B10011111, // 1
 B00100101, // 2
 B00001101, // 3
 B10011001, // 4
 B01001001, // 5
 B01000001, // 6
 B00011011, // 7
 B00000001, // 8
 B00001001 // 9
};

const byte segment[] =
{
 B00000000,
 B10000000, //左端の7セグLED
 B01000000, //
 B00100000, //
 B00010000 //右端の7セグLED
};

void setup() {
 pinMode(SDI, OUTPUT);
 pinMode(LAT, OUTPUT);
 pinMode(CLK, OUTPUT);
}

void loop() {
 for (int i=0; i < 10000; i++){
  Disp(1,i/1000);
  Disp(2,i%1000/100);
  Disp(3,i%100/10);
  Disp(4,i%100%10);
 }
}

void Disp(byte seg,byte value){
 digitalWrite(LAT, LOW);
 shiftOut(SDI, CLK, LSBFIRST,digit[value]);
 if (seg == 2) {
  shiftOut(SDI, CLK, LSBFIRST, digit[value]&B11111110); //左から2番目の7セグLEDに小数点をつける
 }
 shiftOut(SDI, CLK, LSBFIRST,segment[seg]);
 digitalWrite(LAT, HIGH);
 delay(2);
}

  

| |

2022年1月16日 (日)

Arduinoで作ろう(61) Digisparkで7セグLED温度計

Digispark_lm35_7segled_

 またまたDigisparkに温度センサLM35DZをつないで温度計をつくりました。
今度の表示装置はLCDではなく秋月電子通商の74HC595付き7セグLEDです。
この秋月の7セグLEDはほんとに便利なパーツで,マイコンから3本の線でつなぐだけだし どんどん並べることもできるので使ってて楽しいですよ。オススメです。

// Digispark に秋月の74HC595の7セグLEDを接続
// LM35DZで温度計

#define SDI 0
#define LAT 1
#define CLK 2
#define tempPin A2
float value;
int temp,temp1,temp2,temp3;
const byte digits[] = {
0b11111100, // 0
0b01100000, // 1
0b11011010, // 2
0b11110010, // 3
0b01100110, // 4
0b10110110, // 5
0b10111110, // 6
0b11100000, // 7
0b11111110, // 8
0b11110110, // 9
};

void setup() {
 pinMode(tempPin,INPUT);
 pinMode( SDI, OUTPUT );
 pinMode( LAT, OUTPUT );
 pinMode( CLK, OUTPUT );
}

void loop() {
 value=analogRead(tempPin);
 temp = (value*5000)/1024;
 temp3=temp/100;  //10の位
 digitalWrite( LAT, LOW );
 shiftOut( SDI, CLK, LSBFIRST, digits[temp3] );
 digitalWrite( LAT, HIGH );
 temp2=(temp%100)/10;   //1の位
 digitalWrite(LAT, 0);
 shiftOut( SDI, CLK, LSBFIRST, digits[temp2]|0b00000001 );
 digitalWrite(LAT, 1);<br/temp1=temp%10;   //0.1 の位
 digitalWrite(LAT, 0);
 shiftOut( SDI, CLK, LSBFIRST, digits[temp1] );
 digitalWrite(LAT, 1);
 delay(1000);
}

  

| |

2022年1月10日 (月)

Arduinoで作ろう(60) Digisparkでデジタル時計

Digispark_ds3231_i2c_lcd1602_

 DigisparkにRTCとLCDを2つともI2Cでぶら下げて デジタル時計をつくってみました。
リアルタイムクロック DS3231のライブラリは TinyRTClib.h です。これは DS1307 でも DS3231 でも使えるみたい。

//リアルタイムクロック DS3231 を使ったデジタル時計

#include <TinyWireM.h>
#include <LiquidCrystal_I2C.h>
#include <TinyRTClib.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);    //I2Cアドレス 0x27
RTC_DS1307 RTC;    //DS3231だけど,これでOK

void setup(){
 TinyWireM.begin();
 RTC.begin();
 lcd.init();
 lcd.backlight();
// DS3231の日時をコンパイルした時刻に設定するなら下行のコメントアウトを外す
//RTC.adjust(DateTime(__DATE__, __TIME__));
}

void loop(){
 char buff[12] ;
 DateTime dt = RTC.now();
 sprintf(buff, "%04u/%02u/%02u", dt.year(), dt.month(), dt.day()) ;
 lcd.setCursor(0, 0) ;
 lcd.print(buff) ;
 sprintf(buff, " %02u:%02u:%02u", dt.hour(), dt.minute(), dt.second()) ;
 lcd.setCursor(0, 1) ;
 lcd.print(buff) ;
 delay(100) ;
}

  

| |

2022年1月 8日 (土)

Arduinoで作ろう(59) DigisparkのP5を使えるようにした

Fusewriting2_

 Amazonのカスタマーレビューや 他のWebサイトに書いてあることを読んだところ,「ヒューズビットを書き換えれば 現状RESETに割り当てられているP5 を入出力端子として使えるようになる」ということが分かりました。
ヒューズビットって何? という疑問はとりあえず放置しておいて,先人の教えに沿ってやってみました。
 まず,ArduinoISPを書き込んだArduino と 中華パチもんDigispark を上図のように接続し,ArdunoをパソコンのUSB端子につなぎます。
パソコンにはココでダウンロードした avrdude.exe を用意しておきます。
コマンドプロンプトで,以下のように謎のコマンドを打つと,現在の設定値が分かります。
20220103_image1 四角で囲んだ DD を 5F に変えればいいんだそうです。続けて謎のコマンド2を打ちます。
20220103_image2
よく分からずにやってますが,設定値DD を 5F に変えることができたようです。これでほんとにP5は入出力に使えるようになったのかな?
中華パチもんDigisparkに簡単なスケッチをアップロードしてみました。

void setup() {
 for ( int i=0; i<6; i++ ){
 pinMode(i, OUTPUT); digitalWrite(i, LOW);
 }
}

void loop() {
 for ( int i=0; i<6; i++ ){
 digitalWrite(i, HIGH);
  delay(200);
 digitalWrite(i, LOW);
  delay(200);
 }
}

お,P5のLEDもピカピカしてますね。うまくいったようです。

 

  

| |

2022年1月 2日 (日)

Arduinoで作ろう(58) DigisparkとLM35で温度計

Digispark_lm35_i2c_lcd1602_

20220102-152149

 Digisparkに温度センサLM35DZをつないで温度計を作ってみました。表示装置は,I2C接続のLCDです。
ブレッドボード上にパーツを配置し始めてから気がついたのですが,普通のブレッドボードは端にある電源ラインの穴とパーツを配置する部分の穴が少しズレてるんですね。サンハヤトの SAD-101はズレてないので,Digisparkを使うならこれがオススメです。

 I2C接続のLCD1602を使うには,C:\Users\USER\AppData\Local\Arduino15\packages\digispark\hardware\avr\1.0.0\
libraries\DigisparkLCD の中にあるライブラリ LiquidCrystal_I2C.h を使うようですが,本家Arduinoのライブラリにも LiquidCrystal_I2C.h があって同名なので,これがあるとうまくコンパイルが通りません。一時的に本家の方をリネームして衝突を回避しました。

// 温度計 LM35DZ + I2C_LCD1602
#include <TinyWireM.h>
#include <LiquidCrystal_I2C.h>
#define tempPin A2
LiquidCrystal_I2C lcd(0x27, 16, 2); //I2Cアドレス 0x27

float value;
float temp;

void setup(){
 pinMode(tempPin,INPUT);
 TinyWireM.begin();
 lcd.init();
 lcd.backlight();
}

void loop(){
 value=analogRead(tempPin);
 temp = (value*500)/1023;

 lcd.setCursor(0,0);
 lcd.print("temperature:");
 lcd.setCursor(9,1);
 lcd.print(temp); lcd.write(0b11011111); lcd.print("C");
 delay(1000);
}

 あと2つヘンなことがあります。まず,LM35の出力を接続できるはずのDigisparkのアナログinputのA0からA3のうち,A2しか使い物になりませんでした。A0とA3だとデタラメな数字がLCDに表示されます。なんで?
 もうひとつ,Digisparkが完全に起動した後にA2にLM35出力を接続しないと ちゃんと測定できないのです。この2つのトラブルで5時間くらい時間を無駄にしました...。僕が買ったのが,中華製のパチもんDigisparkだからかなあ?

【追記】
Amazonのカスタマーレビューを見たら少しわかってきました。
中華パチもんDigisparkは,P5がRESETに割り当てられてるみたいですね。試しにP5をGNDにちょんと触ったらリセットがかかりました。
あと,DigisparkをUSB端子につないでるときは P3とP4は他の用途に使えないみたい。なーんだ。
Attiny85pinout

 

  

| |

2021年12月31日 (金)

Arduinoで作ろう(57) DigisparkでLチカ

Digispark

 大晦日だというのに 一昨日 Amazonで買った Digispark で遊んでますw
昨今の半導体不足のせいで少々値上がりしてるようで1枚500円程度しますが,上の写真のようにめっちゃ小さくてパソコンのUSB端子に直接挿せるようになってます。
Digisparkpinout

 DigisparkはATtiny85を載せたV-USBデバイスで,ArduinoみたいにUSB-シリアル変換することなくUSB経由で直接書き込むことができます。Arduino UNO等に使われているATMega328Pとスペック比較するとこんな感じ。

  GPIO Flash EEPROM RAM ADC PWM
ATtiny85 6 8KB 512B 512B 4 2
AtMega328P 23 32KB 1KB 2KB 6 6

 

 

 

実際に使えるFlashメモリは6KB程度みたいなので大したことはできそうもありませんが,コロナ禍において在宅ワークしてるサラリーマンがこれを使って「5分ごとにマウスを1px動かす」なんてことをしてたようです。しょうがねえなーw

Digisparkのドライバのインストール
 まずは,このサイトに書いてあることをマネして,DigisparkをWindows10に認識させるために libusb-win32のドライバをインストールしました。
micronucleus-2.0a4-win.zipをダウンロードして展開し DPinst64.exeを実行すると,デバイスマネージャでDigisparkが認識されたことが確認できました。

202112311

ボードマネージャのインストール
 次に Arduino IDEを起動し,「ファイル」→「環境設定」で「追加のボードマネージャのURL」に http://digistump.com/package_digistump_index.json と入れるのが標準的なやり方のようですが,このサイトを見てたら「avr-gccの旧バージョンがオーバライドされ,現行のArduino IDE ver. 1.8.5のavr-gccで可能だったATtiny10系向けのコンパイルができなくなります」なんてことが書いてあったので,この方のアドバイスに従って https://kimio-kosaka.github.io/digispark-clone/package_digispark-clone_index.json と書いてやることにしました。

 そうすると,ボードマネージャに Digispark AVR Boards(clone) ってのが現れるので,これをインストールします。(下図はインストール後の画面です)
202112312

サンプルスケッチの書き込み  
 スケッチを書き込む準備ができたので,Digispark Exampleの中にある Start というLチカのスケッチを書いてやりましょう。
202112313

 ボードは Digispark(Default-16.5mhz) ,書き込み装置は Micronucleus を選びます。
で,ここが大事なのですが DigisparkをUSB端子から取り外した状態で「マイコンボードに書き込む」ボタンを押します。
202112314
上のように,「plug in device now...」のメッセージが出たら,1分以内にDegisparkをUSB端子に挿入します。
202112315 「Micronucleus done. Thank you!」となったら書き込み成功です💓


   

| |

2021年12月24日 (金)

Arduinoで作ろう(56) 16個のLEDでバーサライタ

74hc595_16led_pov_

 74HC595を2個使って,16個のLEDでバーサライターを作ってみました。
友人のstraycatsmachan が作ってくれた縦16ビットの絵柄データを生成できるソフトを使って画数の多い「薔薇」と「焼肉定食」と「魑魅魍魎」のデータを作ってみました(笑)
また,straycatsmachanにデータを#includeする方法を教えてもらったので,絵柄データ部分をメインプログラムから切り離しておいて#includeし,タクトスイッチで3つの絵柄(文字列)を切り替えられるようにしてあります。

Cimg9824
メインのプログラムはコレ↓

// 74HC595×2個  LED 16個のバーサライタ

#define SDI 8
#define LAT 9
#define CLK 10
#define SW 11 //D11を絵柄切換SWとする
#define patternsaidai 3 //絵柄数最大
int bitmap[5][100];
int bitmaplen[5];
unsigned char i,j;

void setup() {
 #include "bitmap1.h"
 #include "bitmap2.h"
 #include "bitmap3.h"
 pinMode( SW, INPUT_PULLUP );
 pinMode( SDI, OUTPUT );
 pinMode( LAT, OUTPUT );
 pinMode( CLK, OUTPUT );
 i=1;
}

void loop() {
 if ( digitalRead(SW)== LOW ){
  delay(100);
  i = i+1;
 }
 if (i >patternsaidai) {
  i=1;
 }

for ( int j=0; j<bitmaplen[i]; j++ ) {
 digitalWrite( LAT, LOW );
 shiftOut( SDI, CLK, LSBFIRST, bitmap[i][j] );
 shiftOut( SDI, CLK, LSBFIRST, bitmap[i][j]>>8 );
 digitalWrite( LAT, HIGH );
 delay(3);
 }
}

↓絵柄データ1(薔薇) bitmap1.h

i=1;
bitmaplen[i] = 46; //薔薇

bitmap[i][1] = 0b0000000000000000;
bitmap[i][2] = 0b0000000000000000;
bitmap[i][3] = 0b0000000000000000;
bitmap[i][4] = 0b0000000000000000;
bitmap[i][5] = 0b0000000000000000;
bitmap[i][6] = 0b0000000000000000;
bitmap[i][7] = 0b0000000000000000;
bitmap[i][8] = 0b0000000000000000;
bitmap[i][9] = 0b0000000000000000;
bitmap[i][10] = 0b0000000000000000;
bitmap[i][11] = 0b0000000000000000;
bitmap[i][12] = 0b0000000000000000;
bitmap[i][13] = 0b0000000100000010;
bitmap[i][14] = 0b0000000110010010;
bitmap[i][15] = 0b0111110101010010;
bitmap[i][16] = 0b0100010100110010;
bitmap[i][17] = 0b0100010101010010;
bitmap[i][18] = 0b0101110110010111;
bitmap[i][19] = 0b0101010100010010;
bitmap[i][20] = 0b0101010111111010;
bitmap[i][21] = 0b0101010100010010;
bitmap[i][22] = 0b0101110110010111;
bitmap[i][23] = 0b0100010101010010;
bitmap[i][24] = 0b0100010100110010;
bitmap[i][25] = 0b0111110101010010;
bitmap[i][26] = 0b0000000110010010;
bitmap[i][27] = 0b0000000100000010;
bitmap[i][28] = 0b0000000000000000;
bitmap[i][29] = 0b0000000000000000;
bitmap[i][30] = 0b0000010001000010;
bitmap[i][31] = 0b0000001000100010;
bitmap[i][32] = 0b0111111110011010;
bitmap[i][33] = 0b0000000001000010;
bitmap[i][34] = 0b0100000000000010;
bitmap[i][35] = 0b0011110101110111;
bitmap[i][36] = 0b0000010101000010;
bitmap[i][37] = 0b0000010101111010;
bitmap[i][38] = 0b0011110101000010;
bitmap[i][39] = 0b0001001001110111;
bitmap[i][40] = 0b0100000110000010;
bitmap[i][41] = 0b0010011001111010;
bitmap[i][42] = 0b0001100001000010;
bitmap[i][43] = 0b0010011111000010;
bitmap[i][44] = 0b0100000001000010;
bitmap[i][45] = 0b0000000000000000;
bitmap[i][46] = 0b0000000000000000;

↓絵柄データ2(焼肉定食) bitmap2.h

i=2;
bitmaplen[i] = 80; //焼肉定食

bitmap[i][1] = 0b0000000000000000;
bitmap[i][2] = 0b0000000000000000;
bitmap[i][3] = 0b0000000000000000;
bitmap[i][4] = 0b0000000000000000;
bitmap[i][5] = 0b0000000000000000;
bitmap[i][6] = 0b0000000000000000;
bitmap[i][7] = 0b0000000000000000;
bitmap[i][8] = 0b0000000000000000;
bitmap[i][9] = 0b0000000000000000;
bitmap[i][10] = 0b0000000000000000;
bitmap[i][11] = 0b0000000000000000;
bitmap[i][12] = 0b0000000000000000;
bitmap[i][13] = 0b0110000001111000;
bitmap[i][14] = 0b0001110000000000;
bitmap[i][15] = 0b0000001111111111;
bitmap[i][16] = 0b0000010000010000;
bitmap[i][17] = 0b0000100000001000;
bitmap[i][18] = 0b0100001001000100;
bitmap[i][19] = 0b0100001001000100;
bitmap[i][20] = 0b0011001111110100;
bitmap[i][21] = 0b0000111001000100;
bitmap[i][22] = 0b0000001001011111;
bitmap[i][23] = 0b0000001001000100;
bitmap[i][24] = 0b0111111001000100;
bitmap[i][25] = 0b0100001111110100;
bitmap[i][26] = 0b0100001001000100;
bitmap[i][27] = 0b0111001001000000;
bitmap[i][28] = 0b0000000000000000;
bitmap[i][29] = 0b0000000000000000;
bitmap[i][30] = 0b0111111111111100;
bitmap[i][31] = 0b0000000000000100;
bitmap[i][32] = 0b0000100001000100;
bitmap[i][33] = 0b0000100001000100;
bitmap[i][34] = 0b0000010000100100;
bitmap[i][35] = 0b0000001000010100;
bitmap[i][36] = 0b0000000110001111;
bitmap[i][37] = 0b0000001000010100;
bitmap[i][38] = 0b0000001000010100;
bitmap[i][39] = 0b0000010000100100;
bitmap[i][40] = 0b0000100001000100;
bitmap[i][41] = 0b0100000000000100;
bitmap[i][42] = 0b0100000000000100;
bitmap[i][43] = 0b0111111111111100;
bitmap[i][44] = 0b0000000000000000;
bitmap[i][45] = 0b0000000000000000;
bitmap[i][46] = 0b0000000000000000;
bitmap[i][47] = 0b0100000000111100;
bitmap[i][48] = 0b0010000000000100;
bitmap[i][49] = 0b0001100000100100;
bitmap[i][50] = 0b0000111100100100;
bitmap[i][51] = 0b0001000000100100;
bitmap[i][52] = 0b0010000000100100;
bitmap[i][53] = 0b0010000000100100;
bitmap[i][54] = 0b0111111111100111;
bitmap[i][55] = 0b0100001000100100;
bitmap[i][56] = 0b0100001000100100;
bitmap[i][57] = 0b0100001000100100;
bitmap[i][58] = 0b0100001000100100;
bitmap[i][59] = 0b0100001000100100;
bitmap[i][60] = 0b0100000000000100;
bitmap[i][61] = 0b0100000000111100;
bitmap[i][62] = 0b0000000000000000;
bitmap[i][63] = 0b0000000000000000;
bitmap[i][64] = 0b0100000000010000;
bitmap[i][65] = 0b0100000000010000;
bitmap[i][66] = 0b0100000000001000;
bitmap[i][67] = 0b0111111111101000;
bitmap[i][68] = 0b0010001010100100;
bitmap[i][69] = 0b0010001010100100;
bitmap[i][70] = 0b0010001010100010;
bitmap[i][71] = 0b0010011010111001;
bitmap[i][72] = 0b0000101010100010;
bitmap[i][73] = 0b0001001010100100;
bitmap[i][74] = 0b0010101010100100;
bitmap[i][75] = 0b0010101111101000;
bitmap[i][76] = 0b0100010000001000;
bitmap[i][77] = 0b0100010000010000;
bitmap[i][78] = 0b0100000000010000;
bitmap[i][79] = 0b0000000000000000;
bitmap[i][80] = 0b0000000000000000;

↓絵柄データ3(魑魅魍魎) bitmap3.h

i=3;
bitmaplen[i] = 74; //魑魅魍魎

bitmap[i][1] = 0b0000000000000000;
bitmap[i][2] = 0b0000000000000000;
bitmap[i][3] = 0b0000000000000000;
bitmap[i][4] = 0b0000000000000000;
bitmap[i][5] = 0b0000000000000000;
bitmap[i][6] = 0b0000000000000000;
bitmap[i][7] = 0b0110000111111100;
bitmap[i][8] = 0b0001111100100100;
bitmap[i][9] = 0b0000000111111110;
bitmap[i][10] = 0b0011111100100101;
bitmap[i][11] = 0b0101010100100100;
bitmap[i][12] = 0b0101100111111100;
bitmap[i][13] = 0b0100000000000000;
bitmap[i][14] = 0b0101111101111010;
bitmap[i][15] = 0b0100000101000010;
bitmap[i][16] = 0b0100110101101010;
bitmap[i][17] = 0b0100101111010011;
bitmap[i][18] = 0b0100110101101010;
bitmap[i][19] = 0b0101000101000010;
bitmap[i][20] = 0b0101111101111010;
bitmap[i][21] = 0b0110000000000000;
bitmap[i][22] = 0b0000000000000000;
bitmap[i][23] = 0b0000000000000000;
bitmap[i][24] = 0b0100000000000000;
bitmap[i][25] = 0b0011000111111100;
bitmap[i][26] = 0b0000111100100100;
bitmap[i][27] = 0b0000000111111110;
bitmap[i][28] = 0b0011111100100101;
bitmap[i][29] = 0b0100000100100100;
bitmap[i][30] = 0b0101100111111100;
bitmap[i][31] = 0b0101011000000000;
bitmap[i][32] = 0b0101101000100000;
bitmap[i][33] = 0b0100000100100100;
bitmap[i][34] = 0b0100000010100100;
bitmap[i][35] = 0b0100111111111111;
bitmap[i][36] = 0b0100000010100100;
bitmap[i][37] = 0b0100000100100100;
bitmap[i][38] = 0b0111001000100000;
bitmap[i][39] = 0b0000000000000000;
bitmap[i][40] = 0b0000000000000000;
bitmap[i][41] = 0b0110000111111100;
bitmap[i][42] = 0b0001111100100100;
bitmap[i][43] = 0b0000000111111110;
bitmap[i][44] = 0b0011111100100101;
bitmap[i][45] = 0b0101010100100100;
bitmap[i][46] = 0b0101100111111100;
bitmap[i][47] = 0b0100000000000000;
bitmap[i][48] = 0b0101111111111110;
bitmap[i][49] = 0b0100000010101010;
bitmap[i][50] = 0b0100011110110010;
bitmap[i][51] = 0b0100010011100010;
bitmap[i][52] = 0b0100010010110010;
bitmap[i][53] = 0b0101000010101010;
bitmap[i][54] = 0b0101111111111110;
bitmap[i][55] = 0b0110000000000000;
bitmap[i][56] = 0b0000000000000000;
bitmap[i][57] = 0b0000000000000000;
bitmap[i][58] = 0b0110000111111100;
bitmap[i][59] = 0b0001111100100100;
bitmap[i][60] = 0b0000000111111110;
bitmap[i][61] = 0b0011111100100101;
bitmap[i][62] = 0b0101010100100100;
bitmap[i][63] = 0b0101100111111100;
bitmap[i][64] = 0b0100000000000000;
bitmap[i][65] = 0b0101111111110010;
bitmap[i][66] = 0b0100001010010010;
bitmap[i][67] = 0b0100000100010010;
bitmap[i][68] = 0b0101111111111110;
bitmap[i][69] = 0b0100001010010010;
bitmap[i][70] = 0b0101000100010010;
bitmap[i][71] = 0b0101111111110010;
bitmap[i][72] = 0b0110000000000000;
bitmap[i][73] = 0b0000000000000000;
bitmap[i][74] = 0b0000000000000000;

で,スローシャッターで撮った写真がこちら↓ なかなかイイでしょ?

Cimg9820_20211223211201

Cimg9813 

Cimg9816_20211223211001

| |

2021年12月22日 (水)

Arduinoで作ろう(55) 74HC595のカスケード接続

74hc595_16led_2

 74HC595を2個, カスケード接続 (多段接続) してLED16個の制御をやってみました。
上図の左側,1個めの74HC595の9ピン(カスケード用シリアル出力) と右の2個めの74HC595の14ピン(シリアルデータ入力) をつないでやります。
そうすると,1個めに入力されたデータが9ピンから出て,2個めの14ピンに流れていくわけです。74HC595をこうやってどんどんカスケード接続していけば,大量のLEDが制御できるっていう仕掛け。おもしろいですなあ。

Cimg9799

fritzingの図では省略してありますが,LEDの電流制限抵抗はちゃんとつけてあります。LEDの足を短く切って,抵抗をハンダづけしてあります。上の写真を見ると分かりますよね。

// 74HC595のカスケード接続 16個のLED 順送り点灯

#define SDI   8
#define LAT   9
#define CLK 10
int bitmap[] = {
 0b0000000000000000,
 0b1000000000000000,
 0b1100000000000000,
 0b1110000000000000,
 0b1111000000000000,
 0b1111100000000000,
 0b0111110000000000,
 0b0011111000000000,
 0b0001111100000000,
 0b0000111110000000,
 0b0000011111000000,
 0b0000001111100000,
 0b0000000111110000,
 0b0000000011111000,
 0b0000000001111100,
 0b0000000000111110,
 0b0000000000011111,
 0b0000000000001111,
 0b0000000000000111,
 0b0000000000000011,
 0b0000000000000001,
};
 
void setup() {
 pinMode( SDI, OUTPUT );
 pinMode( LAT, OUTPUT );
 pinMode( CLK, OUTPUT );
}

void loop() {
 for ( int i=0; i<sizeof(bitmap)/sizeof(int); i++ ) {
  digitalWrite( LAT, LOW );
  shiftOut( SDI, CLK, LSBFIRST, bitmap[i] );
  shiftOut( SDI, CLK, LSBFIRST, bitmap[i]>>8 );
  digitalWrite( LAT, HIGH );
  delay(100);
 }
}

16個のLEDの点滅データですから 1行分のデータは16ビットですが,shiftOut関数は1回で8ビットのデータしか送出できません。
そこで,1回目で下8桁のデータを送出し,2回目はデータを8ビット分右シフトしてから上8桁のデータを送出してやります。

shiftOut( SDI, CLK, LSBFIRST, bitmap[i] );
shiftOut( SDI, CLK, LSBFIRST, bitmap[i]>>8 );

これで,16ビットの点滅データを16個のLEDに反映させることができます。

| |

2021年12月20日 (月)

Arduinoで作ろう(54) 74HC595 を使ってLチカ

74hc595_8led_ シフトレジスタ 74HC595 を使ってLチカをやってみました。
Arduino と 74HC595 を3本の線でつなぐだけで8個のLEDを制御できるってのがイイですね。
shiftOut関数を使ってArduinoから1バイト (8ビット) のデータをシリアルでダダダッと送ると,それを74HC595 が受け取って15,1,2,3,4,5,6,7の8つのピンに出力してくれるわけです。説明が雑すぎですが,ネット上にちゃんとした説明がたくさんありますから調べてみましょう (丸投げ)。
下のスケッチにある,

sizeof(bitmap)/sizeof(byte)

というところで,データ配列bitmap[]の要素数を計算しています。こういうやり方があるんですね。初めて知りました。
20211220 以前 aitendoで買った「74HC595シールドキット」(廃版になったみたい)というのを使ってみました。

// 74HC595を使って8個のLEDを制御

#define SDI   8
#define LAT   9
#define CLK 10

byte bitmap[] = {
  0b00000000,
  0b10000000,
  0b11000000,
  0b11100000,
  0b11110000,
  0b11111000,
  0b01111100,
  0b00111110,
  0b00011111,
  0b00001111,
  0b00000111,
  0b00000011,
  0b00000001,
  0b00000000
};

void setup() {
  pinMode( SDI, OUTPUT );
  pinMode( LAT, OUTPUT );
  pinMode( CLK, OUTPUT );
}

void loop() {
  for ( int i=0; i<sizeof(bitmap)/sizeof(byte); i++ ) {
  digitalWrite( LAT, LOW );
  shiftOut( SDI, CLK, LSBFIRST, bitmap[i] );
  digitalWrite( LAT, HIGH );
  delay(200);
  }
}

 

  

| |

2021年12月18日 (土)

Arduinoで作ろう(53) バーサライタを作ってみた

Pov_

 高校時代の級友 straycatsmachan にバーサライター (POV) を見せてもらって「そう言えば,コレやったことなかったなあ」と思い,マネして作ってみました。
Arduinoのスケッチは武蔵野電波のブレッドボーダーズのものを基にstraycatsmachanが改良を加えたもので,タクトスイッチをカチカチ押して複数の絵柄を選択できるようになってます。素晴らしい。

「武蔵野電波のブレッドボーダーズ」のWebサイトに説明されていますが,

digitalWrite(LEDPIN + i, (bitmap[pos] >> i) & 0b00000001);

ってところがイイですな。絵柄1行分の8bitのデータをビット演算子で右シフトしながら,0b00000001とAND(論理積)で1(LED点灯)を取り出してるんですね。こういうスマートなコードをすらすら書けるようになりたいなあ。
 んで問題は,絵柄をどうやって描くか?ということなんですが,VB使いのstraycatsmachanは,文字列や絵柄をサクっとデータ化するソフトまで作ってくれてたのでした。感謝です。(勝手に公開できないのでごめんなさいね)

202112181    LEDと電流制限抵抗を各8個並べた基板とArduino Pro Miniと電源(セリアで買った単三2本3Vを5Vに変換する電池ケース)を載せた板をマブチモーターで回転させてみました。
202112182

 絵柄がキレイに見えるようにマブチモーターにかける電圧を調節して撮ったのが下の写真。スペースインベーダーのキャラクタです。歳がバレますが笑
202112183

 

  

| |

より以前の記事一覧