環境
準備
Raspberry Piの設定
Raspberry Piの設定からI2Cをオンにしておく必要があります.
古臭いUIで作業する必要があったのは過去の話で,今はGUIで普通に設定できます(再起動が必要です)
Raspberry PiのI2Cデータ転送速度と波形を見る その1 | 電子工作の環境向上
接続
I2Cの2ピンと電源を以下のように接続します.
Raspberry Pi | MCP4018 |
---|---|
3.3V | 1 (Vdd) |
GND | 2 (Vss) |
5 (GPIO3, I2C-SCL) | 3 (SCL) |
3 (GPIO2, I2C-SDA) | 4 (SDA) |
Raspberry Pi にはAnalog入力が無いのでテスターで5番ピンとGNDとの間の抵抗を測定してみようと思います.
Raspberry Pi 接続確認
I2Cが正しく接続されていれば,Raspberry Piの端末で
sudo i2cdetect -y 1
と入力すると,
0 1 2 3 4 5 6 7 8 9 a b c d e f 00: -- -- -- -- -- -- -- -- -- -- -- -- -- 10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 2f 30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 70: -- -- -- -- -- -- -- --
と出力されるはずです.
Pythonプログラム
依存ライブラリはsmbusとtimeです.
smbusはI2Cと,その類似の(同じ?)接続規格に関するライブラリです. 私は特にインストール操作無しに使用できました.
このプログラムはMCP4018に送る値tapを0〜127の範囲で台形波状に変化させます.
import smbus from time import sleep addr = 0x2F bus = smbus.SMBus(1) cnt = 0 tap = 0 while True: if ( cnt % 100 < 25 ): tap = 0 elif ( cnt % 100 < 50 ): tap = int (( cnt % 100 - 25 ) / 25 * 127) elif ( cnt % 100 < 75 ): tap = 127 else: tap = int(( 100 - cnt % 100 ) / 25 * 127) bus.write_byte(addr, tap ) print ( "cnt=" + str ( cnt ) + " tap= " + str( tap ) + " Rwa= " + "{:.2f}".format( (1 - tap / 127.0) * 10.0 ) + "kohm Rwgnd = " + "{:.2f}".format( tap / 127.0 * 10.0 ) + "kohm" ) cnt += 1 sleep( 0.2 )
実行
Pythonプログラムを管理者権限で実行します.
手元のテスターでWピンとGND,WピンとAピンの間の抵抗を測定したところ,ほぼ理論値通りの結果が得られました.