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

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

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

MATLABはMathWorksで開発された数値計算や数値の視覚化のための高水準の対話型プログラミング環境です。

Raspberry Pi

Raspberry Piは、ラズベリーパイ財団が開発した、名刺サイズのLinuxコンピュータです。 学校で基本的なコンピュータ科学の教育を促進することを意図しています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

3回答

3295閲覧

ラズパイのGPIOを外部PCのPythonから制御する方法

sugi4961

総合スコア0

MATLAB

MATLABはMathWorksで開発された数値計算や数値の視覚化のための高水準の対話型プログラミング環境です。

Raspberry Pi

Raspberry Piは、ラズベリーパイ財団が開発した、名刺サイズのLinuxコンピュータです。 学校で基本的なコンピュータ科学の教育を促進することを意図しています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2021/12/01 14:45

編集2021/12/02 02:53

前提・実現したいこと

初心者です。
ラズパイの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の関数を用いて行っています)

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

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

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

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

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

ahidaka

2021/12/01 15:23

へたな旧世代PCよりも機能、性能が良いRaspberry Pi4を使うのに、Pythonをそこでは動作させず、Macbook ProでPythonを動かさなくてはならない必然的な理由がわかりません。 Psychopyなどを使わなくても、様々な正規の安定版のPythonと関連ライブラリがaptやpipが、Macbook Pro並にNativeで自由自在に利用できます。Native動作なので動作クロックから推測すると時間の精度もMacbook Proとは大差無く、リモート分の遅延が無くなります。 単にMacbook ProでPythonを使ってみたいだけではないでしょうか? そもそもアプローチが間違っていると感じるのはそこでは無いでしょうか? ④で、どこでどの様な理由で「パフォーマンスは落ちる」と言われているのかを、良く調べることをお勧めします。
退会済みユーザー

退会済みユーザー

2021/12/01 21:33 編集

> 実験器具: 詳細略,1/0のシンプルな制御だが可能な限り時間精度を高めたい(ms単位) Pythonでms単位の制御ができるかは微妙です。GPIOはシンプルなのでできるかもしれませんが、Pythonを使う時点でせいぜい●十ms程度だと思います。 詳しい人が来たら「どうしてCを使わない?即時性を求める言語じゃないだろう…」と突っ込まれそうな案件です(私には読み書きできません)。 参考:https://qiita.com/hanaata/items/c91788bcac2a40f1bb05 計算にもよりますが、PythonはNumpy(で扱う行列計算の一部やfor文など)の部分についてNumbaを使えばC並みになりますが、「Numbaが使えない処理(行列計算の一部やfor文など以外)」に関してははるかに遅いです。 分かりやすく書くと、 C≒NUMBA化したPython<MATHLAB<<無印Python > 普通は外部PCからラズパイを制御しようとはしないものなのでしょうか。 GPIOがついていないPCからGPIOを使いたいのであればこうするしかないと思います。 PythonでのGPIOの制御は簡単です。たとえば、 https://qiita.com/masato/items/715e28e0c0c945a54297 以下解決策です。 ■方法2' SSHを使えるということはソケット通信が使えるということですよね。 2のやり方に近いですが、以下のやり方でMACからRPiの制御ができます。 ・ SSHはそもそも不要 ・ RPi側でPythonを自動起動するようにする ・ MAC側から出すソケットに"今だよ"だとか"もう止めて"的なメッセージを載せる ・ RPi側のPythonのコードに受信したソケットに合わせてGPIOを制御させるコードを書く ソケット通信のサンプルはたとえば、 https://itsakura.com/python-socket ■方法5 MACにGPIOを付けてしまう https://www.elefine.jp/SHOP/USBGPIO8.html
thkana

2021/12/01 23:12

> そもそもアプローチが間違っているような気もします。 そう思います。 「心理実験」にミリ秒精度が必要なのですか? 本当に? まぁいいでしょう。本当に必要だとして。 なら、RaspberryPiはダメです。普通のLinuxはローカルですらそういう時間精度は保証できません(実力としてはともかく)。「あ、ちょっと時間かかっちゃった、てへ」で許されるならそれでもいいのかもしれませんが、そうなんですか? それなら「ミリ秒精度が必要」ではないということですよね。 まず、本当に必要なスペック、実現させなければいけないモノを確定させてください。「高めたい」とかの希望もいいですけれど、逆に「これ以下だと話にならない」ラインもあるでしょう。その他の制約条件もちゃんと挙げておいて、それから考え始めるべきと思います。
jbpb0

2021/12/02 00:37 編集

> サーバを介するとなると,いっそう時間のラグが大きくなりそう。 と書かれてますが、 > もともとはMATLABのラズパイ用サポートパッケージを使っていました の場合も、ラズパイではパソコンのMATLABと通信するサーバーが動いてるのではないのでしょうか? 【追記】 https://jp.mathworks.com/help/supportpkg/raspberrypiio/ref/getting-started-with-matlab-support-package-for-raspberry-pi-hardware.html の「Prerequisites」に、「MATLAB communicates with the Raspberry Pi hardware by connecting to a server running on Raspberry Pi.」と書かれてました やはり、ラズパイでサーバーが動いてますね
sugi4961

