MCP2221A
概要
- MCP2221AはUSBからPCにシリアル,I2C,GPIOを追加することができる
- USBは-D, +D に直結するだけで使える
ステータスLED
- デフォルトではGP0がRxLED, GP1がTxLED, GP2がUSB動作中LED, GP3がI2C動作中LED
- デフォルトLEDはすべてActiveLow カソード側(-)をピン、アノード側(+)を電源、間に抵抗を挟む、
電源
- Vssを3.3V, Vusbを3.3V に接続すると、IOは3.3Vとなる
- Vssを5V, Vusbを0.1uのコンデンサを挟んでグランドに落とすと、IOは5Vになる
設定
- MCP2221 Utility (v1.0.1) (Windows) を使うといろんな設定ができる。ドライバもインストールされる。設定は内臓EEPROMに保存される。
- 電源を入れたままでの設定適用はリセットが必要。リセットは/RSTをグランドに落とす。
- /RSTはプルアップを内臓している。
Linuxからシリアル接続
シリアルポートは /dev/ttyACM* として認識される。cdc_acmドライバが使用される。
Linuxからi2cを使用する
MCP2221 Linux Kernel I2C Bus Driver を使うことで、i2c-tools が使える。
Raspberry Pi3
Raspbian動作のRaspberry Pi3での使用例
カーネルソースとツールの取得
$ sudo apt-get install bc
$ sudo wget https://raw.githubusercontent.com/notro/rpi-source/master/rpi-source -O /usr/bin/rpi-source
$ sudo chmod +x /usr/bin/rpi-source
$ sudo /usr/bin/rpi-source -q --tag-update
$ sudo rpi-source
ドライバの取得とビルド
$ wget http://ww1.microchip.com/downloads/en/DeviceDoc/mcp2221_0_1.tar.gz
$ tar zxvf mcp2221_0_1.tar.gz
$ cd mcp2221_0_1
$ sudo make modules
$ sudo make install
有効化
$ sudo ./driver_load.sh
i2c tools
$ apt install i2c-tools
$ sudo i2cdetect -l
i2c-3 i2c i2c-mcp2221 at bus 001 device 006 I2C adapter
MCP2221にi2cデバイスを何もつなげていない状態でスキャン
$ sudo i2cdetect -y 3
0 1 2 3 4 5 6 7 8 9 a b c d e f
00: -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --
MCP23017
MCP23017との組み合わせを試す
MCP23017はi2cを16ポートのGPIOに変換するIC
- GPA0からGPA7を8つのLEDに接続(抵抗経由)
- /RESET を プルアップ
- A0, A1, A2 を GNDに
- SCL, SDAは10KΩのプルアップ経由でMCP2221Aに接続
GPIOは双方向で8ビット幅が2組ある。
IOCONが基本動作の設定となるらしい。 ICCON.BANK で制御レジスタのアドレスが変わる。 デフォルトでは IOCON.BANK = 0
アドレスの設定
ハードウェアアドレスは A2,A1,A0 ピンによって設定できる。
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
---|---|---|---|---|---|---|---|
0 | 1 | 0 | 0 | A2 | A1 | A0 | 0 |
という感じになるので、A2,A1,A0をすべてGNDに落とすと
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | Hex |
---|---|---|---|---|---|---|---|---|
0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0x20 |
となる。なのでこれらのピンはHighはLowかきちんと設定しないと動作が不安定になる。
i2cをスキャン
$ sudo i2cdetect -y 3
0 1 2 3 4 5 6 7 8 9 a b c d e f
00: -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: 20 -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --
ハードウェアアドレスは 0x20
出力
IODIRA: GPAをすべて出力に
$ sudo i2cset -y 3 0x20 0x00 0x00
OLATA: ラッチ設定、GPAをすべてHIGHに
$ sudo i2cset -y 3 0x20 0x14 0xFF
OLATA: ラッチ設定、GPAをすべてLOWに
$ sudo i2cset -y 3 0x20 0x14 0x00
入力
IODIRB: GPBをすべて入力に
$ sudo i2cset -y 3 0x20 0x00 0xFF
GPPUB: GPBをすべてプルアップ
$ sudo i2cset -y 3 0x20 0x0D 0xFF
GPIOB: GPBの状態をチェック
$ sudo i2cget -y 3 0x20 0x13
0xff
全てプルアップされているので0xFFになる ここで、GPB0をGNDに落とす
$ sudo i2cget -y 3 0x20 0x13
0xfe
0xFE = 1111 1110 となりひとつだけGNDに落とされていることがわかる
LEDチカチカスクリプト
blink.sh
#!/bin/sh
# 出力設定
sudo i2cset -y 3 0x20 0x00 0x00
while true; do
# 順番に点灯
i2cset -y 3 0x20 0x14 0x01; sleep .1
i2cset -y 3 0x20 0x14 0x02; sleep .1
i2cset -y 3 0x20 0x14 0x04; sleep .1
i2cset -y 3 0x20 0x14 0x08; sleep .1
i2cset -y 3 0x20 0x14 0x10; sleep .1
i2cset -y 3 0x20 0x14 0x20; sleep .1
i2cset -y 3 0x20 0x14 0x40; sleep .1
i2cset -y 3 0x20 0x14 0x80; sleep .1
# 全部点灯させて消す
i2cset -y 3 0x20 0x14 0xFF; sleep .1
i2cset -y 3 0x20 0x14 0x00; sleep .1
# 全部点灯させて消す
i2cset -y 3 0x20 0x14 0xFF; sleep .1
i2cset -y 3 0x20 0x14 0x00; sleep .1
done
udevの設定
USBで接続したら自動でドライバをロードし、i2cを有効化させる
$ sudo cp driver_load.sh /usr/local/sbin/mcp2111a_driver_load.sh
$ sudo sh -c 'cat > /etc/udev/rules.d/10-mcp2221-i2c.rules' << 'EOS'
ACTION=="add", SUBSYSTEM=="usb", ATTRS{idVendor}=="04d8", ATTRS{idProduct}=="00dd", RUN+="/usr/local/sbin/mcp2111a_driver_load.sh"
EOS
$ sudo udevadm control --reload
(メモ) 調査コマンド
$ udevadm monitor
$ udevadm info -a -p $(udevadm info -q path -n /dev/i2c-3)
SSD1306モジュールを使ってみる
Solomon Systech SSD1306 はOLEDの超小型ディスプレイで、安価で便利なモジュールがAmazonなどで入手可能。 ArduinoやRaspberry Piから簡単に利用できるライブラリがそろっている。
i2C版SSD1306モジュールをMCP2221Aに接続して表示してみる。RST端子がない。 Adafruit_Python_SSD1306 はRaspberry Pi専用だが、GPIO関連を修正すればPCからでも使用できるかもしれない。
スキャン
$ sudo i2cdetect -y 3
0 1 2 3 4 5 6 7 8 9 a b c d e f
00: -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: 20 -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- 3c -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --
Python関連の導入
$ sudo apt update
$ sudo apt install build-essential python-dev python-pip git
$ sudo pip install RPi.GPIO
Adafruit_Python_SSD1306の導入
$ pwd
/home/pi/Documents/MCP2221
$ git clone https://github.com/adafruit/Adafruit_Python_SSD1306.git
$ cd Adafruit_Python_SSD1306
$ sudo python setup.py install
美咲フォントの導入
$ mkdir -p ~/font/misakifont
$ cd ~/font/misakifont
$ wget http://littlelimit.net/arc/misaki/misaki_ttf_2019-02-03a.zip
$ unzip misaki_ttf_2019-02-03a.zip
$ ls -1
misaki.txt
misaki_gothic.ttf
misaki_mincho.ttf
misaki_ttf_2019-02-03a.zip
readme.txt
$ cd /home/pi/Documents/MCP2221
$ python ssd1306_japanese_font.py