某ファブ施設スタッフの落書き

某ファブ施設で働くスタッフの気まぐれな日記のようなものです。

RaspberryPiでA/D変換を使う

概要:
RaspberryPiはA/Dコンバータが搭載されていません。このままではアナログ値を出力するセンサー群を使うことができません。(I2C,SPIのモジュールを作れば…)
そこで今回は、RaspberryPiでアナログ値を読み取る方法を書きます。

通信方法:SPI
  言語:Python

部品:
・MCP3208(12bit8chA/Dコンバータ)
f:id:hogerian1306:20160504153814p:plain:h160:w250
画像引用:http://akizukidenshi.com/catalog/g/gI-00238/

データシート:
startとchannel情報、合わせて5bit送信することでA/Dコンバータ側に求めるchannelを指定する。
f:id:hogerian1306:20160510231042p:plain:h400:w250

受信するデータはもちろん12bit(A/Dコンバータの分解能)
f:id:hogerian1306:20160510232406p:plain
データシート一部参照


回路:
f:id:hogerian1306:20160510213002p:plain:h240:w360

プログラム:
使用するピン

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