RT @Seren_kei: さえずり季題[243]は「花火(はなび)」です。傍題に大花火、手花火等など。夏の季語ですが元々はお盆行事に使われることが多かったので江戸時代は秋の季語とされていたようです。「手花火を命継ぐごと燃やすなり」石田波郷 #saezuriha_odai
— June,born in Apr. (@no_ra_co) August 2, 2015
ついでにこれもマネして
ついでに、これも武蔵野電波のマネをしてみた。
これは、100円ショップのビーズを買ってきてLEDを埋め込み、紙コップに「LED生け花」をしてみたものだ。
この中身には、小さいブレッドボードにLEDの電流制御抵抗と、3端子レギュレータで電源回路が仕込んである。
耽るLチカ
LEDは半導体であるから、電球と違って、光り始める前は抵抗は無限大であり、電流は流れない。ところが電圧がVfを超えて光り始めたら最後、抵抗がなくなって電源をショートさせた状態でぶっ飛び、自分自身も壊れる。従って必ず抵抗を一緒にくっつけてやるのだ。
その抵抗を選ぶのは簡単で、基本的にという、この式のみでよい。LEDを買ってくると、流すべき電流値(If)、光り始める電圧(Vf)がどこかに書いてあるから、それに従って計算する。すなわち、
ここに、
V 自分が用意する電源の電圧
Vf 買ってきたLEDのVf(順方向電圧)、つまり光り始める電圧
If 買ってきたLEDのIf(順方向電流)、つまり光らせるために必要な電流
ただ、抵抗は入手可能な数値が決まっており、そのものピタリという抵抗値のものは売っていない。なので、計算した値と一番近い抵抗を選び、その抵抗値で再び電流を計算して、買ってきたLEDのIfを超えていないかどうかを確かめる。
これが、簡単な計算ではあるけどいちいち面倒くさい。
それでまあ、抵抗を選ぶのにこういうスプレッドシートを作る。
それから、これを使ってみよう。
これは、「武蔵野電波のプロトタイパーズ第15回『TLC5940で16個のLEDを遊ぶ』」で取り上げられている「TLC5940NT」というICだ。千石電商本店2階、入って左側の、一番奥のほうの抽斗で売られている。武蔵野電波のページでは400~700円とされているが、千石電商の店頭売りでは390円である。
Arduinoで使うには、GitHubにあるライブラリをダウンロードし、zipを展開して出てくる「tlc5940」というディレクトリをArduino IDEのインストールディレクトリの下にある「libraries」の中にコピーすればよい。
スペックシートはコレだが、スペックシートを見るより、Arduinoにライブラリを入れると出てくるようになるサンプルスケッチの「BasicUse」を見た方が分かり易いと思う。こんな風にサンプルは書かれている。
/* Basic Pin setup: ------------ ---u---- ARDUINO 13|-> SCLK (pin 25) OUT1 |1 28| OUT channel 0 12| OUT2 |2 27|-> GND (VPRG) 11|-> SIN (pin 26) OUT3 |3 26|-> SIN (pin 11) 10|-> BLANK (pin 23) OUT4 |4 25|-> SCLK (pin 13) 9|-> XLAT (pin 24) . |5 24|-> XLAT (pin 9) 8| . |6 23|-> BLANK (pin 10) 7| . |7 22|-> GND 6| . |8 21|-> VCC (+5V) 5| . |9 20|-> 2K Resistor -> GND 4| . |10 19|-> +5V (DCPRG) 3|-> GSCLK (pin 18) . |11 18|-> GSCLK (pin 3) 2| . |12 17|-> SOUT 1| . |13 16|-> XERR 0| OUT14|14 15| OUT channel 15 ------------ -------- - Put the longer leg (anode) of the LEDs in the +5V and the shorter leg (cathode) in OUT(0-15). - +5V from Arduino -> TLC pin 21 and 19 (VCC and DCPRG) - GND from Arduino -> TLC pin 22 and 27 (GND and VPRG) - digital 3 -> TLC pin 18 (GSCLK) - digital 9 -> TLC pin 24 (XLAT) - digital 10 -> TLC pin 23 (BLANK) - digital 11 -> TLC pin 26 (SIN) - digital 13 -> TLC pin 25 (SCLK) - The 2K resistor between TLC pin 20 and GND will let ~20mA through each LED. To be precise, it's I = 39.06 / R (in ohms). This doesn't depend on the LED driving voltage. - (Optional): put a pull-up resistor (~10k) between +5V and BLANK so that all the LEDs will turn off when the Arduino is reset. If you are daisy-chaining more than one TLC, connect the SOUT of the first TLC to the SIN of the next. All the other pins should just be connected together: BLANK on Arduino -> BLANK of TLC1 -> BLANK of TLC2 -> ... XLAT on Arduino -> XLAT of TLC1 -> XLAT of TLC2 -> ... The one exception is that each TLC needs it's own resistor between pin 20 and GND. This library uses the PWM output ability of digital pins 3, 9, 10, and 11. Do not use analogWrite(...) on these pins. This sketch does the Knight Rider strobe across a line of LEDs. Alex Leone <acleone ~AT~ gmail.com>, 2009-02-03 */ #include "Tlc5940.h" void setup() { /* Call Tlc.init() to setup the tlc. You can optionally pass an initial PWM value (0 - 4095) for all channels.*/ Tlc.init(); } /* This loop will create a Knight Rider-like effect if you have LEDs plugged into all the TLC outputs. NUM_TLCS is defined in "tlc_config.h" in the library folder. After editing tlc_config.h for your setup, delete the Tlc5940.o file to save the changes. */ void loop() { int direction = 1; for (int channel = 0; channel < NUM_TLCS * 16; channel += direction) { /* Tlc.clear() sets all the grayscale values to zero, but does not send them to the TLCs. To actually send the data, call Tlc.update() */ Tlc.clear(); /* Tlc.set(channel (0-15), value (0-4095)) sets the grayscale value for one channel (15 is OUT15 on the first TLC, if multiple TLCs are daisy- chained, then channel = 16 would be OUT0 of the second TLC, etc.). value goes from off (0) to always on (4095). Like Tlc.clear(), this function only sets up the data, Tlc.update() will send the data. */ if (channel == 0) { direction = 1; } else { Tlc.set(channel - 1, 1000); } Tlc.set(channel, 4095); if (channel != NUM_TLCS * 16 - 1) { Tlc.set(channel + 1, 1000); } else { direction = -1; } /* Tlc.update() sends the data to the TLCs. This is when the LEDs will actually change. */ Tlc.update(); delay(75); } }
この最初のほうのコメントにアスキー・アートで書かれている図を見て結線するとよい。こんな感じだ。
LEDは秋葉原・千石電商の隣の店、「akiba LEDピカリ館」で売っていた10個入り300円の白色LEDで、Vfが3.0V~3.4V、Ifが20mAとある。電源が5Vならば100Ωばかり抵抗を付けてやればいい理屈だが、全部点灯させるとArduinoがダメになってしまうから、さらに絞って10KΩつけてやる。
コンパイルして動かすとこうなる。
10kΩでもこれくらい明るい。
このICを使うと、パルス幅変調の幅も、Arduinoが256段階であるのに比べ、4096段階と格段に細かくなる。
アレンジを加えてみよう。昨日買ってきたポテンショメータを使う。アナログの4番ピンと5番ピンに50kΩのポテンショメータと10kΩの抵抗をつなぎ、それぞれを強さと速さにして、「尾を引いたみたいに」明るさ制御をする。
ポテンショメータの回路はこうする。
図の「E1」をアナログ入力で読めばよい。ポテンショメータのつまみの位置は、次の計算でR2を求めれば明らかになる。
…①
…②
① = ②
組み付けるとこうなる。
動かすとこんな感じ。
スケッチはこんな感じ。
// // wPotentio2tlc5940.ino // ポテンショメータとTLC5940でLチカ // 27.08.02(日)0900~ // 佐藤俊夫 // #include "Tlc5940.h" // const float R1 = 10000.0, // ポテンショメータ前の抵抗10kΩ, E0 = 5.0, // 電源電圧5V, MAXVR = 50000.0; // ポテンショメータの最大抵抗 const unsigned int VR1 = 4, VR2 = 5; // ポテンショメータはアナログピンのA4・A5 const unsigned int MAX_LED = 15; // LEDは0~15の16個 // void setup() { Tlc.init(); pinMode(VR1, INPUT); pinMode(VR2, INPUT); } void loop() { float vr1 = 0.0, vr2 = 0.0, e11 = 0.0, e21 = 0.0; static unsigned int topLed = 0, tailLen = 10; e11 = analogRead(VR1) * (5.0 / 1024); e21 = analogRead(VR2) * (5.0 / 1024); vr1 = (e11 * R1) / (E0 - e11); // 明るさ vr2 = (e21 * R1) / (E0 - e21); // 速さ if(++topLed > MAX_LED + tailLen) topLed = 0; Tlc.clear(); int bright = constrain(fmap(vr1, 0.0, MAXVR, 0, 4095), 0, 4095); Tlc.set(topLed, bright); for(int i = topLed - 1; i >= 0; i--){ bright -= (4096 / tailLen); if(bright < 0) bright = 0; Tlc.set(i, bright); } Tlc.update(); unsigned int delayTime = constrain(fmap(vr2, 0.0, MAXVR, 100, 10), 10, 100); delay(delayTime); } // float fmap(float x, float in_min, float in_max, float out_min, float out_max) { // もともとの「map()」がlong int型でこの用途に合わないので、float型を定義 return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min; }
秋隣
#kigo #jhaiku #haiku #saezuriha (季語は「秋隣」)
晩夏漫歩
千石電商と秋月電子で買い物しようと思い、秋葉原へ行った。
秋葉原UDX下の立体橋のあたりで、向こうから歩いてきた黒ビジネススーツ、まとめ髪にタイトスカートのOLがにわかにこっちへ走り出してきた。
驚いて成り行きを見守っていると、私の横を並んで歩いていた「サラリーマンの普段着風」の男にはっしと抱きつき、「ありがとうー!」と言っている。多分恋人なのだろう。
「来てくれてありがとうー!」
OLさん、人目も憚らず、本当に嬉しそうだ。残りは見も聞きもしなかったが、男も嬉しそうだった。
ちょっと前ならこんな行動はチャラチャラした連中しかしなかったもので、今日のようないずれ劣らぬ大人の男女は街路で抱擁するなど考えられなかったものだ。
文句を言っているのではない。逆だ。日本は平和で自由で、本当にほがらかで楽しい国になったと思うのみである。良いことだ。
さておき、今日秋葉原をうろつくのは、LEDで遊びたいからである。それは、私淑するスタパ齋藤大先生が参加運営しておられる「武蔵野電波」で、Arduinoを使用してLEDをチカチカと光らせまくっているのに多大なる影響を受け、そのマネをするためである。
そもそも、従来スタパ齋藤大先生のマネをするのは極めて困難であった。なんとなれば、デジタルものは、私にとっては高価だからである。スタパ齋藤大先生は数千万円を気絶のうちにつぎ込んでデジタル道を邁進している人なのであって、その求道の姿は到底私ごときにマネできるものではない。
だが、スタパ齋藤大先生のインタレストが電子工作に指向しだしてからは別だ。炭素抵抗を1個買ったところで5円、ICを1個買っても300円とか、「お前は小学生かい!」と言われかねないほどのあさましい額の微々たる支出である。マネをすることは容易だ。
今日はさまざまな色のLEDと、武蔵野電波のサイトで紹介されていたLEDドライブIC、テキサス・インスツルメンツの「TLC5940NT」、電圧発生用の抵抗、工具などを買う。いろいろ買っても1500円とかそんな程度の出費だ。ほんと、花火大会見物に行く小学生に渡す小遣い程度のものである。
秋葉原のメイド通りで冷やし中華の看板が出ていたので食っていく。
ヨドバシで珍しくカメラ売り場へ行き、買い物をした。
上野へ寄って、アメ横で鍔広の中折を求める。夏向きの、麻風の黒いもの。
こんなものを買った。
私には写真の趣味はないので知らなかったのだが、小さいモノの撮影をするにはこういうものを使うべきなのだそうである。これは小さい写真撮影ブースで、1700円ほどのものだ。傘のような仕組みになっており、テントのような形になる。
この中にモノを置いて撮るのである。
で、さっそく今日買ってきたものなどを撮る。
なんだかガラクタをたくさん買ってきているが、まあ、2000円くらいのものである。
今日の大ヒット買い物は、やはりこれだろう。
これも武蔵野電波で紹介されていたもので、ブレッドボード用のジャンプワイヤを加工するためのゲージだ。普段使っているワイヤーストリッパにネジで取り付けて使う。次のような感じだ。
他に、3端子レギュレータなど買い込む。
東芝のTA7805S。50円くらいのもの。なんでこれを買うかと言うと、ArduinoでLチカをやる際、Arduinoはできれば9Vを給電した方が良いが、LEDに9Vをかけると多少無理が大きいので、LEDには別建てで5Vをかけるためである。これで出力側にセラミックコンデンサを付けて平滑化しておけば手軽に5Vに落とせるのだ。
次女が小学生の頃使っていた髪留めを徴発し、これに3ミリのドリルで穴をあけ、LEDを埋め込んで、この3端子レギュレータで光らせてみる。なかなかピカピカしてよい。
ヨドバシのスタインウェイ
最近、秋葉原ヨドバシのスタインウェイ、「調整中」の貼り札が出たまま、人員整理リボンで塞がれてしまい、立ち寄ってもずっと弾けないままだ。
このまま無くなってしまうかも、と思う。
それでも、よしとするか。
よく弾いた。弾きも弾いたり、である。
秋
依然暑いが、ふとした刹那、秋の香り、秋の光と影がそこここに感じられる。
もう暦の上では来週立秋、夕べの月が美しいのも道理である。昨夜も秋の月のようだった。
出かける。
休みだ。秋葉原へ出かける。
熱帯夜
#kigo #jhaiku #haiku #saezuriha
ただのLチカがこれまた
釣りは「へら鮒に始まりへら鮒に終わる」と言うそうだが、「ArduinoはLチカに始まりLチカに終わる」などと誰かが言っていそうで多分誰も言っていない(笑)。
さておき、けっこう楽しいんだよな、Lチカ。
で、なんっか、手持ちのものをいろいろとくっつけたくなるのだ。今日目に入ったのはSeeedstudio SIDEKICK BASIC KITに入っていた青いポテンショメータ。私が少年の頃は「バリオーム」「ボリューム」「可変抵抗」と言ったものだが、今はポテンショメータと言うそうな。
ポテンショメータでLチカのスピードを調整してみよう。
まず、ポテンショメータのスペックシートなどがなくてはっきりしないから、テスターを当てて抵抗を測る。0Ωから10.5kΩまで変化できることがわかった。
このまま直列に+5Vを印加してアナログピンに入力してしまいそうだが、0Ωの時に過電流になってしまうから、10kΩの別の抵抗と直列に入れた方がいいだろう。そうするとポテンショメータを最小に回し切っても0.5mAくらいに抑えられる。
計算はどうなるかというと、こんなようなことになる。
式に代入すれば、ポテンショメータを最大抵抗にしたとき2.44V、最小抵抗にしたとき0Vになることがわかる。
プロトタイピングシールドのブレッドボードは小さくて全部の部品が載らないから、普段使っている普通のブレッドボードにつける。
動かすとこんな感じだ。
スケッチはこんな感じ。
// // vr2speed.ino // ポテンショメータでLチカ制御 // 27.07.26(日)1300~ // 佐藤俊夫 // const unsigned int STARTPIN = 2, ENDPIN = 8, INPUTPIN = 9, VR = 0, DELAYMIN = 5, DELAYMAX = 100; const float V0 = 5.0, // +5V R1 = 10000.0, // アナログピンに入れるための電流制限抵抗10kΩ VRMIN = 0.0, // ポテンショメータの最小抵抗実測値 0Ω VRMAX = 10500.0; // ポテンショメータの最大抵抗実測値 10.5kΩ // void setup() { // 330Ωをカソードにそれぞれ入れてデジタル2~8番にLEDを繋いである。 for(int i = STARTPIN; i <= ENDPIN; i++){ pinMode(i, OUTPUT); } // タクトスイッチは9番に繋いでアースし、内蔵プルアップ抵抗を使っている。 pinMode(INPUTPIN, INPUT_PULLUP); // ポテンショメータは10kΩ抵抗と直列に繋ぎ、間から出力を取っている。 pinMode(VR, INPUT); } void loop() { static int i = STARTPIN, RLdirection = 1, delaytime = DELAYMIN; static unsigned long int prevtime = 0; if(prevtime + delaytime < millis()){ digitalWrite(i, LOW); i += RLdirection; if(i > ENDPIN) i = STARTPIN; if(i < STARTPIN) i = ENDPIN; digitalWrite(i, HIGH); prevtime = millis(); } if(digitalRead(INPUTPIN) == LOW){ delay(500); RLdirection *= -1; } float v1 = (V0 * R1) / (R1 + VRMAX); float vr = analogRead(VR) * (V0 / 1024); delaytime = constrain(fmap(vr, v1, 0.0, DELAYMAX, DELAYMIN), DELAYMIN, DELAYMAX); } float fmap(float x, float in_min, float in_max, float out_min, float out_max) { // もともとの「map()」がlong int型でこの用途に合わないので、float型を定義 return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min; }