質問編集履歴

4

追記

2021/12/02 02:53

投稿

sugi4961
sugi4961

スコア0

test CHANGED
File without changes
test CHANGED
@@ -96,6 +96,10 @@
96
96
 
97
97
  そしてPsychtoolboxもPsychopyも,そのレベルで言えば求められる精度は達成できている……はずです(ダメな場合,かなりの数の論文が破綻します)。
98
98
 
99
+ ※もちろん実際の実験では,単にGPIOを制御するだけではなく,モニターに様々な視覚刺激を提示したり音刺激を出したりする必要があります。
100
+
101
+
102
+
99
103
  C言語等で実験を実装するのももちろん可能だとは思いますが,あまり現実的ではないです(スキルが属人的になりすぎると引継ぎ時に困る,という研究上の都合も多分にあります)。
100
104
 
101
105
 

3

追記

2021/12/02 02:53

投稿

sugi4961
sugi4961

スコア0

test CHANGED
File without changes
test CHANGED
@@ -47,6 +47,56 @@
47
47
  些細な情報でも結構ですので,情報をくださると本当に助かります。
48
48
 
49
49
  よろしくお願いいたします。
50
+
51
+
52
+
53
+ ### 【追記1 (12/2)】
54
+
55
+ 皆さまご助言ありがとうございます。
56
+
57
+ コメントを踏まえ,いくつか情報を追加いたします。
58
+
59
+
60
+
61
+ ###### ⅰ. Macbookを使う必然的な理由 (→ahidakaさま)
62
+
63
+ ありません。
64
+
65
+ 私がラズパイの性能を見くびっていたようですが,ラズパイ上で問題なくPsychopyが走るのであればなんら問題はありません。
66
+
67
+ 件のパフォーマンス低下にかんしては,直接サポートチームに確認してみます。
68
+
69
+
70
+
71
+ ###### ⅱ. 求められる精度 (→thkanaさま)**
72
+
73
+ 正確に書きますと,
74
+
75
+ ラグの大きさ(PC上の実行からGPIO値が変化するまで): 30ms以下が理想,50msはかなり厳しい,100ms以上は論外
76
+
77
+ ラグのprecision(ラグ間のばらつきの大きさ): ラグの大きさに依存するが,2σ区間で±10ms未満が理想,20msを超えると厳しい,50ms以上は論外
78
+
79
+ このようになります。
80
+
81
+
82
+
83
+ 心理実験と書きましたが,正確には認知神経科学,いわゆる脳科学です(嘘をついたわけではなく,心理学という語の幅が広いだけです)。相応の精度が求められます。
84
+
85
+ 視覚実験の多くはリフレッシュレートに合わせて画像を提示しており,したがってその精度はおおむね(普通のモニターであれば)60Hz,つまり17msです。
86
+
87
+ この程度に収まるのが理想ですが,実験内容の都合上もう少しばらついても仕方ない,という認識です。
88
+
89
+
90
+
91
+ ###### ⅲ. Pythonである理由 (→fourteenlengthさまほか)**
92
+
93
+ 心理・認知実験では,註でもふれたとおり,PsychtoolboxやPsychopyを使うのが一般的です。
94
+
95
+ (上にも書いたように)視覚刺激の時間精度はモニターのリフレッシュレートが事実上の上限であり,逆に言えばリフレッシュレートに合わせて刺激が出せればそれで十分といえます。
96
+
97
+ そしてPsychtoolboxもPsychopyも,そのレベルで言えば求められる精度は達成できている……はずです(ダメな場合,かなりの数の論文が破綻します)。
98
+
99
+ C言語等で実験を実装するのももちろん可能だとは思いますが,あまり現実的ではないです(スキルが属人的になりすぎると引継ぎ時に困る,という研究上の都合も多分にあります)。
50
100
 
51
101
 
52
102
 

2

誤字

2021/12/02 02:41

投稿

sugi4961
sugi4961

スコア0

