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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Raspberry Pi

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

Python

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

Q&A

解決済

2回答

1854閲覧

RaspberryPiによるSPIの取得時間間隔を1ms以下にしたい

Beleren

総合スコア1

Raspberry Pi

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

Python

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

0グッド

0クリップ

投稿2021/02/25 06:54

編集2021/02/25 07:01

SPIによりデータを1ms間隔で取得する必要があるので
下記のコードでRaspberryPiの評価を行いました。

ところが、10秒間で2890回と想定を下回る結果でした。
(5回実行させた行った平均です。)

ちなみにpy_compileでコンパイルしても結果は変わりませんでした。

SPIによりデータを1ms間隔で取得するには
RaspberryPiでは実現することは難しいのでしょうか?

コードに遅くしている原因があるのか
できればpythonで実現させたいのですが、Cで記述すれば実現できるのか?

教えていただけないでしょうか?
よろしくお願い致します。

python code

python

1 2import time 3import sys 4import spidev 5 6CE = 0 7spi = spidev.SpiDev() 8spi.open(0, CE) 9spi.mode = 0b01 10spi.max_speed_hz = 1000000 11 12def getdata(channel): 13 result = spi.xfer([0]) 14 data = result[0] 15 return data 16 17if __name__ == '__main__': 18 try: 19 cnt=0 20 start = time.time() 21 while (time.time()-start)<10: 22 a = getdata(0) 23 cnt += 1 24 25 print(cnt) 26 27 except KeyboardInterrupt: 28 spi.close() 29 sys.exit(0) 30

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

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

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

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

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

episteme

2021/02/25 06:57

Pythonコードからtabが消えるのは致命的なので Markdown 使ってください。
Beleren

2021/02/25 07:03

ご指摘ありがとうございます。修正しました。不慣れなため、失礼いたしました。
ozwk

2021/02/25 14:02

10秒で何回呼べるかを測定するコードかと思いますが、 逆に3000回を何秒で呼べるかを調べるとどうなりますか?
guest

回答2

0

自己解決

もしかしてと思い、
SPI通信しているデバイスを変えました。
また、変更中に使っていたジャンパー線の接触が良くないことに気付き新しい物へ変更したところ、
10秒平均163590回という値となりました。本当はもっと余裕が欲しいのですが…
通信自体はできていたので疑ってなかったのですが
遅い原因は、デバイスやジャンパー線にあるようです。
詳しい原因かはこれからになりますが、別のところに原因があるようですので一度閉めようと思います。
回答いただきた方々ありがとうございました。

投稿2021/02/26 01:41

Beleren

総合スコア1

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

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

ppaul

2021/02/26 01:54

接触不良で再試行が多発していたのでしょうか。 ところで、そこまで速くなったのなら、もう少し速くなるかもしれません。 方法は関数呼び出しをなくすことです。関数呼び出しは、かなり大きなオーバーヘッドです。特にユーザ定義関数はオーバーヘッドが大きいのです。getdataを展開してwhileの中に書いてしまえばこのオーバーヘッドがなくなります。
Beleren

2021/02/26 03:02 編集

アドバイス、ありがとうございます。 ラズパイ ⇔ ADCでやっていたのですが、 調べていくと、どうもジャンパー線の接触というよりはデバイス側にありそうです。 現状の速度はラズパイ ⇔ ArduinoでSPI通信を行った結果です。 相手デバイスのサンプリングレートによって変わるようなのですが、 30ksps(デバイスのMAX speed)で使用しても、やはり速度が出ません。 アドバイスいただいた通り 関数を省略し、試してみました。 5回平均で167,212回 約2%の向上でした。 速度優先にするのであれば、なるべく関数は使わない方が良いみたいです。 勉強になりました。
guest

0

SPIは関係なくて、Linuxではタスクスイッチを厳密にはコントロールできないので、1ms間隔の動作を保証できない(他のタスクに切り替わってしまってそちらを実行していることがある)、ということかと思います。

投稿2021/02/25 13:25

thkana

総合スコア7639

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

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

Beleren

2021/02/26 00:50

ありがとうございます。Raspberry Pi OSを使用しているのですが、この環境ではそもそも実現できないということでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問