• 締切済み

ラズパイをスレーブに設定してデータを受信したい

初めて質問させていただきます。失礼がありましたら申し訳ございません。 ラズパイに外部からクロック信号とデータ信号を入力(ラズパイをスレーブに)してデータを処理したいと考えています。信号は1MHzのSPI通信をさせたいと思っていますが、ラズパイをスレーブにする事例はあまり情報がなく困っております。適当な事例等ございましたら教えてください。通信方式が適当でなければ、あわせてご教授いただければ幸いです。よろしくお願いします。(プログラムはpythonで作成しています)

みんなの回答

  • TIGANS
  • ベストアンサー率35% (244/680)
回答No.5

>通信相手は癖のある装置でSPI通信と称してクロックとデータを送信してきます。送信データの型は決まっていてやり取りもできないため、ラズパイをスレーブにして受信し、データを処理しようと思いました。データを処理する目的は既存の計測システムに組み込むためです。 それならFTDIのft311Dが載ったUSB変換ボードをSPIslave設定にしてPCにつなぐだけ。CJMCU-311なら10ドル以下でも売ってる。 Windowsにデバイスドライバ入れといて接続すればVCPとして接続できて ポートからTeratermでデータロギングできるのではなかったかな。 https://www.ammlab.org/labo/FT311D/index.html

  • lumiheart
  • ベストアンサー率47% (1096/2285)
回答No.4

>USBで受信することはできないでしょうか? 定石的にはUSB-シリアル通信 http://akizukidenshi.com/catalog/g/gM-00720/ シリアル側はRS232C、RS422、TTLレベル その他色々 いにしえの昔からパソコンで計測制御するには常套手段 令和時代になっても未だRS232Cは現役 <所謂レガシーI/F ラズパイのUSBにUSB-シリアル変換器は使用できるよ 普通に増設シリアルポートとして認識される

leo_liooni
質問者

お礼

アドバイスありがとうございました。USB-シリアル変換器は発注済です。試してみます。 通信相手は癖のある装置でSPI通信と称してクロックとデータを送信してきます。送信データの型は決まっていてやり取りもできないため、ラズパイをスレーブにして受信し、データを処理しようと思いました。データを処理する目的は既存の計測システムに組み込むためです。単なる受信ならロジアナでよいのですが、データをリアルタイムで処理するロジアナは高価ですので、まずはラズパイでと考えた次第です。いろいろな情報、ありがとうございました。

  • lumiheart
  • ベストアンサー率47% (1096/2285)
回答No.3

そもそも何故SPIなの? https://www.analog.com/jp/analog-dialogue/articles/introduction-to-spi-interface.html https://www.ei.tohoku.ac.jp/xkozima/lab/raspTutorial3.html 最大の問題は通信距離 同一筐体内部の短距離用 https://www.analog.com/jp/education/landing-pages/003/bbs/bbs_18.html 何事にも例外はあるもんで https://www.analog.com/jp/products/ltc6820.html 「最大100メートルのケーブル長をサポート」 短距離用じゃあなかったの? 定石的にはシリアル通信でしょうね 所謂、RS-232C、RS-422、RS-485 計測制御用途ならModbus https://www.m-system.co.jp/mstoday/plan/mame/b_network/9911/index.html ラズパイでもArduinoでも実装事例はググれば沢山出て来る(ほとんどは英文ですが)

  • TIGANS
  • ベストアンサー率35% (244/680)
回答No.2

回答No.2です。USBだと更に難しくなるでしょう。 UART(非同期シリアル)か TCP-IP(LAN)を使うべきでしょう。

  • TIGANS
  • ベストアンサー率35% (244/680)
回答No.1

不可能ではないですがいろいろ面倒だと思います。 https://github.com/offis/raspi-directhw http://offis.github.io/raspi-directhw/group__spisl.html を参照してみてください。 うまくいかないという記述もありますので期待しないように。 http://www.cenav.org/raspi5/ 最新のラズパイ4ではスレーブ機能自体が使えないようです。 https://www.raspberrypi.org/forums/viewtopic.php?t=250788 >1MHzのSPI通信をさせたい ソフトウェアでスレーブ機能を実現できますが、高速だと取りこぼしなどが生じる可能性が高いかと思います。 http://terminal28.blogspot.com/2015/12/bitbanging-spi-on-raspberry-pi-via-spi.html 高速化に対する解決法は2つ (1)ラズパイ外側にSPI用にマイコンチップなどを付けバッファリングを任せる。 (2)ZinqberryのようなFPGAの載ったラズパイでスレーブ機能を実装する。 以上です。

leo_liooni
質問者

補足

