多摩美術大学
衛星芸術PBL 2011年
2011年10月18日




第6回 : 衛星家具をつくる3




                1
本日やること

 前回の捕捉


  リズム


 サーボモーターを使ったデバイス


  モーターの種類


  サーボモーターてバイスの制作




                   2
(前回のコード)主な関数

playBeep()
ビープ音をならす関数  ピッ

playBeep( 周波数 );
引数は周波数




delay()
次の処理までの待ち時間

delay( milliseconds );

引数はミリセカンド (1/1000秒)


                         3
フィードデータを使う


int feedNum = 1;



draw関数内
freq = map( dataVlue, 0, 12.5 , 0, 22000 );




onReceiveEEML関数内
dataValue = d.getValue( feedNum );




                                              4
フィードデータを使って音の間隔に

ビープ音の間隔にデータを使う



draw関数内
delay( dataValue * 100 );       delayに100倍したセンサーの値を代入




間隔を変えてリズムを作ってみる



                            5
サーボモーターデバイス

本日パーツリスト


・Arduinoボード  1
・サーボモーター  1
・ジャンパー線  3本
・ボレッドボード  1
・USBケーブル  1




                 6
モーターの種類

DCモーター           ACモーター




電流を流すと回転する




             7
モーターの種類

ステッピングモーター




極に順番に電流を流して回転させる(ステップ)
位置を決めるのに便利



                8
モーターの種類

サーボモーター




パルスによって角度を決める
決まった角度を出したい時に便利



                  9
モーターの角調節
5V

0V


      幅 20m秒が一般的


PWMの5Vの山(HIGH)になっている幅で角度を調節する。
右端から左端までの角度とメーカーや種類によって違うので確認が必要




                   10
今日の回路

GND 5V 信号(Arduino PWMへ)




                          11
Arduinoのプログラム
本日使うArduinoスケッチ   ServoFirmata




                  12
本日のProcessingプログラム
以下からソースコードをダウンロード
ARTSAT_Pachube_Example_Servo.pde


   import processing.serial.*;
   import cc.arduino.*;
   import eeml.*;


   DataIn dataIn;
   Arduino arduino;
   int servoPin = 10; // Control pin for servo motor


   int feedId = 12467; //ARTSAAT_PRISM feed ID
   int feedNum = 18; //Temperature Sensor of minus Y panel


   String feedURL = "http://www.pachube.com/api/feeds/";
   String apiKey = "API KEY";
   float dataValue;


次のページにつづく


                                            13
void setup(){
           background(255);
           size(200, 200);
           arduino = new Arduino(this, Arduino.list()[0], 115200);
           arduino.pinMode(servoPin, Arduino.OUTPUT);
           dataIn = new DataIn(this,feedURL + feedId + ".xml", apiKey ,10000);
     }




     void draw(){
         float servoAngle;
         servoAngle = map( feedNum ,-58.0, 35.5, 0, 180 );
         arduino.analogWrite(servoPin, int(servoAngle) ); //send servo angle to Arduino
     }




     void onReceiveEEML(DataIn d){
         if (dataIn == d) {
                dataValue = d.getValue( feedNum );
                println ("feed 12467 Now Temperature Sensor of minus Y panel : " +   dataValue
                                                                             + " Celsius (°C)");
            }
     }



以上




                                                     14
Processingでのサーボ調節


arduino.analogWrite( servoPin, angle );
前回と同様に analogWrite()によってPWM制御


引数1
ArduinoのPWMピン 今回は10

引数2
角度 0 ~ 180




                       15
map()

map()
スケーリングをする



map( feedNum ,-58.0, 35.5, 0, 180 )

使うセンサーの値の最小値/最大値の比率を
角度にスケーリング 0 180度




                                      16
データXMLを見てみる
Pachube apiにリクエストしてXMLを取得

https://api.pachube.com/v2/feeds/12467

時間、単位、最大値/最小値などの情報が手に入る

<data id="18">
<tag>Temperature Sensor of minus Y panel</tag>
<current_value at="2011-10-17T06:24:56.063493Z">-31.4</current_value>
<max_value>35.5</max_value>
<min_value>-58.0</min_value>
<unit type="derivedSI" symbol="">Celsius (°C)</unit>
</data>




                                       17
int()

int()
数値をintに型変換する



int(servoAngle)

servoAngle がfloat(浮動小数点)数値なのでint型に直してあげる




                      18
おつかれさまでした。

質問等は森まで




             19

衛星芸術Pbl 2011 10_18