電子工作はじめの一歩
ラズパイで電子工作してみる。
本記事は勉強しながら徐々に修正/更新していく。
GPIOピン
電子工作の前に、ラズパイ(*)のGPIOピンを確認する。
(*) Raspberry Pi 4 model B (メモリ4GB) を使用
GPIOピンの役割
3.3V, 5V : 電圧、常時出力
GIPO XX : 電子パーツと信号をやりとり(送受信)
ID_SD : 起動時、EEPROMにアクセス
GND : マイナスの役割。『グランド』と読む
LEDが光るだけ
ラズパイに電源いれたらLEDが光る。スクリプトで制御できない。
プログラムでLEDを光らせる
スクリプトでLEDを光らせる。(ラズパイの電源を入れただけではLEDが光らない)GPIO XX ならどこでもいいが、今回は GPIO 18 に接続した。
LEDが点滅するPython3スクリプト
# Python 3 スクリプト
import RPi.GPIO as GPIO
import time
LedGpio = 18 # GPIO 18
WaitTime = 0.5
GPIO.setmode(GPIO.BCM)
GPIO.setup(LedGpio, GPIO.OUT)
GPIO.setwarnings(False)
GPIO.setmode(GPIO.BCM)
GPIO.setup(LedGpio, GPIO.OUT)
for i in range(3):
GPIO.output(LedGpio, True) # LED 点灯
time.sleep(WaitTime) # スリープ
GPIO.output(LedGpio, False) # LED 消灯
time.sleep(WaitTime) # スリープ
GPIO.output(LedGpio, False)
サーボモーターを回す
サーボモーターへの給電は、ラズパイからじゃなく、別に電源を用意した。
import RPi.GPIO as GPIO
import time
GPIO.setmode(GPIO.BCM)
gp_out = 2 # GPIO 2
GPIO.setup(gp_out, GPIO.OUT)
right = GPIO.PWM(gp_out, 50)
right.start(0.0)
gp_out = 3 # GPIO 3
GPIO.setup(gp_out, GPIO.OUT)
left = GPIO.PWM(gp_out, 50)
left.start(0.0)
bot = 2.5
mid = 7.2
top = 12.0
right.ChangeDutyCycle(bot)
left.ChangeDutyCycle(bot)
time.sleep(0.5)
right.ChangeDutyCycle(top)
time.sleep(0.5)
right.ChangeDutyCycle(bot)
left.ChangeDutyCycle(top)
time.sleep(0.5)
right.ChangeDutyCycle(top)
left.ChangeDutyCycle(bot)
time.sleep(0.5)
GPIO.cleanup()
※参考リンク※
むむっ、抵抗(Ω)とか適当に使ってたけど、ちゃんと考えないとダメらしい。(過電流で、LEDが破裂したりするらしい、というか破裂した)
360度連続回転のサーボモーター
サーボモータは指定した角度回転するのですが、連続回転するサーボモーターもあるようです。買ってみました
指定する角度によって、回転速度と方向が変わるらしい。90度は止まる
まずは obniz で動かしてみた
obnizブロックプログラミング
ラズパイで制御
Python3スクリプト
import RPi.GPIO as GPIO
import time
GPIO.setmode(GPIO.BCM)
gp_out = 2 # GPIO 2
GPIO.setup(gp_out, GPIO.OUT)
right = GPIO.PWM(gp_out, 50)
right.start(0.0)
gp_out = 3 # GPIO 3
GPIO.setup(gp_out, GPIO.OUT)
left = GPIO.PWM(gp_out, 50)
left.start(0.0)
gp_out = 14 # GPIO 14
GPIO.setup(gp_out, GPIO.OUT)
right2 = GPIO.PWM(gp_out, 50)
right2.start(0.0)
gp_out = 15 # GPIO 15
GPIO.setup(gp_out, GPIO.OUT)
left2 = GPIO.PWM(gp_out, 50)
left2.start(0.0)
bot = 2.5
mid = 7.2
top = 12.0
top2= 8.0
right.ChangeDutyCycle(bot)
left.ChangeDutyCycle(bot)
right2.ChangeDutyCycle(mid)
left2.ChangeDutyCycle(top)
time.sleep(1.5)
right.ChangeDutyCycle(top)
right2.ChangeDutyCycle(top)
time.sleep(1.0)
right.ChangeDutyCycle(bot)
left.ChangeDutyCycle(top)
right2.ChangeDutyCycle(top)
left2.ChangeDutyCycle(bot)
time.sleep(2.0)
right.ChangeDutyCycle(top)
left.ChangeDutyCycle(bot)
right2.ChangeDutyCycle(bot)
left2.ChangeDutyCycle(top2)
time.sleep(0.5)
GPIO.cleanup()
Pythonスクリプトの場合、指定する角度(degree)は -90度~90度らしい。0度は回転なし状態。-90度と90度は、最大出力で逆回転の関係。
90 / -90度を指定したときの回転方向
角度(degree)を設定するPython3スクリプト
import RPi.GPIO as GPIO
import time
GPIO.setmode(GPIO.BCM)
gp_out = 2 # GPIO 2
GPIO.setup(gp_out, GPIO.OUT)
right = GPIO.PWM(gp_out, 50)
right.start(0.0)
# https://jellyware.jp/kurage/raspi/servo.html
# DutyCycle = 2.5 + ( 12.0 - 2.5 ) / 180 × ( degree + 90 )
degree = -90
#degree = 0 # 0は、サーボモーター動かない
#degree = 90
bot = 2.5 + (12.0 - 2.5) / 180 * (degree + 90)
print("degree={0}, bot={1}".format(degree, bot) )
right.ChangeDutyCycle(bot)
time.sleep(3.0)
GPIO.cleanup()
ラズパイで4個の360度連続回転のサーボモーターを制御
4個のサーボモーターをラズパイで制御できました。ラズパイへの給電をモバイルバッテリーにすればラジコンにできそうです。
配線図はこんな感じ。電圧 3.3V ではサーボを4個も動かなったので、5V電圧を使います。
Python3スクリプトはこれ。
import RPi.GPIO as GPIO
import time
GPIO.setmode(GPIO.BCM)
gp_out = 2 # GPIO
GPIO.setup(gp_out, GPIO.OUT)
s02 = GPIO.PWM(gp_out, 50)
s02.start(0.0)
gp_out = 3 # GPIO
GPIO.setup(gp_out, GPIO.OUT)
s03 = GPIO.PWM(gp_out, 50)
s03.start(0.0)
gp_out = 4 # GPIO
GPIO.setup(gp_out, GPIO.OUT)
s04 = GPIO.PWM(gp_out, 50)
s04.start(0.0)
gp_out = 17 # GPIO
GPIO.setup(gp_out, GPIO.OUT)
s17 = GPIO.PWM(gp_out, 50)
s17.start(0.0)
def exchDegreeToRadian(argDegree):
return 2.5 + (12.0 - 2.5) / 180 * (argDegree + 90)
act01 = exchDegreeToRadian( -90 )
act02 = exchDegreeToRadian( 0 ) # 0はサーボモーター停止
act03 = exchDegreeToRadian( 90 )
s02.ChangeDutyCycle( act01 )
s03.ChangeDutyCycle( act01 )
s04.ChangeDutyCycle( act01 )
s17.ChangeDutyCycle( act01 )
time.sleep(3.0)
s02.ChangeDutyCycle( act02 )
s03.ChangeDutyCycle( act02 )
s04.ChangeDutyCycle( act02 )
s17.ChangeDutyCycle( act02 )
time.sleep(0.5)
s02.ChangeDutyCycle( act03 )
s03.ChangeDutyCycle( act03 )
s04.ChangeDutyCycle( act03 )
s17.ChangeDutyCycle( act03 )
time.sleep(3.0)
GPIO.cleanup()
LEDを2秒間 点灯する
import RPi.GPIO as GPIO
import time
PIN = 18
GPIO.setmode(GPIO.BCM)
GPIO.setup(PIN,GPIO.OUT)
#GPIO.output(PIN,True)
GPIO.output(PIN,GPIO.HIGH)
time.sleep(2.0)
#GPIO.output(PIN,False)
GPIO.output(PIN,GPIO.LOW)
time.sleep(2.0)
GPIO.cleanup(PIN)
#GPIO.cleanup()
ボタン入力を検出する
import RPi.GPIO as GPIO
import time
GPIO.setmode(GPIO.BCM)
GPIO.setup(18, GPIO.IN, pull_up_down=GPIO.PUD_UP)
timesVal = 0
while True:
input_state = GPIO.input(18)
if input_state == False:
timesVal += 1
print('Button Pressed {0}'.format( timesVal ))
time.sleep(0.2)