RaspberryPiでA/D変換を使う
概要:
RaspberryPiはA/Dコンバータが搭載されていません。このままではアナログ値を出力するセンサー群を使うことができません。(I2C,SPIのモジュールを作れば…)
そこで今回は、RaspberryPiでアナログ値を読み取る方法を書きます。
通信方法:SPI
言語:Python
部品:
・MCP3208(12bit8chA/Dコンバータ)
画像引用:http://akizukidenshi.com/catalog/g/gI-00238/
データシート:
startとchannel情報、合わせて5bit送信することでA/Dコンバータ側に求めるchannelを指定する。
受信するデータはもちろん12bit(A/Dコンバータの分解能)
データシート一部参照
回路:
プログラム:
使用するピン
SPI_CLK = 11 SPI_MOSI = 10 SPI_MISO = 9 SPI_SS = 8
GPIOのI/O設定
GPIO.setwarnings(False)
GPIO.setmode(GPIO.BCM)
GPIO.setup(SPI_CLK,GPIO.OUT)
GPIO.setup(SPI_MOSI,GPIO.OUT)
GPIO.setup(SPI_MISO,GPIO.IN)
GPIO.setup(SPI_SS,GPIO.OUT)
アナログ値取得関数
def getMCP3208(channel): GPIO.output(SPI_SS,False) GPIO.output(SPI_CLK,False) GPIO.output(SPI_MOSI,False) GPIO.output(SPI_CLK,True) GPIO.output(SPI_CLK,False) order = (channel | 0x18) << 3 for i in range(5): #データシート参照 if (order & 0x80):#マスクを取り1bitずつ送信する GPIO.output(SPI_MOSI,True) else: GPIO.output(SPI_MOSI,False) order <<= 1 GPIO.output(SPI_CLK,True) GPIO.output(SPI_CLK,False) GPIO.output(SPI_CLK,True) GPIO.output(SPI_CLK,False) GPIO.output(SPI_CLK,True) GPIO.output(SPI_CLK,False) value = 0 for i in range(12): #12bitのデータを受信する value <<= 1 GPIO.output(SPI_CLK,True) if(GPIO.input(SPI_MISO)): value |= 0x1 GPIO.output(SPI_CLK,False) GPIO.output(SPI_SS,True) return value