• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:openFrameworks-複数台Arduino間のシリアル通信)

openFrameworks-複数台Arduino間のシリアル通信

このQ&Aのポイント
  • openFrameworksと複数台のArduinoを使用してシリアル通信をする方法について
  • ofSerialクラスのインスタンスを複数作るとエラーが発生する原因について
  • openFrameworks上で複数台のシリアルデバイスと通信する方法について

質問者が選んだベストアンサー

  • ベストアンサー
  • Wr5
  • ベストアンサー率53% (2177/4070)
回答No.2

>これを実行すると >ofSerial: listing devices (0 total) >という結果になってしまいます.これは,Arduinoを何台接続しても代わらない状況です. こちらについてだけ… >VisualStudio2008 ExpressEdition とのことですが、プロジェクトの文字セットは何になっていますか? of_preRelease_v0061_vs2008_FAT.zipを展開してみましたがUNICODEでは正しく動作しません。 # ofSerial::enumerateWin32Ports()でコールしているSetupDiGetDeviceRegistryProperty()がUNICODEで返却してきて、その後のstrstr()で正しく検索できない。 上記のデバイス列挙で失敗して、ofSerial:setup()も正しく動作していない。 という可能性はありませんか?

maechin1121
質問者

お礼

ご回答,ありがとうございます. 文字セットのご指摘を受けて,openFrameworksではなく,開発環境側に問題があるのではと考え,VisualStudio2008 ExpressEditionを再インストールしたところ,複数Arduinoとのシリアル通信が出来るようになりました. 皆様,本当にありがとうございました.

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (1)

  • Wr5
  • ベストアンサー率53% (2177/4070)
回答No.1

>プログラム実行のどこかでエラーが出てしまいます. どこで発生しているのか、デバッグ環境なりで特定して下さい。 >これはofSerialクラスでは一つのデバイスとしかシリアル通信が出来ない,という意味なのでしょうか? 通常、シリアルポートは複数で共有することはできません。 無理矢理共有しようとすると、データが混ざってしまうことになります。 # 実際にはOS側で排他制御していると思われますが。 serialA.setup() serialB.setup() で、それぞれのインスタンスで使用するシリアルポート(WindowsならCOM1/COM2等、LinuxなどならttyUSB0やttyUSB1、ttyS1など)を設定していますか?

maechin1121
質問者

補足

