質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.35%

[Processing][Arduino][シリアル通信]超音波センターで取得した距離の値をProcessingに反映させたいです。

受付中

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 778

aiaiai7823

score 7

前提・実現したいこと

Arduinoと超音波センサーモジュールを使用して、物体との距離の間を測りました。
下がArduino側のスケッチです。こちらは正常に動いています。
最終的には、獲得できる値の 最小値から最大値を 0~1200に マッピングし直して
Processingでの描画に反映させたいです。
ArduinoにはStandardFilmataが読み込まれています。

int trig = 3; // 出力ピン
int echo = 2; // 入力ピン

void setup() {
  Serial.begin(9600);
  pinMode(trig,OUTPUT);
  pinMode(echo,INPUT);
  }

void loop() {
  // 超音波の出力終了
  digitalWrite(trig,LOW);
  delayMicroseconds(1);
  // 超音波を出力
  digitalWrite(trig,HIGH);
  delayMicroseconds(11);
  // 超音波を出力終了
  digitalWrite(trig,LOW);
  // 出力した超音波が返って来る時間を計測
  int t = pulseIn(echo,HIGH);
  // 計測した時間と音速から反射物までの距離を計算
  float distance = t*0.017;
  // 計算結果をシリアル通信で出力
  Serial.print(distance);
  Serial.println(" cm");
  delay(500);
}

発生している問題・エラーメッセージ

まずはこちらで値が取れたら自分の作品でやってみようと思っています。
エラーが出ている該当のスケッチです。

import processing.serial.*;
import cc.arduino.*;
Arduino arduino; 
int input0 = 0;


void setup() {
  size(500, 800);
  noStroke();
 println(Serial.list());
  arduino = new Arduino(this, Arduino.list()[9], 9600);
}

void draw() {

   int analog0 = arduino.analogRead(input0);
   println(analog0);
}

Processing側でこのようなエラーメッセージが多く出ます。

RuntimeException: Error opening serial port /dev/tty.usbmodem14531: Port busy
RuntimeException: Error opening serial port /dev/tty.usbmodem14531: Port busy
RuntimeException: Error opening serial port /dev/tty.usbmodem14531: Port busy


ポート番号はあっているはずです。

試したこと

・再起動する
・Arduinoを挿し直す。
・私としては、analogInの箇所が怪しいかな・・・と思います。
今回はデジタルピンからしか入力と出力はしていませんので。

補足情報(商品/参考ページなど)

参考にさせていただいたページ(けんゆーさんのブログ)
teratailの別の質問
同じ超音波センサーの使い方が載ったリンク

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

+1

ポート番号はあっているはずです。 

あなたはそういってますけど、PCさんはそうはいってませんね。
シリアルポート名をよく確認してみよう

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/12/06 00:39

    回答ありがとうございます。確認してみます。

    キャンセル

0

ポート番号が間違っていないと天地神明に誓って言うならば、
例えばシリアルモニターを開きっぱなしにして、そっちにデバイスを取られているとか。


追記。
真面目にトレースしてみてわかりました。

ArduinoにはStandardFilmataが読み込まれています。 
これが間違いというか(綴りも違うけど)。読み込まれている、とはどういう具体的にどういう事態を指していますか?

事象としては、ArduinoでFirmataのFirm Wareが動いていないから、FirmataのProcessing側が接続出来ない、ということのようです。
距離センサを持っていないので、Arduino側にはシリアルで見て同様のデータを吐き出すテストプログラム、

void setup() {
  Serial.begin(9600);
}
float dist = 100;
void loop() {
  float d1 = random(-10, 11);
  float d2 = random(1, 4);
  dist += d1 / d2;
  dist = constrain(dist, 4, 400);
  Serial.print(dist);
  Serial.print(" cm");
  delay(500);
}


を書き、私はWindows環境なのでシリアルポート名は適宜変更して質問のProcessingプログラムを走らせると質問と同様の症状が再現しました。
そこで、Arduino側に、Arduino IDEの[ファイル]-[スケッチ例]-[Firmata]-[StandardFirmata]を書き込んだ状態で同じProcessingのプログラムを起動すると、とりあえずエラーは出ません(期待するデータのやり取りはないので画は動きませんが)。

Firmataでなにかやりたいのなら、Arduino側もFirmataのライブラリを適切に使ったプログラムにする必要があります。Firmataで距離センサを制御できるのか、私は知りません。

逆に、ArduinoがFirmataを使わないのなら、Processing側もFirmataを使わずにプログラムを作る必要があります。(これが後の質問でPortのエラーが出ないという状況に繋がります)。
ざっと書いてみましたが、こんな感じになるでしょうか。readstringUntilとか使うともう少し手軽に書けるかもしれませんが、若干応答性は変わるかも。

import processing.serial.*;

final int SMOOTH=10;//移動平均の数
final float MAXDATA=400;//画面右端のデータ値

Serial port;
boolean requestDraw;
String recieved="";//受信文字バッファ
float distance;//取得距離
float history[]=new float[SMOOTH];//移動平均データバッファ
int histPtr;//移動平均格納ポインタ

void setup() {
  size(1200, 640);
  String portName="COM5";//適宜状況に合わせて
  port = new Serial(this, portName, 9600);
  if (port==null) {//一応開けなかったときのチェック
    println("Exit");
    exit();
  }
  stroke(50, 255, 255);
}

void draw() {
  if (requestDraw) {
    background(0);
    float x=distance*(width/MAXDATA);
    line(x, 0, x, height);
    requestDraw=false;
  }
}

void serialEvent(Serial p) {
  char c=(char)p.read();//この関数は1文字だけ受信するもの
  if (c!='\n') {
    //通常データならバッファに追加
    recieved+=c;
  } else {
    //行末だったら1データ単位受信処理
    recieved=recieved.trim(); //'\r'除去

    //計算用バッファにデータ追加
    try {//通信絡みの変換失敗エラーを捕捉
      history[histPtr++]=Float.parseFloat(recieved);
      histPtr%=history.length;

      //移動平均を求める
      float sum=0;
      for (float dist : history) {
        sum+=dist;
      }
      distance=sum/history.length;
      requestDraw=true; //データ準備出来たので描画指示
    }
    catch(java.lang.NumberFormatException ex) {
    }
    finally {
      recieved="";//バッファはクリアする
    }
  }
}

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/12/06 00:38

    Arduino側のシリアルモニター、ずっと開きっぱなしでした...
    試してみます!ありがとうございます。

    キャンセル

  • 2019/12/07 13:27

    で、どうだったのですか。
    なんかいっぱい質問が立っていて現状がよくわかりませんが。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.35%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • トップ
  • Javaに関する質問
  • [Processing][Arduino][シリアル通信]超音波センターで取得した距離の値をProcessingに反映させたいです。