リスト1は、1/fゆらぎを生成する関数によって扇風機がオンになるまでの時間とオフにするまでの時間を制御して、1/fゆらぎを扇風機で実現するためのアルゴリズムのコードになります。オンの時間がオフの時間に依存することなく、それぞれ個別の変数を使っています。
ただし、以降のコードの説明ではオンの時間とオフの時間が依存関係にあるアルゴリズムについても提示します。とにかく1/fゆらぎを理論通りにアルゴリズムで実現するのも大切なことですが、要は人が気持ちいいかどうかが最終的な判断基準だと思いますので、読者のみなさんでコードをいろいろといじってみて、自分流の心地良さを探求してください。
なお、リスト1はArduino IDEで開発したコードです。ここからの説明はArduinoでの開発経験が前提になっています。
void setup() { randomSeed(analogRead(0)); } void loop() { int onFan,offFan; onFan = fluct(onFan); delay(onFan*10); digitalWrite(13,1); offFan = fluct(offFan); delay(offFan*10); digitalWrite(13,0); } int fluct(int x) { if (x < 0.5) x = x + 2 * x * x; else x = x - 2 * (1.0 - x) * (1.0 - x); if (x < 0.05 || x > 0.95) x = random(100, 900); return (x); }
1〜4行目はsetup関数でリセットが一度だけ実行される関数です。ここでは0番のアナログ入力値を基に乱数の初期設定をしています。この値が毎回振れると、より良い乱数を取得できます。例えば、このポートからリード線を垂らしておけば、周辺のノイズを拾って良い乱数の種になります。ただこのポートはインピーダンスが高いのでサージなどを拾うとポートが壊れてしまうおそれがありますので、そこは気を付けてください。
6〜15行目はloop関数で、ここに書かれているコードは定期的に繰り返し実行されます。8行目ではこの関数で用いる変数を定義しています。onFanは扇風機をオンにするまでの時間、offFanは扇風機をオフにするまでの時間です。9行目で1/fゆらぎ乱数を求めて、onFanに代入しています。fluctは1/fゆらぎ乱数を生成する関数です。
10行目ではその値を10倍して扇風機をオンにするまでの時間としています。11行目で13番ピンのデジタルピンにソリッドステートリレーがつながっており、digitalWrite(13,1)で1を書き込みますので、ソリッドステートリレーの先につながった扇風機が回転します。12行目からはオフのフェーズです。オフの時間をfluct関数から求めます。13行目でその値に10を掛けた時間待った後、14行目で扇風機を止めます。
17行目からのfluct関数は1/fゆらぎ値を生成する関数です。1つ前のfluct関数が生成した値に依存して次のfluct関数の値を生成します。このプログラムでは50〜950の整数値を生成します。このアルゴリズムの理論的な解説は本稿では割愛しますが、ネット上で検索すればさまざまな知見が得られると思います。
今回は、気持ちよさと不思議をエレクトロニクスで「結んだ」という感覚を持ちました。不思議なことだから気持ちいいのか、そもそも気持ちいいというのはどういうことかを探求する、探求してみたい、などと筆者は思いました。また、そこにエレクトロニクスがどう関わっていけるのか、関心は尽きません。
もう1つ気づいたことは、最終的に動かす扇風機には羽があって質量があって、また回転数によって空気抵抗は変わるだろうし、将来PID制御とは(比例/積分/微分)などにも興味を持ってもらえるきっかけになったとすればうれしいです。
図4が完成形です。筆者の作業台も映りこんでいますね。いつもここで下らないものを作ったり記事を書いたりしています。もし「あれはなんだ」と疑問をお持ちの読者がいらっしゃいましたら、ぜひMONOist編集部までご連絡ください。そのようなきっかけで次の記事ネタになったりすることも多々ありますのでよろしくお願いします。
Copyright © ITmedia, Inc. All Rights Reserved.