Raspberry Pi 電子工作 07:温度・湿度センサーとLCDディスプレイ(I2C接続)にCPU温度表示

LCDディスプレイに温度、湿度、日付と時間を表示することはできました。

何か、ほかに表示するものはないかと考え、「CPU温度」も表示してみました。

性能が上がった分、CPU温度も上がりがちなRaspberry Pi 4を使用していますが、ファンがちゃんと回るか、そのファンに効果があるかを確認することもできます。

 

 

1. 配線

  前回までのLCDディスプレイの配線では、ディスプレイが暗く、読みづらかったんです。

  気にはなっていたんですが、こんなもんだろうと思っていましたが、どうやら手元にあるLCDディスプレイでは電圧が足りなかったようです。

f:id:kobatom5278:20210119232330p:plain

07_温度湿度センサーとLCDディスプレイ

2. Pythonプログラミング

  前回のものに、CPU温度を計測するコマンド呼び出しを追加しました。

  前回の「Temperature.py」も使用します。

  コマンド呼び出しはちょっとコストがかかる傾向なのですが、これはどうでしょうか。

  1秒ごとに、1秒間隔で「年月日と時分秒」、「温度と湿度」、「CPU温度」が表示されます。

 

# -*- coding: utf-8 -*-
# 日本語コメントをエラーとしないように、UTF-8で保存

# 使用するライブラリのインポート
import Temperature
from time import sleep
import smbus
import datetime
import subprocess
import re

# 定数の定義
# LCDディスプレイのI2Cのアドレス
LCD_I2C_ADDR = 0x27
# LCDの1行目のアドレス
LCD_LINE_1 = 0x80
# LCDの2行目のアドレス
LCD_LINE_2 = 0xC0
# 1行あたりの文字数
LCD_WIDTH = 16
# バックライトのON/OFF(ON:0X08, OFF:0X00を指定)
LCD_BACKLIGHT = 0X08
LCD_CHR = 1
LCD_CMD = 0
ENABLE = 0b00000100
E_PULSE = 0.0005
E_DELAY = 0.0005

def init_lcd():
    """
    LCDの初期化処理
    """
    lcd_byte(0x33, LCD_CMD)
    lcd_byte(0x32, LCD_CMD)
    lcd_byte(0x06, LCD_CMD)
    lcd_byte(0x0C, LCD_CMD)
    lcd_byte(0x28, LCD_CMD)
    lcd_byte(0x01, LCD_CMD)
    sleep(E_DELAY)

def lcd_byte(bits, mode):
    """
    LCDへの書き込み
    """
    bits_high = mode | (bits & 0xF0) | LCD_BACKLIGHT
    bits_low =  mode | ((bits << 4) & 0xF0) | LCD_BACKLIGHT

    bus.write_byte(LCD_I2C_ADDR, bits_high)
    lcd_toggle_enable(bits_high)

    bus.write_byte(LCD_I2C_ADDR, bits_low)
    lcd_toggle_enable(bits_low)

def lcd_toggle_enable(bits):
    """
    LCDへの書き込みサブ
    """
    sleep(E_DELAY)
    bus.write_byte(LCD_I2C_ADDR, (bits | ENABLE))
    sleep(E_PULSE)
    bus.write_byte(LCD_I2C_ADDR, (bits & ~ENABLE))
    sleep(E_DELAY)

def lcd_string(message: str, dispLine):
    """
    LCDへの文字の表示(半角文字列のみ)
    """

    # 表示対象行の初期化
    lcd_byte(dispLine, LCD_CMD)

    # 文字列を1行あたりの文字数に調整
    message = message.ljust(LCD_WIDTH)

    # 表示処理
    for dispIndex in range(LCD_WIDTH):
        lcd_byte(ord(message[dispIndex]), LCD_CHR)

# I2Cの取得
bus = smbus.SMBus(1)

