今回はラズパイで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 件のコメント:
コメントを投稿