goo blog サービス終了のお知らせ 

下手の横好きのスクラップブック!!

下手の横好きの、いろいろな記録です。
電子工作・PIC・Arduino・太陽光発電・写真などetc

心拍センサー(パルスセンサー)のテスト(3)

2013-10-09 | Arduino

SparkFun製パルスセンサーSEN-11574のテスト2回目
メーカーホームページからArduino用のサンプルスケッチをダウンロードしてテストしてみました。

ダウンロードしたスケッチ
/*
>> Pulse Sensor Amped 1.1 <<
This code is for Pulse Sensor Amped by Joel Murphy and Yury Gitman
    www.pulsesensor.com
    >>> Pulse Sensor purple wire goes to Analog Pin 0 <<<
Pulse Sensor sample aquisition and processing happens in the background via Timer 2 interrupt. 2mS sample rate.
PWM on pins 3 and 11 will not work when using this code, because we are using Timer 2!
The following variables are automatically updated:
Signal :    int that holds the analog signal data straight from the sensor. updated every 2mS.
IBI  :      int that holds the time interval between beats. 2mS resolution.
BPM  :      int that holds the heart rate value, derived every beat, from averaging previous 10 IBI values.
QS  :       boolean that is made true whenever Pulse is found and BPM is updated. User must reset.
Pulse :     boolean that is true when a heartbeat is sensed then false in time with pin13 LED going out.

 

This code is designed with output serial data to Processing sketch "PulseSensorAmped_Processing-xx"
The Processing sketch is a simple data visualizer.
All the work to find the heartbeat and determine the heartrate happens in the code below.
Pin 13 LED will blink with heartbeat.
If you want to use pin 13 for something else, adjust the interrupt handler
It will also fade an LED on pin fadePin with every beat. Put an LED and series resistor from fadePin to GND.
Check here for detailed code walkthrough:
http://pulsesensor.myshopify.com/pages/pulse-sensor-amped-arduino-v1dot1

 

Code Version 02 by Joel Murphy & Yury Gitman  Fall 2012
This update changes the HRV variable name to IBI, which stands for Inter-Beat Interval, for clarity.
Switched the interrupt to Timer2.  500Hz sample rate, 2mS resolution IBI value.
Fade LED pin moved to pin 5 (use of Timer2 disables PWM on pins 3 & 11).
Tidied up inefficiencies since the last version.
*/
//  VARIABLES
int pulsePin = 0;                 // Pulse Sensor purple wire connected to analog pin 0
int blinkPin = 13;                // pin to blink led at each beat
int fadePin = 5;                  // pin to do fancy classy fading blink at each beat
int fadeRate = 0;                 // used to fade LED on with PWM on fadePin// these variables are volatile because they are used during the interrupt service routine!
volatile int BPM;                   // used to hold the pulse rate
volatile int Signal;                // holds the incoming raw data
volatile int IBI = 600;             // holds the time between beats, the Inter-Beat Interval
volatile boolean Pulse = false;     // true when pulse wave is high, false when it's low
volatile boolean QS = false;        // becomes true when Arduoino finds a beat.void setup(){
  pinMode(blinkPin,OUTPUT);         // pin that will blink to your heartbeat!
  pinMode(fadePin,OUTPUT);          // pin that will fade to your heartbeat!
  Serial.begin(115200);             // we agree to talk fast!
  interruptSetup();                 // sets up to read Pulse Sensor signal every 2mS
   // UN-COMMENT THE NEXT LINE IF YOU ARE POWERING The Pulse Sensor AT LOW VOLTAGE,
   // AND APPLY THAT VOLTAGE TO THE A-REF PIN
   //analogReference(EXTERNAL);  

}void loop(){
  sendDataToProcessing('S', Signal);     // send Processing the raw Pulse Sensor data
  if (QS == true){                       // Quantified Self flag is true when arduino finds a heartbeat
        fadeRate = 255;                  // Set 'fadeRate' Variable to 255 to fade LED with pulse
        sendDataToProcessing('B',BPM);   // send heart rate with a 'B' prefix
        sendDataToProcessing('Q',IBI);   // send time between beats with a 'Q' prefix
        QS = false;                      // reset the Quantified Self flag for next time   
     }
 
  ledFadeToBeat();
 
  delay(20);                             //  take a break
}

 

void ledFadeToBeat(){
    fadeRate -= 15;                         //  set LED fade value
    fadeRate = constrain(fadeRate,0,255);   //  keep LED fade value from going into negative numbers!
    analogWrite(fadePin,fadeRate);          //  fade LED
  }

 

void sendDataToProcessing(char symbol, int data ){
    Serial.print(symbol);                // symbol prefix tells Processing what type of data is coming
    Serial.println(data);                // the data to send culminating in a carriage return
  }

配線

テスト状況

心拍に応じてLEDが点滅するようになります。

 

コメント (2)
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

Arduino で照度計を作る(3)

2013-10-05 | Arduino

製作した照度計を太陽光の明るさを計測できるように改造してみました。
太陽光の明るさは、30,000lx~100,000lxと非常に明るく、そのままでは計測できないので試行錯誤を繰り返しながら改造しております。

○製作した照度計を光を完全に遮断できるプラボックスにいれる。
○S9705の受光部にあたる部分に丸く穴をあける。
○丸い穴の部分に減光用のフィルターつける。
○フィルターはNDフィルターが理想ですが、今回はアクリル板を使いました。(白のアクリル板 暑さ0.5mm × 2枚)

実際に測定した値をエクセルにインポートして、折れ線グラフに表示
午前中は晴れ時々曇り、午後は曇りのち雨の、日の出から日没までの測定結果です。
(約2秒間隔で測定。 Luxは目安の値です。)

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

Arduinoで照度計を作る(2)

2013-09-30 | Arduino

前回で照度の測定データを、シリアルモニタおよびLCDで確認できました。
続けて、測定データをマイクロSDカードに保存することにします。
sparkfun.comの「マイクロSDシールド」を使うことにします。

配線

ブレッドボードでテスト


シールドの作成

グラフ作成
SDカードに保存されたデータをエクセルにインポートしてグラフを作成してみました。

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

Arduino で照度計を作る(1)

2013-09-28 | Arduino

Arduinoで照度計が作れないかと調べてみると、照度を周波数に変換するフォトIC「S9705」があることが解りました。
しかも、秋月電子で2個入りで¥400で販売されていましたので、早速照度計にチャレンジしてみました。

照度-周波数変換フォトIC S9705 (浜松ホトニクス株式会社製)
S9705は、入射光の強度に比例して発信周波数が変化する矩形波(デューティー比50%)が出力されます。
この矩形波をArduinoでカウントし照度(Lux)に変換します。

S9705の分好感度特性と出力周波数-照度(データシートより)




今回参考にしたページ
簡易照度計V2(S9705)
S9705 照度-周波数変換フォトICを使った照度計

S9705の出力測定
S9705は、約5mm角程の小さいものなので基板にとりた後、ブレッドボードで仮配線して出力周波数、波形等を計測してみました。
      

ブレッドボードで仮配線


S9705の出力波形

 照度が低い時の出力波形      照度が高くなった時の出力波形

   

Arduinoと接続
光の強度に応じて、矩形波の周波数が変化することが確認できましたので、Arduinoに接続します。

スケッチ
Arduino でS9705 の出力をカウントするためには、周波数カウンタのライブラリが必要になります。
Arduino Frequency Counter Library Down load >FreqCounter Libraryからライブラリがダウンロードできますので、それをダウンロードした後、Arduino IDE の libraries フォルダにコピーをしておきます。
また、出力された周波数から照度に変換するには、簡易的に「出力周波数/500 」で変換できるようですのでそれを採用します。

//Illminometer
#include <SD.h>
#include <FreqCounter.h>

long int frq;
long n;