ご回答していただき,ありがとうございます. 説明が不足してしまい,申し訳ありませんでした. 正確には,コンパイルは出来るのですが,プログラム終了時にESCキーを押すと, 「serialExample_debug.exe の 0x7c94e4ff で初回の例外が発生しました: 0xC0000008: An invalid handle was specified」 などのエラーが出てしまい,正常に終了が出来なくなってしまいます. また,setup()内で serialA.setup() serialB.setup() でのデバイス指定してでの実行も,出来ます. しかし,エラー内容や挙動などが開発に使うPC(VisualStudio2008 ExpressEdition)によってまちまちであったりなどしています. また,ofSerialクラスの関数に,使用可能なシリアルデバイスを調べるenumerateDevices();というものがありますが, これを実行すると ofSerial: listing devices (0 total) という結果になってしまいます.これは,Arduinoを何台接続しても代わらない状況です.

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • Arduino シリアル通信でのバイナリ受信

    詳しい方教えてください。 送信元のPCから、受信側のArduinoへ、シリアル通信によってバイナリデータを送ることで、Arduino側でのサーボモータのシリアル駆動を試みています。 PC側からのバイナリデータ送信はVB.NET側で作成済みで、USB-TTLコンバータ(FTDI Basic Breakout 5V)を使ってのサーボモータのシリアル駆動は問題ありません。 (http://micono.cocolog-nifty.com/blog/2011/04/arduino11-17d5.html と同じ処理と思ってください。) 同様な処理を、PC-Arduinoで駆動させようと思っていますが、 void loop() { int c; if (Serial.available() > 0){ c = Serial.read(); ・・・・ こちらでは、Cの値がint型の為かうまくいきません。(キャストも試しましたが・・) そもそも1バイトデータの受信Serial.read()が、int型(2バイト)なのか判りません。 方法はありますでしょうか。

  • GPIOポートを使ったシリアル通信について

    GPIOポート(デジタルの汎用入出力)を用いてのシリアル通信について質問させて頂きます。 通常シリアル通信にはTxD,RxDといったシリアル通信用のピンを用いますが、これは通常1デバイスに一ポート程度しかありません。そこで、多数のシリアル通信デバイスを制御するのに、数のあるGPIOピンを用いることができないか、と検討しております。 具体的には、raspberry piやarduinoに搭載されるGPIOピンと制御したいデバイス(PICマイコンなど)のシリアル通信ポートを接続し、制御したいということです。 説明が下手で意図がうまく伝わらないと思いますが、できるかできないか、または参考になる資料など、なんでもいいので情報の提供をよろしくお願いいたします。 イメージしている接続を図示してみましたので、説明の足しになれば幸いです。

  • Arduino

    Arduinoのシリアル通信を用いてLCDに文字列を表示しようと思っています。 以下コード #include <LiquidCrystal.h> LiquidCrystal lcd(12, 11, 5, 4, 3, 2); //初期設定 void setup() { //LCDの初期設定(縦横のスケール) lcd.begin(16, 2); //起動後一回のみ表示 lcd.setCursor(2, 0); lcd.print("Hello world!"); delay(2000); lcd.clear(); //シリアル通信開始 Serial.begin(9600); } //動作開始 void loop() { lcd.setCursor(0, 0); lcd.print("Auto Mode"); lcd.setCursor(0, 1); lcd.print("Voltage = "); //データを受信時のみの動作 if (Serial.available()) { delay(100); lcd.clear(); while (Serial.available() > 0) { Serial.println("LCD Received!"); lcd.setCursor(10, 1); lcd.print(Serial.available()); } } } このコードでコンパイル後モニタを開き文字列を送信すると、 例 100を送信したとき⇒”0”のみ表示   101を送信したとき⇒”1”のみ表示 のように、最後の文字しか反映されません。 どのように修正したらよいでしょうか。

  • ArduinoとXbee、通信によるラグ、遅延

    ArduinoとXbeeによる無線通信を利用して複数の散水ポンプを遠隔操作でON/OFFしようとしていますがラグ(遅延時間)が生じて困っています。 構成としてArduinoとXbee間でシリアル通信を行い、それを二つ使って無線通信をしています。 ([Arduino←シリアル通信→Xbee]←無線通信→[Xbee←シリアル通信→Arduino]) 使用機器等 AVRマイコンはATmega168Pを使用し、互換性のある回路で動作させています。 XbeeRFモジュールはProではありません。 現状として思い通りに通信できているのは 送信側:シリアル通信で「h」,「j」を3秒経つ毎に繰り返し送信 受信側:「h」の時赤色LED出力、「j」の時黄色LED出力 この時はLEDが交互にラグもなく光ってくれます。 しかし、 送信側:デジタル入力でタクトスイッチのON/OFFを検出し、タクトスイッチを押した時にシリアル通信で「h」を、それ以外の場合(押していない時)は「j」を送信 受信側:「h」の時赤色LED出力、「j」の時黄色LED出力(変更なし) とした時、タクトスイッチを押したり離したりしてLEDで確認をするのですが、3回程押すと通信が途切れてしまうのかLEDが光っていたなら光ったまま数秒から十秒程固まってしまいます。 上記の送信側スケッチ例(プログラム) int button = 13; void setup() { Serial.begin(9600); pinMode(button, INPUT); } void loop() { if (digitalRead(button) == HIGH) { Serial.print('h'); } else { Serial.print('j'); } delay(1000); } 規則的な値を送信し、受信できているといった症状から問題は送信側のスケッチ(プログラム)だと思い、ダメもとでif else文ではなくswitch case文で書きましたが症状は変わりませんでした。 反応速度を上げて使用したいと考えておりdelay(100)等にするとラグが大きくなりました。 また、Xbeeの送信側をパソコンに繋ぎ 送信側:パソコンにXbeeを接続してXbeeの設定ソフトX-CTUのterminalから 「h」,「j」を交互に適当な間隔で送信 受信側:「h」の時赤色LED出力、「j」の時黄色LED出力(変更なし) とした時も同様にラグが発生しています さらに、 送信側:[ArduinoとXbee]アナログ入力に可変抵抗を繋ぎその値をシリアル通信で1秒毎に送信 受信側:パソコンにXbeeを接続してX-CTUのterminalでシリアル通信をモニタリング とした場合 シリアル通信で送ってきた値を1秒毎に表示→数秒後に値の表示が停止→数秒後、止まっていた間の値がまとめて表示→シリアル通信で送ってきた値を1秒毎に表示 の繰り返しです。 検索サイトで調べましたが、同様の症状が出でいる方が居られますが解決にまで至っていませんでした。また、同じような構成でラジコンを製作している方の動画ではラグも無く、ボタンやセンサーにすばやく反応している様でしたので何か設定などがあるのかと思い試していますがうまくいきません 何か解決策はないのでしょうか? お願いします。

  • シリアル通信

    現在、VB6でRS232Cを使いシリアル通信を行っています。一台のみでは何も考えなくてよかったのですが、複数台を同時に通信する場合、1台ずつコマンドの送受信を待ちながら通信を行うというやり方しかわかりません。 現在)1台目送受信開始→1台目送受信完了→1台目の結果の正否→2台目送受信開始→2台目送受信完了→2台目の結果の正否→3台目送受信開始… のように直列に進んでいる感じです。これを下記のように行いたいのです。 実際にやりたい事) 1台目送受信開始→1台目送受信完了→1台目の結果の正否 2台目送受信開始→2台目送受信完了→2台目の結果の正否 3台目送受信開始→3台目送受信完了→3台目の結果の正否 …… イメージとしては並列して送受信を行い1台目の送受信の結果を待たなくても2台目3台目と送受信を開始し、1台目の結果は2台目3台目の送受信をおこないながらでも、もらうことができるようにしたいのですが、どの ようにしたらいいか誰か教えてもらえないでしょうか? 宜しくお願いします。

  • Arduinoで複数のLEDマトリクスに映像出力

    私はこのページを参考に( http://kousaku-kousaku.blogspot.jp/2008/08/arduinoprocessingledweb.html )ArduinoMegaの互換機ChipKitMax32を使用して、12×32のLEDマトリクスを制御し映像を表示させています。 が、映像を表示させるには速度的に問題があり、参考先のプログラムではdelayMicrosecondsで各ドットの明るさを制御していますがそれも怪しく、映像自体のフレームレートを下げるなどしても改善せず、マイコン1台で映像表示するのは厳しいか…と思い、 8×8のLEDマトリクスにつき1台のArduino unoを使用し、それを何個も連結させ大きなLEDマトリクスにしようと考えました。 複数のArduinoを接続する方法として、I2CやSPI通信等がありますが、SPIでは後々Arduino unoのピン数が足りなくなるかもという不安もあり、複雑そうですがI2CでArduino同士を通信させようと思いました。 回路のイメージは添付画像の通り、 プログラムの内容は、 1 Processingから映像の各ドットの明るさの数値を受け取る 2 Arduinoマスタからスレーブ1へ最初の8つの数値を送る 3 スレーブ1がマスタから受け取った8つの数値をLEDマトリクス1の一行目の各ドットの明るさに割り振り点灯 4 Arduinoマスタからスレーブ2へ次の8つの数値を送る 5 スレーブ2がマスタから受け取った8つの数値をLEDマトリクス2の一行目の各ドットの明るさに割り振り点灯(LEDマトリクス1・2の一行目が点灯完了) これをあと7回くりかえし、LEDマトリクスの全画面の点灯完了 最終的には8×8のLEDマトリクスを10台程使用して、16×40のLEDマトリクスに映像を表示させたいです。 Arduinoで複数のLEDマトリクスを扱う場合、「映像表示の速度に耐えられるようにするために、Arduino自体の数を増やす、その通信をI2Cで行い、上記のようなプログラムで制御する」という方法で正しいか、可能かどうかの判断をお願いしたいです。 また、これより良い方法や、その他アドバイス等ありましたらお願い致します。

  • Arduino DS18B20 でデータが取得で

    Arduino DS18B20 でデータが取得できない。 回路は下のサイトを参考にしました。 ArduinoIDE 1.8.8 を使ってスケッチ例の"Dallas temprature" "tester" をボードに書き込みました。 シリアルモニターでは下のような表示です。 11:43:49.686 -> Requesting temperatures...DONE どうもデバイスが見つけられないようです。 回路はあっているように思いますが、問題の切り分け方 ありますでしょうか?

  • C言語のシリアル通信について

    C++でプログラムを書き、シリアル通信(RS232C)を使ってデバイスを動かしたいと試みているのですがよくわからないのでアドバイスお願いします。(OSはlinux) デバイス特有の命令を送るところがよくわかりません。(命令はキャラクタではなくバイナリで送らなければなりません。) 命令はバイナリデータです。 例、 char i[]={255,20,0,10}; ↑このようなデータです。 このようなデータを送る際はfwrite関数を使うということは調べたのですがどのように表すかわからないので教えていただきたいです。 初めのシリアルポートを開く際に”wb”をつけないといけないみたいですがどのようにつければいいのでしょうか。 fd=open("/dev/ttyS0",O_RDWR|O_NOCTTY|O_NONBLOCK); if(fd<0) { printf("erroe\n"); exit(-1); } ↑自分が書いたポートを開く時のプログラムです。最初の行の最後に”wb"を付け足せば良いのですか。 上記の例のような命令を送るとすると fwrite(&i,sizeof(char),4,fd); return 0; で良いでしょうか。warningがでて動作しないのでアドバイスよろしくお願いします。 説明が下手で申し訳ありません。一番わからない点はシリアル通信で命令を送るときのポートオープンとfwriteを使った命令を送る形式です。どうぞよろしくお願いします。

  • メモリリーダライタにユニークなシリアル番号

    メモリリーダライタの種類の中で1台1台に固有のデバイスシリアル番号を持つ製品はありますか?MR-K013シリーズを複数購入しましたが、Windows10で接続してデバイスマネージャーより調べたのですがどれも同じデバイスシリアルでした。 ※OKWAVEより補足:「エレコム株式会社の製品」についての質問です。

  • シリアル通信(RS-485とRS-644)について

    いつも大世話になります。 下記内容につき教えて下さい。 (1)RS-485  この方式ですと1ラインに出力可能なデバイス(端末)が複数接続することが可能だと思います。  トライステート(Hi-z)で出力衝突を物理的に回避できるる事は分かるのですが、制御が  よく変わりません。どのデバイスが出力して良い等はどの様にして制御するのでしょうか?  例)必ず1デバイスがマスター。他はスレーブでマスターから通信で指示が有った時だけ出力する等・・・。 (2)RS-644(LVDS)  この規格を調べたかったのですがWebで探せませんでした。  この電気的特性はどの様な仕様になりますでしょうか?  差動信号であることまでは理解できています。  また、RS-422とRS-644の仕様の信号が同じポートで受けられるPC増設のI/Oボードを  見かけました。  異なる仕様と思うので、なぜ共存できるのか分からずにいます。 おわかりになる方教えて下さい。 宜しくお願いいたします。 以上