ラズパイで半固定抵抗とADコンバーターから電圧を表示するプログラム | そう備忘録

ラズパイで半固定抵抗とADコンバーターから電圧を表示するプログラム

電圧を表示する

ラズパイ(Raspberry Pi 3 B+)と半固定抵抗とADコンバーターを使って動的に変更した電圧をコンソールに表示するプログラムについての記事。

半固定抵抗とは

半固定抵抗とは抵抗値が一定では無くボリューム式つまみを回すことで抵抗値を変化させることが出来る抵抗の事。

写真は秋月電子通商の「Raspberry Piで学ぶ電子工作 パーツセット」に入っていた半固定ボリューム 10kΩ(TSR-3386)で端子が3本出ている。

半固定抵抗写真

同じものでは無いが同様機能の可変抵抗器はアマゾンなどでも購入できる。

下記は半固定抵抗のイメージ図。

半固定抵抗説明図

例えば抵抗Rが10KΩの時に抵抗Xを8KΩに調整すると端子2に出力される電圧は、

3.3V×8KΩ÷10KΩ=2.64Vの電圧が取り出せる。

抵抗の分圧計算式

抵抗の分圧計算式は以下の通り。

抵抗の分圧

Vout = Vcc × R2 ÷ (R1+R2)

例)

  • Vcc:5V
  • R1:100Ω
  • R2:330Ω

の場合、

Vout=5×330÷(100+330)=3.84V

ADコンバーター

端子2の電圧はアナログ値なのでラズパイで読み取るためにはデジタル値に変換する必要がある。

ADコンバーター(アナログ値→デジタル値に変換)はMCP3208を使った。

回路図

ラズパイと半固定抵抗、ADコンバーターの回路図は下記の様に接続した。

実際の配線の様子

実際の配線の様子

参考書籍

回路図は金丸隆志さんの「Raspberry Piで学ぶ電子工作」を参考にさせて貰っている。

この書籍は自分が初めてラズパイを触った時に購入した書籍で基本的な事からちょっとした応用まで細かく丁寧に書かれているのでとてもありがたかった。

尚、上記の書籍はRaspberry Pi 3をベースに書かれている。

今回の回路図ではRaspberry Pi 3、4の違いは無いのだが4対応の書籍も出版されていたので載せておく。

その他必要なもの

半固定抵抗、ADコンバーターの他に必要なものについては以前の記事の「必要なモノ」を参照して欲しい。

事前準備

ラズパイのSPIを有効にする

ラズパイのメニューより”設定”、”Raspberry Piの設定”、”インターフェースタブ”でSPIを有効にする。

ラズパイでSPIを有効にする

spidevのインストール

前述の紹介した書籍「Raspberry Piで学ぶ電子工作」ではspidev(PythonでSPIを操作する為のライブラリー)を使用せずに基本的なコードでプログラミングしている。

ラズパイとspiの制御の基本を学ぶ為にはそちらのコードの方が良いのだが、spidevライブラリーを使用した方がコードも簡潔で制御も簡単になるのでこの記事ではspidevをつかったプログラミングとしている。

LXTerminalから以下のコマンドでspidevをインストールする。

sudo apt-get install python-spidev

実行結果

Python用ライブラリーspidevのインストール

プログラム

ソースコード

下記のプログラムをラズパイ上で実行しながら半固定抵抗のつまみを回すことで0v~3.3Vの間で動的に変更した電圧を取り出すことができる。

尚、前述の回路図ではつまみを時計回りに回すと電圧が高くなり反時計回り回すと電圧が低くなる。

半固定抵抗を上下逆に配置すると逆の動きになる。

# -*- coding: utf-8 -*-
"""
Created on Sun Aug  9 08:48:17 2020

@author: Souichirou Kikuchi
"""

import spidev
from time import sleep

V_REF = 3.29476 # input Voltage
CHN = 0 # 接続チャンネル

spi = spidev.SpiDev()
spi.open(0, 0) # 0:SPI0、0:CE0
spi.max_speed_hz = 1000000 # 1MHz SPIのバージョンアップによりこの指定をしないと動かない

def get_voltage():
    dout = spi.xfer2([((0b1000+CHN)>>2)+0b100,((0b1000+CHN)&0b0011)<<6,0]) # Din(RasPi→MCP3208)を指定
    bit12 = ((dout[1]&0b1111) << 8) + dout[2] # Dout(MCP3208→RasPi)から12ビットを取り出す
    volts = round((bit12 * V_REF) / float(4095),4)  # 取得した値を電圧に変換する(12bitなので4095で割る)
    return volts # 電圧を返す

try:
    print('--- start program ---')
    while True:
        volts = get_voltage()
        print('volts= {:3.2f}'.format(volts))
        sleep(1)

except KeyboardInterrupt:
    pass
finally:
    spi.close()
    print('--- stop program ---')

補足説明

変数の定義

11行目のV_REFは入力の電圧。

12行目のCHNはADコンバーター(MCP3208)に接続するチャンネル。

回路図の左から0~7と8つのチャンネルがある。

つまりMCP3208では8つのデバイスを同時に制御することが出来る。

max Speedの指定

16行目のspi.max_speed_hz = 1000000は以前は未設定でも動いたのだがSPIのバージョンアップ後はこの指定をしないとエラーになるので指定している。

ADコンバーター

18~22行目はADコンバーターから電圧を取り出すロジック。

MCP3208では0~4095の値で電圧を返す。

今回の例だと0~3.3Vを0(0V)~4095(3.3V)の値で表すことになる。

MCP3208に信号を送って(Din)、返ってきた値(Dout)を12ビットで取得して4095で除算して電圧を求めているのだが詳細は以前のこちらの記事を参照して欲しい。

メインループ

25~29行目でget_voltage関数を呼び出して1秒間隔で電圧をprint表示している。

実行結果

実行時の画面ショット。

このプログラムを実行しながら半固定抵抗のつまみを回すと電圧が変わる様子が分かる。

実行時の画面ショット

以上で今回の記事は終了とする。

最後に

この記事が何処かで誰かの役に立つことを願っている。

尚、当記事中の商品へのリンクはAmazonアソシエイトへのリンクが含まれています。Amazonのアソシエイトとして、当メディアは適格販売により収入を得ていますのでご了承ください。

souichirou

やった事を忘れない為の備忘録 同じような事をやりたい人の参考になればと思ってブログにしてます。 主にレゴ、AWS(Amazon Web Services)、WordPress、Deep Learning、RaspberryPiに関するブログを書いています。 仕事では工場に協働ロボットの導入や中小企業へのAI/IoT導入のアドバイザーをやっています。 2019年7月にJDLA(一般社団法人 日本デイープラーニング協会)Deep Learning for GENERALに合格しました。 質問は記事一番下にあるコメントかメニュー上部の問い合わせからお願いします。

おすすめ

質問やコメントや励ましの言葉などを残す

名前、メール、サイト欄は任意です。
またメールアドレスは公開されません。