早々のご回答、ありがとうございます。大変参考になりました。提案していただいた方法、検討させていただきます。追加の質問で申し訳ないのですが、SPIではなくUSBで受信することはできないでしょうか?データの最初4byteは事前にわかっていますのでこれをSOFとして受信することは可能でしょうか?(少し調べてみましたが、USB通信自体が初めてで的外れなことを言っているのかもしれません。)

関連するQ&A

  • ラズパイ3のSPI通信で文字列出力

    現在、ラズパイ3とアトメルのマイコン搭載の基板とをSPI通信で通信するためのコードをpythonで作成しています。 https://github.com/KenjiMaehara/raspberryPiTCPClient/blob/master/testSpi161101/test20161202.py 前回まで、サンプルのコードを参考に”hello”とい文字列をラズパイ3のSPI1ポートから出力していたのですが、 (中略) print "writing data" #hello spi (ASCII) data = [104, 101, 108, 111, 32] #str(spi.xfer2(data)) spi.xfer2(data) (中略) 文字列をSPIポートから出してみたいと思い、次のようにコードしました。 (中略) print "writing data" #hello spi (ASCII) data = "abcdefg" spi.xfer2(data) (中略) しかしこの場合、 $ sudo python test20161202.py test20161202.py:16: RuntimeWarning: This channel is already in use, continuing anyway. Use GPIO.setwarnings(False) to disable warnings. GPIO.setup(16, GPIO.OUT) writing data このようなエラーがでてpythonでコードを実行できません。 data = "abcdefg" このような文字配列で文字列を出力するコードを書くことはできないのか、ご教示よろしくお願い致します。

  • ラズパイでGUIプログラミングしたい

    現在raspberry pi3を使用しています。このラズパイにタッチパネルディスプレイを接続しています(waveshare社製 7inch HDML LCD)。 このタッチパネルを利用して、大きいコマンドボタンを描画して、トグル動作でON,OFFを表現してその信号を出力に設定したGPIOピンに出力したいと思っているのですが、使いやすくて優しいGUI開発環境などをご教示頂きますよう、よろしくお願い致します。 GPIOの制御などのプログラムはラズパイではpythonを使うことが多いです。 ぜひよろしくお願い致します。

  • SPI通信 複数slaveの接続

    MSP430というマイコンにてSPI通信で複数のデバイスとのやり取りを テスト中です。 Chip selectという機能を用いて使用するslaveの選択をしている つもりですが、うまく動作しません。 とりあえずマイコンと一つのslaveデバイスを接続した場合うまく動き、 またもう一つ別のslaveデバイスとマイコンだけを接続した場合も うまく動きます。ところが、二つのslaveデバイス両方をマイコンに 接続している時は、slaveからマイコンへの信号をマイコンが受ける 時点で止まってしまいます。 MISO, MOSI, クロック用ラインはマイコンと二つのslaveデバイスで 共有接続しています。 chip selectを送るラインは、マイコンの二つのポートからそれぞれの slaveデバイスに個別につなげるようにしています。 slaveデバイス(SCP-1000)のマニュアルにはchip selectをhighにすると MISOラインはハイインピーダンスになると記載があります。MISOラインは 別のslaveデバイスとも接続されているのですが、片方のslaveで ハイインピーダンスになっても、それと接続されているもう片方の slaveのMISOはきちんとデータのやり取りをしてくれるのでしょうか? その他、slave複数接続時の確認事項などご教授いただければと思います。

  • AVRでUART通信をしたい

    誰か助けてください!! AVRTiny2313を利用してUART通信するプログラムを組んでいます。 信号はどうやら出力しているようなのですが、レートがおかしいのです。 データシートより、「駆動周波数/16/ボーレート-1」で9600bpsの通信速度を設定しているはずなのですがオシロで確認したところ8倍位遅いレートで通信してるのです。 ヒューズでは内部8MHz、外部8MHz(外部に8MHzのセラロックが付いてます)共に試してみましたが変化ありません。 周波数が本当に8MHzなのか確かめる為にクロックを外部に引き出し、オシロで計測してみましたが位相がかなりブレていて波形が見えませんでした(太い1本の線みたいに見えます) ちなみにF_CPU値も8000000と設定してていますので式は間違いないとは思うのですが…。 私の書いたソースに問題が有るのかと思い他所様のエコーバックテストのソースで通信してみましたがやはり同じように何倍も長い信号が出力されました。 あと考えられるとすればクロックがCPUに供給される前にプリスケーラで分周されている位しか考えられないのですがそれっぽい事はデータシートに記載は無いです。 他に設定を見直す箇所が有れば何方か教えてください!!

  • アトメルのマイコンで、SPI通信で送信ができない

    現在ラズパイ3とAtmelのマイコンATxmega128A1を乗せた基板とをSPI通信させようとしています。 (簡易的な通信の仕様) ・簡易的なパケットデータをラズパイ3側からSPI1の通信ポートからデータを送信。 ・ATxmega128A1側のSPIFポートでデータを受信して、受信内容に応じて1バイトデータをラズパイ3に返送します。 ・ラズパイ3側はパケットデータ3バイトで順番に0x02 -> 0x16 -> 0x00 と送信します。 ・ATxmega128A1側はこのパケットでATxmega128A1のPK1(76番ピン)の入力のH or Lの値をラズパイ3側に返送します。 ATxmega128A1にAtmel-ICEでデバッグしながらプログラムを作っていてわかったのは、ラズパイから送信されてきた3バイトのデータは配列のcmd_data[]の cmd_data[0] = 0x02 cmd_data[1] = 0x16 cmd_data[2] = 0x00 このようにデータが入ってきていて、この部分のSPI通信は問題ないと思うのですが、 https://github.com/KenjiMaehara/raspberryPiTCPClient/blob/master/testSpi161101/M1601A_20161205/MainUnit/event.c こちらの140行目付近の case INPUT_CH18: testtest = get_ch18_Input(); if(testtest==0) { txdata=0x55; } else { txdata=0xaa; } get_ch18_Input()で入力ピンのPK1(76番ピン)のH or Lの値をとって、それによって、txdataに0x55 or 0xaaを入れているのですが、 そのデータを実際に送信しようと SPIF.DATA = txdata; while(!(SPIF.STATUS & 0x80)); dummy = SPIF.DATA; このようにコーディングしたのですが、データ送信されません。 SPIF.DATA = txdata; この部分をデバッガでレジスタの設定などを見ていくと、txdata = 0x55と入っていても SPIF.DATAの内容は全く0x55に書き換わらないのですが、この場合、何かSPI通信の設定で確認したほうがよい内容などをご教示頂きますよう、よろしくお願い致します。

  • i2cの事

    i2cの通信でマスターはラズパイを使おうと追っていますが、スレーブとしてデジタルのデーターをマスターの要求に従い送信する様なデバイスが単体で有りますか。 または流用できるような素子がありますか。

  • RTCの通信方法について

    RTCの通信方法について マイコンにて外付けのEEPROM(SPI通信)とRTCを制御しようと思っているのですが、RTCの通信方法をSPIかI2Cかで迷っています。 仕様的には、1分間隔のRTCからの信号で割込みを掛け、時刻を読み込むとなります。 1分間隔の割込みで毎回SPIの通信速度の変更を行う(SPIのEEPROMのクロックの方がSPIのRTCに比べて相当早い)であれば、I2Cで制御した方がよろしいのでしょうか? よろしくお願い致します。

  • AccessでRS232Cからデータを受信したい

    Access2019を使用しています。 RS232C経由で、外部機器データを取り込みたいと思います。 スィッチがオンになったときとオフになったときのデータをその都度取り込みたいです。 通信方法も設定、受信方法などもわかりません。 サンプルプログラムなどありましたら教えてください。 よろしくお願いいたします。

  • PICのSPI通信(ハード)

    PICのSPI通信の回路を本で見るとSDOとSDIをそのまま接続しているのが多いのですが一部にはSDO、SDI、SCKをプルアップするものがあります。I2Cの場合は2線ともプルアップするようですがSPIの場合はクロックの極性によって変える必要があるのではないかと思ったのですがどうなのでしょうか? クロック極性CKP=0(アイドル=Low)の時はプルダウンしておいた方が良いのではと。SDO、SDIも同様の方が良いのでしょうか? どちらかに固定しておかないと不安定になりそうな気がしますが。 またクロックは長いほうが安定してデータが送れるものなのでしょうか?(Fosc/4よりFosc/64の方がノイズ等には強い?) ちなみに現在使用中はマスター18F452でスレーブが16F877と16F88です。よろしく御願いします。

  • ポインタで特定のアドレスにアクセスできるのでしょうか

    armadillo9(マスター)とFPGA(スレーブ)で、SPI通信をしようと思っています。 調べたのですが、PICなどのマイコンの通信方法がでてきて、Armadillo9上でC言語で通信する方法は見つかりませんでした。 おそらく、SPI1 Data Register(0x808A+0x08)というアドレスでデータを送受信するのではと考えたのですが、Cのポインタで特定のアドレスにアクセスすることは可能なのでしょうか? 冗長な質問ですがお願いいたします。