void setup(){
Serial.begin(9600);
Serial.println("Frequency Counter");

if(!SD.begin(8)){
   Serial.println("Card failed,or not present");
  n = 0;
   }else{
     Serial.println("Card initialized.");
}
}

void loop ()
{
  FreqCounter::f_comp = 8;             // Set compensation to 12
  FreqCounter::start(1000);            // Start counting with gatetime of 1000ms
  while (FreqCounter::f_ready == 0);  // wait until counter ready
  frq = FreqCounter::f_freq;            // read result
   n=n+1;
 Serial.print(n);
 Serial.print(",");
 Serial.print(frq);              
 Serial.print(",");             
 Serial.println(frq/500);   // S9705 100Lux=50KHz

File dataFile = SD.open("datalog.txt", FILE_WRITE);
if (dataFile) {

dataFile.print(n);
dataFile.print(",");
dataFile.print(frq);
dataFile.print(",");
dataFile.println(frq/500);
dataFile.close();
 delay(981.7);
}
else{
  Serial.print("error opening datalog txt");
 
}
}

 

シリアルモニタとLCDで測定値を表示
スケッチは掲載しておりませんが、最初に測定した周波数と照度の値をシリアルモニターとLCDで確認した見ました。
シリアルモニタ出力


LCDに出力して確認

測定値と照度計の比較

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

心拍センサー(パルスセンサー)のテスト(2)

2013-03-08 | Arduino

SparkFun製のパルスセンサーSEN-11574をテストしてみた。
Arduino等に簡単に接続できるようにセンサーとして完成されたもので、24インチ(約60cm)のリード線も取り付け済みです。

センサー部外観

   

センサー部電源ON時外観

  
5Vの電源を供給しセンサー部分を指先か耳たぶに付けると、脈拍に応じたパルス信号が出力されます。

センサー内部配線と接続


前回テストしたRPR-220を使用したセンサーよりは、センサーの装着が楽にできデータ収集も容易にできそうです。

出力信号波形

ArduinoとProcessingのサンプルコードもメーカーホームページからダウンロードできるようです。

コメント (3)
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

心拍センサー(パルスセンサー)のテスト(1)

2013-03-06 | Arduino

Arduino対応の心拍センサーシールドの記事発見!!
キットが販売されており、比較的組立しやすい印象でしたが、あいにくキットは品切れ。
よく見ると手持ちの部品でも対応できそうなので、ブレッドボードで配線しテストしてみました。
配線は下記のとおりで、反射型フォトセンサー「RPR-220」を利用したものです。

配線図

「RPR-220」は比較的価格も安く各パーツショップでも購入できる一般的なものです。
発光部の赤外線LEDと受光部のフォトトランジスタからなり、赤外線LEDから発光された赤外線は、近くの物体で反射しフォトトランジスタで受光されます。

赤外線は肉眼では確認できませんが、携帯電話のカメラ機能を使うと発行を確認できます。(できない機種もあるようです)

携帯電話で赤外線LEDの発光部を撮影した様子
(RPR-220の発光部が薄いピンク色に映っています)


心拍センサーとして使う場合は、フォトセンサーの上に人差し指の腹側を軽く当てると、LEDが脈拍に合わせて点滅します。
ただし、この指の当て方が微妙で、強く押し付けてもダメ、弱すぎてもダメで安定するまで要領があるようです。

心拍測定中

Arduinoへの対応はこれからですが、ノイズ除去のサンプルコード等がダウンロードできるようになっており、詳しく説明されていますので参考になるとおもいます。

測定波形

測定が安定していない状態

測定が安定した状態

横軸 1目盛り1sec 全体で10sec 約9.5パルス

1min = 9.5 * 6 
        =57 (脈拍57程度)


 

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

1-Wire温度センサーDS18B20で気温を計測する

2013-01-11 | Arduino

DS18B20は、1本のライン(バスとGNDで2本)に複数のセンサーを接続して温度を計測することが可能です。

    

