« 2021年11月 | トップページ | 2022年1月 »

2021年12月

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

 

  

| |

« 2021年11月 | トップページ | 2022年1月 »