try:
    # 初期化
    init_lcd()
    # 無限ループ、「年月日と時分秒」、「温度と湿度」、「CPU温度」を1秒間隔で表示
    dispMode = 0
    while True:
        if (dispMode == 0):
            sleep(1)
            # 「年月日と時分秒」を表示
            now = datetime.datetime.now()
            lcd_string(f'date: {now.strftime("%Y/%m/%d")}' , LCD_LINE_1)
            lcd_string(f'time: {now.strftime("%H:%M:%S")}', LCD_LINE_2)
            dispMode = 1
        elif (dispMode == 1):
            # 「温度と湿度」を表示
            # 取得時にディレイをかけているので、1秒後に表示される
            templature , humidity = Temperature.get_tempelature_humidity()
            lcd_string(f'temp: {str(templature)[:4]}\337C', LCD_LINE_1)
            lcd_string(f'hum : {str(humidity)[:4]}%', LCD_LINE_2)
            dispMode = 2
        elif (dispMode == 2):
            sleep(1)
            # 現在のcpu温度の取得
            proc = subprocess.run(["vcgencmd", "measure_temp"], stdout = subprocess.PIPE, stderr = subprocess.PIPE)
            proc_tmp = re.split("[=\']", proc.stdout.decode("utf8"))[1]
            lcd_string(f'cpu : {str(proc_tmp)[:4]}\337C', LCD_LINE_1)
            lcd_string(f'    :           ', LCD_LINE_2)
            dispMode = 0
finally:
    lcd_byte(0x01, LCD_CMD)

Raspberry Pi 電子工作 06:温度・湿度センサーとLCDディスプレイ(I2C接続)

以前取り上げた、温度・湿度センサーとLCDディスプレイを同時に接続します。

そのうえで、LCDディレクトリに「温度・湿度」と「年月日、時間」を交互に表示します。

合わせ技です。

 

 

1. 配線

  同時に接続するだけです。

  電源容量が少し心配だったんですが、問題なさそうです。

f:id:kobatom5278:20210112230923p:plain

06_温度湿度センサー+ディスプレイ

 

2. Pythonプログラミング

  今回は、温度と湿度を取得する処理をクラス化(別ファイル)にし、表示プログラムから呼び出してみます。

  内容は、以前のものとあまり変わりません。

 

  まず、以下のコードを「Temperature.py」というファイル名で保存します。ファイル名を間違えてはいけません。

# -*- coding: utf-8 -*-
# 日本語コメントをエラーとしないように、UTF-8で保存

# 使用するライブラリのインポート
import smbus
from time import sleep

def get_tempelature_humidity():
    """
    温度と湿度を取得する
    """

    ADR = 0x44
    # I2Cの取得
    ic2 = smbus.SMBus(1)

    # 測定頻度の設定
    ic2.write_byte_data(ADR, 0x23, 0x34)
    sleep(0.5)
    # 測定値の読出し
    ic2.write_byte_data(ADR, 0xe0, 0x0)
    sleep(0.5)

    # 6バイト取得
    d = ic2.read_i2c_block_data(ADR, 0x0, 6)

    # 0~1バイトが温度
    # 測定データ(生データ)を取得
    t = ((d[0]) << 8) | (d[1])
    # 換算する
    t = -45 + (175 * t / 65535)

    # 3~4バイトが湿度
    # 測定データ(生データ)を取得
    h = ((d[3]) << 8) | (d[4])
    # 換算する
    h = 100 * h / 65535

    # 結果を返却
    return t, h

 

  次に、「Temperature.py」と同じフォルダに以下のプログラムファイルを配置します。

  こちらのファイル名はなんでもよいです。

  実行すると、1秒間隔で「年月日と時分秒」、「温度と湿度」が表示されます。

# -*- coding: utf-8 -*-
# 日本語コメントをエラーとしないように、UTF-8で保存

# 使用するライブラリのインポート
import Temperature
from time import sleep
import smbus
import datetime

# 定数の定義
# LCDディスプレイのI2Cのアドレス
LCD_I2C_ADDR = 0x27
# LCDの1行目のアドレス
LCD_LINE_1 = 0x80
# LCDの2行目のアドレス
LCD_LINE_2 = 0xC0
# 1行あたりの文字数
LCD_WIDTH = 16
# バックライトのON/OFF(ON:0X08, OFF:0X00を指定)
LCD_BACKLIGHT = 0X08
LCD_CHR = 1
LCD_CMD = 0
ENABLE = 0b00000100
E_PULSE = 0.0005
E_DELAY = 0.0005

def init_lcd():
    """
    LCDの初期化処理
    """
    lcd_byte(0x33, LCD_CMD)
    lcd_byte(0x32, LCD_CMD)
    lcd_byte(0x06, LCD_CMD)
    lcd_byte(0x0C, LCD_CMD)
    lcd_byte(0x28, LCD_CMD)
    lcd_byte(0x01, LCD_CMD)
    sleep(E_DELAY)

def lcd_byte(bits, mode):
    """
    LCDへの書き込み
    """
    bits_high = mode | (bits & 0xF0) | LCD_BACKLIGHT
    bits_low =  mode | ((bits << 4) & 0xF0) | LCD_BACKLIGHT

    bus.write_byte(LCD_I2C_ADDR, bits_high)
    lcd_toggle_enable(bits_high)

    bus.write_byte(LCD_I2C_ADDR, bits_low)
    lcd_toggle_enable(bits_low)

def lcd_toggle_enable(bits):
    """
    LCDへの書き込みサブ
    """
    sleep(E_DELAY)
    bus.write_byte(LCD_I2C_ADDR, (bits | ENABLE))
    sleep(E_PULSE)
    bus.write_byte(LCD_I2C_ADDR, (bits & ~ENABLE))
    sleep(E_DELAY)

def lcd_string(message: str, dispLine):
    """
    LCDへの文字の表示(半角文字列のみ)
    """

    # 表示対象行の初期化
    lcd_byte(dispLine, LCD_CMD)

    # 文字列を1行あたりの文字数に調整
    message = message.ljust(LCD_WIDTH)

    # 表示処理
    for dispIndex in range(LCD_WIDTH):
        lcd_byte(ord(message[dispIndex]), LCD_CHR)

# I2Cの取得
bus = smbus.SMBus(1)

try:
    # 初期化
    init_lcd()
    # 無限ループ、「年月日と時分秒」、「温度と湿度」を1秒間隔で表示
    isTime = True
    while True:
        if isTime:
            # 「年月日と時分秒」を表示
            now = datetime.datetime.now()
            lcd_string(f'date: {now.strftime("%Y/%m/%d")}' , LCD_LINE_1)
            lcd_string(f'time: {now.strftime("%H:%M:%S")}', LCD_LINE_2)
            isTime = False
        else:
            # 「温度と湿度」を表示
            templature , humidity = Temperature.get_tempelature_humidity()
            lcd_string(f'temp: {str(templature)[:4]}\337C', LCD_LINE_1)
            lcd_string(f'hum : {str(humidity)[:4]}%', LCD_LINE_2)
            isTime = True
            # 温度・湿度情報取得時に計1秒ほどウェイトをかけているので、
            # 「年月日と時分秒」は1秒表示される。
            # ここで1秒ウェイト、「温度と湿度」を1秒する表示する。
            sleep(1)
finally:
    lcd_byte(0x01, LCD_CMD)

Raspberry Pi 電子工作 05:Felica

今回は、USB接続で動作する「Felica」のリーダー・ライターの接続確認です。 

Felica」はソニー社が開発した「非接触ICカード」です。

非常に様々なところで使用され、現代の生活には欠かせないものとなっているでしょう。

 

使用するのは手元にあった古い端末ですが、おそらくは新しい端末でも同様に使用できると思います。

今回の目的は、USB接続し、カードやスマホをスキャン、IDを取得するまでです。

 

 

1. 使用する端末

  手元にあるのは、この端末です。

  古いものですが、今回の目的を達成することはできます。

[商品価格に関しましては、リンクが作成された時点と現時点で情報が変更されている場合がございます。]

SONY 非接触ICカードリーダー/ライター PASORI RC-S310/ED4C
価格:3096円(税込、送料別) (2021/1/12時点)

楽天で購入

 

 

