パソコンにGPIOボードを追加する。(1)

#はじめに

Pythonでプログラムを作り、そのプログラムで、外部H/Wを制御したい時があります。
例えば、ノートパソコンをPLCの24Vラインに繋いで、直接に信号の通信を行う場合です。この通信を実現するために、パソコンが制御できるI/Oポートが必要になります。

[関連記事：ノートパソコンにGPIOインターフェースあれば・・](https://matsuyuta.com/wp/archives/2120)

Rasbeprry PIやNVIDIA Jetson nanoのようなシングルボード小型コンピュータには、自前のGPIOポートを内蔵しているため、関連の設定が簡単です。しかし、パソコンの場合には、USB以外のI/Oポートがしないため、別途のGPIOボードを用意し、ドライバーの設置やライブラリーの設定を行う必要があります。

今回の記事では、Windowsパソコンに12ポートのGPIOボードを設置する方法をご紹介します。

#GPIOボードの紹介

GPIOボードとしてAdafruit社のFT232H Breakoutボードを使用します。日本では、スイッチサイエンスや秋月電子さんのサイトで購入可能です。

[Adafruit社　GPIOボード製品紹介ページ](https://www.adafruit.com/product/2264)
![Adafruit.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208980/ba5eb8bd-fd51-cf86-c645-514b803b825e.jpeg)


##仕様

次の表に、GPIOボードの仕様を掲載します。
パソコン側のUSB_5Vを電源としてい利用します。GPIOボードのデジタル出力レベルは3.3Vです。
デジタルI/Oポートは、12本提供します。

そして、直接にデジタル方式のセンサ・アクチュエータとの通信のため、I2CとSPI規格のインタフェースも用意されています。

|パラメータ|詳細|内容|
|:--------:|:--------:|:--------|
|Power Pins|5V| this is the 5V power from the USB input.|
||GND|this is the common ground for all power and logic.|
|GPIO Pins|D4 to D7| can be used as either digital inputs and outputs.|
||C0 to C7| can be used as either digital inputs or outputs.|
|Others|I2C Pins|SCL, SDA|
||SPI Pins|SCLK, MOSI, MISO, CS0|

次の図に、このボードのピン配置を表します。
![FT232H_pinout.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208980/bb2de9fa-c105-c2df-a31a-186d60585087.png)

##パソコンとの接続

今回は、PythonでGPIOボードの制御を行います。Circuit Python Librariesを利用します。

しかし、Pythonが直接にCircuit Python Librariesにアクセスが難しいため、BLINKAというものが必要となります。（Adafruitの説明）
BLINKAとは、PythonがCircuitPython LibrariesへアクセスできるようにするAdafruit社の専用ライブラリです。

パソコンとGPIOボードは、USBポートによってい接続が形成されます。パソコンからGPIOポートへの信号の変換は、FT232Hチップが行います。

複数のパーツが出て、最小は若干複雑に見えますが、いったん設置が終われば、そのパーツの存在を気にせずに使えます。

![Configure.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208980/c38812d4-a3e4-68ba-f5f6-fec45e18fecc.png)

##ドライバーとライブラリの設置

次は設置プロセスです。ここが一番大事な部分です。

詳細は、下記のリンクを参照して、設置を進めてください。順番がとても重要です。

このポストでは、やるほうの項目だけ記入します。全部の設置には、10分～15分程度かかります。

 [Adafruit GPIO Board Setup](https://learn.adafruit.com/circuitpython-on-any-computer-with-ft232h/windows)

1. パソコンにPython3の設置を確認　：　Python 2.7は未対応のため
2. FT232Hのドライバー更新
3. pyftdiとpyusb（修正版）の設置
4. pyusbとpyftdiのテスト
5. Adafruit Blinkaの設置
6. 環境変数の設定 (set BLINKA_FT232H=1)
7. python上でGPIOボードの認識の確認

#GPIOボードの出力テスト

GPIOボードのC0ポートを利用し、LEDを点滅させてみます。
C0ポートをOUTPUTポートに設定し、0.5秒はON、0.5秒はOFFを繰り返します。
出力の様子は、LEDの点滅で確認できます。

次の配線の概略を表します。各素子を直列に接続します。

**C0ポート - LED - 1 kOhm 抵抗 - GND**

![20200309_152011.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208980/73901866-fe13-09b4-8722-0ac4be1fec43.jpeg)


##プログラムコード

環境変数 BLINKA_FT232Hを1に設定する部分を、import boardの前に設置する必要があります。

```Python
import os
os.environ['BLINKA_FT232H'] = '1' #Setting Environmental Variable

import board
import time
import digitalio

#GPIO Setting : C0 will be output port.
led = digitalio.DigitalInOut(board.C0)
led.direction = digitalio.Direction.OUTPUT

while True:
    led.value = True
    time.sleep(0.5)
    led.value = False
    time.sleep(0.5)
```

動作の様子です。プログラム通り、OUTPUTポートから出力されることが確認できました。
![ezgif.com-video-to-gif.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208980/ce2572ed-68dc-34f0-ea6d-b5069ccbfbe0.gif)


#まとめ

パソコンにGPIOボードを追加する方法を紹介し、その動作を確認しました。

#今後の予定

次回は、GPIOボードからINPUT信号をもらい、Python上でその結果を表示する方法を紹介します。

#参考資料

1. [Adafruit Circuit Python Libraries with FT232H](https://learn.adafruit.com/circuitpython-on-any-computer-with-ft232h)
2. [Adafruit GPIO Board Setup](https://learn.adafruit.com/circuitpython-on-any-computer-with-ft232h/windows)
3. [ノートパソコンにGPIOインターフェースあれば・・](https://matsuyuta.com/wp/archives/2120)