« Arduinoはじめました。虹色グラデーションランプ | Main | 足のなまり度チェック »

明るさセンサーの使い方

今日は悲しいお知らせがあります。
せっかく朝早く磨いた、SSのサーリーちゃんがさっそく砂まみれになりました。
久しぶりに自転車で近場を流そうかと思っていましたが、お昼に突如現れた強風と黄色い砂塵にすっかりやる気をそがれました。

Ba8430ba893b11e2bfae22000a9e0782_7

ということで、家に引きこもり、最近は待っているマイコンArduinoをいじりを始めました。

とはいえ、電子工作は相変わらず素人なので、レシピ本"Prototyping Lab"に頼りきりです。
この本はArduinoを使ったプロトタイプを作りながら、アイディアを形にしていくための考え方やヒント、センサーなどの制御方法などが書かれていてとても参考になります。
今日はこの中から、明るさセンサー(CdSセル)を使ったレシピを実現しました。

Dsc_2754_e

レシピに書いてあったProcessingのサンプルソース(プログラムのコード)は、PCとArduinoとの連携に重きを置いていて、表示はグレーの四角いウィンドウだけとちょっとさびしいものでしたので、明るさセンサーから取得した値をグラフに書いてみることにしました。

2

一番上は、センサー値、棒グラフはセンサー値より小さい部分を白い四角に、それ以外は濃いグレーに塗っています。
その下は、センサー値を配列に格納してプロットしています。新しい値が取れたら、一番古い値を配列から削除して、新しい値を配列に追加しながらプロットしているので、ちょっとづつずれていきます。コードはこんな感じです。

import processing.funnel.*;

// Arudino
Arduino arduino;

// 光センサに接続したピン
Pin sensorPin;

// LEDに接続したピン
Pin ledPin;

// 現在のセンサー値
float sensorValue;

// グラフの横幅
final int GRAPH_SIZE = 380;

// センサー値のログ
int logData[] = new int[GRAPH_SIZE];

// 初期化処理
void setup() {
  size(400, 400);
  frameRate(30);
  
  // LEDピンを出力モードに
  Configuration config = Arduino.FIRMATA;
  config.setDigitalPinMode(9, Arduino.PWM);
  arduino = new Arduino(this, config, "COM6");
  
  // 光センサとLEDに接続したピンを初期化
  sensorPin = arduino.analogPin(0);
  ledPin = arduino.digitalPin(9);
  
  // 光センサの値をLED輝度に変換するスケーラをセット
  Scaler scaler = new Scaler(0, 1, 1, 0);
  sensorPin.addFilter(scaler);
}

// 描画処理
void draw() {
  background(100);  //背景塗りつぶし
  
  // 描画色設定
  fill(255, 255, 255);
  noStroke();

  // センサー値を文字で描画
  textSize(16);
  text("Brigthness: ", 10, 20);
  text(1023 * sensorValue, 120, 20);

  // センサー値を棒グラフで描画
  int w = ceil(GRAPH_SIZE * sensorValue);
  for(int i = 10; i < GRAPH_SIZE; i+=10) {
    if(i > w) {
      fill(66, 66, 66);
    }
    rect(i, 40, 8, 20);
  }

  // 配列の要素をひとつ前の要素に移動しながらプロット
  stroke(255);
  for(int i = 0; i < GRAPH_SIZE; i++ ) {
    if(i < (GRAPH_SIZE - 1)) {
      logData[i] = logData[i + 1];
    }
    if(logData[i] > 0) {
      point(i + 10, logData[i]);
    }
  }
  // 最新のプロット位置(Y座標)を配列の最後に格納
  logData[(GRAPH_SIZE - 1)] = 300 - ceil(200 * sensorValue);
}

void change(PinEvent e) {
  // センサピンが変化した場合
  if(e.target == sensorPin) {
    ledPin.value = sensorPin.value;
    sensorValue = 1 - sensorPin.value;
  }
}

|

« Arduinoはじめました。虹色グラデーションランプ | Main | 足のなまり度チェック »

Arduino」カテゴリの記事

Processing」カテゴリの記事

プログラミング」カテゴリの記事

Comments

Post a comment



(Not displayed with comment.)




« Arduinoはじめました。虹色グラデーションランプ | Main | 足のなまり度チェック »