4.2 Raspberry Pi B+ 温度を測ろう!

4.2 PWMでサーボ-モータを回して見よう

(1) サーボ-モータの回路を作ろう

PWMを使ってサーボモータを回します。サーボモータの回る角度はPWM信号のパルス幅で変わります。

(2) 回路を作ろう

①組立
下の配線図、回路図をみて、回路を組立て下さい。

raspi_4.2_1s raspi_4.2_2s

(2) 部品を作ろう

サーボモータ(SG-90)は、

動作パルス:20ms–>周波数50Hz

0度:1.0m–>デユーティ5%

90度:1.5ms–>デユーティ7.5%

180度:2.0ms–>デユーティ10.0%

で動作します。

①電源を入れます。

RaspberryPiB+にACアダプタを繋ぎ、電源を入れます。

②ログインします。

Raspbianが立ち上がったら、ログインして下さい。

③「nano」エディター立ち上げます。

「nano rpi_bp_pwm_sv1_1.py」コマンドを実行して下さい。
画面が「nano」エディターの画面に変わります。

④プログラムを入れます

サンプルプログラム1

 #! /usr/bin/env python

import RPi.GPIO as GPIO
import time

GPIO.setmode(GPIO.BCM) # use GPIO Number

SV1 =12
GPIO.setup(SV1, GPIO.OUT)

servo = GPIO.PWM(SV1, 50) # set 20 ms / 50 Hz

angle = 0.0 # set angle
new_duty =(1.0 + angle/180.0)/20.0*100.0 # calculate duty
print(new_duty)
servo.start(new_duty)
print(“angle 0 deg”)
time.sleep(0.5)

angle = 90.0 # set angle
new_duty =(1.0 + angle/180.0)/20.0*100.0 # calculate duty
print(new_duty)
servo.ChangeDutyCycle(new_duty)
print(“angle 90 deg”)
time.sleep(0.5)

angle = 180.0 # set angle
new_duty =(1.0 + angle/180.0)/20.0*100.0 # calculate duty
print(new_duty)
servo.ChangeDutyCycle(new_duty)
print(“angle 180 deg”)
time.sleep(0.5)

angle = 0.0 # set angle
new_duty =(1.0 + angle/180.0)/20.0*100.0 # calculate duty
print(new_duty)
servo.start(new_duty)
print(“angle 0 deg”)
time.sleep(0.5)

servo.stop() # stop servo

⑤入力を終わります。

「ctrl+X」を実行します。
次に、「y/n」は「enter」を入れます。

⑥入力したプログラムを実行します。

「sudo python rpi_bp_pwm_sv1_1.py」を実行します。

*サーボモータが0度、90度、180度、0度とまわります。その後に、「sv1 done」のメッセージが出ます。

raspi_code_4.2_1

(2) 部品にしよう

初期化、回転角の制御を部品にします。

①「nano」エディター立ち上げます。

「nano rpi_bp_pwm_sv1a_1.py」コマンドを実行して下さい。
画面が「nano」エディターの画面に変わります。

②プログラムを入れます

サンプルプログラムを見て、入力します。

サンプルプログラム2

 #! /usr/bin/env python

import RPi.GPIO as GPIO
import time

def sv_init(sv):
GPIO.setup(sv, GPIO.OUT)
servo = GPIO.PWM(sv, 50) # set 20 ms / 50 Hz
return servo

def angle_duty(angle):
duty =(1.0 + angle/180.0)/20.0*100.0 # calculate duty
return duty

if __name__ == (“__main__”) :
# start

GPIO.setmode(GPIO.BCM) # use GPIO Number

SV1 =12
servo = sv_init(SV1)

angle = 0.0 # set angle
new_duty = angle_duty(angle)

print(new_duty)
servo.start(new_duty)
print(“angle 0 deg”)
time.sleep(0.5)

angle = 90.0 # set angle
new_duty = angle_duty(angle) # calculate duty
print(new_duty)
servo.ChangeDutyCycle(new_duty)
print(“angle 90 deg”)
time.sleep(0.5)

angle = 180.0 # set angle
new_duty = angle_duty(angle) # calculate duty
print(new_duty)
servo.ChangeDutyCycle(new_duty)
print(“angle 180 deg”)
time.sleep(0.5)

angle = 0.0 # set angle
new_duty = angle_duty(angle) # calculate duty
print(new_duty)
servo.start(new_duty)
print(“angle 0 deg”)
time.sleep(0.5)

servo.stop() # stop servo

③入力を終わります。

「ctrl+X」を実行します。
次に、「y/n」は「enter」を入れます。

④入力したプログラムを実行します。
「sudo python rpi_bp_pwm_sv1a_1.py」を実行します。

*サーボモータが0度、90度、180度、0度とまわります。
その後に、「sv1a done」のメッセージが出ます。

raspi_code_4.2_2

(3) モジュールを使おう

(2)で作った部品(関数)の入ったファイルをモジュールとして使います。

①「nano」エディター立ち上げます。

「nano rpi_bp_pwm_bz1b_1.py」コマンドを実行して下さい。
画面が「nano」エディターの画面に変わります。

②プログラムを入れます
サンプルプログラムを見て、入力します。

サンプルプログラム3

 #! /usr/bin/env python

import RPi.GPIO as GPIO
import time

from rpi_bp_pwm_sv1a_1 import *

if __name__ == (“__main__”) :
# start

GPIO.setmode(GPIO.BCM) # use GPIO Number

SV1 =12
servo = sv_init(SV1)

angle = 0.0 # set angle
new_duty = angle_duty(angle)

print(new_duty)
servo.start(new_duty)
print(“angle 0 deg”)
time.sleep(0.5)

angle = 90.0 # set angle
new_duty = angle_duty(angle) # calculate duty
print(new_duty)
servo.ChangeDutyCycle(new_duty)
print(“angle 90 deg”)
time.sleep(0.5)

angle = 180.0 # set angle
new_duty = angle_duty(angle) # calculate duty
print(new_duty)
servo.ChangeDutyCycle(new_duty)
print(“angle 180 deg”)
time.sleep(0.5)

angle = 0.0 # set angle
new_duty = angle_duty(angle) # calculate duty
print(new_duty)
servo.start(new_duty)
print(“angle 0 deg”)
time.sleep(0.5)

servo.stop() # stop servo
GPIO.cleanup()

③入力を終わります。

「ctrl+X」を実行します。
次に、「y/n」は「enter」を入れます。

④入力したプログラムを実行します。

「sudo python rpi_bp_pwm_sv1b_1.py」を実行します。
*サーボモータが0度、90度、180度、0度とまわります。
その後に、「sv1b done」のメッセージが出ます。

raspi_code_4.2_3

⑤電源をきります。

「sudo shutdown -h now」を入力して下さい。

*ステータスLEDの点滅が終わり、消えてからマイクロUSBのDC5Vを抜いて下さい。

raspi_code_4.2_4

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です