アナログ入力ができないラズパイで、ADコンバータを使ってアナログデータを取り込めるようにしました。

 

 

使ったもの

  • RaspberryPi2 Model B
  • 可変抵抗
  • ADコンバータ MCP3208

 

 

ADコンバータ『MCP3208』は、秋月電子で300円。(2020.5.17現在)

 

 

 

今回も先人たちの知恵をお借りしています。

参考にさせて頂いた記事はこちら。

そう忘備録さん :RaspberryPi 3 Model B+と赤外線距離センサー(GP2Y0A02YK)で距離を測定する

https://www.souichi.club/raspberrypi/raspi-gp2y0a02yk/

 

 

まずは配線をしていきます。

今回は、ADコンバータには可変抵抗のアナログ値を入力しようと思います。

ラズパイとADコンバータ、ADコンバータと可変抵抗の配線は下記のようにしました。

 

 

わかりづらいかもしれませんが、写真でも残しておきます。

 

ラズパイ側

 

 

ADコンバータと可変抵抗

 

全体

 

 

可変抵抗は、とりあえず真ん中くらいに合わせています。

ツマミをぐりぐりと回すと、出力電圧が変わる予定。

 

これでハード側の準備は完了。

 

 

次はプログラムを書いていきます。

現在勉強中のPythonで書きます。

 

 

プログラムを書く前に、2点ほど準備が必要。

 

 1.SPIの有効化

 

 2.spidevのインストール

 

 

SPIの有効化は、「設定」 → 「Raspberry Pi の設定」 から変更できます。

 

 

 

SPIのところを有効にしました。

ついでにI2Cも有効化しておきました。

たぶんそのうち使うはずなので。

 

 

spidevは、既にインストールされてたっぽい。

コマンドは下記。

 

sudo apt-get install python-spidev

 

 

これで準備完了。

 

そして、参考にした記事のサンプルプログラムをコピペ&若干の修正を加えました。

追記した箇所を赤色の文字にしています。

 

# -*- coding: utf-8 -*-
import time                                             
import spidev                                           
import numpy as np                                      
import csv
CHN = 0                                                 
VOLTS = 5                                               
 
class  ADConverterClass:                                
    def __init__(self, ref_volts, ch):                  
        self.ref_volts = ref_volts                      
        self.spi = spidev.SpiDev()                      
        self.spi.open(0,0)                              
        self.spi.max_speed_hz = 1000000                 
        self.ch = ch                                    
 
    def get_voltage(self, ch):                          
        raw = self.spi.xfer2([((0b1000+ch)>>2)+0b100,((0b1000+ch)&0b0011)<<6,0])  
        raw2 = ((raw[1]&0b1111) << 8) + raw[2]          
        volts = (raw2 * self.ref_volts ) / float(4095)  
        volts = round(volts,4)                          
        return volts                                    
 
    def Cleanup(self):                                          
        self.spi.close()                                        
 
if __name__ == '__main__': # main
    ad_conv = ADConverterClass(ref_volts=VOLTS, ch=CHN) 

with open('ADC.csv','w') as f:
    writer = csv.writer(f, lineterminator='\n')


    try:
            while True:
                __volts = ad_conv.get_voltage(ch=CHN)       
                print("volts: {:8.2f}".format(__volts))
 
                volf = float(__volts)
                writer.writerow([volf])

                
                time.sleep(1)                               
    except KeyboardInterrupt:                           
        print("\nCtl+C")
    except Exception as e:
        print(str(e))                                   
    finally:
        ad_conv.Cleanup()                               
        print("\nexit program")                         

 

通信の設定やデータ取得のプログラムはそのままにして、csvファイルへ保存するところを追記しました。

 

 

動作確認の結果。

 

 

 

しっかりとデータが取得できました!!

 

 

色々と勉強した成果もあり、今回は割と短時間で出来ました。

少しずつですが、プログラムが読めるようになってきた気がします。

これでまた使える引き出しが1つ増えました。

 

 

まだまだコピペメインですが、作りたいものが作れるようになるまで頑張ります!