演習問題
「IoT演習第9回、センサとアクチュエータ」の「5. 演習」「光の強さが強い時と、弱い時で、サーボモータの向きを変える回路とプログラムを作ってください。(2.6と3.2を参考にしてください)」の演習の解答例です。
解答へのアドバイス
ー ヒントになる回路やプログラムや今までに学習した回路やプログラムを良く理解することが必要になります。回路の細かいところや、プログラムの一行一行に意味があります。その意味を理解すると良いです。
ー 論理的に考えてください。
参考になる「2.6 光センサ」の回路
光の強弱によって、アナログ入力端子 A0 の電圧が変化するように作成しています。
参考になる「2.6 光センサ」のプログラム
「IoT演習第5回、アナログ値の入力とPWM出力」の、「5.2 プログラム」と同じプログラムを実行することで、1秒ごとに、$9.9 l_x$の値が表示されます。以下、プログラムを再掲します。
アナログ入力端子A0の電圧を0Vの時0, 3.3Vの時、65537 になるように比例配分して出力します。
from machine import ADC, Pin
import time
adc = ADC(Pin(26))
while True:
print(adc.read_u16())
time.sleep(1)
参考になるサーボモータを動かす回路の例:
GPIO GP9からPWM信号が出力されることを想定してそのデューティー比によりサーボモータ(SG90)が動くように回路を作っています。
参考になるサーボモータを動かすプログラムの例
SG90の仕様から、SG90のホーンの向きを、0度、90度、0度、-90度に変化させるようにデューティー比を作り、その出力を繰り返しています。
from machine import PWM, Pin
from time import sleep
servo = PWM(Pin(9))
servo.freq(50)
angle_M90 = int(2.5 / 20 * 65536)
angle_0 = int(1.5 / 20 * 65536)
angle_90 = int(0.5 / 20 * 65536)
while True:
servo.duty_u16(angle_0)
print(angle_0)
sleep(2)
servo.duty_u16(angle_90)
print(angle_90)
sleep(2)
servo.duty_u16(angle_0)
print(angle_0)
sleep(2)
servo.duty_u16(angle_M90)
print(angle_M90)
sleep(2)
解答例
光の強弱により、アナログ入力端子A0にかかる電圧が変化し、
adc = ADC(Pin(26))
v=adc.read_u16()
で得られた光の強弱に比例した値(およそ$9.9 l_x$)が、500より小さい時は、サーボモータの角度を0にし、500以上の時は、サーボモータの角度を90度に変化させます。
回路の例
A0端子で、光センサで得られる、照度にほぼ比例した電圧を計測し、
GPIO 9の端子でサーボモータの信号線にPWMの信号を与えるようにします。
プログラムの例
while ループの前に、サーボモータのホーンの位置が-90度、0度、90度になる場合のPWMのデューティー比の設定、を行っています。アナログ入力の設定も行っています。
whileループの中では、A0端子で計測した光の強さ(およそ$9.9 l_x$)が500より大きければ、サーボモータの信号線に、ホーンの向きが0度になるようなデューティー比のPWM信号を出力します。A0端子で計測した光の強さ(およそ$9.9 l_x$)が500以内であれば、サーボモータの信号線に、ホーンの向きが90度になるようなデューティー比のPWM信号を出力します。
from machine import PWM, ADC, Pin
from time import sleep
servo = PWM(Pin(9))
servo.freq(50)
angle_M90 = int(2.5 / 20 * 65536)
angle_0 = int(1.5 / 20 * 65536)
angle_90 = int(0.5 / 20 * 65536)
adc = ADC(Pin(26))
while True:
v=adc.read_u16()
print(v)
if v<500:
servo.duty_u16(angle_0)
else:
servo.duty_u16(angle_90)