FT232HとI2Cデバイスの複数接続(MPU-6050)

前回に引き続き

Windows10でPythonから加速度センサMPU-6050を動作させる

I2Cの複数接続をやってみます。

接続方法

2つ目のMPU-6050を接続する場合は2つ目のMPU-6050のVCCには何も入れず、代わりにADO(データアウト)へ対して+5Vを入れるとI2アドレスが0x69になってくれます。よって、スクリプトでは1つ目が0x68, 2つ目が0x69として値を渡してあげればよいのです。※データシートを熟読できていないので、もしかしたら、+3.3Vが正しいのかもしれません。

スクリプト

ポイントは、インスタンスを作るときにI2Cアドレスを引数として指定することです。ここだけです。

mpu1 = adafruit_mpu6050.MPU6050(i2c, address=0x68)

mpu2 = adafruit_mpu6050.MPU6050(i2c, address=0x69)

 

Windows10でPythonから加速度センサMPU-6050を動作させる

前回、Noobsが入ったラズベリーパイ3のGPIOピンを使ってI2C接続を試み、見事成功いたしました。

今回は、普段から使っているWindows10のモバイルPCでMPU-6050を動かせないか検討しました。

モバイルPCで一般的な入出力といえばUSBなので、これをGPIO的な何かに変換できれば行けるだろうという思惑です。

FT232H使用 USB⇔GPIO+SPI+I2C変換モジュール

http://akizukidenshi.com/catalog/g/gM-08942/

探した結果、こんなんがありました。Adafruit(エイダフルート)の変換モジュールです。下の方に「メーカー資料」とありますので、クリックしてみると。

https://learn.adafruit.com/adafruit-ft232h-breakout/mpsse-setup

いきなり現れる「非推奨」の文字!

どうやらPython2でやり方を書かれている古い情報のようです。

大丈夫です、代替方法が用意されてありました。

BLINKAとサーキットPythonライブラリ

https://learn.adafruit.com/circuitpython-on-any-computer-with-ft232h

これによると、Python3の他にBLINKAとCIRCUIT_PYTHON なるソフトウェアが必要だそうです。

sensors_board_ft232h.png

FT232HをUSBへ認識させる

※実は、この項目は必要ないかもしれません。後述するBLINKAなどのセットアップが終わりテストスクリプトを走らせたあと、気がついたら、ここで行ったことがなかったことになっていました。しかしちゃんと動いています。参考までに残しておきます。↓↓↓

https://www.ftdichip.com/Drivers/VCP.htm

とその前に、先にこれをやらないといけません。基本的にはFT232H側マイクロUSB~PC側USB とケーブルで接続すれば勝手に認識されます。

確認方法は、デバイスマネージャーを開いてポート(COMとLPT)の直下に新しいCOMx(xは数字)が作成されていればOKです。またポートと同層にあるユニバーサルシリアルバスコントローラーの直下にUSBコンバーターが作成されていればOKです。この詳細設定でVCPをONにしなければ動かない場合があるそうなので念の為ONにしておきます。

うまくいかない場合。

まず、ちゃんと正常なマイクロUSBケーブルを用意します。

これが今回最も手こずった所です。マイクロUSBは少し前のスマホでよく使われていましたが、今はUSB-Cに取って代わられています。マイクロUSBの致命的な欠点はその接触の悪さです。

一本目はナイロンで保護されている高級そうなケーブルで試してみました。「ピロポン♪↑」というUSB認識の音がなり、デバイスマネージャーを確認すると勝手にドライバーが入る手はずなのですが、COMとして認識された瞬間に接続が切れ、何回接続し直したりrebootしたりしても改善されません。

他のケーブルを試してみましたが、電源のみのケーブルというのも混在しており見分けが付きません。電源LEDは点灯すれどもUSB接続の「ピロポン♪」という音がなりません。これを3本ほどやりました。ぐぬぬぅ・・・。

さらに、ケーブルを替えてうまく認識されたと思いきや、1時間作業後に再び切れ、FT232Hの電源LEDすら点灯しなくなるという事態になりました。

(電源線を間違えてFT232Hが壊れたか・・・。OTZ)

結果、そんなことはありませんでした。奇跡的に見つけた最後のケーブルを使うと、なんの問題もなくプラグアンドプレイできてるじゃないですか。

ちゃんと正常なマイクロUSBケーブルを用意しましょう。

それでもプラグアンドプレイできないときは、https://www.ftdichip.com/Drivers/VCP.htm

のwindows セットアップ実行ファイルでインストールしましょう。

Windowsへのセットアップ

 

https://learn.adafruit.com/circuitpython-on-any-computer-with-ft232h/windows

