読者です 読者をやめる 読者になる 読者になる

Arduino 高精度IC温度センサ LM35DZ

電子工作

・目的 

 温度センサを使い、室温を計測する。

 

・使用したもの

 Arduono uno

 ジャンパワイヤ

 ブレッドボード

 デジタルテスター

 IC温度センサ LM35DZ

 ノートPC(Windows 10)

方法

 (1)回路を組む

f:id:shangtian:20170325110625p:plain

 

   (2)プログラム

  

   秋月電子のホームページ(http://akizukidenshi.com/catalog/g/gI- 00116/)による  とLM53DZの温度係数は10.0mV/℃、測定温度範囲 は0~100℃である。ここで  温度センサの出力電圧をVoutとし、

   電源電圧をVとする。またVoutより出力される電圧の範囲は0~1V

  である。以上のことを表1に示した。

 

      表1:基本データ

温度係数

10mV/℃

測定温度範囲

0~100℃

Vout範囲「

0~1V

 

Arduinoがアナログピンで読み取ることのできる電圧の範囲は

0~5Vである。またanalogRead()で読み取ることのできる値は

0~1023でる。今回、温度センサは0~1Vまでの出力なので、

analogRead()で読み取る値は、0℃è0 100℃à204.8したがって、

変換式はt = Vout*V/204.8*100である。

プログラムコードを図2に示した。

nt analog_no = 5 ;// define A5 as input signal pin
unsigned long time;
void setup()
{
  Serial.begin(9600);
}
void loop()
{
  int pin_value;
  int vol;
  float t;
  time = millis();
  pin_value = analogRead(analog_no);
  t = pin_value*1*100/204.8;
  Serial.print(time);
  Serial.print(",");
  Serial.println(t);
  
  delay(500);
}

図2:プログラムコード

 

 

 

・結果

f:id:shangtian:20170325110727p:plain

図3:測定結果

 

  とれたデータは図3に示した。1列目はシリアル通信を

  始めてからの経過時間(単位:ミリ秒)、2列目はセンサから 

  読み取った値(単位:℃)である。

 

・考察

  他の温度計で室温を計測したところ、20度前後だが、arduino

  読み取った値は、30度付近であり、うまくセンサの値を読み取れていない可能性が  大きい。

 

 <参考文献>

IC温度センサ

http://www.marutsu.co.jp/contents/shop/marutsu/mame/49.html

 

http://www.rm.kanagawa-it.ac.jp/~kawaralab/sens7.pdf

 

processingにてcvsファイルを読み取り 

processing

・目的

 Arduinoから送られてきたデータを保存したtxtファイルを

 processingで読み込 み、グラフとしてプロットする。

 

・使用したもの

 ノートpc(Windows 10

    Processing IDE

 

・方法

 プログラムコードを図1に示した。読み取るファイルは1列目はarduino

 データを取得してからの時間(単位:ミリ)、2列目は温度センサが

 返した値(変換式に通して℃にしてはない)である。

 ファイルの内容の一部を図1に示した。

f:id:shangtian:20170323221924p:plain

図1:ファイルの内容の一部

 String lin;
int ln;
String lines[];

void setup() {
  ln = 0;
  lines = loadStrings("teraterm.txt");
//txtファイルの読み込み background(0); size(1000,800); } void draw() { lin = lines[ln];//ln行目を収納 String [] co = split(lin,',');
//カンマの前後で区切り配列に収納 if (co.length == 2){ float x = float(co[0]); float y = float(co[1]); fill(#FC0A0A); noStroke(); ellipse(x/200,500-y*5,10,10); } ln++;//次の行に移行 if(ln == lines.length) noLoop(); //最後の行まで読み込み終わった時、ループを終了させる。 }

図2:プログラムコード

 

 読み込ませるtxtファイルをprocessingのスケッチが入れてある

 フォルダーに入れる。

 

 

・結果

 縦軸はセンサーの値を5倍したもの、横軸はセンサーの値を読み込み

 始めてからの時間(単位:ミリ秒)としたグラフを図2に示した。

f:id:shangtian:20170323220832p:plain

 図2:データのプロット

Arduino-processing シリアル通信により連携させる その3

processing 電子工作

・目的

 複数のセンサーの値をarduino側で読み取りシリアル通信にてデータをprocessing側に送信する。Processing が受け取った値に対応して立方体の大きさと回転速度を変化するようにプログラムを組む。

 

 

・使用したもの

 可変抵抗(10KΩ)2個

 

小型 ボリューム 可変 抵抗器 10K Ω B 10 個 セット

小型 ボリューム 可変 抵抗器 10K Ω B 10 個 セット

 

 

    Arduino uno

    Processing IDE

   ノートPC(Windows 10

 ブレッドボード

 ジャンパワイヤ

 

・方法

 

 (1)回路を組む

可変抵抗を2個使い、任意の可変抵抗をアナログピンA4に、

残りの可変抵抗をアナログピンA5に接続した。可変抵抗の

VCCピンをブレッドボードの+に、GNDをブレッドボードの

マイナスに接続した。回路図を図1に示した。

f:id:shangtian:20170321220819p:plain

図1:回路図

 

 (2)Arduino側のプログラム

 

int sensors[2];
int inByte;

void setup() {
  Serial.begin(9600);

  sensors[0] = 0;
  sensors[1] = 0;
  inByte = 0;

  establishContact();
 
}

void loop() {

  if(Serial.available() > 0){

    inByte = Serial.read();

    sensors[0] = analogRead(A0);
    sensors[1] = analogRead(A1);

    Serial.print(sensors[0]);
    Serial.print(",");
    Serial.println(sensors[1]);
    }
   

}

void establishContact() {

  while(Serial.available() <= 0) {
    Serial.println("0,0");
    delay(300);
  }
}

.

(3)processing側のプログラム

 import processing.serial.*;
Serial myPort;

float i;
float j;
void setup() {
  size(800,800,P3D);
  
  myPort = new Serial(this,"COM3",9600);
  
  myPort.bufferUntil('\n');
}

void draw() {
  
  background(0);
 
  translate(width/2,height/2);
  fill(#E4FA03);
  rotateY(frameCount/i);
  rotateX(frameCount/i);
  box(j);
  
}

void serialEvent(Serial myPort){
  
  String myString = myPort.readStringUntil('\n');
  
  myString = trim(myString);
  
  int sensors[] = int(split(myString, ','));
  
  if (sensors.length > 1) {
  //0~1023を0~255に変換 i = map(sensors[0],0,1023,0,255); j = map(sensors[1],0,1023,0,255); } myPort.write("A"); }

.

・結果

 


accept arduino date by serial 3 2017 03 21 9 04 05

お名前.com

 

 

shangtian.hatenablog.com

shangtian.hatenablog.com

 

processing JSON web APIを使って天気情報を表示させる

processing

・目的

 JSON形式のweb APIを使ってProcessing にて天気予報を表示させる

 

・使用したもの

 Processing 3.2.1

 ノートPC(Windows 10

 

・方法

(1)天気予報サービスを利用する

    今回はJSONデータで天気予報を配布しているライブドアのお天気

webサービスを使用する。仕様はhttp://weather.livedoor.com/weather_hacks/webservice

に載っている。

 

--JSONとは--

 JSON(JavaScript Object Notation)は、軽量のデータを交換するフォーマット。

詳しくはhttp://www.json.org/json-ja.htmlを見てください。

 

 

 (2)プログラムコード

String baseURL = "http://weather.livedoor.com/forecast/webservice/json/v1?city="; 
String city = "120010";  //都市コード
String title;
String publicTime;
String image;
JSONArray forecasts;
JSONArray description;



void setup() {
  size(800,800);
  JSONObject w = loadJSONObject(baseURL+city); //JSON形式のデータを取得 baseURLと都市コードを結合  
  title = w.getString("title");                 
  forecasts = w.getJSONArray("forecasts");   //forecastsのプロパティーを取得
  publicTime = w.getString("publicTime");
  
  
}


void draw() {
  background(255);
  fill(0);
  text(title,150,30);
   text(publicTime,width/2,height/2);
  
  //配列に収納されているので データを取り出す
  for(int i=0; i<forecasts.size(); i++){
    JSONObject f = forecasts.getJSONObject(i);
    String s =  f.getString("dateLabel")+":" +f.getString("telop");
    JSONObject t = f.getJSONObject("temperature");
    JSONObject v = f.getJSONObject("image");
    for (int j=0; j<v.size();j++){
      String link = v.getString("url");
          textSize(30);
          text(link,170,330);
    }
    
    
text(s,150,100+20*i);
  }
    
}

図1:プログラムコード

 

・結果 

 文字を拡大するコードを入力し実行した結果が図2。文字化けしている。

for (int j=0; j<v.size();j++){
      String link = v.getString("url");
          textSize(30);//この行を削除したのが図3
          text(link,170,330);
    }

 

f:id:shangtian:20170321165024p:plain

図2:文字化け

f:id:shangtian:20170321165026p:plain

図3:天気情報

・考察

 表示される文字の大きさが小さいため

 textSize(); 

  で大きくしたが、日本語が文字化けしてしまう。

 おそらくProcessing側のフォントをUTF-8にすることで解決

 しそうだが、設定画面で変更しようとしても、そもそも設定画面にUTF-8

 が存在しないため解決できなかった。英語のサイトから天気情報を持ってくれば

 一応は解決しそうだ。

<参考文献>

JSON の紹介

 (http://www.json.org/json-ja.html

Processing で Web API (Web サービス) を利用するプログラムを作る

 (http://www2.kobe-u.ac.jp/~tnishida/misc/processing-web-api.html)

ヘテムル

esp-wroom-02 光センサーの値を読み取る

電子工作

esp-wroom-02 光センサー値

 

・目的

 光センサーにて取得したデータをシリアルモニタ上に表示させる。

 

・使用したもの

 esp-wroom-02

 

ESP-WROOM-02ピッチ変換済みモジュール《T型》

ESP-WROOM-02ピッチ変換済みモジュール《T型》

 

 

  ジャンパワイヤ

 

普通のジャンパワイヤ(オス?オス)

普通のジャンパワイヤ(オス?オス)

 

 

 ブレッドボード

 

普通のブレッドボード

普通のブレッドボード

 

 

 ノートパソコン(windws10)

  光センサー

 

 

 

・方法

  (1)回路を組み立てる

光センサーで読み取った値をアナログ値として受け取る。

esp-wroom-02のTOUTピンを使う。このピンはArduino uno の

アナログピンに当たる。ダウンロードモードの回路を図1に示した。

実際にプログラムを書き込むときはリセットすることを忘れないこと。

リセットはRSTピンをGND(ブレッドボードのマイナス)につなげ、

抜くことで可能。またプログラムを実行するときは回路を組み直す必要

があることに注意すること。

 

f:id:shangtian:20170304113255p:plain

図1:ダウンロードモード

  (2)プログラム

通常のarduinoとアナログピンの読み取り方法(プログラムの書き方)が若干異なることに注意してプログラムを作成した(図2)。

 extern "C" {
  #include "user_interface.h"

}

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

int getToutValue() {
 int res = system_adc_read();

 return res;
} //toutピンの読み取り

void loop() {
  int val = getToutValue(); //値の受取
  Serial.print("value:");
  Serial.print(val);//シリアルモニタに値を表示
  Serial.print("\n");
}

図2:esp-woorm-02に書き込んだプログラム    

(3)実行

 

図のように回路を組み換え実行モードに変更する。この時も

リセットすることを忘れないこと。f:id:shangtian:20170304113140p:plain

 図3:実行モード

 

 

 

 

 

・結果

  しっかり光センサーで読み取った値をシリアルモニタ上に表示させることが

出来た。

 

f:id:shangtian:20170304113314p:plain

 

 

 

Arduino-processing シリアル通信により連携させる 改良版

processing 電子工作

・目的

 前回の実験ではArduino側で読み取った値をうまくprocessing側に表示

 できなかった。ここの改善を図る。

 

・方法

     (1)arduino側プログラム

    Arduino側のint型は2バイトで0~1023を表示可能だが

    シリアル通信によって送ることが可能なデータ量は1バイトで

    0~255となるため、Arduino側でシリアル通信で送る値を

    map関数によって変更した。図1にプログラムコードを記載した。

void setup() {

 Serial.begin(115200);
}

void loop() {
  
  int val =map( analogRead(0),0,1023,0,255);
  
  Serial.write(val);
  
 

}

 

図1:Arduino側プログラム

 

 (2) Proessing側プログラム

    こちらのコードは変更を加えていない。Processingの

   プログラムコードは図2に示した。

 import processing.serial.*;

Serial myPort;
float x;
int y;
void setup() {
  background(255);
  size(800,500);
  
  myPort = new Serial(this,"COM3",115200);
  y = 500;
}

void draw() {
 
  x+=0.5;
  noStroke();
  fill(#F7114F);
  ellipse(x,500-y,10,10);
  if(x>width){
    x = 0;
    background(255);
  }
}

void serialEvent(Serial myPort){
  y = myPort.read();
}

 

    図2:Processing側プログラム

 

>espressif ESP-WROOM-02 Wi-Fiモジュール

価格:864円
(2017/3/21 07:12時点)

・結果

値がジャンプすることなくproessing側で表示することが出来た。


Arduino-processing 改良

 

・考察

まだprocessing側で表示できるのはArduino側のセンサー1個

のみのデータである。複数のセンサーの値を表示するには

配列と繰り返しの工夫を加をすれば可能ではないか。

Arduino-processing シリアル通信にて連携させる

電子工作 processing

・目的

 Arduinoで所得したデータをシリアル通信でprocessingに送りグラフを表示。

 

 

・使用したもの

 Arduino uno

   ブレッドボード

 ジャンパワイヤー

 可変抵抗

   processing 3.2.1

 

・方法

 

(1)回路

   図1のように組む。

f:id:shangtian:20170302134453p:plain

図1:可変抵抗

 

(2)Arduino側のプログラム

アナログピン0から値を読み取るので0ピンを読み取るようにセット

読み取った値をvalに代入

int val = analogRead(0);

以下にてシリアル通信で値を送る

  Serial.write(val);
今回使ったコードを図2に示した
void setup() {

 Serial.begin(115200);
}

void loop() {
  
  int val = analogRead(0);
  
  Serial.write(val);
  delay(100);
 

}

 図2:Arduino

 

(3)processing側のプログラム

Arduinoが接続しているポートアドレスを入力する

今回はCOM3だったので、そう記入した。

myPort = new Serial(this,"COM3",115200);
import processing.serial.*;

Serial myPort;
float x;
int y;
void setup() {
  background(255);
  size(800,500);
  
  myPort = new Serial(this,"COM3",115200);
  y = 500;
}

void draw() {
 
  x+=0.1;
  noStroke();
  fill(#F7114F);
  ellipse(x,500-y,10,10);
  if(x>width){
    x = 0;
    background(255);
  }
}

void serialEvent(Serial myPort){
  y = myPort.read();
}

 図3:processing側

 

(4)実行

Arduino unoをパソコンに接続し、(3)で作ったprocessingを起動させる。

可変抵抗のつまみを回しグラフの変化を観察する。

 

 

・結果

  Arduinoとprocessing間での通信は一応成功した。しかし可変抵抗を回し

 ていくと、途中で値がゼロに飛んでしまう。またグラフも滑らかではなく

 速く可変抵抗のツマミを回すとグラフが線でなく点になってしまった。


arduino-processing シリアル通信 円

 

・考察

  • グラフの値がゼロに飛ぶ理由について

まず、可変抵抗の値をうまく読み取れていない可能性を考慮し、

シリアル通信にて取得データを確認した。取得したデータは0~1023

であり正常であった。よって、問題はprocessing側有る可能性が出てきた。

 

次にprocessing側がシリアル通信にて取得したデータを確認するため

以下のプログラムを実行した。

import processing.serial.*;

Serial myPort;

int x;

void setup(){
  
  size(1000,1000);
  
  myPort = new Serial(this, "COM3",115200);
}

void draw() {
  background(255);
  
  ellipse(width/2,height/2,x,x);
  textSize(16);
  println(str(x));//下のバーに値を表示
}

void serialEvent(Serial myPort){
  x = myPort.read();
  
}

結果は0~255までしか表示されておらず、受け取った値が255を

超えると0にジャンプする


processing シリアル通信テスト

 

以上の結果からシリアル通信が問題だと考えられる。

 

Arduinoで使われるint型は2バイトシリアル通信では1バイトずつ

データを送るので、ここを処理しないとうまく表示できないことが

分かる。

 

 

<参考文献>

http://d.hatena.ne.jp/kougaku-navi/20141008/p1

【ドスパラWeb】