見出し画像

電子工作はじめの一歩

ラズパイで電子工作してみる。
本記事は勉強しながら徐々に修正/更新していく。

GPIOピン

電子工作の前に、ラズパイ(*)のGPIOピンを確認する。
(*) Raspberry Pi 4 model B (メモリ4GB) を使用

画像5

GPIOピンの役割
3.3V, 5V : 電圧、常時出力
GIPO XX : 電子パーツと信号をやりとり(送受信)
ID_SD  : 起動時、EEPROMにアクセス
GND  : マイナスの役割。『グランド』と読む

画像5

LEDが光るだけ

ラズパイに電源いれたらLEDが光る。スクリプトで制御できない。

画像6

画像9

画像6

プログラムでLEDを光らせる

スクリプトでLEDを光らせる。(ラズパイの電源を入れただけではLEDが光らない)GPIO XX ならどこでもいいが、今回は GPIO 18 に接続した。

画像4

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)

画像7

サーボモーターを回す

サーボモーターへの給電は、ラズパイからじゃなく、別に電源を用意した。

画像4

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()

※参考リンク※

画像8

むむっ、抵抗(Ω)とか適当に使ってたけど、ちゃんと考えないとダメらしい。(過電流で、LEDが破裂したりするらしい、というか破裂した)

画像10

360度連続回転のサーボモーター

サーボモータは指定した角度回転するのですが、連続回転するサーボモーターもあるようです。買ってみました

指定する角度によって、回転速度と方向が変わるらしい。90度は止まる

画像11

まずは obniz で動かしてみた

obnizブロックプログラミング

画像12

ラズパイで制御

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度は、最大出力で逆回転の関係。

画像13

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電圧を使います。

画像17

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秒間 点灯する

画像15

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()

ボタン入力を検出する

画像16

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)



こんな弱小ブログでもサポートしてくれる人がいることに感謝です。