このページの通りにざーっとやると良いです。Python3はAnaconda3とかでなく素の状態で入れました。バージョンは3.7.7。

ZadigでFT232Hを接続してドライバーを修正

FT232Hデバイス用のlibusbドライバーを簡単にインストールするツールです。 ※これをやるから、前項が必要なくなる?

ツールを実行する前に、コンピュータからすべてのFTDIデバイスを取り外します

FT232Hだけを接続して、PCに接続されている唯一のFTDIデバイスになるようにします。

オプション ]メニューをクリックし、以下の[ すべてのデバイスをリスト ] 項目を選択します。

FTDIBUSに等しいドライバーと0403 6014に等しいUSB IDを持つデバイスを選択してください!

USB Serial Converter > FTDIBUS(v2.12.28.0)

libusb-win32(v1.2.6.0)

0403 6014 にして Replace Driverボタンをおします。

デバイスマネージャーを開くとlibusb-win32 devices とその直下にUSB Serial Converterが出来上がっています。

pyftdiとpyusbをアンインストールしてからインストールする

まず、以前にpyusbとpyftdiを入れてしまっている可能性がある場合はアンインストールしておきましょう。

$ pip uninstall pyusb

$pip uninstall pyftdi

Windowsに影響するバグを修正するには、pyusbのフォークを取得します。

$ git clone https://github.com/minkustree/pyusb.git

gitでエラーが出たときは

https://git-scm.com/download/win

で、gitをインストールします。

PowerShell管理者モードを再起動させてから、今一度

$ git clone https://github.com/minkustree/pyusb.git

です。

$ cd pyusb

$ pip install pyftdi

で、インストールが完了です。

pyusbとpyftdiをテストする

FT232Hを接続しておいた状態で

これで DEVICE IDが出てくればOKです。

 

Adafruit Blinkaをインストールする

$ pip install adafruit-blinka

環境変数を設定

PowerShell管理者権限で入っている場合は

$とenvにはスペースを入れない状態で

$env:BLINKA_FT232H=1

cmdなら

set BLINKA_FT232H=1

です

プラットフォーム検出確認

 

python3を起動して

 

で、エラーが発生せず、利用可能なすべてのピンのリストが表示される場合は、準備完了です。

 

インストール後のチェック

https://learn.adafruit.com/circuitpython-on-any-computer-with-ft232h/troubleshooting

 

python3で

とやって

ならOKです

Python環境変数の確認

import os
os.environ[“BLINKA_FT232H”]

数字が返ってくればOK ’1’など。

import board

エラーが出なければOK。

ピン配列を確認

https://learn.adafruit.com/circuitpython-on-any-computer-with-ft232h/pinouts

電源ピン

5V-これはUSB入力からの5V電源です。

GND-これは、すべての電源とロジックに共通のグラウンドです。

3V電源出力 – 新しいバージョンには、最大500mAの3.3V電源出力ピンがあります

GPIOピン

D4にD7は -デジタル入力または出力のいずれかとして使用することができます。C0へC7は -デジタル入力または出力のいずれかとして使用することができます。

I2Cピン

FT232HとMPU6050とのI2C接続です。D1とD2を短絡させる必要がありました。

SCL -I2Cクロック信号はD0にあります。

SDA -I2CデータはD1   D2にあります。

I2Cスイッチ – 新しいバージョンには、D1とD2を接続してI2Cインターフェースを容易にするスイッチがあります。

I2CやSTEMMA QTコネクタを使用するには、スイッチをONに動かします。その後、SDAにD1またはD2を使用できます。

元のバージョンのみ:I2Cを使用するには、2つのピン(D1とD2)があることに注意してください。

SPIピン

FT232HとMPU9250/6500のSPI接続(のはず)です。まだ動かすことができていません。

SCLK -SPIクロック信号はD0にあります。
MOSI-マスター出力、スレーブ入力はD1にあります。
MISO-マスター入力、スレーブ出力はD2にあります。
CS0-チップセレクトはD3にあります。これはBlinkaでは使用されず、代わりに上からGPIOピンの1つを使用します(例のセクションを参照)。

 

MPU6050用 Pythonモジュールのインストール

https://pypi.org/project/adafruit-circuitpython-mpu6050/

 

スクリプト

結果出力

今後について

I2Cデバイスの複数接続

MPU-6050がまだ3つほどあるのでチャレンジします。

FT232HとI2Cデバイスの複数接続(MPU-6050)

SPI通信

本当はこっちをやりたかった。

MPU-9250/6500を購入しましたが、いい感じのライブラリとか知らないのでどうしたものか悩んでいます。

SPIデバイスの複数接続

最終的な目標。

MPU-9250/6500を2個購入しましたので、なんとしてもやりきりたいです。

 

