2のPython3で加速度センサーを動かす。23:02前回では、ラズパイのPython3でI2Cの設定をしました。今回は、I2CにGセンサーを取り付けてみます。MMA8451Qを利用してみます。価格は800円/個で、RSコンポーネントでもチップ単体で販売しています。・ストロベリー・リナックスの該当ページ・RSコンポーネントの該当ページ・フリースケールの該当ページMMA8451Qはフリースケール社が出している、I2Cで通信をする3軸加速度センサーで、14bitの分解能を持った±2/±4/±8Gを計測できます。I2Cのアドレスは、0x1cと0x1dのどちらかを利用できます。今回は、SA0をGNDに接続して0x1cで利用してみます。汚いですが、こんな感じで配線してみます。左上のArduinoDueは、パルス信号作成用に使っています。加速度センサーの基盤自体は、8ピンですのでかなり小さいのです。I2CのSCL、SDAはそれぞれ5.6kΩでプルアップをしています。GNDラズパイで確認してみます。10x1cに、加速度センサーが見えています。Python3でプログラムを組んでみます。50Hzの周期、最大±2Gで読んでみます。'__main__':startGsens()出力は、ポーリング回数、実データ回数、X軸最大、X軸最小、Y軸最大、Y軸最小、Z軸最大、Z軸最小です。下4桁で切り捨てています。出力例)いろいろ傾けています。Z軸に1Gがかかっているのがわかります。これで、シングルコアCPUで利用率が3%弱です。意外と簡単にI2Cでデータ取得できました。次回は、Python以外の言語を利用してみます。Pythonの設定をする。Sambaの設定をする。Windows10でPythonの開発環境を構築する。2のPython3でGPIOのパルスを取得する。2のPythonでGPIOを調べてみる。2のPythonでGPIOの割り込み処理をする。2のPython3でI2Cを設定する。2のPython3で加速度センサーを動かす。2にmonoをインストールしてC#を利用する。2にgoをインストールしてみる。2のGPIOをC#(mono)でパルス取得する。2のGPIO読み込みを、mono(C#)とPythonで比較する。2のPython3でI2Cを設定する。22:14前回では、ラズパイのPythonのGPIOで割り込み処理をしました。今回は、I2Cを利用する準備をします。/etc/modulesを変更します。i2c-bcm2708]の行があれば、削除します。再起動後、[apt-get]でi2ctoolとPython-smbusを追加します。python-smbusただし、現在(2015/10913)Python3用のsmbusがリリースされていないためPython3では利用できません。そこで、別途smbusをPython3にインストールします。installこれで、Python3でもsmbusが利用可能となりました。i2cの確認をします。1まだ何もつながっていません。次回は、I2cで加速度センサーを動かしてみます。Pythonの設定をする。Sambaの設定をする。Windows10でPythonの開発環境を構築する。2のPython3でGPIOのパルスを取得する。2のPythonでGPIOを調べてみる。2のPythonでGPIOの割り込み処理をする。2のPython3でI2Cを設定する。2のPython3で加速度センサーを動かす。2にmonoをインストールしてC#を利用する。2にgoをインストールしてみる。2のGPIOをC#(mono)でパルス取得する。2のGPIO読み込みを、mono(C#)とPythonで比較する。2のPythonでGPIOの割り込み処理をする。0:03前回では、ラズパイのPythonでGPIOで矩形波のパルスをポーリングで取得してみました。今回は、割り込み処理をしてみます。WiringPiを利用してみようと考えたのですが、Pythonで割り込み処理は出来ないのとのことで、残念ですがRPi.GPIOを利用して疑似的な割り込み処理をしてみようと思います。GPIO25番に、500Hzの矩形波を入れてみます。'__main__':StartPulseReader()で、割り込みプログラムと同時に、ほかのプログラムを動かしてみます。はい、取りこぼしています。この方法だと、複数のGPIOで割り込み処理をしたときに精度が思いっきり落ちそうです。CPUの使用率と優先度を調整しながら、ポーリングの処理のほうがよさそうです。WiringPiの開発者は、本気でするならカーネールに組み込めとのこと。次回は、I2cを使ってみます。Pythonの設定をする。Sambaの設定をする。Windows10でPythonの開発環境を構築する。2のPython3でGPIOのパルスを取得する。2のPythonでGPIOを調べてみる。2のPythonでGPIOの割り込み処理をする。2のPython3でI2Cを設定する。2のPython3で加速度センサーを動かす。2にmonoをインストールしてC#を利用する。2にgoをインストールしてみる。2のGPIOをC#(mono)でパルス取得する。2のGPIO読み込みを、mono(C#)とPythonで比較する。2のPythonでGPIOを調べてみる。22:11前回では、ラズパイのPythonで作成したプログラムで、GPIOで矩形波のパルスを取得してみました。GPIOの取り込みでいまいち、取りこぼしが発生していたので調べてみます。Arduinoから、500Hzの矩形波をラズパイのGPIOに入れてみて、どのぐらい取りこぼしが出るか調べてみます。簡単なプログラムを書いてみます。1秒間に何回くらいGPIOを取得できるかです。str(cntP0))10秒間の平均をとってみました。17.451秒間にGPIO1か所の取得時間を出してみました。Python3遅いですが、500Hzを取得するのには十分な速度です。待ち時間0.0002Secを入れた時のPython3のループ回数は、だいたい3140回ぐらいです。upgrade]をしてみて、影響を調べてみます。思いっきり、影響を受けていま。PythonプログラムのCPUの占有率は、シングルCPUで25%程度ですので、余裕のはずです。プログラムの優先度を上げて動かしてみます。PulseTest01.pyで、若干良くなりますが、取りこぼすことには変わりません。次に、待ち時間をなくして、優先度を上げて動かしてみると、別のCPUに100%の負荷を与えても、取りこぼしが起きなくなりました。いっても、4コア中の1コアといえども、100%の負荷を与えるのは気持ちが悪いのです。この場合ほかのスレッドに影響を与えすぎます。待ち時間を短くしても取りこぼし自体は発生するようなので、pythonの[time.sleep()]の処理に時間がかかるのだろうなということでもう少し調べます。time.sleep()がどのくらいの時間ロスをしているかを調べてみます。1time.sleep(0.0002)print(str(time.time()))5000回ループするのにかかる時間は、まったくロスがなければ1秒ですが、このプログラムの場合、1.5秒弱かかります。Cythonで、変数を与えてみても1割程度しか早くなりません。予想以上にあれだということで、Pythonではこの程度のものだということを前提に今後進めます。次回は、割り込み処理をしてみます。Pythonの設定をする。Sambaの設定をする。Windows10でPythonの開発環境を構築する。2のPython3でGPIOのパルスを取得する。2のPythonでGPIOを調べてみる。2のPythonでGPIOの割り込み処理をする。2のPython3でI2Cを設定する。2のPython3で加速度センサーを動かす。2にmonoをインストールしてC#を利用する。2にgoをインストールしてみる。2のGPIOをC#(mono)でパルス取得する。2のGPIO読み込みを、mono(C#)とPythonで比較する。2のGPIO読み込みを、mono(C#)とPythonで比較する。2のGPIOをC#(mono)でパルス取得する。2にgoをインストールしてみる。2にmonoをインストールしてC#を利用する。2のPython3で加速度センサーを動かす。2のPython3でI2Cを設定する。2のPythonでGPIOの割り込み処理をする。2のPythonでGPIOを調べてみる。2のPython3でGPIOのパルスを取得する。Windows10でPythonの開発環境を構築する。Sambaの設定をする。Pythonの設定をする。