Scientific Journey

私の冒険記録。たまに回り道。

【Arduino】放射温度センサMLX90614を使ってみる(Galileo2についても解説)

手の温度を取得するために、放射温度センサMLX90614を使ってみる。

用意するもの

手順

  • 以下のサイトからライブラリをダウンロードして、Arduino > Libraries にコピーして入れる。

https://github.com/adafruit/Adafruit-MLX90614-Library

  • IDEを開き、ファイル→スケッチの例から「Adafruit MLX90614 Library」を選択して、mlxtest.ioを実行する。

結果

f:id:an-modoki:20160929114835p:plain

補足

  1. Galileo2の利用について

Galileo2で試してみたところ、どうしてもうまくいきませんでした。
I2Cのポートをうまく認識せず、クロック数の相性があるのでしょうか。
2日取り組みましたが、よくわからないままでした。

  1. 1つのボードによる複数利用について

以下のサイトから、データシートを読みます。
https://learn.sparkfun.com/tutorials/mlx90614-ir-thermometer-hookup-guide

Every MLX90614 has a default I2C address of 0x5A, but that address can be re-written – one of the major features supported by the device. By reconfiguring the address of an MLX90614, you can add multiple devices (up to 127!) to the same bus to get a larger temperature map.

One last bit to note about the SMBus interface – every read or write transmission should be completed with an 8-bit CRC (CRC-8-CCITT) check using a x8+x2+x1+x0 polynomial – handy for that extra bit of data-confidence.

複数つなげる事が可能みたいですね。

【PsychoPy】Arduinoとシリアル通信をさせる。

Adruino(Galileoとのシリアル通信)をBuilder modeでする。

作成したもの
  1. PsychoPy側から、文字列(一行)を送信
  2. Arduino側で受け取ったら、その値をPC側に送信
  3. PsychoPyのプログラムにて、表示
用意するもの

Arduino(Galileo)
・PCとArduinoをつなぐためのケーブル

コード

Arduino
#define num 30//一度に送れる文字数

void setup() {
  Serial.begin(9600);//シリアル通信開始
}

void loop() {
  char incomingByte = 0;  // 受信データ用
  char sended_value[num] = {0};
  int i = 0;

  //シリアル通信
  while(1){
    if(Serial.available() > 0){
      incomingByte = Serial.read(); // 受信データを読み込む
      if(incomingByte > 47 && incomingByte < 59 ){ //アスキーコード10進数(47~59がきたら読み込み)
        sended_value[i] = incomingByte;//配列に入れる
        Serial.print(sended_value[i]);
        i++;
      }
      if(incomingByte == '.'){Serial.print(".");}
      if(incomingByte == ';'){Serial.println(";");break;}//;が来たらwhile文終了。
    }
    else{break;}
  }
}

※ 注意
Arduino Programはパソコン側から「0,1,2,3,4,5,6,7,8,9」「",",";"」しか受信をせず
。「;」を受信するとそこまでが1行とみなされる。
一回に受信できるコードは一行まで。

PsychoPy側コンポーネント設定

キーコンポーネント設定

f:id:an-modoki:20160928073723p:plain

コードコンポーネント設定

Begin Experiment
f:id:an-modoki:20160928073913p:plain

Begin Routine
f:id:an-modoki:20160928073937p:plain

End Experiment
f:id:an-modoki:20160928074024p:plain

結果

f:id:an-modoki:20160928074636p:plain

【Arduino(Gallileo2)】シリアル通信 PCから送られてきた値配列に格納・表示

ほんの忘備録です。

PCから値送信→Arduino受信→配列に格納

コード

#define num 30//一度に送れる文字数

void setup() {
  Serial.begin(9600);//シリアル通信開始
}