以上、まだまだ続きます。

 

追記1

PowerShell管理者権限で入らないと実行できません。

PowerShellをリブートしたら、同じスクリプトなのに実行できませんでした。

 

PowerShell管理者権限で入って

$env:BLINKA_FT232H=1

をすると、何事もなく実行できました。一体なんでしょう・・・?

 

 

追記2

PowerShellで管理者権限でない状態でスクリプトを実行するとimport boardが機能しないことがわかっています。

boardモジュールがないのでインストールしてくださいというエラーメッセージの通りに pip install boardを行うとインストールできますが、機能しません。board.なんちゃらはメソドを持っていませんというエラーがでるので、別物のboardではないでしょうか?。

pip uninstall boardして管理者権限に移行して、追記1の通り$env:BLINKA_FT232H=1 をしてからスクリプトを実行したところ、実行されません。先程pip uninstall boardしたことで何かがおかしくなってしまったのでしょうか。

解決策としては、ずーっと前まで戻って

$ pip uninstall adafruit-blinka

$ pip install adafruit-blinka

することで、再度import boardできるようになりました。

まだ理屈がわかってません。

FT232HとMPU-9250/6500

お世話になりました。

https://qiita.com/kotai2003/items/0c96143b7d6e84629d99

https://zadig.akeo.ie/

https://learn.adafruit.com/circuitpython-on-any-computer-with-ft232h/windows

Python:datetimeモジュールで細かい時間(msec, μsec)を出したいとき

datetimeで作った時刻データでは、秒よりも細かい6桁の数字が含まれています。

単位はマイクロ秒 なので ミリ秒で出したいときは下記のように出せます。

結果出力

Python: numpyとlistのappendの違い

numpyとlistのappendの違い

センサーから時系列で入ってくるデータを変数に格納したい時、ありますよね。

普段はlistとしてli = []のような空リストを作ってからli.append(入ってくるデータ) でどんどんリストの要素として追加していましたが、時間方向の分解能を高めるために、numpyを使おうとすると、直感ではうまくできなかったので、メモしておきます。

numpyのappendは破壊的でないため、変数に再代入しなくてはappendの結果が反映されません。注意点はここだけです。

 

 

python:flaskの基本2 GET, POST, PUT, DELETE

今日はflaskが実行されているサーバーのIPアドレス127.0.0.1:5000に対して、クライアントからPOSTするやりかたを見ていきます。

flaskサーバー側のスクリプト

flaskのメインスクリプトに下記の関数を追加します。

これをVScode右上の再生ボタンでRUNさせておきます。

127.0.0.1:5000でRUNし始めたはずです。

クライアント側のスクリプト

これに対して、クライアント側からPOSTするために、pythonファイルを新規作成してrequestsモジュールのpostメソドを使ってアクセスしてみます。

で、これをVScode上ではなくて、cmdを開いてそこから実行すると。

cmdでクライアント側のスクリプトを実行

(‘username’, ‘mike’)が返ってきています。

 

以上、GET, PUT, DELETEも同じやり方です。

python:flaskの基本

flaskをちょっといじってみます。

IPアドレスは127.0.0.1:5000がデフォルトとのこと。

  • トップページ
  • トップページの下層にページ1
  • トップページの下層に引数付きのページ2
 

テンプレートを使ってみます。

同層にディレクトリtemplatesを作成して、その中に下記のようなhtmlファイルを作成します。{% ○○ %} を使うとif文が使用できたりします。

 

pythonファイルにはrender_templateを使用して下記のようにhtmlファイルを呼び出します。

 

次回は、get, post, ,put, delete をやっっていきます。

 

 

 

 

 

OpenCV:異物検出プログラム

Jetaon Nanoで異物を検出したいのですが、まずは使い慣れたPCで作ってみます。

カメラ

エレコム WEBカメラ 200万画素 マイク内蔵 MAC対応 ブラック UCAM-C0220FBNBK

2015年に買った、2000円くらいの安物です。

レア過ぎて価格にプレミアがついていました。

インストール

参考にさせていただきました:https://www.kkaneko.jp/tools/win/cv2.html

Python3.7.7を入れました。最新の3.8.2はOpenCVが対応してない可能性があるのでやめておきました。

https://www.python.org/downloads/release/python-377/

Windows x86-64実行可能インストーラー

cmdでpythonとして、 3.7.7が起動させます。

pip listをすると

pip 19.2.3
setuptools 41.2.0
WARNING: You are using pip version 19.2.3, however version 20.0.2 is available.
You should consider upgrading via the ‘python -m pip install –upgrade pip’ command.

とバージョンアップを促されるので、

