著者:米田聡
シェルスクリプトマガジンでは、小型コンピュータボード「Raspberry Pi」(ラズパイ)向けのセンサー搭載拡張ボード「ラズパイセンサーボード」を制作しました。第7 回では、I2C のインタフェースに接続するI/Oエキスパンダ「MCP23017」でGPIO 端子を増やす方法を紹介します。
シェルスクリプトマガジン Vol.60は以下のリンク先でご購入できます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 |
from smbus import SMBus class MCPGPIO(): __IODIR = [0x00, 0x01] # レジスタ番号 __GPPU = [0x0C, 0x0D] __GPIO = [0x12, 0x13] __OLAT = [0x14, 0x15] INPUT = 1 OUTPUT = 0 INPUTPULLUP = 3 HIGH = 1 LOW = 0 def __init__(self,address = 0x20): self.bus = SMBus(1) self.addr = address def setup(self, pin, dir): if pin < 16: dir = self.bus.read_byte_data(self.addr,self.__IODIR[int(pin/8)]) dir &= ~(0x01 << int(pin % 8)) dir |= (dir & 1) << int(pin % 8) self.bus.write_byte_data(self.addr, self.__IODIR[int(pin/8)], dir) if (dir & 1) == 1: pu = self.bus.read_byte_data(self.addr,self.__GPPU[int(pin/8)]) pu &= ~(0x01 << int(pin % 8)) pu |= ((dir >> 1) & 1) << int(pin % 8) self.bus.write_byte_data(self.addr, self.__GPPU[int(pin/8)], pu) def input(self, pin): r = 0 if pin < 16: gp = self.bus.read_byte_data(self.addr, self.__GPIO[int(pin/8)]) r = (gp >> int(pin%8) & 1) return r def output(self, pin, val): if pin < 16: gp = self.bus.read_byte_data(self.addr, self.__GPIO[int(pin/8)]) gp &= ~(0x01 << int(pin % 8)) gp |= (val & 1) << int(pin % 8) self.bus.write_byte_data(self.addr, self.__GPIO[int(pin/8)], gp) @property def gpioa(self): return self.bus.read_byte_data(self.addr, self.__GPIO[0]) @gpioa.setter def gpioa(self, value): self.bus.write_byte_data(self.addr,self.__GPIO[0], value) @property def gpiob(self): return self.bus.read_byte_data(self.addr, self.__GPIO[1]) @gpiob.setter def gpiob(self, value): self.bus.write_byte_data(self.addr,self.__GPIO[1], value) |