距離センサ(Arduino) x openFrameworks

#テスト制作物
距離センサを用い，近いほど円が小さくなるプロジェクト．

![ダウンロード.gif](https://qiita-image-store.s3.amazonaws.com/0/184790/188df54a-36d6-c9c8-055d-1d48c5f57fc2.gif)

#実行環境
- maxOS Sierra 10.12.6
- openFrameworks 0.9.8
- Arduino 1.8.5

#基盤のセットアップ
距離センサはシャープ測距モジュール　ＧＰ２Ｙ０Ａ２１ＹＫを使用します．
画像のように左から5V（赤）,GND（黒）,A0（黄）に距離センサの配線を繋げます． 
![50176.jpg](https://qiita-image-store.s3.amazonaws.com/0/184790/f72d3298-29e2-9a45-c1db-690d536c4ca7.jpeg)

これでもよくわかんないよって方はデータシートをみてください
->http://akizukidenshi.com/download/ds/sharp/gp2y0a21yk_e.pdf



#Arduinoのセットアップ

1. スケッチ例の中のStandardFirmataを使用していきます．
<img width="892" alt="スクリーンショット 2018-07-05 0.38.20.png" src="https://qiita-image-store.s3.amazonaws.com/0/184790/eb75890e-bb1d-6d7f-1c6f-75d0d742f7ce.png">　　
　　
2. 自分はbpsを9600にしました．　またこれに応じてシリアルモニタ（shift＋cmd+mで出ます）のbpsも9600にしています．
<img width="869" alt="スクリーンショット 2018-07-05 0.40.23.png" src="https://qiita-image-store.s3.amazonaws.com/0/184790/3b08ab96-5763-4ee1-a9ad-a49233972b64.png">

*注意：ボードに書き込む際などはシリアルポートの選択ミスが内容にしてください

今回，僕はArduinoUnoを使用しているのでこの画像のようになっています．
<img width="1184" alt="スクリーンショット 2018-07-05 0.47.20.png" src="https://qiita-image-store.s3.amazonaws.com/0/184790/aa1bda89-cfda-cef2-9e21-e59aa45dbe32.png">

#oF側のコード

```ofApp.h
#pragma once

#include "ofMain.h"

class ofApp : public ofBaseApp{
    public:
    void setup();
    void update();
    void draw();
    void setupArduino(const int & version);
    void analogPinChanged(const int & pinNum);

    ofArduino ard;
    float ardValue;
    bool bSetupArduino;
};
```
  
```ofApp.cpp
#include "ofApp.h"
#define SPEED 9600

//--------------------------------------------------------------
void ofApp::setup(){
    ofBackground(0);
    ofSetFrameRate(60);
    ard.connect("/dev/cu.usbmodem14131", SPEED);
    ofSetCircleResolution(64);
}
//--------------------------------------------------------------
void ofApp::update(){
    if ( ard.isArduinoReady()){
        if (bSetupArduino == false){// only do this once
            bSetupArduino = true;
            ofAddListener(ard.EInitialized, this, &ofApp::setupArduino);//add eventFunc
            ofAddListener(ard.EAnalogPinChanged, this, &ofApp::analogPinChanged);
        }
        ard.update();
    }else{
        cout << "not conect" <<endl;
    }
}

//--------------------------------------------------------------
void ofApp::draw(){
    ofDrawCircle(ofGetWidth()/2, ofGetHeight()/2,
                 ardValue/2.0);
    ofDrawBitmapString(ofToString(ardValue), 20, 30);
}

//--------------------------------------------------------------
void ofApp::setupArduino(const int & version) {
    ofRemoveListener(ard.EInitialized, this, &ofApp::setupArduino);
    ard.sendAnalogPinReporting(0, ARD_ON);
    //when data is changed
    ofAddListener(ard.EAnalogPinChanged, this, &ofApp::analogPinChanged);
}

//--------------------------------------------------------------
void ofApp::analogPinChanged(const int & pinNum) {
    ardValue = ard.getAnalog(pinNum);
}


```


- ard.connect("/dev/cu.usbmodem14131", SPEED); 
Arduinoエディタで選択したシリアルポートを記入してください．Macなら/dev/~でwinならCOM~になると思います．
　　

- ofAddListener　　
setupArduinoは一回呼ばれ，analogPinChangedはpinに入力された値が変わるたびに呼ばれるって感じです．

#補足：デジタルピン，アナログピン
それぞれの使い分けについて少し書いておきたいと思います．
1.デジタルピン
●説明
指定したピンに対して0Vか5Vに設定（出力）または、指定したピンが0Vなのか5Vなのかを判断するときに使用します.
Arduinoにおいては、0VはLOW 、5VはHIGHとして指定します。
●どんな時に使用するのか
digitalWriteはピンに接続されたLEDを点灯させたり消灯させたり、外部機器に信号を送る場合に使用します。
digitalReadはピンに接続されたスイッチの状態や外部の機器からの信号を読むときに使用します。


2.Analog
●説明
A0,A1,,,などのように表記されています．
ArduinoにおけるAnalogは、ほとんど入力として使用されることが多いのです．
現在のボードが5Vで動作しているときに、0V～5Vのが変化するセンサーを取り付けた場合、0～5Vを0～1023の数字に変換して入力することが可能です。
●どんな時に使用するのか
光を検知するセンサーや音を検知するセンサー、そしてデジタルの温度計など、ほとんどのセンシング部品は、部品そのものからの値を電圧で返してきます。

#参考URL
http://daisuki-arduino.com/arduino-pin/
http://akizukidenshi.com/catalog/g/gI-02551/
http://takepepe.com/openframeworks-x-arduino-001-2/