Raspberry Piを使ってみる
目次
最初に作るプログラム「HelloWorld」
世の中にはいろいろなプログラム言語がありますが、どれも大抵は勉強を始めるにあたり、「『 Hello World』を表示する」というものからはじめます。
その標準の出力に Hello World と表示させるだけのものですが、
---------------
C#では
static void Main(string[] args)
{
Console.WriteLine("Hello World!");
}
---------------
Pythonでは
print("Hello World!")
---------------
PHPでは
<?php
echo "Hello World!";
?>
と、そのプログラム言語なりの様々な処理が必要なので、いろいろ勉強になります。
電子工作の「HelloWorld」にあたるLチカとは?
なには無くとも、「電子工作」を始めるなら、一番最初にやってみる事、それが「Lチカ」です。
「Lチカ」 のLは、LED(light emitting diode)を指します。
LEDをチカチカと点滅させるので、LEDチカチカ→Lチカと称されます。
そのLEDについては、日本語訳では「発光ダイオード」ですし、LED電球などでポピュラーでもあるので、特に何か説明の必要はないかな? と思っていたら、
「なんでLEDは光るの?」
と「チコちゃんに叱られる!」で取り合げられ、答えられないと「ボーッと生きてんじゃねーよ!!」と叱られていましたから、LEDが光る原理は「ボーッと生きていない」証明には必要なようなので、簡単に説明しましょう(笑)
これは、LED一個の写真です。
秋月電子などで、部品で購入すると、こんなLEDが購入できます。
画像中の説明の通り、製造段階から足の長さが変えてあり、足の長いのがアノード、プラス側になります。
一方、足の短いのはカソード、マイナスです。
それぞれの足に直流の電気、この場合乾電池の+とマイナスを繋いでみましょう。
淡いですが、光ります。
乾電池一個では電圧が足らないので、まぁ仕方が無いでしょう。
このとき、動画では白い線のマイナス側が、赤いLED本体の中で電子の多い半導体へと繋がっています。一方、黄色のプラス側は、正孔というホールが多い半導体に繋がっています。
通電すると、この電子と正孔が電気の流れに乗って半導体の接合部に向かい、そこで結合し、その時のエネルギーが光になります。
フィラメントで熱を光にする白熱電球や、電気を放電させて、蛍光塗料を発光させる蛍光灯に比べると、高効率にエネルギーを光に変換できます。
また、ダイオード(整流器)の名前のとおり、プラスマイナスを逆に繋ぐと、電子と正孔というホールが逆向きに移動してしまい、中央で結合せず、光りません。
また電気も通らないため、「整流」といって電気の流れを強制するために使ったりもします。
開けないと誰も見ないパソコンの本体内でただ光ってるLEDがあったりしますが、これは「整流」目的で使用されているという事ですね。
GPIO端子で、流れる電気を調整
さて、Raspberry PiでLEDを制御させるには、GPIO端子に繋ぎます。
GPIOは”General-purpose input/output”の略で、「汎用入出力」となり、信号を読んだり、発信したりできます。
ここから、プラスマイナスの電気をコントロールする訳です。
上の写真の部分がGPIO端子です。
「この端子は5V直流のプラスだよ」とか、「この端子は-極として動作する端子だよ」とか、電気のパルスで信号を受け取ったりと、様々な動作に使えます。
このうち、3.3Vのプラスと、-極の端子にLEDを繋いでみます。
回路はこのようになります。
LEDが光ったり、消えたりと点滅、つまりチカチカを繰り返しています。
これは、このようなpythonプログラムが走っているためです。
LED点滅のプログラム
#!/usr/bin/python
# coding:utf-8
import RPi.GPIO as GPIO
import time
GPIO.setmode(GPIO.BCM)
GPIO.cleanup()
GPIO.setup(25, GPIO.OUT)
while True:
GPIO.output(25,GPIO.HIGH)
time.sleep(0.5)
GPIO.output(25,GPIO.LOW)
time.sleep(0.5)
GPIO.cleanup()
まず、動画の通り、GPIOのある位置の端子からLEDのプラスへ結線します。
不要なLEDもありますが、念のため、330Ωの抵抗が入れてあります。
LEDを通った電気は、白い線でマイナス極に回収されます。
このGPIOの位置が25番なので、Pythonのプログラムでは
import RPi.GPIO as GPIO
の記述でGPIOの制御を呼び出し、
GPIO.setup(25, GPIO.OUT)
で初期化します。
以降、無限ループの中で、
GPIO.output(25,GPIO.HIGH)
で電気が流され、
GPIO.output(25,GPIO.LOW)
でカットされるという動作を、
time.sleep(0.5)
の指定により、0.5秒毎に繰り返す事になります。
これが、電子工作のHelloWorldになります。
どの電子工作機器でも、最初はLEDを光らせてみるというところから始めますので、これがスタートラインです。
センサーの情報を読み取ってみる
LEDが光ったところで、次はセンサーのデータを読んで見ましょう。
やはりIoT機器を使う場面を想定すると、温度管理や回転数の管理など、何等かのデータを収集する目的が多いでしょう。
Raspberry Piの場合、上記のGPIO端子がセンサーのデータを取得するための規格、「I2C」に対応しているので、接続してデータ取得する事は比較的簡単にできます。
センサーモジュールは、秋月電子で購入した温度センサーモジュールを使用し、Raspberry PiのGPIOと結線してみます。
結線の写真と、どのように繋がっているかは配線図の通りです。
「I2C」をRaspberry Piで使用できるよう設定する
Raspberry Piのターミナルで、$ sudo raspi-config と入力して、基本設定を呼び出します。
Interfacing Options から I2C を選び、enabled? と訪ねられるので、はい を選択します。
これで、Raspberry Piを一度再起動します。
再びターミナルを起動し、i2cdetect -y -r 1 を入力すると、中央に48の文字列が見えます。
48は、温度センサー(ADT7410)のI2C上のアドレスなので、Raspberry PiがGPIOを通じて、温度センサーと繋がっている事が証明されたことになります。
プログラムコードは、Qiitaさんのこちらの記事からお借りしました。
# -*- coding: utf-8 -*-
import smbus
from time import sleep
def read_adt7410():
word_data = bus.read_word_data(address_adt7410, register_adt7410)
data = (word_data & 0xff00)>>8 | (word_data & 0xff)<<8
data = data>>3
if data & 0x1000 == 0:
temperature = data*0.0625
else:
temperature = ( (~data&0x1fff) + 1)*-0.0625
return temperature
bus = smbus.SMBus(1)
address_adt7410 = 0x48
register_adt7410 = 0x00
try:
while True:
inputValue = read_adt7410()
print(inputValue)
sleep(0.5)
except KeyboardInterrupt:
pass
このコードを、ondo.py の名称で保存し、python ondo.pyで実行すると
連続センサー読み取り結果
センサーとその挙動を同時に写すため、画面の動画撮影になって申し訳ないですが、0.5秒毎に温度が測定され、行が増えていくのが判ると思います。
途中、指が映ってセンサーに触りますが、その途端、温度がどんどん上がっていくのが判ります。
真夏の炎天下でも無い限り、気温の方が低いので、指が触れて体温を感知するとこのように数値が上がりますね。
その後、指が離れると、次第に気温に向かって下降していきます。
例えば、工場などの生産ラインで温度管理が必要だけれど、今は作業員の勘や、温度計を見て手記録しているなどの工程がありましたら、Raspberry Piとこのセンサーで常時記録ができるでしょう。
もちろん、プログラムを改修すれば、例えば規定の温度を超えた、逆に下回った状態が○秒以上続いたら、GPIOからのキックでスイッチを入れ、警告灯を点けるような事も可能になります。
もし、興味がおありでしたら、連絡フォームからご相談ください。