python -m pip install –upgrade pip

します。

numpyも入れてみましょう。

pip install numpy で1.18.2が入りました。

ではVScodeを起動させて、メニュー>view > select interpriter で python 3.7.7を選択し・・・たいところですが、ありません。

一旦VScodeを起動させ(まだpython 3.7.7は表示されない。)、そしてVScode下部のターミナルで一旦pythonを起動させます。3.7.7が起動しました。

スクリプト実行を何回かさせて、numpyがないよー、と言われながら、interpriterの指定を開くと,python 3.7.7が選択できるようになっていました。

で、スクリプトを実行すると、今度はcv2がないよー、といわれましたので、cmdから

で入れました。opencv-python-4.2.0.34が入りました。

cmdでエラーが出るときは、Power Shellを管理者権限で開いてやってみましょう。

で、確認です。

その他のライブラリをインストール

VScodeをいじっているとpylintをいれてと促されるので

$ -m pip install -U pylint –user

いろんなライブラリも同時に勝手にはいりました。

Package Version
—————– ——–
astroid 2.3.3
colorama 0.4.3
isort 4.3.21
lazy-object-proxy 1.4.3
mccabe 0.6.1
numpy 1.18.2
opencv-python 4.2.0.34
pip 20.0.2
pylint 2.4.4
setuptools 41.2.0
six 1.14.0
typed-ast 1.4.1
wrapt 1.11.2

エラー

こんなんがでます、frame.shepeがわからないそうです。
File “c:/Users/keita/scripts/shihenDetector/main.py”, line 39, in <module>
height, width, channels = frame.shape
AttributeError: ‘NoneType’ object has no attribute ‘shape’

 

frame.shepe[:3]にして、カメラ番号を1から0に変更したら内蔵カメラが映りました。

webカメラをUSBに指して、カメラ番号1に戻したらこれでも映りました。

ということで[:3]は関係なかったと思われます。

画像処理

OpenCVで

案1:BGR画像→グレースケール→検査窓トリミング→現在画像→二値化

案2:BGR画像→グレースケール→検査窓トリミング→初期画像と現在画像を差分を取る→二値化

 

の2案をやってみましたが、結果的に案1を採用します。

案1は、背景が動いたりカメラが動いたりしたときでも、検出精度は変わらない利点があります。

案2は、初期画像と現在画像を比較するので、背景になんらかの均一でない構造があったとしても、初期画像と現在画像で比較するので異物検出のロバスト性が高くなる利点があります。しかし、背景が動いたりカメラが動いたりして、初期画像とのズレが発生するとと検出できないか検出精度が大幅に落ちます。

今回は、よりシンプルな案1でやっていきます。

結果

スクリプトを回すと自動的に時系列データがcsvファイルとして入ってきます、

グラフ化

作成されたcsvファイル読み込んでグラフ化しました。

横軸が時間、縦軸は検出された異物(黒)の画素数です。

 

検出画像

開始5秒の画像は異物がない、まっさらな状態です。影一つありません。

開始15秒で5mm程度の異物を置いてみました。黒い点が現れます。

開始60秒で1mmと5mm程度の異物を置いてみました。どちらも黒い点になって現れます。200万画素の安物カメラでもこれだけの精度が用意に出ます。

周囲の照明コンディションが良ければ、0.5mm程度までは検出できそうです。

メインスクリプト

グラフ作成スクリプト

pandasとmatplotlibを使うのでインストールします。

pip install pandas

installed pandas-1.0.3 python-dateutil-2.8.1 pytz-2019.3

pip install matplotlib

installed cycler-0.10.0 kiwisolver-1.2.0 matplotlib-3.2.1 pyparsing-2.4.7

はい、ではスクリプト実行しましょう。

以上です。

shihenDetector

Python:一定の時間間隔でプログラムを実行する方法

一定の時間間隔でプログラムを実行する方法を考える必要がありましたので、考えたスクリプトをメモしておきます。

これを使えば、OpenCVを使っているときに、while文の中で動画を取得し処理している最中に、任意のインターバルで時刻や分析データをファイルに保存することができます。

スクリプト

出力結果

0.001sec つまり 0~1msec程度の遅れがあります。

私の用途では、十分許容できます。

 

以上

 

Jetson Nano: Python OpenCVからMIPIカメラへアクセスする方法

参考にさせていただきました。

https://qiita.com/tsutof/items/2d2248ec098c1b8d3e32

 

今回で画面が緑色になってしまう問題を解決できるか!

試運転:shellからでは映像が出力できています。

 

Python3から nano_cam_test.py を実行してみるとエラーが出ます。

エラー:

たぶん、カメラが対応している解像度と違うからでしょう。

直してみましょう。