このチュートリアルは武蔵野美術大学通信教育課程授業用に作成したものです。
今回は授業課題のイメージを掴むために具体的なサンプルを挙げ、ステップバイステップでプログラミングしてゆきます。
前回の続きです。デバイス構成はある程度固まってきたので、いくつかのチューニングをしてゆきます。以下は前回のコードです。
#include <Servo.h> Servo myservo; // create servo object to control a servo int potpin = A0; // analog pin used to connect the potentiometer int val; // variable to read the value from the analog pin void setup() { myservo.attach(9); // attaches the servo on pin 9 to the servo object } void loop() { val = analogRead(potpin); // reads the value of the potentiometer (value between 0 and 1023) val = map(val, 0, 1023, 0, 180); // scale it for use with the servo (value between 0 and 180) myservo.write(val); // sets the servo position according to the scaled value delay(15); // waits for the servo to get there }
光センサーを扱うときは個体差や環境に合わせて値を調整してあげる必要がありますので、こちらを参考にし、光センサーの値の範囲を確認しておきます。今回もconstrain関数を用いてチューニングしてゆきます。
#include <Servo.h> Servo myservo; const int analogInPin = A0; int sensorValue = 0; int outputValue = 0; void setup() { Serial.begin(9600); myservo.attach(9); } void loop() { sensorValue = analogRead(analogInPin); sensorValue = constrain(sensorValue,200,760); outputValue = map(sensorValue, 200, 760, 0, 170); myservo.write(outputValue); Serial.print("sensor = "); Serial.print(sensorValue); Serial.print("\t output = "); Serial.println(outputValue); delay(15); }
変数名を調整し、CDSセル(analogInPin)の値をsensorValueに格納、constrain関数で値の調整を行い、map関数でサーボモータの有効範囲に収めてmyservo.writeで出力しています。
サーボは180度まで動きますが、手持ちのサーボが180度指定だとふらつく感じがしたので170度までにマッピングしました。
こちらが挙動になります。Serial.printで値を確認しながら調整出来るようになりました。また、光を強く当てたり、当てなかったときのサーボがプルプルとふらつくことがなくなりました。
ここまでできたら造作に合わせて値をチューニングしてゆけそうですね。造作を待ちながら、CDSセルセンサーをケーブル延長したり、回路の最終化を行ってゆけそうです。
機構プロトタイプ
3Dプリントを使って糸を引っ張る構造を作りました。これで、サーボモータが回転すると糸を引っ張りオブジェクトが上下運動するという構造をテスト出来ます。
構成は上記のような形で、サーボモータにテグスをつなげ、アクリルパイプを通って3Dプリントオブジェクトにつながっています。間にバネを置くことで、糸を引いてないときにはバネの力で突っ張る挙動になる形です。
プログラムを実行してみた様子です。光を近づけるとバネが伸縮しているのがわかります。このプログラムで最低限のインタラクションは完成です。機構や形状の造作を詰めて作品を完成させることが出来そうです
他にも、光の段階でサーボの動きを変えたり、光のフェードが出来るじょうろデバイスを追加で作ったり、いろいろなブラッシュアップが出来るかもしれません。