Skip to content

Instantly share code, notes, and snippets.

@mamemomonga
Last active March 27, 2024 04:16
Show Gist options
  • Star 5 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save mamemomonga/fdb7a2330b0a3c5d2ba50528c5946ef4 to your computer and use it in GitHub Desktop.
Save mamemomonga/fdb7a2330b0a3c5d2ba50528c5946ef4 to your computer and use it in GitHub Desktop.
MCP2221Aメモ

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

ssd1306_japanese_font.py

$ cd /home/pi/Documents/MCP2221
$ python ssd1306_japanese_font.py
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment