Raspberry Pi 3 B+を買って、設定とインストールをしました。また、無線LANの設定を行って家のWindows PCにWifi接続し、TeraTermでCLI接続できるようにし、さらにVNCでGUIでもつなげて操作できるようにしました。
ここからは、電子回路用のキットをAmazonで購入し、Raspberry PiにつないでPythonのプログラムで制御してみたので、その方法について書きます。
1.電子回路キットの購入
いろいろ調べて、お安いのを買いました。LED、 温度・湿度センサー、大気圧センサー、A/Dコンバーター、タクトスイッチ、人感センサー、チルトセンサー、赤外線リモコンと、見るからに楽しいパーツがたくさん入っています。
また、DVDには、マニュアル(英語)と、先述したパーツ類を制御するためのPythonとC言語のプログラムサンプルが入っています。これで3,000円に満たないお値段。信じられない安さです。
結論から書くと、これはいい買い物だったと思います。マニュアルが配線基板の表示と微妙に違っていたりするので、中身を理解しながら進める必要がありましたが、そもそも中身も理解せずに動かすのではあまり意味がないので、それはそれでよかったです。
また、マニュアルは基本的に英語ですが、そんなに難しくありません。図解が豊富ですし、文章はシンプルで短いものばかり。それでもどうしても苦手というのであれば、コピー&ペーストでGoogle翻訳使ってもなんとかなるレベルです。
2.キットを開けてみよう
(1)キット開封
届きました。楽しいです(笑)。もう、わくわくします。開けると、確かにプラスチックケースの中にパーツがたくさん入っています。
(2)まずはマニュアルから
付属のDVDを入れると、マニュアルなどが入っています。ReadMe.txtはこんな感じ。
業者さんのWebサイトはこちら。一応、日本語のページも選べることは選べます。
マニュアルの中には文書と動画のリンクがあります。すべて英語ですが、以下のように図解が豊富です。最初にRaspberry Pi のチュートリアルがあり、セットアップの画面や、ラズパイのインターフェースの説明があります。
ケーブルで電子回路とラズパイをつなぐためのピンの番号の説明と注記もあります。全部で40ピンで構成されていて、それぞれ役割の規格が決まっていますから、その説明もあります。
この40個あるピンはそれぞれ役割が違います。そこで、その説明のために、この右上のピン配置図では、それぞれのピンを色で塗り分けてグループ化して解説しています。
書かれている略称は、GNDは接地、V3.3とV5は電源電圧、GPIOはRaspberry Piの制御用のピンになります。それぞれの色で塗られているピンの略称の意味をまとめると、下記のような用途になります。
- 赤色:V3.3とV5の電源共有用のピン。
- 黒色:接地用のピン。
- 灰色:I2C (Inter-Integrated Circuit)。I2Cプロトコル用のピン。
- 空色:UART (Universal asynchronous receiver/transmitter)。非同期転送用のシリアル接続ピン。
- 黄色:SPI (Serial Peripheral Interface Bus)。SPIデバイスと接続するためのシリアル接続用のピン。
- レモン色:標準的なGPIO。LEDのオン・オフのようなデジタル制御用のピン。
すごく面倒くさくて、はじめは何を言ってるのかさっぱりわかりませんでした。ただ、詳細は後回しでいいにしても、この部分のピンの概要についての理解は重要です。Raspberry Piと電子回路は、このピンを通じてやりとりすることになるからです。
ここからまたややこしいのですが、この各ピンはラズパイ側で利用するプログラム言語から見ると違う呼び方があります。さらに、これらのピンは、GPOケーブルを仲介して電子部品を差すT型エクステンション(T Extention)とつながります。
まとめると、どれも同じものを指しているのですが、
という3つの呼び方の体系があることになります。また、ラズパイと回路はT型エクステンション経由でつながるので、それらすべての対比を一目でわかるようにすると以下のような表になるようです。
いちいち最初からこんなのをすべて覚えるのは大変ですので、まずはこういうものなのだ、ということを念頭に置きながら概要だけ理解し、必要に応じて都度これを参照することにします。
※上記のいくつかの写真とこの表の出典はキットのマニュアルです。気に入ったら、買ってあげてください(https://amzn.to/2EZvnb7\)。
3.簡単な回路を作ってみた
上記のピンのだいたいの意味を理解して、今度は回路の方に取り掛かります。ここでは、200Ωのカラー抵抗と赤いLEDをつないだ、もっとも簡単な実験をしてみます。
(1)回路
下図に示したような簡単な回路です。LEDについてはプラスとマイナスの極性があるので取付時に気を付ける必要があります。足の長い方がAnode(プラス)で、短い方がCathode(マイナス)側です。
Register(抵抗)は極性を気にする必要はありません。LEDのマイナス側とRegisterが直列につながるようにボードに差し込みます。
次いで、Registerのもう片側をGNDピンへつながる穴へ差します。GNDはグラウンド(接地)なので、複数あるGNDのピンのどれかにつなげればよいです。
さらに、LEDのプラス側をB17へつながる穴に差し込みます。B17はBCM17の略、つまりGPIO17に通じるピンです。
尚、このキットを購入して使う限りはちゃんと200Ωと書いたシートが貼ってあるので問題はないのですが、ついでにカラー抵抗の読み方も勉強したいという方は、日本アマチュア無線連盟の抵抗のカラーコードが参考になります。
(2)組み立てと接続
ブレッドボード上に電子部品を差しこんで回路を組み立てます。ブレッドボードというのは電子部品や配線を差しこんで回路を作るための小さな穴がたくさん空いた板状の基盤になります。
ブレッドボードの両脇の穴同士は水平に、それ以外の穴同士はそれぞれ平行に裏側でつながっているので、つながっている穴同士にそれぞれ電子部品の線を差すだけで回路の結線ができます。ハンダ付けは不要で、電子ブロックのような感覚です。つながっていない列と列はそれぞれの列の穴に銅線を差し込んで連結させます。このボードも、ちゃんとキットに付属しています。ブレッドボードについては、ブレッドボードの使い方-電子工作とメモが、とてもわかりやすかったです。
ブレッドボード上に実現した回路と、ラズパイとつなぐ太いコネクターケーブルを接続したT型エクステンションをブレッドボードに差したものが以下の写真になります。
ちなみに、Raspberry Pi側ですが、コネクターが太くてラズパイを入れたケース越しにつなげられなかったので、ラズパイをいったんShutdownして本体をケースから取り出してつなぎ直しました。慣れるまではこういう無駄な作業や手戻りがいくつも発生して、なかなか大変です。
4.ラズパイ側の設定
いよいよプログラムから動作させてみましょう。マニュアルにはC言語とPythonの2つの例が載っていますが、ここではPythonを利用します。
(1)Raspberry Pi側のPython環境の準備
ラズパイにログインして、Python3(IDLE)を起動して使います。ちなみに、TeraTermでCLIでPythonを起動するとなぜかそちらではデフォルトがPython2でした。
ここではPython3でやります。VNCの設定ができていれば、Python3の起動方法は簡単です。以下のように[プログラミング]から[Python3(IDLE)]を起動します。
(2)サンプルプログラムをコピー
キットのDVDから、サンプルプログラムをコピーし、[File]から[Save As...]でRaspberry Piのディレクトリに保存します。
(3)実行結果
画面のメニューバーの[RUN]->[Run Module F5]で実行します。すると、以下のように実行されます。
そして見事、回路側のLEDも点滅しました。
5.プログラムについて
プログラムソースを見てみます。著作権の問題もあるし、すべてを細かく解説する必要もないと思うので、ポイントだけ引用して見てみます。
全体を知りたい人は、パーツとマニュアルとこれ以外のサンプルプログラム全部含めて3,000円もしないお安いキットなので、しつこいですけど、気に入った方は買ってあげてください(https://amzn.to/2EZvnb7\)。
(1)GPIOの制御
GPIO用のライブラリは複数あるようですが、このキットのサンプルではRPI.GPIOのライブラリを使用しています。17という数字は回路図で説明したB17ピンになります。
import RPi.GPIO as GPIO
import time
# set GPIO 0 as LED pin
LEDPIN = 17
(2)セットアップ部分の関数
セットアップ部分の関数です。setmode()メソッドでBCMのナンバリング、setup()で値の設定をしています。
#setup function for some setup---custom function
def setup():
GPIO.setwarnings(False)
#set the gpio modes to BCM numbering
GPIO.setmode(GPIO.BCM)
#set LEDPIN's mode to output,and initial level to LOW(0V)
GPIO.setup(LEDPIN,GPIO.OUT,initial=GPIO.LOW)
(3)メイン関数
output()メソッドでHIGHとLOWを0.5秒ごとにお休みを入れながら設定して、whileループで回しています。
#main function
def main():
#print info
print_message()
while True:
GPIO.output(LEDPIN,GPIO.HIGH)
print('...LED ON\n')
time.sleep(0.5)
GPIO.output(LEDPIN,GPIO.LOW)
print('LED OFF...\n')
time.sleep(0.5)
pass
pass
(4)RPI.GPIO
RPI.GPIOについては、以下のサイトにライブラリとドキュメントがあります。他にもネットで探せばサンプルが見つかります。
6.最後に
Raspberry Piを回路につなぎ、PythonのプログラムでLEDの点滅を制御するところまで成功しました。
マニュアルを読み解き、ネットで検索をかけ、ひとつひとつ理解しながら進めることになったので、予想よりずいぶん時間がかかってしまいました。特にGPIOの理解のところは苦戦しました。ブレッドボードについても穴が裏側でつながっているということを最初は知らなかったので使い方の理解に時間がかかりました。そのため、LEDの点滅制御を実現しただけなのですが、うまくいったときは嬉しかったです。
ひとつできてしまうと基本的な手順は同じなのであとは省略しますが、この後、他の回路も実現して試してみました。
ここまでで電子回路とRaspberry Piをつないでプログラムと回路の連携ができるようになったので、次はラズパイを使ってIoT(クラウドに送る)を実現し、さらには機械学習もやってみたいと思っています。