2. 接続確認

  接続方法はUSB端子に指すだけです。

  正しく認識しているかは、以下のコマンドにて。

  認識されていれば、「Sony Corp. FeliCa S310 [PaSoRi]」と表示されます。

 lsusb 

 

3. ライブラリなどのインストール

  外部ライブラリをインストール、Pythonから使えるようにセットアップします。

    1. まずは、任意のフォルダに新しいフォルダを作成します。(例として、「pasori」とします)
    2. 「LXTerminal」を開き、作成されたフォルダに移動します。(「cd」コマンド)
    3. 以下のコマンドを実行し、ライブラリなどをインストールします。(「libusb」と「libpafe」)
sudo apt-get install libusb-dev
git clone https://github.com/rfujita/libpafe.git
cd libpafe
./configur
make
sudo make install

 

4. 動作確認

  うまくインストールできたか確認します。

  「LXTerminal」で「pasori」の下の「libpafe」フォルダの下、「tests」フォルダに移動し、以下コマンドで実行します。

  動作できていれば、何行か表示され、「sucess」と表示されます。

  これで、「sudo」(管理者権限)で実行できることが確認できます。

sudo ./pasori_test

 

5. 動作確認(非管理者権限)

  プログラムを管理者権限で動作させるのは不便ですので、非管理者権限でも動作できるように設定します。

  以下の内容でできますが、内容としては設定ファイルを作って、設定を書き込み再起動です。

    1. 「60-libpafe.rules」を新規作成する

sudo nano /lib/udev/rules.d/60-libpafe.rules

    2. 作成した「60-libpafe.rules」を編集する。
     ("054c"は、「lsusb」コマンドで確認できる「ID」の":"の前の値、
      "006C"は、同じく「lsusb」コマンドで確認できる「ID」の":"の後ろの値です。)

ACTION!="add", GOTO="pasori_rules_end"
SUBSYSTEM=="usb_device", GOTO="pasori_rules_start"
SUBSYSTEM!="usb", GOTO="pasori_rules_end"
LABEL="pasori_rules_start"

ATTRS{idVendor}=="054c", ATTRS{idProduct}=="006c", MODE="0664", GROUP="plugdev"

LABEL="pasori_rules_end"

    3. 再起動する。

    4. 先ほどの動作確認と同様、「LXTerminal」で「pasori」の下の「libpafe」フォルダの下、「tests」フォルダに移動し、以下コマンドで実行します。

     「sudo」は不要です。

     うまくいっていれば、先ほどの「sudo」を付けた結果と同じになります。

./pasori_test

 

6. Pythonプログラミング

   準備ができましたので、Pythonで組んだプログラムでIDを読込んでみましょう。

  VisualStudioCodeでリモート接続して実行可能です。

  スマホなどをリーダーにかざして実行すると、16進数の16桁の番号がターミナルに表示されます。

  違うカードやスマホに変えると表示される値が変わり、何も乗せないと「0000000000000000」と表示されるかと思います。

  

# -*- coding: utf-8 -*-
# 日本語コメントをエラーとしないように、UTF-8で保存

# 使用するライブラリのインポート
from ctypes import *

# 定数
FELICA_POLLING_ANY = 0xffff

# ライブラリの読込
libpafe = cdll.LoadLibrary("/usr/local/lib/libpafe.so")

# 初期化
libpafe.pasori_open.restype = c_void_p
pasori = libpafe.pasori_open()

libpafe.pasori_init(pasori)

libpafe.felica_polling.restype = c_void_p
felica = libpafe.felica_polling(pasori, FELICA_POLLING_ANY, 0, 0)

# 読込
idm = c_ulonglong()
libpafe.felica_get_idm.restype = c_void_p
libpafe.felica_get_idm(felica, byref(idm))

# 16進表記で表示
print("%016X" % idm.value)

# 後始末
libpafe.free(felica)
libpafe.pasori_close(pasori)

Raspberry Pi 電子工作 04:LCDディスプレイ(I2C接続)

前回に引き続き、Raspberry Piに「I2C」規格に対応したLCDディスプレイを接続、制御します。

I2C規格対応のデバイスであれば、同時に接続できます。

ですので、前回の温度・湿度センサーと、今回のLCDディスプレイを同時に接続することができます。

 

 

1. LCDディスプレイ

セットに付属するLCDディスプレイはこれにあたると思います。

1行あたり16文字、2行表示できるものを使用しています。

[商品価格に関しましては、リンクが作成された時点と現時点で情報が変更されている場合がございます。]

Adeept Raspberry Pi用 LCD1602 スタータキット
価格:2294円(税込、送料別) (2021/1/11時点)

楽天で購入

 


 

 

2. 配線

前回の温度、湿度センサーと配線は同じです。

手元にあったものは「vcc」「gnd」が温度、湿度センサーと並びが逆でしたので注意。

 

3. I2C接続の確認

配線ができたら、以下のコマンドで接続、アドレスの確認を行います。

i2cdetect -y 1

手元にあったものは、「27」となっていました。

 

4. Pythonソースコード

今回は、1行目に年月日、2行目に時分秒を1秒間隔で表示するプログラムです。

ただの時計です。

 

# -*- coding: utf-8 -*-
# 日本語コメントをエラーとしないように、UTF-8で保存

# 使用するライブラリのインポート
from time import sleep
import smbus
import datetime

# 定数の定義
# LCDディスプレイのI2Cのアドレス
LCD_I2C_ADDR = 0x27
# LCDの1行目のアドレス
LCD_LINE_1 = 0x80
# LCDの2行目のアドレス
LCD_LINE_2 = 0xC0
# 1行あたりの文字数
LCD_WIDTH = 16
# バックライトのON/OFF(ON:0X08, OFF:0X00を指定)
LCD_BACKLIGHT = 0X08
LCD_CHR = 1
LCD_CMD = 0
ENABLE = 0b00000100
E_PULSE = 0.0005
E_DELAY = 0.0005

def init_lcd():
    """
    LCDの初期化処理
    """
    lcd_byte(0x33, LCD_CMD)
    lcd_byte(0x32, LCD_CMD)
    lcd_byte(0x06, LCD_CMD)
    lcd_byte(0x0C, LCD_CMD)
    lcd_byte(0x28, LCD_CMD)
    lcd_byte(0x01, LCD_CMD)
    sleep(E_DELAY)

def lcd_byte(bits, mode):
    """
    LCDへの書き込み
    """
    bits_high = mode | (bits & 0xF0) | LCD_BACKLIGHT
    bits_low =  mode | ((bits << 4) & 0xF0) | LCD_BACKLIGHT

    bus.write_byte(LCD_I2C_ADDR, bits_high)
    lcd_toggle_enable(bits_high)

    bus.write_byte(LCD_I2C_ADDR, bits_low)
    lcd_toggle_enable(bits_low)

def lcd_toggle_enable(bits):
    """
    LCDへの書き込みサブ
    """
    sleep(E_DELAY)
    bus.write_byte(LCD_I2C_ADDR, (bits | ENABLE))
    sleep(E_PULSE)
    bus.write_byte(LCD_I2C_ADDR, (bits & ~ENABLE))
    sleep(E_DELAY)

def lcd_string(message: str, dispLine):
    """
    LCDへの文字の表示(半角文字列のみ)
    """

    # 表示対象行の初期化
    lcd_byte(dispLine, LCD_CMD)

    # 文字列を1行あたりの文字数に調整
    message = message.ljust(LCD_WIDTH)

    # 表示処理
    for dispIndex in range(LCD_WIDTH):
        lcd_byte(ord(message[dispIndex]), LCD_CHR)

# I2Cの取得
bus = smbus.SMBus(1)

try:
    # 初期化
    init_lcd()
    # 無限ループ、年月日と時分秒を1秒間隔で表示
    while True:
        now = datetime.datetime.now()
        lcd_string(f'date: {now.strftime("%Y/%m/%d")}' , LCD_LINE_1)
        lcd_string(f'time: {now.strftime("%H:%M:%S")}', LCD_LINE_2)
        sleep(1)
finally:
    lcd_byte(0x01, LCD_CMD)
    

Raspberry Pi 電子工作 03:温度・湿度センサー(I2C接続)

