今回はラズパイで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°で制御する必要があることに気を付けないとサーボモーターは動きません。
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の部分を可変抵抗に変えれば、つまみを回すことでサーボモーターの回転角を決められるようになります。
 
0 件のコメント:
コメントを投稿