Raspberry Pi 2のPythonでGPIOを調べてみる。

前回では、ラズパイのPythonで作成したプログラムで、GPIOで矩形波のパルスを取得してみました。
GPIOの取り込みでいまいち、取りこぼしが発生していたので調べてみます。


Arduinoから、500Hzの矩形波をラズパイのGPIOに入れてみて、どのぐらい取りこぼしが出るか調べてみます。
簡単なプログラムを書いてみます。 1秒間に何回くらいGPIOを取得できるかです。

10秒間の平均をとってみました。

取得回数/秒 GPIO取得
せず
GPIOのみ
取得回数
GPIO取得時間(μSec)
Python2.7.10 175,319 306,117 130,798 7.65
Python3.5.10 99,865 157,170 57,305 17.45

1秒間にGPIO1か所の取得時間を出してみました。
Python2系では、7.65μSec/回 なのに Python3では、 17.45μSec/回 かかっています。
Python3遅いですが、500Hzを取得するのには十分な速度です。
待ち時間0.0002Secを入れた時のPython3のループ回数は、だいたい3140回ぐらいです。

GPIOを取得しながら、別のコンソールで[apr-get update;apt-get upgrade]をしてみて、影響を調べてみます。
106

思いっきり、影響を受けていま。PythonプログラムのCPUの占有率は、シングルCPUで25%程度ですので、余裕のはずです。 プログラムの優先度を上げて動かしてみます。

で、若干良くなりますが、取りこぼすことには変わりません。

次に、待ち時間をなくして、優先度を上げて動かしてみると、別のCPUに100%の負荷を与えても、取りこぼしが起きなくなりました。とはいっても、4コア中の1コアといえども、100%の負荷を与えるのは気持ちが悪いのです。
また、この場合ほかのスレッドに影響を与えすぎます。

待ち時間を短くしても取りこぼし自体は発生するようなので、pythonの[time.sleep()]の処理に時間がかかるのだろうなということでもう少し調べます。


time.sleep()がどのくらいの時間ロスをしているかを調べてみます。

5000回ループするのにかかる時間は、まったくロスがなければ1秒ですが、このプログラムの場合、1.5秒弱かかります。かかりすぎです。
Cythonで、変数を与えてみても1割程度しか早くなりません。


time.sleep() が予想以上にあれだということで、Pythonではこの程度のものだということを前提に今後進めます。

 

次回は、割り込み処理をしてみます。


第 1回 Raspberry Pi 2 の初期設定をしてみる-1
第 2回 Raspberry Pi 2 の初期設定をしてみる-2
第 3回 Raspberry Pi 2 の初期設定をしてみる-3
第 4回 Raspberry Pi 2 にWifiの設定をする
第 5回 Raspberry Pi 2 不要サービス停止
第 6回 Raspberry Pi 2 RAMディスクの設定
第 7回 Raspberry Pi 2 コンソールの設定
第 8回 Raspberry Pi 2 にウォッチドッグタイマーを導入する
第 9回 Raspberry Pi 2 でPythonの設定をする。
第10回 Raspberry Pi 2 でSambaの設定をする。
第11回 Windows10でPythonの開発環境を構築する。
第12回 Raspberry Pi 2のPython3でGPIOのパルスを取得する。
第13回 Raspberry Pi 2のPythonでGPIOを調べてみる。
第14回 Raspberry Pi 2のPythonでGPIOの割り込み処理をする。
第15回 Raspberry Pi 2のPython3でI2Cを設定する。
第16回 Raspberry Pi 2のPython3で加速度センサーを動かす。
第17回 Raspberry Pi 2にmonoをインストールしてC#を利用する。
第18回 Raspberry Pi 2にgoをインストールしてみる。
第19回 Raspberry Pi 2のGPIOをC#(mono)でパルス取得する。
第20回 Raspberry Pi 2のGPIO読み込みを、mono(C#)とPythonで比較する。

コメントを残す

メールアドレスが公開されることはありません。