void loop() {
  char incomingByte = 0;  // 受信データ用
  char sended_value[num] = {0};
  int i = 0;

  //シリアル通信
  while(1){
    if(Serial.available() > 0){
      incomingByte = Serial.read(); // 受信データを読み込む
      if(incomingByte > 47 && incomingByte < 59 ){ //アスキーコード10進数(47~59がきたら読み込み)
        sended_value[i] = incomingByte;//配列に入れる
        Serial.print(sended_value[i]);
        i++;
      }
      if(incomingByte == ';'){Serial.println(";");break;}//;が来たらwhile文終了。
    }
  }
}

結果

f:id:an-modoki:20160926074149p:plain

【PsychoPy】Galileo2(Arduino)とシリアル通信させてみる。Builder Viewで!

Builder Viewで動作を確認しました。

今日の午前中は何もかもが神っていますね。
あまり大したプログラムではないのですが、Builderでも動作を確認できました。

プログラムの詳細
  • タクトスイッチをオン、オフ→通信が成功すると画面に「OK」と表示される。
Builderの設定

Builderモードでルーチン、コンポーネントをこんな風に配置する。
f:id:an-modoki:20160922042058p:plain

コンポーネントの設定。

f:id:an-modoki:20160922042300p:plain

  • codeコンポ―ネント

f:id:an-modoki:20160922042414p:plain
f:id:an-modoki:20160922042455p:plain
f:id:an-modoki:20160922042550p:plain

実行結果

f:id:an-modoki:20160922042656p:plain

【PsychoPy】Galileo2(Arduino)とシリアル通信をしてみる。(coder編)

本日の朝、動作を確認しました。

Galileo側にコンパイル、スケッチを書き込み後、
PsychoPyのcoderモードで動作を確認しました。

以下が、Galileo側のプログラム

//------------------------------------------
//Tact switch time (P/N: 611 - PTS635SL50LFS)
//------------------------------------------
unsigned long tt, tt2, tt3;

int b_pin = 2;   // Desital pin
int ledpin = 13;
int state = 0;   // pin state
int flag = 0;

float tt4;

void setup() {
  Serial.begin(9600);  
  pinMode(b_pin, INPUT);     // input setting
  pinMode(ledpin, OUTPUT);     // input setting
  digitalWrite(ledpin, LOW);   // LED pin
}

void loop() {
  float ans , temp , tv ;
  float ans2 , temp2 , tv2 ;

  state = digitalRead(b_pin);  // read data
  
  ans = analogRead(0) ;        // read sensor from A0 pin
  ans2 = analogRead(1) ;        // read sensor from A1 pin
 
  if(state == 1 && flag == 0){
    flag = 1;
    tt = millis();
    Serial.println("ON");
    digitalWrite(ledpin, HIGH);
  }
  if(state == 0 && flag == 1){
    tv = (ans*5)/1024;           // convert sensor value to voltage
    tv2 = (ans2*5)/1024;           // convert sensor value to voltage
     
    temp = 100 * (tv - 0.5);     // convert voltage to temperature
    temp2 = 100 * (tv2 - 0.5);     // convert voltage to temperature
     
    tt3 = millis();
    tt2 = tt3 -tt;
    tt4 = (float)tt2 / 1000;
    flag = 0;
    
    Serial.print("time:");       // output serial monitor
    Serial.print(tt4);       // output serial monitor
    Serial.print(",coldbar:");       // output serial monitor
    Serial.print(temp);       // output serial monitor
    Serial.print(",warmbar:");       // output serial monitor
    Serial.println(temp2);       // output serial monitor
    digitalWrite(ledpin, LOW);
    
  }
  
  delay(100);
 }

以下がPsychoPyのcoder側のプログラム。

import serial

com06 = serial.Serial('COM6') # open first serial port COM6
line = com06.readline()   # read a '\n' terminated line
print(line)
com06.close()

Galileo2はCOM6につないである。

実行結果

f:id:an-modoki:20160922035606p:plain

次はviewerモードで実装してみます!

Galileoを触ってみる【温度センサ/タクトスイッチを使ってみる】

センサ類をいじってみるよ!

今日は温度センサとタクトスイッチをそれぞれ動かしてみたいと思います。