主な特徴は
 データ線から電源を供給できる。
 温度測定範囲 -55℃~+125℃
 -10°~+125℃で±0.5℃の精度
 個々のデバイスにシリアル番号があり同一バス上に複数個のデバイスが接続できる。
 電源 3.0V~5.5V
  センサーの距離を大幅に伸ばすことが出来る。

DS18B20のマニュアルは「DS18B20 日本語マニュアル」を参考にさせて頂きました。

DS18B20をArduinoで使うためには、ライブラリが必要となります。
入手先は「http://www.pjrc.com/teensy/td_libs_OneWire.html」で、「Download: OneWire.zip (Version 2.1)」をクリックしてダウンロードします。
ZIPファイルを解凍すると、OneWireファイルが作成されますので、それをArduino1.0.1のlibrariesにコピーします。

DS18B20は複数のデバイスを接続可能ですが、今回は2個使用します。(手持ちが2個しかないので)

回路図

   

スケッチはダウンロードしたライブラリーの中の「example]に 「DS18x20_Temperature」が用意されておりますのでそれを利用します。
このスケッチはシリアルモニターで計測値を観測するようになっておりますが、LCDにも表示するように若干修正を加えました。
なお、このスケッチでは、マイナス温度が異常値が表示されますので0℃~125℃の範囲での利用になります。
マイナス温度も測定範囲に加えたい場合は「こちら」が参考になると思います。
また、LCDの表示はデバイスそれぞれの値が交互に表示されます

シリアルモニターの表示
上側がデバイス1
下側がデバイス2

スケッチ

 

#include <OneWire.h>
#include <LiquidCrystal.h>
// OneWire DS18S20, DS18B20, DS1822 Temperature Example
//
// http://www.pjrc.com/teensy/td_libs_OneWire.html
//
// The DallasTemperature library can do all this work for you!
// http://milesburton.com/Dallas_Temperature_Control_Library

 

OneWire  ds(9);  // on pin 9
LiquidCrystal lcd(2,3,8,5,6,7);

 

void setup(void) {
  Serial.begin(9600);
  lcd.begin(16,2);
  lcd.clear();
}

 

void loop(void) {
  byte i;
  byte present = 0;
  byte type_s;
  byte data[12];
  byte addr[8];
  float celsius, fahrenheit;
 
  if ( !ds.search(addr)) {
    Serial.println("No more addresses.");
    Serial.println();
    ds.reset_search();
    delay(250);
    return;
  }
 
  Serial.print("ROM =");
  for( i = 0; i < 8; i++) {
    Serial.write(' ');
    Serial.print(addr[i], HEX);
  }

 

  if (OneWire::crc8(addr, 7) != addr[7]) {
      Serial.println("CRC is not valid!");
      return;
  }
  Serial.println();
 
  // the first ROM byte indicates which chip
  switch (addr[0]) {
    case 0x10:
      Serial.println("  Chip = DS18S20");  // or old DS1820
      type_s = 1;
      break;
    case 0x28:
      Serial.println("  Chip = DS18B20");
      type_s = 0;
      break;
    case 0x22:
      Serial.println("  Chip = DS1822");
      type_s = 0;
      break;
    default:
      Serial.println("Device is not a DS18x20 family device.");
      return;
  }

 

  ds.reset();
  ds.select(addr);
  ds.write(0x44,1);         // start conversion, with parasite power on at the end

 

  delay(1000);     // maybe 750ms is enough, maybe not

 

  // we might do a ds.depower() here, but the reset will take care of it.
 
  present = ds.reset();
  ds.select(addr);   
  ds.write(0xBE);         // Read Scratchpad

 

  Serial.print("  Data = ");
  Serial.print(present,HEX);
  Serial.print(" ");
  for ( i = 0; i < 9; i++) {       // we need 9 bytes
 
    data[i] = ds.read();
    Serial.print(data[i], HEX);
    Serial.print(" ");
  
  }
  Serial.print(" CRC=");
  Serial.print(OneWire::crc8(data, 8), HEX);
  Serial.println();

 

  // convert the data to actual temperature

 

  unsigned int raw = (data[1] << 8) | data[0];
  if (type_s) {
    raw = raw << 3; // 9 bit resolution default
    if (data[7] == 0x10) {
      // count remain gives full 12 bit resolution
      raw = (raw & 0xFFF0) + 12 - data[6];
    }
  } else {
    byte cfg = (data[4] & 0x60);
    if (cfg == 0x00) raw = raw << 3;  // 9 bit resolution, 93.75 ms
    else if (cfg == 0x20) raw = raw << 2; // 10 bit res, 187.5 ms
    else if (cfg == 0x40) raw = raw << 1; // 11 bit res, 375 ms
    // default is 12 bit resolution, 750 ms conversion time
  }
  celsius = (float)raw / 16.0;
  fahrenheit = celsius * 1.8 + 32.0;
  Serial.print("  Temperature = ");
  Serial.print(celsius);
  Serial.print(" Celsius, ");
  Serial.print(fahrenheit);
  Serial.println(" Fahrenheit");
 
  lcd.clear();
  lcd.print("T= ");
  lcd.print(celsius);
  //lcd.setCursor(0, 1);
  //lcd.print("F= ");
  //lcd.print(fahrenheit);

 

}

 

