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

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

新規登録して質問してみよう
ただいま回答率
85.35%
openFrameworks

openFrameworksは、C++で記述されたライブラリ群です。既存のライブラリの設定なしで使用できるため「糊」のようなツールキットと呼ばれています。簡単なコードだけで様々なグラフィックスやインタラクションをデザインすることが可能です。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Arduino

Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。

Q&A

2回答

2561閲覧

ArduinoからopenFrameworksにデータを送る方法を知りたい

wowowwo

総合スコア0

openFrameworks

openFrameworksは、C++で記述されたライブラリ群です。既存のライブラリの設定なしで使用できるため「糊」のようなツールキットと呼ばれています。簡単なコードだけで様々なグラフィックスやインタラクションをデザインすることが可能です。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Arduino

Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。

0グッド

0クリップ

投稿2021/07/07 12:40

編集2021/07/07 13:35

ArduinoからopenFrameworksにデータを送る方法を知りたい

大学でarduinoとopenFrameworksを勉強している者です。
arduinoでの操作をopenframeworksに反映する課題が出ているのですが
arduinoでスイッチを押したとき、Serial.write(2);で情報を送り、openframeworksのdraw関数で描いた絵を表示させる。というプログラムを作りたいのですが、arduinoとopenframeworksとの連携が出来ていないようで、arduinoでopenframeworksを制御できません。
エラーメッセージは出ておらず、真っ暗な画面が表示されています。

自分としては、available関数とreadByte関数の使用方法を理解していないことが原因だと思っています。またデータの送受信のバイトについても理解不足だと思います。

プログラミングは苦手で、openframeworksもarduinoも一通り勉強しましたが力不足です。
解決法や理解に繋がる知識のご教授、よろしく願い致します。

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

発生している問題
arduinoとopneframeworksの連携が出来ていない

該当のソースコード

#Arduino

void setup() { pinMode(0, INPUT); Serial.begin(9600); } void loop() { int value = digitalRead(0); if(value == LOW){ Serial.write(2); } }

#openFrameworks

###include "ofMain.h" class ofApp : public ofBaseApp { public: void setup(); void update(); void draw(); void keyPressed(int key) {}; void keyReleased(int key) {}; void mouseMoved(int x, int y) {}; void mouseDragged(int x, int y, int button) {}; void mousePressed(int x, int y, int button) {}; void mouseReleased(int x, int y, int button) {}; void mouseEntered(int x, int y) {}; void mouseExited(int x, int y) {}; void windowResized(int w, int h) {}; void dragEvent(ofDragInfo dragInfo) {}; void gotMessage(ofMessage msg) {}; ofEasyCam cam; ofSerial serial; }; ### #include "ofApp.h" class ofApp : public ofBaseApp { public: void setup(); void update(); void draw(); void keyPressed(int key) {}; void keyReleased(int key) {}; void mouseMoved(int x, int y) {}; void mouseDragged(int x, int y, int button) {}; void mousePressed(int x, int y, int button) {}; void mouseReleased(int x, int y, int button) {}; void mouseEntered(int x, int y) {}; void mouseExited(int x, int y) {}; void windowResized(int w, int h) {}; void dragEvent(ofDragInfo dragInfo) {}; void gotMessage(ofMessage msg) {}; ofEasyCam cam; ofSerial serial; }; ###include "ofApp.h" //-------------------------------------------------------------- void ofApp::setup() { serial.setup("COM3", 9600); ofSetFrameRate(60); ofBackground(0); ofSetWindowTitle("Insta"); ofEnableDepthTest(); ofEnableBlendMode(ofBlendMode::OF_BLENDMODE_ADD); ofNoFill(); ofSetColor(128); } //-------------------------------------------------------------- void ofApp::update() { } //-------------------------------------------------------------- void ofApp::draw() { if (serial.available() > 1) { this->cam.begin(); int data = serial.readByte(); float radius = 300; int deg_span = 1; for (int z = -1200; z <= 300; z += 15) { ofBeginShape(); for (int deg = 0; deg < 360; deg += deg_span) { float x = radius * cos(deg * DEG_TO_RAD); float y = radius * sin(deg * DEG_TO_RAD); float tmp_radius = ofMap(ofNoise(x * 0.005, y * 0.005, z * 0.005 + ofGetFrameNum() * 0.05), 0, 1, 200, 300); x = tmp_radius * cos(deg * DEG_TO_RAD); y = tmp_radius * sin(deg * DEG_TO_RAD); ofPoint point = ofPoint(x, y, z); ofVertex(point); } ofEndShape(true); } this->cam.end(); } }

試したこと

arduinoでは、
if(value == LOW){
Serial.write(2);
}
でスイッチ押してデータを送りました。

