Raspberry Pi 2のPython3で加速度センサーを動かす。

前回では、ラズパイのPython3でI2Cの設定をしました。
今回は、I2CにGセンサーを取り付けてみます。


Gセンサーは、ストロベリー・リナックスが出している3軸加速度センサモジュール MMA8451Qを利用してみます。価格は800円/個で、RSコンポーネントでもチップ単体で販売しています。
・ストロベリー・リナックスの該当ページ
・RSコンポーネントの該当ページ
・フリースケールの該当ページ

MMA8451Qはフリースケール社が出している、I2Cで通信をする3軸加速度センサーで、14bitの分解能を持った±2/±4/±8Gを計測できます。

I2Cのアドレスは、0x1cと0x1dのどちらかを利用できます。今回は、SA0をGNDに接続して0x1cで利用してみます。

ちょっと汚いですが、こんな感じで配線してみます。

112

左上のArduinoDueは、パルス信号作成用に使っています。
加速度センサーの基盤自体は、8ピンですのでかなり小さいのです。I2CのSCL、SDAはそれぞれ5.6kΩでプルアップをしています。

ラズパイのGPIOとの接続は

Pin.No 名称1 用途 利用
1 3.3V Power 電源
3 GPIO02 SDA I2Cデータ
5 GPIO03 SCL I2Cクロック
9 GND GND GND

ラズパイで確認してみます。

113

0x1cに、加速度センサーが見えています。


Python3でプログラムを組んでみます。
50Hzの周期、最大±2Gで読んでみます。

出力は、ポーリング回数、実データ回数、X軸最大、X軸最小、Y軸最大、Y軸最小、Z軸最大、Z軸最小です。下4桁で切り捨てています。

出力例)
114

いろいろ傾けています。Z軸に1Gがかかっているのがわかります。
これで、シングルコアCPUで利用率が3%弱です。

意外と簡単にI2Cでデータ取得できました。

次回は、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で比較する。

Raspberry Pi 2のPython3でI2Cを設定する。

前回では、ラズパイのPythonのGPIOで割り込み処理をしました。

今回は、I2Cを利用する準備をします。


先ず、/etc/modulesを変更します。2行追加します。

次に、もし[/etc/modprobe.d/raspi-blacklist.conf]に、[blacklist i2c-bcm2708]の行があれば、削除します。
再起動後、[apt-get]でi2ctoolとPython-smbusを追加します。

ただし、現在(2015/10913)Python3用のsmbusがリリースされていないためPython3では利用できません。
そこで、別途smbusをPython3にインストールします。

これで、Python3でもsmbusが利用可能となりました。
108

i2cの確認をします。

109

まだ何もつながっていません。

次回は、I2cで加速度センサーを動かしてみます。


第 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で比較する。

Raspberry Pi 2のPythonでGPIOの割り込み処理をする。

前回では、ラズパイのPythonでGPIOで矩形波のパルスをポーリングで取得してみました。今回は、割り込み処理をしてみます。


WiringPiを利用してみようと考えたのですが、Pythonで割り込み処理は出来ないのとのことで、残念ですがRPi.GPIOを利用して疑似的な割り込み処理をしてみようと思います。

GPIO25番に、500Hzの矩形波を入れてみます。

作ってみたプログラムは、

で、割り込みプログラムと同時に、ほかのプログラムを動かしてみます。

107

はい、取りこぼしています。この方法だと、複数のGPIOで割り込み処理をしたときに精度が思いっきり落ちそうです。CPUの使用率と優先度を調整しながら、ポーリングの処理のほうがよさそうです。

WiringPiの開発者は、本気でするならカーネールに組み込めとのこと。すみませんでした。

次回は、I2cを使ってみます。


第 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で比較する。

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で比較する。