午後、ピアノの稽古。ノクターンに、いい具合の晴れ時々曇りにもかかわらずショパンの「雨だれ」。
しかし、もうダメってくらいダメ。……ピアノ強化期間でも設定しようかしらん。……いや、でもしんどいからやめとこ。
……下手糞、ったって、もともと下手糞どころか、素人のチョット出くらいのモンなんですけどね。
オッサンは生きている。
午後、ピアノの稽古。ノクターンに、いい具合の晴れ時々曇りにもかかわらずショパンの「雨だれ」。
しかし、もうダメってくらいダメ。……ピアノ強化期間でも設定しようかしらん。……いや、でもしんどいからやめとこ。
……下手糞、ったって、もともと下手糞どころか、素人のチョット出くらいのモンなんですけどね。
去年までの9年間と言うもの、毎日朝5時半から6時までの30分間、ピアノの稽古を欠かすことがなかったが、この1年は多忙でもあって、そういう気になれず、だんだん稽古しなくなった。
しかし、週に1度、金曜日の夜などに秋葉原ヨドバシの6階にあったスタインウェイを弾きに行くのが楽しみの一つになり、それに通っている間はまだ腕前があまり落ちなかった。
しかし、ヨドバシのスタインウェイは昨年の夏ごろから弾けなくなり、そうこうするうち撤去されてしまった。
それから、週に一度の稽古も手につかなくなった。
今日は朝から少し稽古してみた。腕前の低下は顕著だ。
それでもショパンのノクターンはまだ弾ける。ところが、「雨だれ」の最後のほうがダメになってきた。「覚え弾き」なので、楽譜を見てもいまいち素早く復活しない。
晴れてるけど「雨だれ」弾く。
それから、ノクターン弾いて、エリーゼ弾いて、ジムノペディ弾く。ジムノペディ、終わりのほう弾けなくなっている。久しぶりに楽譜を見る。
いやもう、「オッサンとバイエル、ピアノ等」って銘打ってて、長らくなかったこのネタ。ええ、ピアノですよ、ピアノ。
……すなわちコレである。Arduinoをピアノにつなぎ、LEDをピアノ演奏に合わせて明滅させようというものだ。
いまや遅しとやってみた。
一つ覚えみたいにノクターンで申し訳ないですが(笑)、すんませんレパートリーがあんまりないもんで。
アナログピンからピアノの音声出力を読み、それに合わせてTLC5940NTに接続されたLEDを適宜明滅させるわけである。いかにもピアノ風味に明滅させるにあたっては、乱数によるLED選択と、先日会得した「PWMを十分に使い、余韻をもって各LEDを徐々に消す」という技を遺憾なく使用した。
これをやるには、アナログピンに上手に音声を入れる必要がある。
こういう時、電圧レベルを知るのにオシロスコープなどが使えればいいのだが、残念ながら持っていない。そこで、あらかじめテスターのACでテレビ、ラジオ、自分のピアノなどの音声出力端子からだいたいのレベルを推定し、次に十分な抵抗を入れて、Arduinoのアナログピンに入力して読み取った。その結果、だいたい200mVの振幅程度であることがわかった。これならばArduinoに直接入れてもどうということはなさそうだ。ただし、レベルが小さいから、ソフトウェアのほうでうまくやる必要がある。
次に、音声はアナログ信号だから、プラス・マイナスに振れる。一方、Arduinoのアナログ入力は0~5Vの間を1024分割で読むのだから、ここをうまく工夫しなければならない。
まず、2.5Vを中心に電圧が振れるよう、2.5Vを生成して合成する。ちょうどTLC5940NTを動かすために5Vの3端子レギュレータを使っているので、ここから抵抗分圧で2.5Vを作り、それを合成する。合成するとき、出力側の音声端子に電流が流れ込んではまずいから、コンデンサを0.1μFばかりつける。周波数は見当がつくが、電圧の見当がつきにくいので、とりあえず0.1μFにして、出来が悪いようなら取り換えることにする。
まず、大して疑問もない簡素な付加回路。たしか、パルス技術ではこういうの、「クランパ」って言ったっけな……。
それで、TLCなどと一緒にLEDを植え込む。
ミニジャックを接続するために、秋月電子の「ステレオミニジャックDIP化キット」を取り付けた。
で、スケッチはこうなった。
// // voice2tlc.ino // アナログピンに音声を入れ、TLC5940NTを使ってLEDを光らせる。 // 27.08.13(木)1000~ // 佐藤俊夫 // #include "Tlc5940.h" #include <stdio.h> // const int AUDIO = 0, // アナログ0ピン THRESH = 8; // 8単位以上のレベルならLEDを点灯 // void setup() { Tlc.init(); Tlc.clear(); Tlc.update(); } void loop() { int v = 0, l = 0; static long int prevtime = 0.0; static int prevv = 0; v = abs(analogRead(AUDIO) - 512); l = constrain(fmap(v, 0, 15, 0, 4095), 0, 4095); if(millis() >= prevtime + 10){ prevtime = millis(); for(int i = 0; i <= 15; i++){ Tlc.set(i, Tlc.get(i) * 0.9); } } for(int i = 0; i <= 15; i++){ if(random(0, 16) == 1 && prevv != v && v >= THRESH){ Tlc.set(i, l); } } Tlc.update(); prevv = v; } // 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; }
帰宅。
今日は日本ITストラテジスト協会関東支部の月例会があったが、仕事と用事が重なり、行けなかった。今回の月例会のテーマ別ディスカッションもぜひ聞きたいと思っていた内容だったので、残念である。人生、なかなか、こうしたいああしたい、と、思ったようには運ばぬものだ。
忙中有閑。仕事は朝に引けたから、帰りに秋葉原へ寄り、挨拶がわりにヨドバシのスタインウェイをちょっと弾く。
いつものショパン3曲弾くなど。
千石電商と秋月電子で少し買い物をする。2000円ほども使えばたっぷり楽しめる。我ながらなんとささやかなこと。
今回買ったもののうちでも、出色の傑作は、このたった250円の小さなキットだろう。
これは、TTL5VでAC100Vを扱うためのリレーなのだが、昔のリレーとは違って、機械電磁式ではなく、電子式の無接点で、部品点数も極めて少ない。しかも100Vで25Aも流せる。これは、この方のブログ記事で見て知ったのである。
それから、もうひとつはこれだろう。Arduinoのシールド基盤に小さなブレッドボードを載せることができるもの。
帰宅してみると、先週作った「メールサーバお知らせランプ」、赤い点滅で、100通以上の未読がある。
電子メールを読み出すと、動画のように緑色の点灯に変わる。
さて、一週間、誤動作なく動いていた「メールサーバお知らせランプ」だが、さっさと回路をバラしてしまい、次の作品を作ることにする。
秋葉原で買ってきたものを取り出し、半田鏝を温めて、なにやらごそごそと活動する。
このちっぽけな基盤がAC100VをTTLで扱うためのキモである。
これを、Arduinoにつなぐ。先日買った超音波センサを、今日買ったブレッドボードシールドに取り付け、回路はこんな具合にする。
スケッチを書く。こんな感じだ。
// // superSonic2AC100.ino // 27.06.21(日) 1500~ // SatoToshio // Arduino + 超音波センサ + ソリッドステートリレーで、 // 人が近接したら扇風機などを回す。 // const int TRIG = 8, ECHO = 9, SSR = 10; float ranges[10]; int arrcount = 0; const float THRESHOLDRNAGE = 100.0; void setup() { Serial.begin(9600); pinMode(TRIG,OUTPUT); pinMode(ECHO,INPUT); pinMode(SSR, OUTPUT); digitalWrite(SSR, LOW); } void loop() { float range = 0.0; delay(1000); range = ranging(); ranges[arrcount++] = range; if(arrcount >= 9){ arrcount = 0; } // THRESHOLDRANGE以下が何割かを調べる。雑音除去のため。 int rangecount = 0, i = 0; for(i = 0; i <= 9; i++){ if(ranges[i] < THRESHOLDRNAGE){ rangecount ++; } } Serial.println(range); Serial.println(rangecount); if(rangecount >= 6){ digitalWrite(SSR, HIGH); }else{ digitalWrite(SSR, LOW); } } float ranging(){ float time = 0.0, range = 0.0; digitalWrite(TRIG,LOW); delayMicroseconds(1.1); digitalWrite(TRIG,HIGH); delayMicroseconds(1.1); digitalWrite(TRIG,LOW); time = pulseIn(ECHO,HIGH); if (time > 0.0) { range = (time / 2.0) * 340.0 * 100.0 / 1000000.0; if(range > 500.0){ range = 500.0; } return(range); }else{ return(9999.0); } }
で、これで何をするかというと、「人が近づくと部屋のミニ扇風機が回る」というのをやりたかったわけだ。暑いから(笑)。
組み付けたプロトはこんな感じだ。100円ショップで買ったアクリルの仕切りグッズにスペーサーで取り付けてある。
自分の部屋に入ると、扇風機が回り出し、涼しい。
まるでアホの一つ覚えで恐縮だが、心機一転ブログ、WordPress設置記念演奏で、飽きもせずノクターンである。
やっぱり、「オッサンとバイエル、ピアノ等」と看板上げるからには、どうあっても演奏データがないと、ねえ。
先週の木曜日、いつものとおり朝のピアノ稽古をしていたら、前回のよりかはいくらかよくなった演奏が出来たので、録音を残した。