GPIO」カテゴリーアーカイブ

Pi PICO W + 焦電人感センサー

「ラズパイPico完全ガイド」に、焦電人感センサー SB412A の記事が乗ってたのでやってみた。
(昔 TweLite で使ってた物が残ってた)

実験だけなら、 SB412A を使用しなくても「タクトスイッチ+抵抗」で十分

タダこのままだと使いみちが無いので、
Pi PICO W + DS18B20 (1)Pi PICO W + DS18B20 (2)を一寸書き換えて遊んでみた。

入力側をリードSWにしたり、出力側を WebCAM の画像保存用のトリガーにしたりと
応用出来る。
zigbee の方が簡単だけど、コストパフォーマンスなら pico w が良いみたいです。
(電源などの設置条件しだいですが)
選択肢が増えるのは歓迎すべきです。

そのうち、並列処理でも試してみます。

Pi PICO W + ADC 電圧測定

以前に、zigbee(TWELITE DIP) で実験した 6v ソーラーパネルとバッテリーが有ったので
Pi PICO W で使ってみようと思い、バッテリー電圧監視をテストしてみた。

太陽電池モジュール 3W SY-M3W
完全密封型鉛蓄電池 6V7Ah WP7-6
6V3Aソーラーチャージコントローラー CMP03-3A

python スクリプトは、ラズパイPico完全ガイド を参考に、分圧比の 1/6 を追加。
著作権が面倒なので、詳細は本を購入下さい。

KIKUSUI PMC18-2A で、電圧を可変し測定た結果
PMC18-2A 電圧表示と測定値の差

電圧表示 測定電圧差 ツェナー取付時電圧差
12v -0.24 -4.89
11v -0.21 -406
10v -0.18 -3.26
9v -0.14 -2.51
8v -0.10 -1.80
7v -0.03 -1.17
6v +0.01 -0.64
5v +0.04 -0.26
4v +0.08 -0.07
3v +0.13 -0,01
2v +0.20 ±0
1v +0.23 ±0

カーボン抵抗で ± 0.25v (2%) 程度の誤差なので、
バッテリーの電圧確認程度なら INA219 を使用しなくても十分使える。
入力電圧保護用のツェナーダイオードを取付けると誤差が大きく使い物にならない!
※ PMC18-2A 出力電圧表示誤差 ± 0.5 % +2dgt

実際の運用試験は、近日中を予定

Pi PICO W + DHT22

温度センサー DHT22 を接続
DS18B20 と同様で、違いは送る DATA が2つになるだけ

前回との違いは、
送信側 (PICO W)
DHT22ライブラリ から、PicoDHT22.py を DL
温度と湿度を , 区切りの文字列に成形して送信する。

受信側 (Pi4)
, 区切りの mess から 温度・湿度を list にて抽出

DS18B20 の python スクリプトを一寸変更すればOK

Pi PICO W + DS18B20 (2)

Pi4 で DS18B20 データーを受信

参考 URL

[受信側(ラズパイ)のコード] の receive.py を参考に、日時表示を変更
Pi4 に Apache2 を構築済

ds18b20_receive.py

#!/usr/bin/env python
# -*- coding: utf-8 -*

from socket import socket, AF_INET, SOCK_STREAM
import threading
import time
import csv
import datetime

HOST = 'IPアドレス'
PORT = port番号
MAX_MESSAGE = 2048
NUM_THREAD = 4

CHR_CAN = '\18'
CHR_EOT = '\04'

def com_receive():
    # global sock
    sock = socket(AF_INET, SOCK_STREAM)
    sock.bind ((HOST, PORT))
    sock.listen (NUM_THREAD)

    while True:
        try:
            conn,addr = sock.accept()
            mess = conn.recv(MAX_MESSAGE).decode('utf-8')
            conn.close()
            if(mess == CHR_EOT):
                break
            if(mess == CHR_CAN):
                continue
            t_delta = datetime.timedelta(hours=9)
            JST = datetime.timezone(t_delta, 'JST')
            now = datetime.datetime.now(JST)
            DateTime = now.strftime('%Y/%m/%d %H:%M')
            with open('/Web-Document/任意名.csv', 'a') as f:
                writer = csv.writer(f)
                writer.writerow([DateTime, mess])
        except:
            print('Error')
    sock.close()