必要なもの(GalileoとUSBケーブルの他)

タクトスイッチ編

datasheet: http://www.mouser.com/ds/2/60/PTS635-43997.pdf

  • 8.8KΩの抵抗 10KΩくらいなら何でも大丈夫

温度センサ編

温度センサをデータシートの通りにつなげて、以下のコードを書きます。
今回Vs側には3.0Vの電圧をかけるよ。
ない人はGalileoボードの3.3vを使うといいかも。

//****************************************
//Temperature sensor-1(Vs = 3.0v: TMP36)
//****************************************
void setup() {
     Serial.begin(9600) ;      // Serial initiallize
}
void loop() {
     float ans , temp , tv ;

     ans = analogRead(0) ;        // read sensor from A0 pin
     tv = (ans*5)/1024;           // convert sensor value to voltage
     temp = 100 * (tv - 0.5);     // convert voltage to temperature
     Serial.println(temp) ;      // send value to PC
     delay(1000) ;                // delay.
}

出力はこのような感じになりました。
f:id:an-modoki:20160916102214p:plain

タクトスイッチ編

タクトスイッチにつなげます。電源は5vで出力側はデジタルピン2につなぎます。
その途中から抵抗をグランドにつなげます。

//------------------------------------------
//Tact switch (P/N: 611 - PTS635SL50LFS)
//------------------------------------------

int b_pin = 2;   // Desital pin
int state = 0;   // pin state

void setup() {
  Serial.begin(9600);  
  pinMode(b_pin, INPUT);     // input setting
}

void loop() {
  state = digitalRead(b_pin);  // read data
  Serial.println(state);       // output serial monitor
  delay(500);
}

タクトスイッチを押すと1が表示されます!!

Galileo を触ってみる【初期設定とLチカ】

IntelGalileo Gen2を触ってみます。

販売中止になってしまいましたが、研究室の段ボールにたくさん入っていたので
Galileo Gen2を使うことになりました。

[開発環境]
Windows8.1

箱から出してセットアップ

箱の中の内容物ですが、

  • AC アダプタ

このままでは使えないので、大学のショップまで

  • USB A male - USB micro B male

の買い物をしに行きました。おおよそ8ドルで買いました。

さあ、気を取り直してIDEとドライバのインストール

ArduinoIDEも使えます(1.53以上)
ですが、私はintel ArduinoをこちらからダウンロードしてIDEを入れました。

  • IntelArduino-1.6.0-windows-installer.exe

https://downloadcenter.intel.com/download/24355/Intel-Galileo-Board-Software-Package

ダウンロードが終わったら、
Galileo本体にACアダプタをさして、電源を入れて
先ほど買ってきたUSBケーブルをパソコンにつなぎます。

次にドライバーのインストール。

  • バイスマネージャーに不明なデバイスまたは、Galileo以外の名前で書いてある不明なデバイスを

右クリックして、ソフトウェアの更新をします。

  • 手動で更新をクリック

そして、ドライバの場所を以下で設定
C:\IntelArduino\drivers

そうすると、ドライバが入るはずなのですが、筆者はなぜか
「ストアへドライバーを追加する際に問題が発生しました」
という表示が出てしまい。

こちらのブログの方法を試してみました。
http://www.teradas.net/archives/9922/

そうするとやっとこさ、Galileoが認識されました。

Lチカをやってみる。

Galileoでちゃんとプログラムが書けるかどうか、試してみます。
IntelArduinoを起動して、以下のスケッチを書きます。

#define LED_PIN 13
void setup() {
  pinMode(LED_PIN, OUTPUT);
}
 
void loop() {
  digitalWrite(LED_PIN, HIGH);
  delay(3000);
  digitalWrite(LED_PIN, LOW);
  delay(3000);
}

書き込み前

  • ツール→ボードでintel Galileo Gen2に変更
  • ツール→シリアルポートを設定

コンパイルをしてから、書き込みをします。


はい。うまく書き込めました。
お疲れ様です。