【ラズパイ】A/Dコンバータを使ってアナログ信号を扱う

2024/02/26

ADS1115 Cds サーボモーター ラズパイ

  • B!

今回はラズパイでADS1115(A/Dコンバータ)を使ってアナログ信号を扱えるようにします。

ラズパイのGPIOはアナログ入力に対応していないのでA/Dコンバーターで変換する必要があります。

アナログ信号をラスパイで扱えるようになることで電子工作の幅が広がります。

今回は、Cdsモジュールの信号に応じてサーボモーターを動かしてみます。

今回の目標

回路構成

使用するラズパイのピンアサインを確認してください。

ADS1115

VDD RaspberryPi 3.3v
GND RaspberryPi GND
SCL RaspberryPi SCL
SDA RaspberryPi SDA
A0 Cds AO

Cdsモジュール

VCC RaspberryPi 3.3v
GND RaspberryPi GND
A0 ADS1115 A0

サーボモーター

黄色 RaspberryPi PWM (GPIO 21)
赤色 RaspberryPi 5.0v
茶色 RaspberryPi GND

サンプルコード

I2Cを使ってCdsの出力信号を読み取ります。

サーボの回転角は最大180°であること、回転角は-90~+90°で制御する必要があることに気を付けないとサーボモーターは動きません。

ads1115_cds.py
import RPi.GPIO as GPIO
import time
import sys
import board
import busio
import adafruit_ads1x15.ads1115 as ADS
from adafruit_ads1x15.analog_in import AnalogIn

i2c = busio.I2C(board.SCL, board.SDA)
ads = ADS.ADS1115(i2c)
cahnnel0 = AnalogIn(ads, ADS.P0)

Servo_pin = 21

GPIO.setmode(GPIO.BCM)
GPIO.setup(Servo_pin, GPIO.OUT)

Servo = GPIO.PWM(Servo_pin, 50)
Servo.start(0)

#cdsから値を取得する
def read_cds():
    #print('Vol : ', round(cahnnel0.voltage, 1))
    cds = round(cahnnel0.voltage, 0) * 60
    return cds

#サーボモーターを動かす
def servo_angle(angle):
    duty = 2.5 + (12.0 - 2.5) * (angle + 90) / 180
    Servo.ChangeDutyCycle(duty)
    time.sleep(0.3)

try:
    while True:
        angle = int(read_cds())
        
        #サーボは-90~+90°の範囲
        angle -= 90
        
        servo_angle(angle)
        #print('Angle : ', angle, '\n')
        time.sleep(1)
        
except KeyboardInterrupt:
    servo_angle(-90)
    Servo.stop()
    GPIO.cleanup()
    sys.exit()

実行結果

周囲の明るさに応じてサーボモーターの回転角が変化します。

ラズパイでCdsのアナログ信号を読み取ってサーボを動かすためのPWM信号に置き換えることができています。

Cdsの部分を可変抵抗に変えれば、つまみを回すことでサーボモーターの回転角を決められるようになります。

Ranking

Community

Search