ADC(ADS1015)を使ってRaspberry Piでアナログ信号を取り込む方法

  • URLをコピーしました!

今回はTI社のADコンバータ、ADS1015を使ってRaspberry Piでアナログ信号を読み取る方法にいて解説します。
I2C接続で簡単に使用できますのでぜひ活用してみてください。

\ Raspberry Piを使ったアプリ開発を学びたい人には自宅で学べるUdemyがおすすめ! /

講座単位で購入できます!

目次

Raspberry Piとは

ラズベリーパイ(Raspberry Pi)はイギリスのラズベリーパイ財団が教育用に開発したボードコンピュータです。

最新のRaspberry Pi 4では、ARMアーキテクチャを採用したBroadcom製の高性能SoC BCM2711を搭載しており、1.5GHzで動作するARM Cortex-A72が4コアとマイコンボードの中では非常に高速な処理能力を持っています。また、ユーザーがアクセス可能な40ピンのGPIOも搭載しており、外部ハードウェアを制御することが可能です。

詳細なスペック等は以下の記事で解説していますので、あわせてご覧ください。

ADS1015 ADコンバータ

今回使用するADコンバータはTI(テキサスインスツルメンツ)が製造、販売しているADS1015を搭載したADCモジュールです。
ADS1015を搭載したADCモジュールはAmazonで安価で入手することができます。

ADS1015 ADコンバーター I2C ラズパイ 電子工作 に 12bit 4入力 アナログ→デジタル変換

アナログ入力を4チャンネル使用でき、分解能は12bitとなります。
接続はI2Cのシリアル通信となります。

電源電圧2.0V〜5.5V
チャンネル数シングルエンド4ch
差動2ch
分解能12bit
接続I2C
ADS1015スペック

AD変換の詳細については以下の記事で解説していますので、あわせてご覧ください。

ハードウェアの接続

こちらがADS1015モジュールの写真です。
ADS1015の基板の背面には各端子の信号名が記載されています。

基板背面

この信号名を元に以下のようにRaspberry Piとの配線を行いました。
今回はテスト的にADS1015のA0のチャンネルに、Raspberry PiのGPIO5(Pin No 29)を接続します。そして、GPIO5番ピンのデジタル信号をON/OFFし、電圧値が正しく読み取れるかを実験します。

ピン接続表

すごしごちゃごちゃとしていますが、以下の画像がADCとRaspberry Piを配線した様子です。

ライブラリ

今回は直接I2Cにアクセスするのではなく、AdafruitのPythonライブラリを使用してADCにアクセスします。

Adafruit社はRaspberry PiやArduinoなどのマイコンの周辺モジュールを多数開発、販売しているメーカーで、今回使用するADS1015用に無料公開しているライブラリがそのまま流用できます。

使用するライブラリ

AdafruitのADS1015で使用できるライブラリのリポジトリは以下となります。

インストール

プロンプトで以下のコマンドを実行し、ライブラリをインストールしてください。

sudo pip install adafruit-ads1x15

I2Cでの通信

Rapsberry PiとADS1015がI2Cで正しく通信できているかの確認を行います。

Raspberry Piの設定

Raspberry Piの設定画面で「インタフェース」の項目の「I2C」がデフォルトではOFFとなっているため、ONに変更します。

接続確認

ADS1015が正しくI2Cバスで接続できているかを確認します。
プロンプトで以下のコマンドを実行します。

i2cdetect -y 1

以下のようにアドレスが表示されれば正しく通信できています。

     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:                         -- -- -- -- -- -- -- -- 
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
40: -- -- -- -- -- -- -- -- 48 -- -- -- -- -- -- -- 
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
70: -- -- -- -- -- -- -- --       

GPIOライブラリのセットアップ

今回テスト用の信号としてRaspberry Piに搭載されているGPIOから出力した信号を使用します。
PythonのプログラムからGPIOへアクセスするためのライブラリ、pigpioを事前にセットアップしておいてください。

セットアップ方法は以下のページで解説しています。

作成したソースコード

今回はADS1015を使ったアナログ信号の取り込み処理の作成にあたり、以下のサイトを参考にさせて頂きました。

こちらが作成したソースコードです。
GPIOの5番ピンから出力した信号をADS1015の入力チャンネルに接続してAD変換をして取り込みます。

pigpioのwriteメソッドで5番ピンの出力状態を変更します。(23行目)
5番ピンがOFFの時は0V、ONの時は3.3Vが出力されます。

import time
import Adafruit_ADS1x15
import pigpio

#GPIOを初期化
#使用するピン番号を指定
pin1 = 5 #GPIO5番ピンを指定

pi = pigpio.pi()
pi.set_mode(pin1, pigpio.OUTPUT)  #ですと信号を出力するピンを設定


#ADS1015を初期化
ads = Adafruit_ADS1x15.ADS1015()
GAIN = 1 #ゲインを1(±4.096V)に設定
RANGE = 4.096 * 2
UNIT = RANGE / 4096

#ADSのアナログ入力ピン指定
ads1015_pin  = 0 #ch0を設定

#ADで読むための信号を出力
pi.write(pin1, 0)  #ON→3.3v , OFF→0V

#ADC読み出しを100回ループ
for i in range(100):
    data = 0
    volt = 0

    #ADS1015からデータを読み出し
    data = ads.read_adc(ads1015_pin, gain=GAIN)

    #電圧値を計算
    volt = data * UNIT

    print("受信データ:" + str(data))
    print("電圧      :" + "{:.3f}".format(volt))

    #0.5秒待機
    time.sleep(0.5)

print("done.")

発生したエラー

私の環境ではPyhonプログラム実行時に以下のようなエラーが発生しました。

raise RuntimeError('Could not determine default I2C bus for platform.')
RuntimeError: Could not determine default I2C bus for platform.

Adafruitのライブラリ内でI2Cのバスが検出できないというエラーのようです。
以下のサイトを参考に修正した結果、解消できました。

エラーの解消方法

以下のディレクトリにあるAdafruitのライブラリのファイルを修正します。

/home/pi/.local/lib/python3.9/site-packages/Adafruit_GPIO

テキストエディタで問題のライブラリのファイルを開きます。

sudo nano /home/pi/.local/lib/python3.9/site-packages/Adafruit_GPIO/I2C.py

ファイルを開くと「get_i2c_device」という関数が定義されている箇所がありますので探してください。

以下のようにif文とその下の行をコメントアウトし、戻り値returnで実行している「Device」という関数の第2引数の値を「1」に変更します。

以上で修正は完了です。
これで私の環境では問題なく使用できるようになりました。

実行結果

まずpigpioを起動するため、プロンプトで以下のコマンドを実行します。

sudo pigpiod

先ほどのPythonプログラムを実行します。結果は以下のようになりました。

GPIO5番ピンがOFFの時は0Vが出力されていますので、ADS1015で読み取ったアナログ信号もほぼ0Vと表示されいます。

続いてGPIO5番ピンをONにした場合です。
GPIOからは3.3Vが出力されていますので、ADS1015で読み取ったアナログ信号もほぼ3.3Vとなっています。

アナログ信号をADS1015で正しく読めていることが確認できました。

まとめ

今回はTI社のADC、ADS1015を使ってRaspberry Piでアナログ信号を読み取る方法について解説しました。アナログ信号を扱うことで多くのセンサーなどと接続することができますので、ぜひ活用してみてください。

また、以下の記事で効率的にPythonのプログラミングスキルを学べるプログラミングスクールの選び方について解説しています。最近ではほとんどのスクールがオンラインで授業を受けられるようになり、仕事をしながらでも自宅で自分のペースで学習できるようになりました。

スキルアップや副業にぜひ活用してみてください。

スクールではなく、自分でPythonを習得したい方には、いつでもどこでも学べる動画学習プラットフォームのUdemyがおすすめです。

講座単位で購入できるため、スクールに比べ非常に安価(セール時1200円程度~)に学ぶことができます。私も受講しているおすすめの講座を以下の記事でまとめていますので、ぜひ参考にしてみてください。

それでは、また次の記事でお会いしましょう。

\ Raspberry Piを使ったアプリ開発を学びたい人には自宅で学べるUdemyがおすすめ! /

講座単位で購入できます!

参考

よかったらシェアしてね!
  • URLをコピーしました!
目次