Raspberry Piに「I2C」規格(?)に対応したセンサーであれば、比較的楽に、同様の方法で制御できます。

基本的には何かのセンサーをつなぐことが多いようですが、今回はその基本、温度と湿度センサーです。

 

1. 温度・湿度センサー

  今回は、購入したセットに入っていた「SHT3X-DIS」というセンサーを使用します。たいていのセットに入っているようです。

 

[商品価格に関しましては、リンクが作成された時点と現時点で情報が変更されている場合がございます。]

Raspberry Pi用Adeept Ultimate 初心者向け学習キット
価格:6885円(税込、送料別) (2021/1/3時点)

楽天で購入

 


 

 

2. I2Cの有効化

  「Raspberry Pi の設定」から、「インターフェース」タブの「I2C」を「有効」として「OK」を押下するだけです。

f:id:kobatom5278:20210103112913j:plain

I2Cの有効化

3. I2Cの有効化の確認

  「LXTerminal」にて、以下コマンドを実行します。有効化されていれば、表のようなものが出力されます。

  無効化の場合は「Could not open file」とエラーになります。

  現状、何もつながっていないので、すべて「- -」となっています。

i2cdetect -y 1

 

4. 配線

  ポイントは「SDA」「SCL」でしょうか。抵抗などは不要で、電源は3V」でよいようです。

f:id:kobatom5278:20210103115247p:plain

03:温度湿度センサー

5. I2Cの有効化の確認(センサーの確認)

  「LXTerminal」にて、再度、以下コマンドを実行します。

  どこかが「- -」ではなく、数字になっていると思います。

  これが、接続した機器のI2Cアドレスとなるようです。(おそらくは「44」)

i2cdetect -y 1

 

6. Pythonソースコード

  接続した機器で取得できる温度と湿度を表示するプログラムです。

  なお、データシートを基にコマンドや換算式を組みます。

  ~ データシート:SHT3x-DIS ~

https://strawberry-linux.com/pub/Sensirion_Humidity_SHT3x_DIS_Datasheet_V3_J.pdf

 

  このコードはSSH接続したVisualStudioCodeで実行できます。

  実行すると、温度と湿度が「ターミナル」ウインドウに表示されます。

  途中でスリープかけていますが、このスリープを短く、またはなくしてしまうと、チップが頑張りすぎて発熱するそうです。 

# -*- coding: utf-8 -*-
# 日本語コメントをエラーとしないように、UTF-8で保存

# 使用するライブラリのインポート
import smbus
from time import sleep

def get_templature_humidity():
    """
    温度と湿度を取得する
    """

    ADR = 0x44
    # I2Cの取得
    ic2 = smbus.SMBus(1)

    # 測定頻度の設定
    ic2.write_byte_data(ADR, 0x23, 0x34)
    sleep(0.5)
    # 測定値の読出し
    ic2.write_byte_data(ADR, 0xe0, 0x0)
    sleep(0.5)

    # 6バイト取得
    d = ic2.read_i2c_block_data(ADR, 0x0, 6)

    # 読みだした値をそのまま出力(6バイトの数値)
    print(d)

    # 0~1バイトが温度
    # 測定データ(生データ)を取得
    t = ((d[0]) << 8) | (d[1])
    # 換算する
    t = -45 + (175 * t / 65535)

    # 3~4バイトが湿度
    # 測定データ(生データ)を取得
    h = ((d[3]) << 8) | (d[4])
    # 換算する
    h = 100 * h / 65535

    # 結果を返却
    return t, h

templature , humidity = get_templature_humidity()
print(f'温度: {templature} ℃ , 湿度: {humidity} %')

OpenCVをRaspberry Pi OS にインストール

Raspberry Pi OS にOpenCVをインストール、Pythonから使用できるようにセットアップします。

Open CVは画像処理などを便利にしてくれるライブラリです。

 

 

1. パッケージ管理システム(apt)の最新化

以下コマンドをRaspberry Pi OS の「LXTerminal」で実行しておきます。

これは定期的に行ったほうがよいと思います。 

