前回、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 なるソフトウェアが必要だそうです。
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を接続しておいた状態で
1 2 3 4 |
import usb import usb.util dev = usb.core.find(idVendor=0x0403, idProduct=0x6014) print(dev) |
これで DEVICE IDが出てくればOKです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 |
DEVICE ID 0403:6014 on Bus 000 Address 001 ================= bLength : 0x12 (18 bytes) bDescriptorType : 0x1 Device bcdUSB : 0x200 USB 2.0 bDeviceClass : 0x0 Specified at interface bDeviceSubClass : 0x0 bDeviceProtocol : 0x0 bMaxPacketSize0 : 0x40 (64 bytes) idVendor : 0x0403 idProduct : 0x6014 bcdDevice : 0x900 Device 9.0 iManufacturer : 0x1 iProduct : 0x2 iSerialNumber : 0x3 bNumConfigurations : 0x1 CONFIGURATION 1: 100 mA ================================== bLength : 0x9 (9 bytes) bDescriptorType : 0x2 Configuration wTotalLength : 0x20 (32 bytes) bNumInterfaces : 0x1 bConfigurationValue : 0x1 iConfiguration : 0x0 bmAttributes : 0x80 Bus Powered bMaxPower : 0x32 (100 mA) INTERFACE 0: Vendor Specific =========================== bLength : 0x9 (9 bytes) bDescriptorType : 0x4 Interface bInterfaceNumber : 0x0 bAlternateSetting : 0x0 bNumEndpoints : 0x2 bInterfaceClass : 0xff Vendor Specific bInterfaceSubClass : 0xff bInterfaceProtocol : 0xff iInterface : 0x2 ENDPOINT 0x81: Bulk IN =============================== bLength : 0x7 (7 bytes) bDescriptorType : 0x5 Endpoint bEndpointAddress : 0x81 IN bmAttributes : 0x2 Bulk wMaxPacketSize : 0x200 (512 bytes) bInterval : 0x0 ENDPOINT 0x2: Bulk OUT =============================== bLength : 0x7 (7 bytes) bDescriptorType : 0x5 Endpoint bEndpointAddress : 0x2 OUT bmAttributes : 0x2 Bulk wMaxPacketSize : 0x200 (512 bytes) bInterval : 0x0 |
Adafruit Blinkaをインストールする
$ pip install adafruit-blinka
環境変数を設定
PowerShell管理者権限で入っている場合は
$とenvにはスペースを入れない状態で
$env:BLINKA_FT232H=1
cmdなら
set BLINKA_FT232H=1
です
プラットフォーム検出確認
python3を起動して
1 2 |
import board dir(board) |
で、エラーが発生せず、利用可能なすべてのピンのリストが表示される場合は、準備完了です。
1 2 3 4 |
['C0', 'C1', 'C2', 'C3', 'C4', 'C5', 'C6', 'C7', 'D4', 'D5', 'D6', 'D7', 'I2C', 'MISO', 'MOSI', 'SCK', 'SCL', 'SCLK', 'SDA', 'SPI', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'ap_board', 'board_id', 'detector', 'pin', 'sys'] |
インストール後のチェック
https://learn.adafruit.com/circuitpython-on-any-computer-with-ft232h/troubleshooting
python3で
1 2 |
from pyftdi.ftdi import Ftdi Ftdi().open_from_url('ftdi:///?') |
とやって
1 2 |
Available interfaces: ftdi://ftdi:232h:1/1 () |
なら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/
1 |
$ pip install adafruit-circuitpython-mpu6050 |
スクリプト
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 |
import time import datetime import board import busio import adafruit_mpu6050 # i2cインスタンスを作成する i2c = busio.I2C(board.SCL, board.SDA) # mpu6050をi2cで使用するインスタンスを作成する mpu = adafruit_mpu6050.MPU6050(i2c) print('Temperature degC, Acceleration m/s2') print('') init_time = datetime.datetime.now() time_cnt = 0.0 interval = 0.2 while True: T = mpu.temperature ax = mpu.acceleration[0] ay = mpu.acceleration[1] az = mpu.acceleration[2] a_total = (ax ** 2 +ay ** 2 + az ** 2) ** (1/3) if a_total > 7 : status = ' ==== ! ! ALERT ! ! ==== ' elif a_total > 5: status = ' = CAUTION =' else: status = '' current_time = datetime.datetime.now() - init_time current_time = current_time.seconds + current_time.microseconds/1000_000 if current_time >= time_cnt: print(str(datetime.datetime.now()) + ' ' + '{:.3f}'.format(current_time) + " T:{:.2f}, ax:{:.2f}, ay:{:.2f}, az:{:.2f}, a_total:{:.2f}, status:{} " .format(T, ax, ay, az, a_total, status)) time_cnt += interval # ジャイロ:角速度 # print("Gyro X:%.2f, Y: %.2f, Z: %.2f degrees/s"%(mpu.gyro)) |
結果出力
1 2 3 4 5 6 7 8 9 |
PS C:\Users\omoiy\scripts\ft232h_mpu6050_i2c> python .\mpu6050_i2c.py Temperature degC, Acceleration m/s2 2020-04-24 21:35:43.968182 0.209 T:28.39, ax:-0.35, ay:0.12, az:-8.31, a_total:4.10, status: 2020-04-24 21:35:44.175897 0.417 T:28.62, ax:-0.34, ay:0.16, az:-8.28, a_total:4.09, status: 2020-04-24 21:35:44.385182 0.626 T:28.62, ax:-0.41, ay:0.07, az:-8.36, a_total:4.12, status: 2020-04-24 21:35:44.594621 0.836 T:28.53, ax:-0.33, ay:0.08, az:-8.29, a_total:4.10, status: 2020-04-24 21:35:44.804302 1.045 T:28.72, ax:-0.29, ay:0.07, az:-8.34, a_total:4.11, status: 2020-04-24 21:35:45.013619 1.255 T:28.58, ax:-0.41, ay:0.11, az:-8.32, a_total:4.11, status: |
今後について
I2Cデバイスの複数接続
MPU-6050がまだ3つほどあるのでチャレンジします。
SPI通信
本当はこっちをやりたかった。
MPU-9250/6500を購入しましたが、いい感じのライブラリとか知らないのでどうしたものか悩んでいます。
SPIデバイスの複数接続
最終的な目標。
MPU-9250/6500を2個購入しましたので、なんとしてもやりきりたいです。
以上、まだまだ続きます。
追記1
PowerShell管理者権限で入らないと実行できません。
PowerShellをリブートしたら、同じスクリプトなのに実行できませんでした。
1 2 3 4 5 6 7 |
PS C:\Users\omoiy\scripts\ft232h_mpu6050_i2c> python .\mpu6050_i2c.py Traceback (most recent call last): File ".\mpu6050_i2c.py", line 3, in <module> import board File "C:\Program Files\Python37\lib\site-packages\board.py", line 153, in <module> raise NotImplementedError("Board not supported {}".format(board_id)) NotImplementedError: Board not supported None |
PowerShell管理者権限で入って
$env:BLINKA_FT232H=1
をすると、何事もなく実行できました。一体なんでしょう・・・?
1 2 3 4 5 6 7 8 9 10 |
PS C:\Users\omoiy\scripts\ft232h_mpu6050_i2c> $env:BLINKA_FT232H=1 PS C:\Users\omoiy\scripts\ft232h_mpu6050_i2c> python .\mpu6050_i2c.py Temperature degC, Acceleration m/s2 2020-04-24 21:35:43.968182 0.209 T:28.39, ax:-0.35, ay:0.12, az:-8.31, a_total:4.10, status: 2020-04-24 21:35:44.175897 0.417 T:28.62, ax:-0.34, ay:0.16, az:-8.28, a_total:4.09, status: 2020-04-24 21:35:44.385182 0.626 T:28.62, ax:-0.41, ay:0.07, az:-8.36, a_total:4.12, status: 2020-04-24 21:35:44.594621 0.836 T:28.53, ax:-0.33, ay:0.08, az:-8.29, a_total:4.10, status: 2020-04-24 21:35:44.804302 1.045 T:28.72, ax:-0.29, ay:0.07, az:-8.34, a_total:4.11, status: 2020-04-24 21:35:45.013619 1.255 T:28.58, ax:-0.41, ay:0.11, az:-8.32, a_total:4.11, status: |
追記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できるようになりました。
まだ理屈がわかってません。