openframeworksでは、draw関数内で
if (serial.available() > 1) {
で送られてきた情報が1以上である場合、int data = serial.readByte();を実行し描画する

よう書きました。

補足情報(FW/ツールのバージョンなど)

描画は
https://junkiyoshi.com/2018/02/
からお借りしました。

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

先に、日本語のレベルですが、

プログラミングを作りたい

プログラミングというのは、プログラムを作る行為のことです。プログラムを作る行為を作る...ことはできません。プログラムを作りたい、ならわかりますけれど。

もう一つ日本語レベル...かな?

arduinoでスイッチを押したとき、Serial.write(2);で情報を送り

スイッチを「押した」というと、多分に「まさに今押したとき」というニュアンスを含むと思います。スイッチを押したら一発データがでる、というような。しかしプログラムは「スイッチが押されているならば」という動作になっています。スイッチが押され続けているとデータが送られ続けます。これは期待する動作ですか?

さらに日本語。

arduinoでopenframeworksを制御できません。

トラブルを解決するためには「うまくいかない」とか「できない」というのはほとんど意味のない情報です。必要なのは、まず「どうなることを期待しているのか」。そして、(観察できた事実として)「何が起こったのか」。「制御できない」ということは観察できないでしょ? 観察できる事実とは、画面が真っ暗で何も変化しないとか、勝手にメチャクチャな画が表示されるとか、そういうこと。(かろうじて「エラーメッセージは出ていない」というのは「事実」ですけれど)

if (serial.available() > 1) {

で送られてきた情報が1以上である場合

送られた情報が1個(1byte)以上溜まっている場合(情報の中身はなんでもいい)、という意味です。

int data = serial.readByte();を実行し描画する

もちろん、Serial::readByte()は描画とはなにも関係ありません。溜まっている情報から1byteを取り出す仕事をします。1byte取り出すので、溜まっていたデータは1個減ります。
で、描画しているものはちゃんと見えるはずなのですか? processingならともかく、openframeworksには手を出していないので、私には確認できません。

それと、読みにくいのでコード部分はヘルプ等を参考にしてマークダウン記法で表記してください。


以下追記。

まず訂正。
serial.available() > 1
ってのは、シリアルで受信したデータが「1個を超える値」つまり2個以上ある時に真。
普通は、serial.available() > 0serial.available() >= 1じゃないかしら。

それから、確認事項。
1: serial.available()のところ

//if (serial.available() > 1) { //一旦コメント { //追加

したら、画は表示されますか? されなければ、描画のどこかが間違っていますからシリアルでなにを叩こうと出るわけないので、まずそれを確認。

表示されるなら...openFrameworksは置いておいて、
2: Arduinoに繋いだスイッチを押したとき、TxのLEDが点灯するかどうか確認。

つぎに、
3:Arduino IDEを開いてシリアルをCOM3に設定し、シリアルモニタを開く。COM3に設定出来なければシリアルポートを確認。

今度は
4:ArduinoのUSBケーブルを引っこ抜いて、同様にArduino IDEを開いてCOM3に設定出来ないことを確認。もし出来てしまったら、Arduino以外のデバイスがCOM3につながっているということ。デバイスマネージャを調べるなどしてArduinoがつながっているCOMポートを探す。

この辺まででなにか見つかるんじゃないかなぁ。

投稿2021/07/07 13:25

編集2021/07/07 14:17
thkana

総合スコア7703

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

wowowwo

2021/07/07 13:37

日本語不十分、すみませんでした…… 見直しながら修正します。 ありがとうございました。
guest

0

int data = serial.readByte();

の受信データdataがどこにも使われてないようですが

んで、drawメソッドって、どういうタイミングで実行されるんでしょうか

投稿2021/07/07 12:50

編集2021/07/07 12:52
y_waiwai

総合スコア88042

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

wowowwo

2021/07/07 14:26

解答ありがとうございます。 ofのupdate関数内に if(serial.available() > 0){ int data = serial.readByte(); cout << data << "\n"; } を書き スイッチを押したとき Serial.write(0); 押していない時 Serial.write(1); と送るデータをそれぞれ異なるようプログラムをarduinoに書き、 ofのdraw関数で if (Serial.available() == 1) と書き、押していない時描画すると変更しました。 やはり画面が真っ暗で、上手くいきませんでした。 考え方から間違っていると思います。 どのようにプログラムを組み立てていけばよいのか、具体的にどこが間違えているのかご指摘いただきたいです。 無知で恥ずかしいのですが、<<drawメソッドって、どういうタイミングで実行されるんでしょうか の質問は、どのタイミングで描写し始めるのか?という意味の質問でしょうか。 調べてみましたが、この理解であっているか自信がありません。 私としては、スイッチを押した時に描画され、スイッチから指を離すと描画されなくなるプログラムを作りたいです。 お返事いただけると嬉しいです。どうぞよろしくお願いいたします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問