2021/12/02 03:00

皆様ありがとうございます。大変助かります。 とくに重要と思われる箇所は本文のほうに追記いたしました。 そのうえで個別にご返信させていただくと, >> ahidakaさま ありがとうございます。ラズパイの実力をわかっていなかったようです。 ひとまず直接ラズパイ上で動かしてみつつ,Psychopyのサポートチームにも知見を伺ってみます。 なお,Macを使う”必然的な”理由はありませんが,ふつうのPC上で動いてくれる方がラボの後輩に指導したり引き継いだりするのが楽……という,非本質的な事情は多分にあります。 それから単にMacbook ProでPythonを使ってみたいだけ」については,ご発言の意図を汲みかねました。MacでPythonを使うことに付加価値を感じる人がいるのかどうか,素朴によくわかりませんが,私がそうだと決めつけるのはさすがに邪推ではないでしょうか,と思います。 >> fourteenlengthさま 大変参考になります。 ご提示くださった案は,(私の実力では)試してみるのに時間を要しそうですので,取り急ぎ御礼のご連絡です。 >> thkanaさま ありがとうございます。基本的には追記したとおりです。 >> jbpb0さま ありがとうございます。 なるほど……中身をまったく確認せずにMATLABを使っていました。 であれば,同様の方法をPythonでとっても,今と同程度の精度は出せそうですね。 (Prerequisitesくらい読んでから使えよという話ではありますが)本当に助かります,ありがとうございました。
thkana

2021/12/02 03:45

精度とひとくちに言っていますが、全ての動作が精度が必要なわけでもないのでは。 ありがちなパターンだと刺激発生->反応時間を測る、ここは10ms以内の精度で測りたいけれど、試験開始->刺激発生までの時間、あるいは刺激発生を繰り返すその間隔は百ms単位で管理できれば十分、とかあるのではないでしょうか。 とすると、RaspberryPiを(通信経路のラグなどが影響しまくる)リモートのGPIOとするのではなく、刺激発生->反応時間を測る部分の処理をパッケージにしてRaspberryPiのローカル処理とし、その処理単位をPC(Mac)から呼び出す、ようなシステムも考えられるでしょう。 もっとも、すでに話もでていますが、RaspberryPiで全てが賄えるならばまとめてしまうのが一番簡単ですね。 それと、言葉の定義の話になっちゃいますが「サーバ」というのは物理的な別のコンピュータという意味ではなく、単に「そういう機能を持ったプログラムを別個に動かして処理を委託すること」でしかなく、必ずしも「サーバを介する」=時間がかかる、という話でもないです。
jbpb0

2021/12/02 07:47 編集

> 同様の方法をPythonでとっても,今と同程度の精度は出せそうですね。 MATLABとPythonの違いや、ラズパイ側で動いてるものの違いもあるので、実際のところはやってみないと分かりませんが、同程度の精度が出る「可能性」はあります
guest

回答3

0

そもそも、OSにLinuxを使ってる時点で時間精度を求めるのはムリムリかと思います
まあ、たまにずれても構わないというのであればいいでしょうけど。

そういうのを前提でいきますと、LANを使うんであれば、TCPよりUDPソケットを使ったほうが、もしかしたら、シリアル通信を使うほうがいい結果が出るかもしれません
文字列で1にするコマンド、0にするコマンドを決めておいて、それで信号のやり取りをします

投稿2021/12/02 04:20

y_waiwai

総合スコア88163

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

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

0

ラズパイのGPIOを外部PCから制御する方法

Raspberry Piを設定する の「インターフェイス」
の「リモートGPIO」を有効にして、
raspberrypi pigpioでリモート制御 2020/05/31
の手順で可能なようですが、それで

可能な限り時間精度を高めたい(ms単位)

が可能かは分かりません

投稿2021/12/01 23:15

jbpb0

総合スコア7658

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

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

0

自己解決

皆さまありがとうございました!
なんとかラズパイへのPsychopyインストールに成功し,ラグを測ってみたところ大きさ/Precisionともに充分な値が出ていました。
(GPIOをHIGHにする→実験装置が物理的に動く(詳細略)→動いたかどうかを判定する,の行程に要する時間が11−12msにほぼ収まっていました。物理運動にかかっている時間をのぞけば,10ms未満のラグしか生じていないと思われます)

結果的に直接叩き込むかたちになりましたが,接続の方法等もろもろご教示くださった皆さまにも大変感謝しております(ベストアンサーを誰にも出せず申し訳ないです…)。
実験環境次第ではリモートで操作する可能性も依然としてありますので,今後の参考にさせていただきます。
改めて,皆さま本当にありがとうございました。

投稿2021/12/09 14:51

sugi4961

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.31%

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

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

質問する

関連した質問