コメント (5)
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

Arduino Leonardoのテスト(2)

2012-12-06 | Arduino

リサジュー図形の描画
Leonardoのテストとして、リサジュー図形を描いてみました.
LeonardoをUSBのマウスにみたて、パソコンでペイントを起動しモニターにリサジュー図形を描きます。
配線はデジタル12ピンにスイッチを1個付けるだけです。
 

スケッチは「武蔵野電波のプロトタイパーズ」に掲載されていたものを参考にさせて頂きました。
スケッチ内の変数を変えることによりいろいろなリサジュー図形が描かれます。

スケッチ

const int sw = 12;
int x, y;
float r;

void setup() {
  pinMode(12, INPUT_PULLUP);  // 内部プルアップ有効
  Mouse.begin();
}

void loop() {
  if(!digitalRead(12)) {  // スイッチが押されていたら
    r += 0.02;
    x = sin(r*3) * 12.0;
    y = cos(r*5) * 12.0;
    Mouse.move(x, y, 0);  // X, Y, Wheel
  }
  delay(5);
}

ペイントを起動させツールの鉛筆を選択しておきます。その後、LeonardoにつけたスイッチをONにし、マウスの左ボタンを押すとリサジュー図形が描かれます。

描かれたリサジュー図形

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

Arduino Leonardoのテスト

2012-12-05 | Arduino

Arduino Leonardoのテスト
以前に衝動買いをしていたArduino Leonardo、そのまま放置していてももったいないので、とりあえずテストをしてみた。
Arduino Leonardoには、ピンヘッダーが実装されているものと実装されてないものがあるようですが、私の購入したものはピンヘッダー実装済みの物です。
外観はICチィップが少なくなっているのですっきりした感じです。
 



Arduino Unoとの違い
基本的には従来のボードと同じように使えると思いますが、いろいろ違いがあるようです。

・パソコンに接続するには、マイクロUSBのB端子を持つ「micro-B」USBケーブルが必要です。
・Leonardo用のドライバをインストールする必要があります。
・Arduino IDEは、Arduino1.0.1で日本語化されている。
・1個のマイコンでスケッチの実行とUSB通信の両方を実行している。
・デジタルI/Oの数が6ピン増えた。(アナログポートをデジタルポートとして利用)
・PWM端子が1個増えた。(DIGTAL13)
・アナログ入力端子が6個増えた。(A6~A11、デジタルポート4,6,8,9,10,12を利用)

とりあえずテストのため増設されたPWM端子を使用してLEDの明るさを変化させてみます。
13ピンの出力を0から255の範囲で5単位で連続変化させます。

配線
 


Arduinoに準備されているサンプルスケッチのFadingを開きLEDのピン番号を13に変更しました。

