Raspberry Piを使ってみる

電子工作の「HelloWorld」LEDのチカチカからセンサーまで

世の中にはいろいろなプログラム言語がありますが、どれも大抵は勉強を始めるにあたり、「『 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は、LED(light emitting diode)を指します。
LEDをチカチカと点滅させるので、LEDチカチカ→Lチカと称されます。

そのLEDについては、日本語訳では「発光ダイオード」ですし、LED電球などでポピュラーでもあるので、特に何か説明の必要はないかな? と思っていたら、

「なんでLEDは光るの?」

と「チコちゃんに叱られる!」で取り合げられ、答えられないと「ボーッと生きてんじゃねーよ!!」と叱られていましたから、LEDが光る原理は「ボーッと生きていない」証明には必要なようなので、簡単に説明しましょう(笑)

これは、LED一個の写真です。
秋月電子などで、部品で購入すると、こんなLEDが購入できます。

画像中の説明の通り、製造段階から足の長さが変えてあり、足の長いのがアノード、プラス側になります。
一方、足の短いのはカソード、マイナスです。

それぞれの足に直流の電気、この場合乾電池の+とマイナスを繋いでみましょう。

淡いですが、光ります。
乾電池一個では電圧が足らないので、まぁ仕方が無いでしょう。

このとき、動画では白い線のマイナス側が、赤いLED本体の中で電子の多い半導体へと繋がっています。一方、黄色のプラス側は、正孔というホールが多い半導体に繋がっています。
通電すると、この電子と正孔が電気の流れに乗って半導体の接合部に向かい、そこで結合し、その時のエネルギーが光になります。

フィラメントで熱を光にする白熱電球や、電気を放電させて、蛍光塗料を発光させる蛍光灯に比べると、高効率にエネルギーを光に変換できます。

また、ダイオード(整流器)の名前のとおり、プラスマイナスを逆に繋ぐと、電子と正孔というホールが逆向きに移動してしまい、中央で結合せず、光りません。
また電気も通らないため、「整流」といって電気の流れを強制するために使ったりもします。
開けないと誰も見ないパソコンの本体内でただ光ってるLEDがあったりしますが、これは「整流」目的で使用されているという事ですね。

さて、Raspberry PiでLEDを制御させるには、GPIO端子に繋ぎます。
GPIOは”General-purpose input/output”の略で、「汎用入出力」となり、信号を読んだり、発信したりできます。
ここから、プラスマイナスの電気をコントロールする訳です。

上の写真の部分がGPIO端子です。
「この端子は5V直流のプラスだよ」とか、「この端子は-極として動作する端子だよ」とか、電気のパルスで信号を受け取ったりと、様々な動作に使えます。

このうち、3.3Vのプラスと、-極の端子にLEDを繋いでみます。

LEDが光ったり、消えたりと点滅、つまりチカチカを繰り返しています。
これは、このようなpythonプログラムが走っているためです。

#!/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 &amp; 0xff00)>>8 | (word_data &amp; 0xff)<<8
    data = data>>3
    if data &amp; 0x1000 == 0:
        temperature = data*0.0625
    else:
        temperature = ( (~data&amp;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からのキックでスイッチを入れ、警告灯を点けるような事も可能になります。

もし、興味がおありでしたら、連絡フォームからご相談ください。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です