python-peripheryを使ってみる

アナログ入力(PCF8591)

2G-IOTで使われているRDA8810には4チャネルのADCが内蔵されていますが、ポートとして出ていません。
アナログセンサーを使うときは、ADコンバータが必要になります。
そこで、i2cのADコンバータのPCF8591を使ってみました。
以下のコードでCh0からCh2の3チャンネルのアナログを変換できます。
結線はコメント欄を参照してください。
'''
python-periphery pcf8591 sample

2G_IOT---PCF8591
-----------------
Pin#3----SDA
Pin#5----SCK
---------AIN0(Analog Channel 0)---3.3V
---------AIN1(Analog Channel 1)---1.65V
---------AIN2(Analog Channel 2)---GND
GND------A0
GND------A1
GND------A2
GND------EXT
GND------AGND
3.3V-----Vref
3.3V-----VDD
GND------VSS
'''

#!/usr/bin/python
#-*- encoding: utf-8 -*-

from periphery import I2C
import time
import signal
import sys

flag = True

def handler(signal, frame):
  global flag
  print('handler')
  flag = False

argv = sys.argv
argc = len(argv)
if (argc == 1):
  device = "/dev/i2c-0"
if (argc == 2 and int(argv[1]) == 0):
  device = "/dev/i2c-0"
if (argc == 2 and int(argv[1]) == 1):
  device = "/dev/i2c-1"
if (argc == 2 and int(argv[1]) == 2):
  device = "/dev/i2c-2"

print device
# Open i2c-0 controller
#i2c = I2C("/dev/i2c-0")
i2c = I2C(device)

signal.signal(signal.SIGINT, handler)
# Read data to PCF8591
while flag:
  msgs = [I2C.Message([0x40]), I2C.Message([0x00,0x00], read=True)]
  i2c.transfer(0x48, msgs)
#  print "value0=",msgs[1].data[0],msgs[1].data[1]
  data = int(msgs[1].data[1])
  volt0 = data * 3.3 / 255
#  print "volt(Ch0)={0:.2f}".format(volt0)

  msgs = [I2C.Message([0x41]), I2C.Message([0x00,0x00], read=True)]
  i2c.transfer(0x48, msgs)
#  print "value1=",msgs[1].data[0],msgs[1].data[1]
  data = int(msgs[1].data[1])
  volt1 = data * 3.3 / 255
#  print "volt(Ch1)={0:.2f}".format(volt1)

  msgs = [I2C.Message([0x42]), I2C.Message([0x00,0x00], read=True)]
  i2c.transfer(0x48, msgs)
#  print "value1=",msgs[1].data[0],msgs[1].data[1]
  data = int(msgs[1].data[1])
  volt2 = data * 3.3 / 255
#  print "volt(Ch2)={0:.2f}".format(volt2)
  print "volt(Ch0)={0:.2f} (Ch1)={1:.2f} (Ch2)={2:.2f}".format(volt0,volt1,volt2)

  time.sleep(2)

i2c.close()

起動時の引数でデバイスを変更することができます。
2G-IOTには3つのi2cデバイスが有りますが、/dev/i2c-1(ピン番号=27/28)は、GPIO#1/#0としてアサインされて いるので
i2cとしては使えません。

python smbusライブラリが2G-IOTでも動きました。
i2cだけを使うのであれば、こちらの方が楽かもしれません。
こちらのコードが2G-IOTでもあっ さり動きました。

次回は、BMP280のディジタル温度計の使い方を紹介しま す。