前提・実現したいこと
初心者です。
ラズパイのGPIOを外部PCから制御する方法を教えていただきたいです。
【状況】
Macbook Pro (Mojave, 10.14.6): ここでPythonを動かす
Raspberry pi 4B: 有線LANでMacbookと接続,GPIOで実験器具を制御
実験器具: 詳細略,1/0のシンプルな制御だが可能な限り時間精度を高めたい(ms単位)
私は心理実験用のプログラムをPythonで作っており,実験の途中で外部PCからラズパイに信号を送ってGPIOの制御を行うのが目標です。
もともとはMATLABのラズパイ用サポートパッケージを使っていました( →■ )。これは
MATLAB
1writeDigitalPin(mypi,pinNumber,onoff); 2```と打つだけでGPIOが制御できて非常に楽だったのですが,諸事情(→註1)でMATLABをやめてPythonを使って実験を作らねばならなくなりました。 3 4ところが,Pythonでこれに相当するものを探したものの,よくわかりませんでした。 5Pythonでは(MATLABのwriteDigitalPin()に相当する)かんたんなGPIOの制御方法はないのでしょうか? 6普通は外部PCからラズパイを制御しようとはしないものなのでしょうか。 7それとも,根本的になにかを勘違いしているのでしょうか? 8 9以下に検討中のプランを記します。 10また,最下段に参考としてMATLABでのGPIO制御スクリプトを簡単に載せておきます。 11些細な情報でも結構ですので,情報をくださると本当に助かります。 12よろしくお願いいたします。 13 14### 【追記1 (12/2)】 15皆さまご助言ありがとうございます。 16コメントを踏まえ,いくつか情報を追加いたします。 17 18###### ⅰ. Macbookを使う必然的な理由 (→ahidakaさま) 19ありません。 20私がラズパイの性能を見くびっていたようですが,ラズパイ上で問題なくPsychopyが走るのであればなんら問題はありません。 21件のパフォーマンス低下にかんしては,直接サポートチームに確認してみます。 22 23###### ⅱ. 求められる精度 (→thkanaさま)** 24正確に書きますと, 25ラグの大きさ(PC上の実行からGPIO値が変化するまで): 30ms以下が理想,50msはかなり厳しい,100ms以上は論外 26ラグのprecision(ラグ間のばらつきの大きさ): ラグの大きさに依存するが,2σ区間で±10ms未満が理想,20msを超えると厳しい,50ms以上は論外 27このようになります。 28 29心理実験と書きましたが,正確には認知神経科学,いわゆる脳科学です(嘘をついたわけではなく,心理学という語の幅が広いだけです)。相応の精度が求められます。 30視覚実験の多くはリフレッシュレートに合わせて画像を提示しており,したがってその精度はおおむね(普通のモニターであれば)60Hz,つまり17msです。 31この程度に収まるのが理想ですが,実験内容の都合上もう少しばらついても仕方ない,という認識です。 32 33###### ⅲ. Pythonである理由 (→fourteenlengthさまほか)** 34心理・認知実験では,註でもふれたとおり,PsychtoolboxやPsychopyを使うのが一般的です。 35(上にも書いたように)視覚刺激の時間精度はモニターのリフレッシュレートが事実上の上限であり,逆に言えばリフレッシュレートに合わせて刺激が出せればそれで十分といえます。 36そしてPsychtoolboxもPsychopyも,そのレベルで言えば求められる精度は達成できている……はずです(ダメな場合,かなりの数の論文が破綻します)。 37※もちろん実際の実験では,単にGPIOを制御するだけではなく,モニターに様々な視覚刺激を提示したり音刺激を出したりする必要があります。 38 39C言語等で実験を実装するのももちろん可能だとは思いますが,あまり現実的ではないです(スキルが属人的になりすぎると引継ぎ時に困る,という研究上の都合も多分にあります)。 40 41### 考えたこと 42 43###### ①ssh接続したラズパイを,MacからPythonのsubprocessを用いて動かす 44「ラズパイ 外部PC 制御」等で調べると,(1)ターミナルからssh接続する→(2)ターミナルでそのままコードを叩いてGPIOをいじくる,という方式が多く出てきました。 45しかしメインのプログラムはあくまでPythonなので,この方法を採用する場合,Pythonの途中でsubprocess,run()等をもちいてターミナルコマンドを無理やり走らせることになるのかな? と思いました。 46 47**欠点**: 時間の精度に不安がある。Python→ターミナル(?)→ラズパイ…だと,ms単位でみるとラグがありそう。また,素人目には強引な感じがする。 48 49###### ②ラズパイ内でGPIO制御のコードだけ書いておき,Pythonの途中でそれを呼び出して走らせる 50①とほぼ同じかもしれませんが,MacのPythonスクリプトの途中で,やはりsubprocess.run()等をもちいて強引にラズパイ側のGPIO制御ファイルを動かすのも可能かな,と思いました。 51 52**欠点**: GPIO制御のファイルはラズパイ内で勝手に走ってしまうので,Macbook側から挙動を正しくモニターできなさそう。実験の都合上,いつGPIOがONになり,またいつOFFになったか,正確に記録できないとまずい。 53 54###### ③WebIOPiを使う 55現時点では,サーバを立てることでGPIOを制御できる……という程度の理解しかないです。 56 57**欠点**: サーバを介するとなると,いっそう時間のラグが大きくなりそう。 58 59###### ④ラズパイ内にPsychopyを叩き込む 60ラズパイにPsychopy(実験用のPythonモジュール,→註1-2)を叩き込み,いわばラズパイ単品ですべて行うのも不可能ではないらしいですが…。 61 62**欠点**: 「パフォーマンスは落ちる」と言われている。具体的にどのような問題が生じるのかは今のところ情報不足。時間精度が落ちると困る。 63 64###### ⑥総じて 65そもそもアプローチが間違っているような気もします。 66writeDigitalPin()くらい簡単な制御方法があればよいのですが……改めて,情報をくださると本当に助かります! 67 68### 註釈 691: 実験用のMATLABパッケージであるPsychtoolboxの挙動がMacOSでは不安定であり(Mojaveのままアプデしていないのもそれが理由です),そろそろPythonでの実験用パッケージであるPsychopyに移行しようと考えています。Psychopyでは時間精度が落ちるらしいのですが,MATLABはもはや動きすらしないので……。 70 712: 正確には,註1にあるとおり,「Psychopyで書いたスクリプトの途中に」です。ふつうのpyファイルと基本的に同じだと思うのですが,Psychopyは単独でアプリケーション化しているので,内部で動かせるモジュール等にやや制限があったりするのかもしれません。 72 73### MATLABによるGPIO制御スクリプト(参考) 74```MATLAB 75IP = '169.xxx.xxx.xxx'; % ラズパイのIPアドレス 76uName = 'xx'; % ラズパイのユーザーネーム 77pass = 'xxxxx'; % ラズパイのパスワード 78 79mypi = raspi(IP, uName, pass); % これで接続できます 80 81configurePin(mypi, 25, 'DigitalOutput'); % これで25番のピンが出力に使えます 82 83writeDigitalPin(mypi, 25, 1); % ピンをONにして 84pause(1.0) % 1秒休み 85writeDigitalPin(mypi, 25, 0); % ピンをOFFにします 86```(実際の実験では,時間の制御はpause()ではなくPsychtoolboxの関数を用いて行っています)


回答3件
あなたの回答
tips
プレビュー