メーターの改良をした話

 今回も開発していくメーターですが、去年使ったデータはすべて表示できるようになりました。今になって時計を表示するのを忘れてることを思い出しましたが、そのうち追加したいと思います。


 今回行ったことはほとんど前回前々回のコピペなのでプログラムは載せませんが、一つ不具合が出ました。
1
 これはArduinoからシリアル通信で送られてくるデータなのですが、二つしかデータが格納されていません。Arduinoから送られてきたデータを、一つの配列に格納して使うようなプログラムにしているので、データが格納されていないところがあるとエラーを吐かれます。それなので、読み取るかどうか判断する部分部分のプログラムを"
if (inString != null && split(trim(inString),',').length==4) {
のようにすることで解決しました。

 そんなわけで出力は下のようになります。
me-ta-
 それっぽくなってきているんじゃないでしょうか?

 今回はここまでです。次回はまたちょっと改良しようと思います。それではまた今度。

Processingで複数のデータをいっぺんに送った話

 今回もProccessingをやっていきます。今回は、いくつかのデータをArduinoからProcessingに送っていこうと思います。

 前々回やった方法でまとめて送ることもできるとは思いますが、めんどくさかったのでStringを使うことにしました。


・Arduino
 今回は3つにデータを1秒おきに送ろうと思います。
void setup() {
  Serial.begin(9600);
}

void loop() {
  int valueh = analogRead(0);
  int values = analogRead(1);
  int valuev = analogRead(2);
  Serial.print(valueh);
  Serial.print(",");
  Serial.print(values);
  Serial.print(",");
  Serial.print(valuev);
  Serial.print("\n");

  delay(1000);
}


・Processing
 Processingのコードは以下のようになります。
import processing.serial.*;
Serial myPort;

int []data = new int [3];

void setup() {
  myPort = new Serial(this, Serial.list()[1], 9600);
}

void draw() {
}

void serialEvent(Serial p) {  
  String inString = myPort.readStringUntil('\n');

  if (inString != null) {
    inString = trim(inString);
    data = int(split(inString, ','));
    println(data);
  }
}
 このプログラムの大事なところは以下の通りです。
① String inString = myPort.readStringUntil('\n');
 ここで改行(\n)までをいっぺんに読み取ります。例:"valueh,values,valuev\n"
② inString = trim(inString);
 trim()で改行(\n)を削除します。例:"valueh,values,valuec"
③ data = int(split(inString, ','));
 split()で区切られた文字列を配列に直し、int()でint型に直します。例:{valueh,values,valuec}

 このようにすることでArduinoからProcessingにint型の複数の値を簡単に渡すことができます。

キャプチャ
 出力はこのような感じで出てきます。

 今回はここまでです。次回は前回作ったメーターを改良し、スピード、温度、電圧を表示できるようなものを作りたいです。それではまた今度。

Processingでメーターを作った話

 前回に引き続き開発をしていきたいと思います。今回は各種メーターの基礎を作っていきたいと思っています。


 Arduinoのプログラムはそのままでセンサーの値を1バイトずつ出力します。

・Processing
import  processing.serial.*;

Serial  serial;
int[]   data;
int recv_dataH;

void setup() {
  size(800, 600);
  smooth();
  background(0,0,0);
  data = new int [width];
  serial = new Serial( this, Serial.list()[1], 9600 );
  speedmeter();
}

void speedmeter(){
  strokeWeight(3);
  stroke(255,0,0);
  fill(30,30,30);
  arc(200, 200, 220, 220, PI, PI*2.000, PIE);
  arc(200, 200, 220, 220, PI, PI*1.875, PIE);
  arc(200, 200, 220, 220, PI, PI*1.750, PIE);
  arc(200, 200, 220, 220, PI, PI*1.625, PIE);
  arc(200, 200, 220, 220, PI, PI*1.500, PIE);
  arc(200, 200, 220, 220, PI, PI*1.375, PIE);
  arc(200, 200, 220, 220, PI, PI*1.250, PIE);
  arc(200, 200, 220, 220, PI, PI*1.125, PIE);
}

void draw() {
  speed();
}

void speed(){
  strokeWeight(4);
  fill(30,30,30);
  stroke(100,50,0);
  arc(200, 200, 201, 201, PI, PI*2, PIE);
  strokeWeight(3);
  stroke(255,0,0);
  arc(200, 200, 200, 200, PI, PI+recv_dataH*0.002, PIE);
  fill(255);
  textSize(32);
  text(recv_dataH, 220, 200);
}

int serialEvent(Serial port) {  
  if ( port.available() >= 3 ) {
    if ( port.read() == 'H' ) {
      int high = port.read();      
      int low = port.read();
      recv_dataH = high*256 + low;
      println(recv_dataH);
    }
  }
  return(recv_dataH);
}

 ゴリ押しで図形を表示しています。特に開設することもないでしょう。改善点はそれぞれの図形のxy座標を変数にしていじりやすくするとかですかね。
キャプチャ

 出力してみるとこのような感じ。そこそこいい感じになっていると思います。

 動かしてみるとこんな感じです。結構それっぽくなったと思います。


 今回はここまでです。次回はいろいろなデータをいっぺんに表示できるようにしたいと思います。それではまた今度。

ProcessingでArduinoからのデータをグラフ化した話

前回の続きとして、今回はセンサーの値をArduinoで読み取り、それをProcessingでグラフにします。

 
 まず、int型は2バイトです。しかし、シリアル通信は1バイトずつデータを送るので、センサーの値を送るのにはひと手間かかります。


・Arduino側のプログラム

  1. void setup() {
  2.   Serial.begin(9600);
  3. }

  4. void loop() {
  5.   int value = analogRead(0);
  6.   Serial.write('H');             // ヘッダの送信
  7.   Serial.write(highByte(value)); // 上位バイトの送信
  8.   Serial.write(lowByte(value));  // 下位バイトの送信
  9. }
ヘッダーをつけて二つに分割して送ります。


・Processing側のプログラム

  1. import  processing.serial.*;

  2. Serial  serial;
  3. int[]   data;

  4. void setup() {  
  5.   size(400, 250);
  6.   data = new int [width];
  7.   serial = new Serial( this, Serial.list()[1], 9600 );
  8. }

  9. void draw() {
  10.   background(10);
  11.   strokeWeight(2); 
  12.   stroke(0, 255, 0);

  13. //グラフの描画
  14.   for (int i=0; i<data.length-1; i++) {
  15.     line( i, convToGraphPoint(data[i]), i+1, convToGraphPoint(data[i+1]) );
  16.   }
  17. }

  18. void serialEvent(Serial port) {  
  19.   if ( port.available() >= 3 ) {
  20.     if ( port.read() == 'H' ) {
  21.       int high = port.read();      
  22.       int low = port.read();
  23.       int recv_data = high*256 + low;
  24.       
  25. //時系列データを更新
  26.       for (int i=0; i<data.length-1; i++) {
  27.         data[i] = data[i+1];
  28.       }
  29.       data[data.length-1] = recv_data;
  30.     }
  31.   }
  32. }

  33. float convToGraphPoint(int value) {
  34.   return (height - value*height/1024.0);
  35. }

 このようにするとできます。まあそもそも、データをそのままグラフにして表示するのならArduino IDEのシリアルプロッタを使えばいいのですが...
 一応出力はこのようになります。シリアルプロッタと違うところは背景や線の色を自由に変えられるところでしょうか...
キャプチャ



 この中で大事なのは以下に抜き出した部分です。

  1. void serialEvent(Serial port) {  
  2.   if ( port.available() >= 3 ) {
  3.     if ( port.read() == 'H' ) {
  4.       int high = port.read();      
  5.       int low = port.read();
  6.       int recv_data = high*256 + low;

 この部分はたびたび使いますが、大量のデータをいっぺんに送るときの方法です。このブログでは、GPSを使ったときに似たようなことをやっていて、センサーから送られてきた様々なデータから必要なデータを持ってくるときに使っていました。このような処理はよく使うので、プログラムがちょっとできる人なら見たことがあると思います。

 今回はここまでです。次回はメーター類の基礎をできればいいと思います。それではまた今度。

2020/10/13更新 プログラムがたぶん読みやすくなったはずです。

Processingを使ってみた話

 この間よくわからないまま使っていたProcessingですが、Ene-1GPのモニターに使えそうだということで使えるようになろうと思います。今回はその時使ったプログラムの解読です。

 まず、Arduinoで毎回センサーのデータをとるのはめんどくさいので、数秒おきに1~4をシリアル出力しておきます。

 前回使ったプログラムは以下の通りです。
 コメントに解説を追加しておきます。
import processing.serial.*; //宣言?

//下三行が定義
Serial port;
int val;
int x, y, dx, dy, c;

void setup() {
  size(800, 600); //画面サイズ
  String arduinoPort = Serial.list()[1]; //シリアルポートの番号
  port = new Serial(this, arduinoPort, 19200); //ポートの設定
  background(0); //背景を黒に設定
}

void draw() {
  val = 0;
  if ( port.available() > 0) {
    val = port.read(); //ポートの値を読む
    print(char(val)); //Processingのコンソールに読んだ文字を表示
    if (char(val) == '2') {
      x = -800;  //表示する図形の左上の点の初期位置のx座標
      y = 0; //同y座標
      dx = 50;  //xの変化量
      dy = 0; //yの変化量
      c = 16; //出てくるまでのコマ数
      fill(255, 255, 0); //表示する図形の色
    } else if (char(val) == '1') { //以下繰り返し
      x = 800; 
      y = 0;
      dx = -50; 
      dy = 0;
      c = 16;
      fill(0, 0, 255);
    } else if (char(val) == '4') {
      x = 0; 
      y = -600;
      dx = 0; 
      dy = 40;
      c = 15;
      fill(255, 0, 0);
    } else if (char(val) == '3') {
      x = 0; 
      y = 600;
      dx = 0; 
      dy = -40;
      c = 15;
      fill(0, 255, 0);
    }
  }
  if (c-- > 0) { //更新処理
    x = x + dx;  //x座標の変換
    y = y + dy; //y座標の変換
    rect(x, y, 800, 600); //(x,y)の座標から800*600の長方形を表示
  }
}

 このようになります。Javaはわからないので間違っていたらごめんなさい。

 今回はここまでです。ちょっとProcessingに浮気していろいろ作ってみたいと思います。それではまた今度。

ギターを弾くと光るやつを作った話

 弟に「ギターを弾くと光るやつ」を作ってって言われたので作りました。

・回路図
gita-noyatu_回路図
 こんな感じで、ギターの入力(数mV)をオペアンプで増幅してコンパレーターの閾値よりも高いときだけLEDを光らせます。手元にRail to Rail(またの名をフルスイング)のオペアンプがなかったので、任意の閾値(0~5V)の中で2.5±1.5Vまでにしか増幅されず感度がピーキーになってしまいました。また、閾値を超す波の密度の差によってpwmと同じ現象が起き音の大きさによって明るさが変わるようになりました。

・動作
 このように動作します。

 今回はここまでです。そろそろきちんとVVVFを作りたいと思います()。それではまた今度。

定電流ダイオード(CRD)を使ってみた話

 以前から名前は知っていた定電流ダイオード(CRD)ですが、使ったことがなかったので試しに使ってみました。

 秋月にあるデータシートを見てみるといろいろなグラフが乗っていますが、今回はハードワークさせるつもりはないので静特性のグラフを見ます。

キャプチャ
 静特性のグラフはこのような感じになってます。これを見ると型番によって多少の違いはあれども、端子間電圧がほとんど0Vでも定格電流を流し百数十Vまでは定格電流を流し続けることがわかります。


 実際に直流安定化電源でLEDと直列につなぎ電気を流した時の様子がこちらです。
 LEDの最低動作電圧である3V弱~30V弱まで同じ明るさで光っていることがわかると思います。
 今回は18mAのものを使ったので、電源が3V以上あればどのような電圧でも同じ明るさで光らせることができます。これは導通チェック用のライトとして使いやすいものです。

 今回はここまでです。VVVFがなんかうまくいってないので最近は簡単なものが多く申し訳ないです。それではまた今度。

3V→5Vの昇圧回路の話

 一年ほど前に作っていて記事にしてなかったのでDC/DCコンバータの話でも。
 自分はほかにも555を使ったスタンガンや、Arduinoを使ったコイルガン付きのラジコンを作ったことがあるので機会があったらそちらの話も記事にしたいと思います。

 今回扱う昇圧回路ですが、HT7750Aというものを使う簡単なものです。


3V_5V_回路図
 このような回路で動作します。インダクタは100μH程のもので動作します。


 今回は昇圧回路を使いました。あまり電流は取り出せませんが手軽なので、いろいろなものに使えると思います。それではまた今度。

コーヒーメーカーを分解した話

 新しいコーヒーメーカーを買ったので古いものがいらなくなったので分解してみました。

ko-hi-2
 中身はこんな感じでした。スイッチが入ったら電熱線があったまり、温度が上がるとさーみすてにより出力が下がる感じだと思いますたぶん。また、140℃の温度ヒューズがついているので安全なのでしょう。

 水の入力口に便があったので内部で発生した水蒸気の圧力で水を上げる感じだと思います。


 今回はここまでです。VVVFインバータの開発がうまくいってないのですが、頑張ろうと思います。それではまた今度。

デジタルテルミンを作った話

 今まで一回も測距センサーを使ったことないので使ってみようということで、テルミンを作ってみました。

 今回使ってみたセンサーは、シャープ製のGP2Y0A21YKを使いました。
DSC01148
これです。有名な話ですが、このセンサーは左からVo,GND,Vccとなっており、それぞれの色のイメージとは違うので気を付けなければいけません。

 プログラムは下のように適当に書きます。

#define BEATTIME 20 //音を出している時間(msec)
#define SPEAKER 12 //スピーカーの出力ピン番号
int val1=0;
  
void setup() {
Serial.begin(9600);
}

void loop() {
  val1=analogRead(0);
  Serial.println(val1);
  tone(SPEAKER,val1,BEATTIME) ; // ド
  delay(BEATTIME) ;
}

 適当にデータを拾って適当に出力します。センサーの出力がArduinoのアナログインプットで100~600ぐらいなのでそのままそれを周波数として発信させてもいいと思います。

 今回はここまでです。それではまた今度。
アクセスカウンター
  • 今日:
  • 昨日:
  • 累計:

読者登録
LINE読者登録QRコード