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できるようになりました。

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