sudo apt-get update
sudo apt-get upgrade

  ※続行するか聞かれた場合は「Y」で続行しましょう

 

2. ライブラリをインストール

今回はOpenCVはpip3コマンドでインストールします。

OpenCVの公式ではないようですが、使えればいい、というレベルなので。

合わせて、依存ライブラリも一緒にインストールします。

以下コマンドをRaspberry Pi OS の「LXTerminal」で実行します。

pip3 install opencv-python
sudo apt install libjasper1
sudo apt install libqtgui4
sudo apt install libqt4-test
sudo apt install libatlas-base-dev

 

3. 動作確認

Pythonで簡単なプログラムを書いて、動作確認をします。

カメラを使用しますので、以前のこの記事を参考に、カメラのセットアップをしておいてください。

letraspberry.hatenablog.com

 

# -*- coding: utf-8 -*-
# 日本語コメントをエラーとしないように、UTF-8で保存

# 使用するライブラリのインポート
import cv2 as cv

# カメラの設定
cap = cv.VideoCapture(0)
cap.set(cv.CAP_PROP_FRAME_WIDTH, 640)
cap.set(cv.CAP_PROP_FRAME_HEIGHT, 480)

while True:
    # 撮影
    ret, frame = cap.read()

    # 撮影画像を表示する
    cv.imshow('カメラ画像', frame)
    cv.waitKey(1)

 

うまくいくと、「カメラ画像」というタイトルのウィンドウが開き、カメラで撮影した画像が連続表示されます。

このプログラムは、WindowsからSSHで接続したVisualStudioCodeでは動作しません。

リモートデスクトップで接続したRaspberry Pi OSから実行しましょう。

また、1回目の実行でimportの行で例外が発生することもありますが、続けて実行すると成功します。(ちょっと不安定です)

プログラムの終了はVisualStudioCodeの「□」ボタン(または「Shift + F5」)で。

Raspberry Pi 電子工作 02:LEDぐるぐる

今回は3つのLEDを光らせます。

ただ光らせてもつまらないので、指定したパターンで光らせてみようと思います。

 

 

1. 配線

f:id:kobatom5278:20201231170417p:plain

02:LED

抵抗をGround側に配線してみました。

自分は知識がないので真相不明ですが、+側に抵抗を配線するのをよく見かけます。

配線と抵抗を減らしたかっただけですが、もしかすると正しくはないかもしれません。

 

2. Pythonソースコード

GPIOのピン番号と発光パターンにタプルを使用しました。

一度定義したら変更できない、というアレです。

この2つを適宜増やすことで、発光させるLEDの数を増減でき、光らせ方も変わります。

 

# -*- coding: utf-8 -*-
# 日本語コメントをエラーとしないように、UTF-8で保存

# 使用するライブラリのインポート
import RPi.GPIO as GPIO
from time import sleep

# −−− 定数 ---
# LEDのピン番号たち
GPIOS = (18, 23, 24)
# 実行回数
LOOP_COUNT = 10
# 実行間隔
SLEEP_TIME = 0.1
# 光らせるパターン(1が光り、0が消える)
PATTERN = ((1, 0, 0), 
           (0, 1, 0), 
           (0, 0, 1),
          )

# −−− GPIOの設定 ---
# ピンの指定をGPIO番号で行う
GPIO.setmode(GPIO.BCM)
# 対象ピン(GPIO)を出力に設定
for gp in GPIOS:
    GPIO.setup(gp, GPIO.OUT)

# ループ実行
for repeat in range(LOOP_COUNT):
    # パターンをぐるぐる
    for ledSwitch in PATTERN:
        for index in range(len(GPIOS)):
            # 1なら光らせる
            if ledSwitch[index] == 1:       
                GPIO.output(GPIOS[index], GPIO.HIGH)

        # 待つ
        sleep(SLEEP_TIME)

        for index in range(len(GPIOS)):
            # 光らせていたLEDを消灯
            if ledSwitch[index] == 1:
                GPIO.output(GPIOS[index], GPIO.LOW)

# 忘れずに、後処理
GPIO.cleanup()

少し、工夫した感が出てきたかと思います。