Shujima Blog

Apple製品,技術系の話をするブログ

デジタル可変抵抗器 MCP4018をRaspberry Pi ( Python )で使ってみる(I2C書き込み)

DIP化などの準備はArduino編を参照

masa-flyu.hatenablog.com

環境

準備

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)

f:id:masa_flyu:20181008004557p:plain

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プログラムを管理者権限で実行します.

f:id:masa_flyu:20181008015337p:plain
(macOSからSSHで表示)

手元のテスターでWピンとGND,WピンとAピンの間の抵抗を測定したところ,ほぼ理論値通りの結果が得られました.

当ブログをご利用いただく際には免責事項をお読みください。