test CHANGED
@@ -1 +1 @@
1
- ラズパイのGPIOを外部PCのPythonから(ターミナルを使わずに)制御する方法
1
+ ラズパイのGPIOを外部PCのPythonから制御する方法
test CHANGED
File without changes

1

途中で誤投稿されたので訂正しました。

2021/12/01 14:47

投稿

sugi4961
sugi4961

スコア0

test CHANGED
File without changes
test CHANGED
@@ -8,64 +8,136 @@
8
8
 
9
9
 
10
10
 
11
- 私は心理実験用のプログラムを作っており,実験の途中で外部PCからラズパイに信号を送ってGPIOの制御を行うのが目標です。
11
+ 【状況】
12
12
 
13
+ Macbook Pro (Mojave, 10.14.6): ここでPythonを動かす
14
+
15
+ Raspberry pi 4B: 有線LANでMacbookと接続,GPIOで実験器具を制御
16
+
17
+ 実験器具: 詳細略,1/0のシンプルな制御だが可能な限り時間精度を高めたい(ms単位)
18
+
19
+
20
+
21
+ 私は心理実験用のプログラムをPythonで作っており,実験の途中で外部PCからラズパイに信号を送ってGPIOの制御を行うのが目標です。
22
+
13
- もともとはMATLABのラズパイ用サポートパッケージを使っていました→[■](https://jp.mathworks.com/help/supportpkg/raspberrypiio/index.html?searchHighlight=raspberry&s_tid=srchtitle_raspberry_8)。これは
23
+ もともとはMATLABのラズパイ用サポートパッケージを使っていました( →[■](https://jp.mathworks.com/help/supportpkg/raspberrypiio/index.html?searchHighlight=raspberry&s_tid=srchtitle_raspberry_8) )。これは
14
24
 
15
25
  ```MATLAB
16
26
 
17
27
  writeDigitalPin(mypi,pinNumber,onoff);
18
28
 
19
- ```と打つだけでGPIOが制御できて非常に楽だったのですが,諸事情でMATLABをやめてPythonを使って実験を作らねばならなくなりました。
29
+ ```と打つだけでGPIOが制御できて非常に楽だったのですが,諸事情(→註1)でMATLABをやめてPythonを使って実験を作らねばならなくなりました。
20
30
 
21
31
 
22
32
 
33
+ ところが,Pythonでこれに相当するものを探したものの,よくわかりませんでした。
34
+
35
+ Pythonでは(MATLABのwriteDigitalPin()に相当する)かんたんなGPIOの制御方法はないのでしょうか?
36
+
37
+ 普通は外部PCからラズパイを制御しようとはしないものなのでしょうか。
38
+
39
+ それとも,根本的になにかを勘違いしているのでしょうか?
23
40
 
24
41
 
25
42
 
43
+ 以下に検討中のプランを記します。
44
+
45
+ また,最下段に参考としてMATLABでのGPIO制御スクリプトを簡単に載せておきます。
46
+
47
+ 些細な情報でも結構ですので,情報をくださると本当に助かります。
48
+
49
+ よろしくお願いいたします。
26
50
 
27
51
 
28
52
 
29
- ### 発生している問題・エラーメッセージ
53
+ ### 考えたこと
30
54
 
31
55
 
32
56
 
33
- ```
57
+ ###### ①ssh接続したラズパイを,MacからPythonのsubprocessを用いて動かす
34
58
 
35
- ラーメッセ
59
+ ズパイ 外部PC 制御」等で調べると,(1)タミナルからssh接続する→(2)タミナルでそのままコードを叩いてGPIOをいじくる,という方式が多く出てきました。
36
60
 
37
- ```
61
+ しかしメインのプログラムはあくまでPythonなので,この方法を採用する場合,Pythonの途中でsubprocess,run()等をもちいてターミナルコマンドを無理やり走らせることになるのかな? と思いました。
38
62
 
39
63
 
40
64
 
41
- ### 該当スコード
65
+ **欠点**: 時間精度に不安がある。Python→タミナル(?)→ラズパイ…だと,ms単位でみるとラグがありそう。また,素人目には強引な感じがする。
42
66
 
43
67
 
44
68
 
45
- ```ここに言語名入力
69
+ ###### ②ラズパイ内でGPIO制御のコードだけ書いておき,Pythonの途中でそれ呼び出して走らせる
46
70
 
47
- ソーコード
71
+ ①とほぼ同じかもしれませんが,MacのPythonクリプトの途中で,やはりsubprocess.run()等をもちいて強引にラズパイ側のGPIO制御ファイルを動かすのも可能かな,と思いました。
48
-
49
- ```
50
72
 
51
73
 
52
74
 
53
- ### した
75
+ **欠点**: GPIO制御のファイルはラズパイ内で勝手に走ってまうので,Macbook側から挙動を正しくモニターできなさそう。実験の都合上,いつGPIOがONになり,まいつOFFになったか,正確に記録できないまずい。
54
76
 
55
77
 
56
78
 
79
+ ###### ③WebIOPiを使う
80
+
57
- ここに問題に対し試したことを記載てください。
81
+ 現時点では,サーバを立ことでGPIO制御できる……という程度の理解かなです
58
82
 
59
83
 
60
84
 
61
- ### 補足情報(FW/ツルのージョンど)
85
+ **欠点**: ーバを介するとると,いっそう時間のラグが大きくなりそう。
62
86
 
63
87
 
64
88
 
65
- ここより詳細な情報記載してください。
89
+ ###### ④ラズパイ内Psychopy叩き込む
90
+
91
+ ラズパイにPsychopy(実験用のPythonモジュール,→註1-2)を叩き込み,いわばラズパイ単品ですべて行うのも不可能ではないらしいですが…。
66
92
 
67
93
 
68
94
 
69
- ### 注釈
95
+ **欠点**: 「パフォーマンスは落ちる」と言われている。具体的にどのような問題が生じるのかは今のところ情報不足。時間精度が落ちると困る。
70
96
 
97
+
98
+
99
+ ###### ⑥総じて
100
+
101
+ そもそもアプローチが間違っているような気もします。
102
+
103
+ writeDigitalPin()くらい簡単な制御方法があればよいのですが……改めて,情報をくださると本当に助かります!
104
+
105
+
106
+
71
- *
107
+ ### 註釈
108
+
109
+ 1: 実験用のMATLABパッケージであるPsychtoolboxの挙動がMacOSでは不安定であり(Mojaveのままアプデしていないのもそれが理由です),そろそろPythonでの実験用パッケージであるPsychopyに移行しようと考えています。Psychopyでは時間精度が落ちるらしいのですが,MATLABはもはや動きすらしないので……。
110
+
111
+
112
+
113
+ 2: 正確には,註1にあるとおり,「Psychopyで書いたスクリプトの途中に」です。ふつうのpyファイルと基本的に同じだと思うのですが,Psychopyは単独でアプリケーション化しているので,内部で動かせるモジュール等にやや制限があったりするのかもしれません。
114
+
115
+
116
+
117
+ ### MATLABによるGPIO制御スクリプト(参考)
118
+
119
+ ```MATLAB
120
+
121
+ IP = '169.xxx.xxx.xxx'; % ラズパイのIPアドレス
122
+
123
+ uName = 'xx'; % ラズパイのユーザーネーム
124
+
125
+ pass = 'xxxxx'; % ラズパイのパスワード
126
+
127
+
128
+
129
+ mypi = raspi(IP, uName, pass); % これで接続できます
130
+
131
+
132
+
133
+ configurePin(mypi, 25, 'DigitalOutput'); % これで25番のピンが出力に使えます
134
+
135
+
136
+
137
+ writeDigitalPin(mypi, 25, 1); % ピンをONにして
138
+
139
+ pause(1.0) % 1秒休み
140
+
141
+ writeDigitalPin(mypi, 25, 0); % ピンをOFFにします
142
+
143
+ ```(実際の実験では,時間の制御はpause()ではなくPsychtoolboxの関数を用いて行っています)