電子工作を始めたい人も、Raspberry Piを使ってみたい人も『電子工作の目的』や『最初に何を試すか』が分からないと、第一歩を踏み出せません。
この記事では、第一歩を踏み出せない初心者の方向けに、電子工作やRaspberry Piの概要やRaspberry Piによる電子工作事例を紹介します。記事の後半ではセンサーキットを使用した具体的な電子工作についても紹介しているので、是非参考にしてみてください!
電子工作の魅力を伝える
電子工作の魅力は何と言っても『最新技術を勉強できたり、自分が好きなガジェットを自作できる』ことでしょう。特に最近はRaspberry PiのようなシングルボードコンピューターやArduinoマイコン関連の商品が充実しているため、少ない予備知識で電子工作を楽しめるようになりました。
最新技術の1つとして注目されている物に『ドローン』があります。ドローンは製品自体を購入することもできますが、自作キットやカスタムパーツを調達して自作することもできます。
自作を通して最新のセンサーや制御システムについて勉強できるので、新しい物が好きな人たちは病みつきになると思います。
さらに、他の人が使っているドローンよりも特定の機能を強化したり、大型のバッテリーを搭載して稼働時間を伸ばすこともできます。自分の好みに合わせて、オンリーワンの製品を作成できるのは面白いですね。
本記事の後半では、Raspberry Piとセンサーキットを使用して、LEDやセンサーの簡単な制御をご紹介します。初心者の方が最初からドローンを制作することは難しいですが、基本的な電子工作の知識を蓄えていけば、やがてドローンも自作できるようになります。ぜひ一緒に第一歩を踏み出しましょう。
Raspberry Pi(ラズベリーパイ)とは?
Raspberry Piとは超小型のコンピューター機能に、電子工作に最適なGPIO端子を設けたシングルボードコンピューターです。
特徴①高コスパ
CPUは1.5GHz クアッドコア、メモリは8GBの処理能力を持ちながら、正規価格が1万3千円以下で購入可能なため、コストパフォーマンスが高いです。
コンピューターとしての動作も軽快で動画サイトを見ながら、プログラミングをしても処理速度に影響しません。
特徴②軽量/小サイズ
重量とサイズはそれぞれ、重量が60g、サイズは5×56×18mmとコンパクトです。
このため、場所を選ばず様々な場所に持ち運びや設置が可能です。
特徴③低消費電力
一般的なノートPCの消費電力が30W程度に対して、Raspberry Pi4 Model Bの消費電力は半分の15Wとなります。さらに待機時の電力は3Wであり、圧倒的に消費電力が低いです。
特徴④高い拡張性
Raspberry Pi4 Model Bは端子が豊富です。特に映像面では4K出力に対応したほか、トリプルモニター出力が可能になりました。USB端子4つにGPIO端子が付属するなど、多くの機器と接続できます。
- USB2.0×2
- USB3.0×2
- micro-HDMI×2
- I²S
- 3.5 mm ジャック
- 有線LAN
- GPIO×40pin
特徴⑤簡単な操作方法
ひと昔前まではPICマイコンを用いた電子工作が主流でしたが、PICマイコンをPCやセンサーに接続するには複雑な手順が必要です。しかしRaspberry PiはコンピューターとGPIO端子が直結しているおかげで、マイコン用のセンサーモジュールやLEDと簡単に通信できます。
GPIOの設定はPythonのライブラリとして登録されているため、Raspberry Pi上で数行のプログラムを記述するだけで、簡単にGPIO信号を制御できます。
Raspberry Piで何ができるの?
Raspberry Piは拡張性や応用先が広いため、できることが多いです。全てを紹介することは不可能なので、ここでは一例を取り上げます。
先にご紹介したRaspberry Pi4 Model BはRAMメモリが8GBなので、動画視聴しながらブラウジングとテキスト編集を並列して行えます。画面出力もトリプルディスプレイに対応しているため、作業性は十分に高いでしょう。
Windows/Mad対応のソフトウェアは利用できませんので、あくまでメインPCの代用として使用すると良いです。
プログラミング機能はRaspbianOSに搭載されているPythonとC言語を利用できます。PythonとC言語のどちらかさえ使えば殆どの作業を行えますが、「ラズベリーパイ」というだけあって公式はPythonを推奨しています。(ラズベリーパイのPiはPythonから来ています)
なお、追加でMathematicaやScratchもインストール可能です。Mathematicaは数値計算言語で行列計算に優れている言語であり、Scratchはビジュアルプログラミング言語のひとつで小学生の間で利用が広まっています。興味があれば遊んでみてください。
電子工作はRaspberry Piの利用目的として、最も多い項目の1つです。GPIO端子を利用することで5Vや3,3V電源を供給できるほか制御信号を出力できるため、複雑な制御システムを簡単に構築できるようになりました。
NASはネットワーク上に設置するハードディスクで、クラウドのローカル版と考えて頂ければ結構です。Raspberry PiにはWi-FiとBluetoothが搭載されていて遠隔操作が可能なこと、消費電力が少ないため常時起動する用途に向いていることからNASとして利用されます。
上記で紹介した事例以外にも様々な利用方法があります。下記の記事にRapberry Piの活用事例が紹介されているので、こちらの記事もご参照ください。
Raspberry Piのパーツキットを使ってみよう!
電子工作の目的が無い人や、Raspberry Piを使って何をすれば良いか分からない人は、Rasberry Piのセンサーキットを使って見ましょう。Amazonでセンサーキットを検索してみると、次のような商品が見つかります。
紹介したキットにはRasberry Piで使用できるセンサーやLED、ジャンパー線、小型モニターがセットになっています。また、日本語による取扱説明書や、PythonやC言語を使用したソースコードがついているため、Rasberry Piの動作環境があれば即座に製品を試すことができます。
Raspberry Piは付いていないので注意してください。
別途購入しておきましょう。
センサーキットを試そう!!
実際に、センサーキットを購入してRasberry Piで電子工作を初めてみました。今回はセンサーキット『Raspberry Pi Sensor Kit for Expert』の中から、次の4点を紹介します。
Lチカに挑戦
電子工作の業界では『LEDをチカチカ点灯させること』を『Lチカ』と称しています。これは動作環境の構築や、プログラムの動作環境が整ったことを確認するために、とりあえずLEDをチカチカさせる動作が良く使用されるためです。
私もSunFounder社製のDual-color LED Moduleを使用して、Lチカを行ってみました。
このLEDをRasberry PiのGPIOポートと接続して、後述するソースコードをRasberry Pi上で実行します。
電子工作を行うときは、GPIOの信号をブレッドボードに引き出しておくと便利です。GPIO端子はデリケートなため、何回も試行錯誤を行うと端子が破損します。画像に示すようにセンサーやモジュールの付け替えはブレッドボードで行いましょう。
このLEDをRasberry PiのGPIOポートと接続して、後述するソースコードをRasberry Pi上で実行します。
ソースコードをご紹介します。なお、ソースコードはgithubのSunfounder様のページにて公開されています。下記にリンクをご紹介するので、必要に応じてダウンロードしてください。
次に紹介するのはDual-color LED の色を0.5秒ごとに切り替えるソースコードです。ソースコードはPythonとC言語が用意されていますが、Rasberry PiはPythonが初期環境にインストールされているので、Pythonコードを使いました。元のソースコードでは日本語による注釈文がありませんので、筆者が追記しました。
#!/usr/bin/env python3
##使用するモジュールのインポート---始め
import RPi.GPIO as GPIO
import time
##使用するモジュールのインポート---終わり
##変数の定義---始め
colors = [0xFF00, 0x00FF, 0x0FF0, 0xF00F] #色の設定
pins = (11, 12) # pins is a dict #出力ピンの設定
GPIO.setmode(GPIO.BOARD) # Numbers GPIOs by physical location
GPIO.setup(pins, GPIO.OUT) # Set pins' mode is output
GPIO.output(pins, GPIO.LOW) # Set pins to LOW(0V) to off led
p_R = GPIO.PWM(pins[0], 2000) # set Frequece to 2KHz
p_G = GPIO.PWM(pins[1], 2000)
p_R.start(0) # Initial duty Cycle = 0(leds off) #デューティ比の初期設定は0秒
p_G.start(0)
##変数の定義---終わり
##関数の定義---始まり
def map(x, in_min, in_max, out_min, out_max):
return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min
def setColor(col): # For example : col = 0x1122
R_val = col >> 8
G_val = col & 0x00FF
R_val = map(R_val, 0, 255, 0, 100)
G_val = map(G_val, 0, 255, 0, 100)
p_R.ChangeDutyCycle(R_val) # Change duty cycle
p_G.ChangeDutyCycle(G_val)
def loop():
while True:
for col in colors:
setColor(col)
time.sleep(0.5)
def destroy():
p_R.stop()
p_G.stop()
GPIO.output(pins, GPIO.LOW) # Turn off all leds
GPIO.cleanup()
##関数の定義---終わり
##メインルーチンの定義---始まり
#メインルーチンは外部割り込みが無い限りLチカを続ける。
if __name__ == "__main__":
try:
loop()
except KeyboardInterrupt:Ctrl+Cで割り込み。
destroy()
##メインルーチンの定義---終わり
ブザーを鳴らしてみる
次はブザーを鳴らしてみましょう。ブザーにはアクティブブザーとパッシブブザーがあるので、両方とも鳴らしてみます。
アクティブブザーとは発振用マイコンが内蔵されているブザーで、電源を供給するだけで音が鳴ります。制御が簡単ですが内蔵されたマイコンで周波数が固定されているため、音楽を奏でることはできません。
#!/usr/bin/env python3
import RPi.GPIO as GPIO
import time
Buzzer = 11 # pin11
def setup(pin):
global BuzzerPin
BuzzerPin = pin
GPIO.setmode(GPIO.BOARD) # Numbers GPIOs by physical location
GPIO.setup(BuzzerPin, GPIO.OUT)
GPIO.output(BuzzerPin, GPIO.HIGH)
def on():
GPIO.output(BuzzerPin, GPIO.LOW)
def off():
GPIO.output(BuzzerPin, GPIO.HIGH)
def beep(x):
on()
time.sleep(x)
off()
time.sleep(x)
def loop():
while True:
beep(0.5)
def destroy():
GPIO.output(BuzzerPin, GPIO.HIGH)
GPIO.cleanup() # Release resource
if __name__ == '__main__': # Program start from here
setup(Buzzer)
try:
loop()
except KeyboardInterrupt: # When 'Ctrl+C' is pressed, the child program destroy() will be executed.
destroy()
パッシブブザーは発振用マイコンが内蔵されていないので、プログラムで入力信号を作成する必要があります。制御が複雑になりますが周波数を自由に変更できるので、音を自由に変更できます。
#!/usr/bin/env python3
#---------------------------------------------------
#
# This is a program for Passive Buzzer Module
# It will play simple songs.
# You could try to make songs by youselves!
#
# Passive buzzer Pi
# VCC ----------------- 3.3V
# GND ------------------ GND
# SIG ---------------- Pin 11
#
#---------------------------------------------------
import RPi.GPIO as GPIO
import time
Buzzer = 11
CL = [0, 131, 147, 165, 175, 196, 211, 248] # Frequency of Low C notes
CM = [0, 262, 294, 330, 350, 393, 441, 495] # Frequency of Middle C notes
CH = [0, 525, 589, 661, 700, 786, 882, 990] # Frequency of High C notes
song_1 = [ CM[3], CM[5], CM[6], CM[3], CM[2], CM[3], CM[5], CM[6], # Notes of song1
CH[1], CM[6], CM[5], CM[1], CM[3], CM[2], CM[2], CM[3],
CM[5], CM[2], CM[3], CM[3], CL[6], CL[6], CL[6], CM[1],
CM[2], CM[3], CM[2], CL[7], CL[6], CM[1], CL[5] ]
beat_1 = [ 1, 1, 3, 1, 1, 3, 1, 1, # Beats of song 1, 1 means 1/8 beats
1, 1, 1, 1, 1, 1, 3, 1,
1, 3, 1, 1, 1, 1, 1, 1,
1, 2, 1, 1, 1, 1, 1, 1,
1, 1, 3 ]
song_2 = [ CM[1], CM[1], CM[1], CL[5], CM[3], CM[3], CM[3], CM[1], # Notes of song2
CM[1], CM[3], CM[5], CM[5], CM[4], CM[3], CM[2], CM[2],
CM[3], CM[4], CM[4], CM[3], CM[2], CM[3], CM[1], CM[1],
CM[3], CM[2], CL[5], CL[7], CM[2], CM[1] ]
beat_2 = [ 1, 1, 2, 2, 1, 1, 2, 2, # Beats of song 2, 1 means 1/8 beats
1, 1, 2, 2, 1, 1, 3, 1,
1, 2, 2, 1, 1, 2, 2, 1,
1, 2, 2, 1, 1, 3 ]
def setup():
GPIO.setmode(GPIO.BOARD) # Numbers GPIOs by physical location
GPIO.setup(Buzzer, GPIO.OUT) # Set pins' mode is output
global Buzz # Assign a global variable to replace GPIO.PWM
Buzz = GPIO.PWM(Buzzer, 440) # 440 is initial frequency.
Buzz.start(50) # Start Buzzer pin with 50% duty ration
def loop():
while True:
# Playing song 1...
for i in range(1, len(song_1)): # Play song 1
Buzz.ChangeFrequency(song_1[i]) # Change the frequency along the song note
time.sleep(beat_1[i] * 0.5) # delay a note for beat * 0.5s
time.sleep(1) # Wait a second for next song.
# Playing song 2...
for i in range(1, len(song_2)): # Play song 1
Buzz.ChangeFrequency(song_2[i]) # Change the frequency along the song note
time.sleep(beat_2[i] * 0.5) # delay a note for beat * 0.5s
def destory():
Buzz.stop() # Stop the buzzer
GPIO.output(Buzzer, 1) # Set Buzzer pin to High
GPIO.cleanup() # Release resource
if __name__ == '__main__': # Program start from here
setup()
try:
loop()
except KeyboardInterrupt: # When 'Ctrl+C' is pressed, the child program destroy() will be executed.
destory()
こんなのもあるよ。超音波距離計
距離を測定するセンサーのひとつとして超音波距離計HC-SR04が挙げられます。超音波距離計の原理はこうもりが使う『エコーロケーション』そのものです。つまり、自分が発した超音波の反射時間と音速をかけ合わせることで距離を測定しています。
センサーを見るとスピーカーのような部品があります。正面左の『T』の記号がある部品がトランスミッターで、超音波を発信する部品です。右側の『R』の部品がレシーバで、超音波受信部になります。
こちらもPythonでコードを記載します。
#!/usr/bin/env python3
##使用するモジュールのインポート---始め
import RPi.GPIO as GPIO
import time
##使用するモジュールのインポート---終わり
##変数の定義---始め
TRIG = 11
ECHO = 12
##変数の定義---終わり
##関数の定義---始まり
def setup():
GPIO.setmode(GPIO.BOARD)
GPIO.setup(TRIG, GPIO.OUT)
GPIO.setup(ECHO, GPIO.IN)
def distance():
GPIO.output(TRIG, 0)
time.sleep(0.000002)
GPIO.output(TRIG, 1)
time.sleep(0.00001)
GPIO.output(TRIG, 0)
while GPIO.input(ECHO) == 0:
a = 0
time1 = time.time()
while GPIO.input(ECHO) == 1:
a = 1
time2 = time.time()
during = time2 - time1
return during * 340 / 2 * 100 ##時間と速度から距離を計算する。
def loop():
while True:
dis = distance()
print (dis, 'cm')
print ('')
time.sleep(1) ##測定間隔。時間が短すぎると処理が追いつかないので,1s程度に設定する。
def destroy():
GPIO.cleanup()
##関数の定義---終わり
##メインルーチンの定義---始まり
#メインルーチンは外部割り込みが無い限り測定結果を送り続ける。
if __name__ == "__main__":
setup()
try:
loop()
except KeyboardInterrupt:
destroy()
##メインルーチンの定義---終わり
センサーとLEDで傾斜感知システムを構築しよう!
今まではLEDやセンサー単体の動作を確認してきましたが、今度はセンサーとLEDを組合せて動作確認してみましょう。
使用するセンサーはチルトスイッチ(傾斜感知スイッチ)で、傾きを感知すると内部の鉄球が動いてスイッチが付きます。傾きを感知する毎にDual-color LEDの色を変化させてみました。
チルトスイッチを傾けると『カチッ』と小さな音がして、LEDの色が変化しています。これでセンサーの変化を、LEDを使って検出することができたので、傾斜感知システムが完成しました。
こちらのコードについても記載します。
#!/usr/bin/env python3
##使用するモジュールのインポート---始め
import RPi.GPIO as GPIO
##使用するモジュールのインポート---終わり
##変数の定義---始め
TiltPin = 11
Gpin = 13
Rpin = 12
##変数の定義---終わり
##関数の定義---始まり
def setup():
GPIO.setmode(GPIO.BOARD) # Numbers GPIOs by physical location
GPIO.setup(Gpin, GPIO.OUT) # Set Green Led Pin mode to output
GPIO.setup(Rpin, GPIO.OUT) # Set Red Led Pin mode to output
GPIO.setup(TiltPin, GPIO.IN, pull_up_down=GPIO.PUD_UP) # Set BtnPin's mode is input, and pull up to high level(3.3V)
GPIO.add_event_detect(TiltPin, GPIO.BOTH, callback=detect, bouncetime=200)
def Led(z):
if x == 0:
GPIO.output(Rpin, 1)
GPIO.output(Gpin, 0)
if x == 1:
GPIO.output(Rpin, 0)
GPIO.output(Gpin, 1)
def detect(chn):#傾斜感知時の割り込み処理を記載する。傾斜状態が変化する毎にLEDの色を変更する。
Led(GPIO.input(TiltPin))
def loop():
while True:
pass
def destroy():
GPIO.output(Gpin, GPIO.HIGH) # Green led off
GPIO.output(Rpin, GPIO.HIGH) # Red led off
GPIO.cleanup() # Release resource
##関数の定義---終わり
##メインルーチンの定義---始まり
if __name__ == '__main__': # Program start from here
setup()
try:
loop()
except KeyboardInterrupt: # When 'Ctrl+C' is pressed, the child program destroy() will be executed.
destroy()
##メインルーチンの定義---終わり
大袈裟な言い方になりますが、Rasberry Piを使用してシステムを構築できました。今はセンサー1つとLED1つの小さなシステムですが、電子工作は基本動作の組合せと積み上げなので、センサーの使い方と出力方法を勉強すれば応用は無限大です。
今回はRasberry Piの使用例を紹介するために、センサー数点の動作確認とソースコードをご紹介しました。今後、Rasberry Piに使用可能なセンサー一覧を紹介する予定ですので、ぜひご覧になってください。
まとめ
この記事では電子工作の魅力をお伝えするために、Rasberry Piの概要説明とRasberry Piを利用してできることを紹介し、後半では実際に電子工作を行いました。
今回取り上げたRaspberry Pi4 Model Bは基本性能が高いため、複数のシステムを並列構築して動作可能です。自分がやりたいと考えた電子工作のアイディアを、手当たり次第に試すのも良いでしょう。