スケッチ

int ledPin = 13;    // LED connected to digital pin 9

void setup()  {
  // nothing happens in setup
}

void loop()  {
  // fade in from min to max in increments of 5 points:
  for(int fadeValue = 0 ; fadeValue <= 255; fadeValue +=5) {
    // sets the value (range from 0 to 255):
    analogWrite(ledPin, fadeValue);        
    // wait for 30 milliseconds to see the dimming effect   
    delay(30);                           
  }

  // fade out from max to min in increments of 5 points:
  for(int fadeValue = 255 ; fadeValue >= 0; fadeValue -=5) {
    // sets the value (range from 0 to 255):
    analogWrite(ledPin, fadeValue);        
    // wait for 30 milliseconds to see the dimming effect   
    delay(30);                           
  }
}

これにより出力のパルス幅が変わりLED明るさが変化します。


PWM(Pulse Width Modulation)
一定の周波数でパルスのオンとオフの時間を変えて供給する電力を調整する。
パルスがすべてオンの時出力100%、オンとオフの時間がそれぞれ1/2の時出力50%、パルスがすべてオフの時0%となる。
(この比率をデューティ比と呼び、Arduinoでは0~255の値でこのデュティ比を調整している)

13ピンの出力波形
duty 50%(128/255)

duty 20%(51/255)

duty 80%(204/255)

参考にしたページ
Arduino Leonardoへのガイド
待ちに待ったArduino Leonardoがやってきました(1)

 

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

Arduino・Ethernetシールドをテストする(3) マイクロSDカードにデータを保存

2012-03-29 | Arduino

Ethernetシールドには、マイクロSDカードが実装できるようになっておりますので、今回はそれ利用してデータを保存してみます。
前回使った装置にLCDディスプレイを追加して、データを見えるようにします。さらにSerial Monitor で各データの確認ができるスケッチにしました。
センサー部分は前回のままですが、Arduino、Ethernetシールド、LCDシールドの3階建てになります。

LCDディスプレイはEthernetのピンと重ならないように配線を変更しました。

 

全体の配線

スケッチ

#include <LiquidCrystal.h>
#include <SD.h>
 
const int chipSelect = 4;
float v = 5;
float vt = 0;
float vh = 0;
int Temp = 0;
int Hum = 0;
LiquidCrystal lcd(2,3,8,5,6,7);

float sen0 = 0;
float sen1 = 0;

void setup()
{
  Serial.begin(9600);
lcd.begin(16,2);
lcd.clear();
if (!SD.begin(chipSelect)) {
lcd.print("card failed, or not present");
return;
}
else {
lcd.print("card ON ");

void loop ()

sen0 = analogRead(0);
vt = sen0;
sen1 = analogRead(1);
vh = sen1;
Temp = (( vt *  0.00489 )- 0.6) * 100;
Hum = ( vh * 0.00489 * 30.855 ) -11.504;

Serial.print("Temp=");
Serial.print(Temp);
Serial.print(" , Hum=");
Serial.print(Hum);
Serial.print(" , vt=");
Serial.print(vt);
Serial.print(" , vh=");
Serial.println(vh);

lcd.clear();
lcd.print("T=");
lcd.print(Temp);
lcd.write(0xDF);
lcd.print("C");

lcd.setCursor(7,0);
lcd.print("H=");
lcd.print(Hum);
lcd.print("%"); 

File dataFile = SD.open("datalog.txt", FILE_WRITE);
if (dataFile) { 

dataFile.print("Temp,");
dataFile.print(Temp);
dataFile.print(",Hum=,");
dataFile.println(Hum);

dataFile.close();
lcd.setCursor(0,1);
lcd.print("SD write=");

lcd.setCursor(10,1);
lcd.print("R");
}
else {
lcd.print("error opening datalog.txt");
}

delay(60000);
}

 Serial Monitor確認画面

 
SDカードに保存されたデータ


データをエクセルに取り込みグラフ作成
 

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする