RaspberryPiとADS1115でアナログ入力を取得する

# Outline
 raspberryPiを使ってアナログ入力を取得するために
 ADDA変換モジュールADS1115を使って値を取得する。　

# Output
<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483299/0973a072-0a12-7478-fed5-93c63f5ad518.jpeg width=320>

<iframe width="320" height="320" src="https://www.youtube.com/embed/Uy8chX4VXyM" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>

# Hardware setup

* [ADS1115](https://www.amazon.co.jp/KKHMF-ADS1115-4%E3%83%81%E3%83%A3%E3%83%B3%E3%83%8D%E3%83%AB-%E3%82%B2%E3%82%A4%E3%83%B3%E3%82%A2%E3%83%B3%E3%83%97-Arduino/dp/B07J4R941L)

| Raspberry-pi | 配線 | ADS1115 |
|:-----------|------------:|:------------:|
|01 3.3V        | <-> | VIN|
|03 5V        | <-> | SDA|
|05 5V        | <-> | SCL|
|09 GND        | <-> | GND|
|        |  | A0:チャンネル0|
|        |  | A1:チャンネル1|
|        |  | A2:チャンネル2|
|        |  | A3:チャンネル3|

※ADコンバータは  
A0、A1、A2、A3の4チャンネルの電圧を測定(SingleEnded)と、
A0-A1、A2-A3間の2チャンネルで差動を測定する(Differentianl)がある

# Software setup
# install
```
sudo pip3 install adafruit-circuitpython-ads1x15
sudo pip install adafruit-ads1x15
```

# ディレクトリ構成 [Github](https://github.com/h-kiyo/ADDA_ADS1115.git)
```
home/
├ adafruit_ads1x15\
│ └ ads1x15         　 #ライブラリ
└ ads1115_example.py 　#exampleコードを複数チャンネル入力対応に改変
```

# code

```py:ads1115_example.py
import time
import board
import busio
import adafruit_ads1x15.ads1115 as ADS
from adafruit_ads1x15.analog_in import AnalogIn

# Create the I2C bus
i2c = busio.I2C(board.SCL, board.SDA)

# Create the ADC object using the I2C bus
ads = ADS.ADS1115(i2c)

# Create single-ended input on channel 0
chan0 = AnalogIn(ads, ADS.P0)
chan1 = AnalogIn(ads, ADS.P1)
chan2 = AnalogIn(ads, ADS.P2)
chan3 = AnalogIn(ads, ADS.P3)

print("{:>5}\t{:>5}".format("raw", "v"))

try:
    while True:
        print("cahn0: {:>5}\t{:>5.3f}".format(chan0.value, chan0.voltage))
        print("cahn1: {:>5}\t{:>5.3f}".format(chan1.value, chan1.voltage))
        print("cahn2: {:>5}\t{:>5.3f}".format(chan2.value, chan2.voltage))
        print("cahn3: {:>5}\t{:>5.3f}".format(chan3.value, chan3.voltage))
        print("")
        time.sleep(0.5)
except KeyboardInterrupt:
    pass
```

## 参考　ゲインの設定
 詳細はデータシートを参照
| GAIN | 電圧 |
|:----:|:----:|
|2/3   | ±6.144 |
|1     | ±4.096 |
|2     | ±2.048 |
|4     | ±1.024 |
|8     | ±0.512 |
|16    | ±0.256 |

 ※APIを使ったゲイン設定も存在するようなのでそちらを使用するとシンプル。
「ゲイン1」の時の、「受信データ1単位」の電圧を計算します
「ゲイン1」の範囲はプラス・マイナス 4.096なので、8.192になります
 RANGE = 4.096 * 2
 ADS1115は上記範囲を16bit(65536)で表すので、上記範囲を65536で割ると、ADSのデータ「1」につき、電圧は0.000125[V]になります。
 8.192/65536=0.000125


# run
```
python3 ads1115_example.py
```

# 結果

```py:ads1115_example.pyの出力
cahn0: 26380	3.297
cahn1: 13202	1.650
cahn2:  4823	0.605
cahn3:  4817	0.604
```

各チャンネルの出力が確認できました。
以上

# 参考記事
* [ ADコンバータ(ADS1115)を使ってCdsから値(電圧)を取得する](https://androiphone.uvs.jp/?p=2458)  
* [Raspberry Pi で ADS1115 を使う](https://qiita.com/ekzemplaro/items/1e98e1c9e58bd4d8a95c)  
* [Adafruit_CircuitPython_ADS1x15](https://github.com/adafruit/Adafruit_CircuitPython_ADS1x15)  
* [データシート](https://cdn-shop.adafruit.com/datasheets/ads1115.pdf)  
 コードの参考元
* [RaspberryPiでA/D変換する方法【Adafurit ADS1015】](https://tech-and-investment.com/raspberrypi2-5-ads1015/)  
* [[ラズパイ] ADコンバータ(ADS1115)を使ってサーミスタから温度を取得する](https://androiphone.uvs.jp/?p=2509)
* [購入_STEMMA QT/Qwiic互換 ADS1115搭載 16BitADC 4CH 可変ゲインアンプ付き](https://www.switch-science.com/products/1138)