def message(mes):
    var1.set(mes)

def com_start():

    th=threading.Thread(target=com_receive)
    th.start()

com_start()

dygraph-combined・jquery.csv.min で、
グラフと一覧表を Web 表示してみた。

Pi PICO W + DS18B20 (1)

PICO W に 1-Wire 温度センサー DS18B20 を接続し測定
結果を WebServer へ送信し、CSV に追記 一覧表・グラフにて表示させる。

参考サイト

DS18B20 は、他の用途が設定されてない GPIO22 へ接続
三端子レギュレーターは、3.3V 1A (たまたま有った在庫品を使用)

ds18x20.py と onewire.py を準備して、pico w へ入れておく。

main.py

import machine, utime, time, socket, network, onewire, ds18x20

HOST = 'WebServerIPアドレス'
PORT = port番号
interval = 測定休止(秒)
SSID:str = 'WiFi-AP ID'
PASS:str = 'パスワード'

ds_pin = machine.Pin(22)
ds_sensor = ds18x20.DS18X20(onewire.OneWire(ds_pin))
roms = ds_sensor.scan()
led = machine.Pin("LED", machine.Pin.OUT)

def wifi_up():
	wlan = network.WLAN(network.STA_IF)
	wlan.active(True)
	wlan.connect(SSID, PASS)
	while wlan.isconnected() == False:
		print('Connecting')
		time.sleep(1)
	wlan_status = wlan.ifconfig()
	print('Connected!')
	led.on()
	status = wlan.ifconfig()
	print(f'IP Address: {wlan_status[0]}')

def com_send(mess):
	while True:
		try:
			led.on()
			sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
			sock.connect((HOST, PORT))    
			sock.send(mess.encode('utf-8'))
			led.off()
			sock.close()
			break
		except:
			print ('retry: ' + mess)
			led.off()

while True:
	wifi_up()
	ds_sensor.convert_temp()
	time.sleep_ms(750)
	for rom in roms:
		tempC = ds_sensor.read_temp(rom)
		if tempC is None:
			continue
		else:
			temperature = '{:.1f}'.format(tempC)
	print(temperature)
	temp_info = str(temperature)
	com_send(temp_info)
	print('temp send')
	utime.sleep(interval)

WebServer 側の受取設定は、次回

Pi PICO W

pico W を仕入れたので、在庫してた DS18B20 と DHT22 を接続してみた。

DS18B20 (中華製パチ物)

DHT22

pico は、時計を持たないので NTP のライブラリー py も作ってみました。

詳細は、次回

pi zero w で YAAC (APRS-WX)

にゃん太郎とアマチュア無線 で、
「YAACにはWXNOW.TXTがサポートされている」との記述を見つけたので、
pi zero w と BME280 で、APRS WeatherStation を作ってみた。
以前 SWITCHSCIENCE にて公開されていた
bme280_custom.py を import して使用するみたいです。
現在 bme280_custom.py は無いので、今でも公開されてる bme280_sample.py をDLして変更

bme280_sample.py の変更箇所
—————————————————————–
#coding: utf-8

#from smbus2 import SMBus ←コメントもしくは削除
import smbus # 追記
/// 略 ///

#bus = SMBus(bus_number) ←コメントもしくは削除
bus = smbus.SMBus(bus_number) # 追記
/// 略 ///

def readData():
/// 略 ///
#compensate_T(temp_raw) ←コメントもしくは削除
#compensate_P(pres_raw) ←コメントもしくは削除
#compensate_H(hum_raw) ←コメントもしくは削除
t = compensate_T(temp_raw) # 追記
p = compensate_P(pres_raw) # 追記
h = compensate_H(hum_raw) # 追記
return p + “,” + t + “,” + h # 追記

def compensate_P(adc_P):
/// 略 ///
#print “pressure : %7.2f hPa” % (pressure/100) ←コメントもしくは削除
return “%7.2f” % (pressure/100) # 追記

def compensate_T(adc_T):
/// 略 ///
#print “temp : %-6.2f ℃” % (temperature) ←コメントもしくは削除
return “%.2f” % (temperature) # 追記

def compensate_H(adc_H):
/// 略 ///
#print “hum : %6.2f %” % (var_h) ←コメントもしくは削除
return “%.2f” % (var_h) # 追記
/// 略 ///
—————————————————————–
bme280_custom.py と rename

※ 設置場所が水辺で、湿度が100%になった時に文字列がズレた為
「にゃん太郎とアマチュア無線」の記述を変更

WXNOW.TXTのデータフォーマットへの変換は、下記の様に抽出
wx###.py の一部
—————————————————————–
bme_get = bme280_custom.readData()
bme_list = (bme_get.split(‘,’))

# 気温 摂氏→華氏
temp = bme_list[1]
temp_C = float(temp)
T = format(( (temp_C*1.8) + 32), ‘.0f’)

# 湿度
hum = bme_list[2]
hum1 = float(hum)
H = (format(hum1, ‘.0f’))[-2:]

# 気圧
press = bme_list[0]
press1 = float(press)
press2 = format(press1, ‘.1f’)
P = (press2.replace(‘.’,””))
—————————————————————–
普通の環境なら、「にゃん太郎とアマチュア無線」の記述を
そのまま流用すれば良いと思います。

● wxnow.txt 保存
煩雑に上書きするので、SDカード延命の為 tmpfs を作成して使用する。

● pi zero w bullseye java
$ sudo apt install openjdk-8-jre -y

● YAAC install
$ sudo apt install unzip -y
$ wget https://www.ka2ddo.org/ka2ddo/YAAC.zip
$ mkdir ./YAAC
$ cd ./YAAC
$ unzip ../YAAC.zip

● YAAC setup
pi zero w の場合、configuration wizard を使用すると YAAC が落ちるので、キャンセル
File → Configre → Expert Mode で設定

● YAAC 自動起動
YAAC 起動前に wxnow.txt を作成
$ nano /home/[user]/.config/lxsession/LXDE-pi/autostart
——————————————-
@python /home/[user]/bme280/wx###.py
@java -jar /home/[user]/YAAC/YAAC.jar
——————————————-

● cron
※ wxnow.txt を autostart で作成すると
root だとパーミッションエラーになるので [user] にて cron
$ crontab -e (10分間隔の例)
————————————————————————-
*/10 * * * * python /home/[user]/bme280/wx###.py > /dev/null 2>&1
————————————————————————-
$ sudo /etc/init.d/cron restart

赤外線カメラ+MotionEye


中華製の 赤外線カメラ・赤外線LED照明・CSItoHDMI変換ケーブル で試してみた。
(尚、赤外線カメラ付属のLED照明はケースへ収めると反射するので撤去)
pi zero に、MotionEye と Flask を入れ
MotionEye で、カメラ動画から Motion Triggere にて静止画を取得
Flask で、Web から GPIO を制御し SSR で 赤外線LED照明の点灯を制御
(LED照明延命の為、電源は常時入れず実験時のみ使用)

現在、Motion Detection の しきい値 調整実験中

motioneye TOP

motioneye 設定

Flask にて、赤外線LED照明制御

pigpio + WebIOPi で SG-90 を制御

OS が jessie の頃 RPIO + WebIOPi で
マイクロサーボ SG-90 を使用したカメラの雲台制御をしたが、
buster では、RPIO がエラーになるので pigpio で使用出来る様に変更してみた。

接続図

pigpio で動かしてみた動画

WebIOPi + pigpio で Web から制御した時のブラウザ動画(縮小動画)


カメラは、mjpg-streamer にで動作中

参考にした元の RPIO + WebIOPi が、かなり前だったので
何処のサイトだったか不明の為、
それを pigpio 用に変更したスクリプトの公開は控えます。

servo.set_servo → pi.set_servo_pulsewidth
と、import の変更程度で可能でした。