RaspberryPiを利用したいろいろの工作結果、等を書いてみます。
CO2センサーの利用
2022年1月1日
CO2センサーが結構安く入手でき、RaspberryPiに接続して”簡易CO2計”を作ってみた。
1.準備したもの
・CO2センサー基板 SEN-CCS811 Amazonで購入
・小型ディスプレー OLED Display 0.91inch for Arduino ARM Amazonで購入
・ブレッドボード P-05155 秋月電子通商…手持ち在庫
・Raspberry Pi 4B OKdo…手持ち品
2.接続
・SEN-CCS811
VCC Raspberry Pi-3.3V
GND Raspberry Pi-GND
SDA Raspberry Pi-GPIO(3)
SCL Raspberry Pi-GPIO(5)
RST Raspberry Pi-VCC
WAKE Raspberry Pi-GND
・OLED Display
GND Raspberry Pi-GND
VCC Raspberry Pi-3.3V
SCL Raspberry Pi-GPIO(5)
SDA Raspberry Pi-GPIO(3)
3.動作準備
3-1Rasoberry Pi
・OS Raspbian Buster 導入後、update,upgrade
・I2Cが使え、Pythonで制御できるようにする
raspi-configを実行。インターフェース・オプション設定で、I2Cを有効にする。
I2C関連のツール等をインストールする。
$ sudo apt install i2c-tools
3-2センサーの接続確認
$ i2cdetect -y 1
0x5a または 0x5b が表示される
4.動作プログラムの実装
4-1動作プログラム…テスト1
下記の記事を参考に、忠実に実行した。
・CircuitPythonをインストール
・I2CとSPIの動作確認
・CircuitPythonのライブラリのインストールを確認…blinkatest.pyを実行
・CCS811のライブラリのインストール
・/boot/config.txtへの追記
・測定・表示プログラムの実行…ccs811test.py
CO2、TVOCの値が表示され始めたが、途中でエラーが発生。表示がストップした。
以後再度動作コマンドを入力しても、即エラーが発生。
(私のPythonの理解力が不十分で、プログラムの動作不良個所での挙動が十分に把握できてないことも一因)
なお本センサーは、使用初期に48時間のエージングが推奨されており、測定開始後安定した値になるまで20分程度必要とされている。
十分に時間をおいてから、測定・表示プログラムの実行を試みたが、エラーの発生は解消できなかった。
*参照記事 Itmediaの記事
部屋の二酸化炭素濃度を測定しよう ラズパイでCO2センサーを作る
https://www.itmedia.co.jp/news/articles/2109/18/news032.html
4-2動作プログラム…テスト2
CCS811の操作プログラムに関する記事を検索した結果、SEN-CCS811に関する記事は上記の他に見つからなかった。
が、同等機能の基板BME280に関する記事がいくつか見つかった。そのうち下記の記事を参考にして動作テストをしてみた。
なお、動作準備の条件が4-1とは多少異なるので、新しいSDHCカードにOSをインストールすることから始めた。
・OS Raspbian Buster 導入後、update,upgrade
・I2Cが使え、Python3で制御できるようにする
raspi-configを実行。インターフェース・オプション設定で、I2Cを有効にする。
I2C関連のツール、Python3での制御のためのモジュール等をインストールする。
$ sudo apt install i2c-tools
$ sudo pip install smbus2
・Python3系を使うようにする
デフォルトPythonのバージョン確認
$ python –version
Python2系がデフォルトの場合、Python3系に変更する
$ cd /usr/bin
$ sudo unlink python
$ sudo ln -s python3 python
$ cd ~
3系に変わったことを確認
$ python –version
Python 3.7.3 など3系が表示されれば、OK
Python3系へのシンボリックの確認
$ cd /usr/bin
$ ls -al | grep python
python -> python3 の表示がされればOK
・センサー基板のI2C接続確認
$ i2cdetect -y 1
0x5aを検出
・/boot/config.txtへの追記
dtparam=i2c_baundrate=10000
・動作関連プログラムccs811.pyを入手。
・動作プログラムatom_log.pyを実行する。
ccs811.pyを呼び込んで実行する部分でエラーが発生したが、 エラーの内容・対処方法など十分にできなかった。
*参照記事
【Raspberry Pi】空気品質センサCCS811を使って我が家の空気を観測する
https://temcee.hatenablog.com/entry/air_quality
4-3動作プログラム3
投稿された時期は少し古いが、シンプルなプログラム例が見つかったので、テストしてみた。
動作条件は、4-2にほぼ同等。
・OS Raspbian Buster 導入後、update,upgrade
・I2Cが使えるようにする。
raspi-configを実行。インターフェース・オプション設定で、I2Cを有効にする。
I2C関連のツール、Python3での制御のためのモジュール等をインストールする。
$ sudo apt install i2c-tools
$ sudo pip install smbus2
・Python3系を使うようにする
・センサー基板のI2C接続確認
$ i2cdetect -y 1
0x5aを検出
・動作関連プログラムccs811.pyを入手。
・動作プログラムexample.pyを実行する。
今回もエラーが発生したが、プログラムを良く読み、下記の作業も行った結果、動作しだした。
・ccs811.py センサーの接続が0x5bになっていた。0x5aに変更
・example.py
BME280関係のプログラム行はすべて削除…example-1.py
・$ sudo pip install smbus2 を再度実行
example-1.py
#!/usr/bin/env python
import board
import digitalio
from PIL import Image, ImageDraw, ImageFont
import adafruit_ssd1306
from time import sleep
from ccs811 import CCS811
# SEN-CCS811の利用
ccs811 = CCS811()
# SSD1306のピン設定
DEVICE_ADR = 0x3C
DISP_WIDTH = 128
DISP_HEIGHT = 64
def main():
# Setting some variables for our reset pin etc.
RESET_PIN = digitalio.DigitalInOut(board.D4)
# Very important… This lets py-gaugette ‘know’ what pins to use in order to reset the display
i2c = board.I2C()
oled = adafruit_ssd1306.SSD1306_I2C(DISP_WIDTH, DISP_HEIGHT, i2c, addr=DEVICE_ADR, reset=RESET_PIN)
while(True):
# Clear display.
oled.fill(0)
oled.show()
# Create blank image for drawing.
image = Image.new(“1”, (oled.width, oled.height))
draw = ImageDraw.Draw(image)
# Load a font in 2 different sizes.
font = ImageFont.truetype(“/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf”, 28)
font2 = ImageFont.truetype(“/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf”, 14)
voc, co2 = ccs811.get()
print(f”TVOC:{voc:4d} ppb, eCO2:{co2:4d} ppm”)
sleep(1)
*参照記事
Qiita @-nvh の投稿記事
PythonでI2Cセンサ(CCS811/BME280)を読んでいろいろ表示してみた(Matplotlib、Dash)
5.小型ディスプレーへの表示
RaspberryPiにssd1306を使用した小型ディスプレーをI2C接続し、文字を表示するプログラムを見つけた。(下記参照記事)
端末にCO2濃度を表示する上記のexample-1.pyに、文字表示のプログラムを付け加えればいいと考えた。
・小型ディスプレーへの文字表示用モジュールのインストール
$ sudo pip install adafruit-circuitpython-ssd1306
$ sudo pip install pillow
・文字表示プログラムssd1306_text.pyを実行
・example-1.pyとssd1306_text.pyを合体したプログラムmeasure.pyを作った。
当然文字表示コマンドdrawの部分は、CO2濃度の表示になるよう変更した。
文字(CO2,TVOC,ppm,ppb)は正しく表示するが、co2,tvocの測定値がどうしてもうまく表示できない。
drawコマンドの書式が正しくないと思われたが、それ以外の要因もありそう。
試行錯誤の結果、drawの前に下記のように測定値の入手コマンドを書き加えることで、解決できた。
voc, co2 = ccs811.get()
フォントの大きさ、表示位置、表示間隔など少し変更した。
measure.py
#!/usr/bin/env python
import board
import digitalio
from PIL import Image, ImageDraw, ImageFont
import adafruit_ssd1306
from time import sleep
from ccs811 import CCS811
ccs811 = CCS811()
# SSD1306のピン設定
DEVICE_ADR = 0x3C
DISP_WIDTH = 128
DISP_HEIGHT = 64
# Setting some variables for our reset pin etc.
RESET_PIN = digitalio.DigitalInOut(board.D4)
# Very important… This lets py-gaugette ‘know’ what pins to use in order to reset the display
i2c = board.I2C()
oled = adafruit_ssd1306.SSD1306_I2C(DISP_WIDTH, DISP_HEIGHT, i2c, addr=DEVICE_ADR, reset=RESET_PIN)
while(True):
try:
# Clear display.
oled.fill(0)
oled.show()
# Create blank image for drawing.
image = Image.new(“1”, (oled.width, oled.height))
draw = ImageDraw.Draw(image)
# Load a font in 2 different sizes.
font = ImageFont.truetype(“/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf”, 28)
font2 = ImageFont.truetype(“/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf”, 14)
# Draw CO2,TVOC
voc, co2 = ccs811.get()
draw.text((0, 0), “CO2:{}ppm”.format(co2), font=font, fill=255)
draw.text((0, 34), “TVOC:{}ppb”.format(voc), font=font, fill=255)
# Display image
oled.image(image)
oled.show()
sleep(10)
# Clear display.
oled.fill(0)
oled.show()
return
# voc, co2 = ccs811.get()
# print(f”TVOC:{voc:4d} ppb, eCO2:{co2:4d} ppm”)
sleep(1)
except OSError:
# i2c bus somtimes cannot access
continue
except KeyboardInterrupt:
*参照記事
SSD1306表示デバイスを使って、文字列や画像を表示する
https://zenn.dev/kotapro/books/raspberrypi-tips/viewer/250_kiso_ssd1306
ラズパイで測定したCO2とTVOCの値をディスプレーに表示させる
https://www.itmedia.co.jp/news/articles/2109/18/news018.html
現在は写真のようにバラックで動かしているが、Raspberry Pi W or WH を入手して、小さなケースの中に配置し、簡易CO2計にしてみたい。
監視カメラ(IPカメラ)
2016年11月20日

RaspberryPi B+にカメラモジュールを取付け、適当なプラスティックケースに組み込んで監視カメラにしてみました。
苦労したのは、
仮設置テストでWiFiで繋がっていたのに、設置予定場所では接続が不安定
(自宅無線LANのAPへの接続が自宅周辺の場所によりかなりバラツキ大)
自宅外からの接続(画像のストリーミング配信)がうまくいかなかった
(一時的に成功したが、通信設定などいろいろテスト中にNGになった)
WiFi接続…無線LANアダプターの交換、無線LAN子機をケース内に組み込み、等いろいろ試みたが、最終的には接続安定な個所を何とか探し出した。
ストリーミング配信…サーバーの設定、ネットワーク関連の設定をよく見直し成功
監視カメラ設定詳細1へ (CPU基板を変えて再製作。下記№2。)
監視カメラ(IPカメラ) 2
2017年 8月 日

製品完成・販売のアナウンスから約5ヶ月、やっと待望のRaspberryPi Zero Wが入手できました。技適合格まで長かったこと。
早速カメラモジュールを接続し、監視カメラの製作に取り掛かりました.。
Rasp Pi Zero Wの小さいこと。これで無線LANもBluetoorhも搭載されているとは!正に今はやりのIoT向けにぴったりのCPU基板でしょう。
Raspberry Pi B+基板を基に動作させせていた経験とカメラモジュールを動作させるドライバーの組み込み方法の記事を見つけて、うまく動作するようになりました。
現在、カーポートの柱に取り付け、動作テスト中です。
センサーライト
2016年11月 日

赤外線センサーによる動体検知基板(キット)を入手して組み立て、接点出力を利用してLEDライト2個を点灯するようにしてみました。
適当なプラスティックケースに部品類を取付けましたが、センサーとLEDライトの取付け角度が悪く、人間の検知とライト点灯方向がうまく調整できなかった。
明るさ検知をCdsで行ったが、その調整幅が狭く、夜間のみ点灯がうまくいかず見た目の不格好さ、屋外での取付の難しさ、等から市販品を購入しました。
カーポートの柱に取り付けています。
*写真は、購入した市販品
Voice Kit
2017年12月26日、2018年 7月17日追記

最近”スマートスピーカー”が話題になっている。RaspberryPiにGoogle AssistantAPIを入れてそれに近いことができるというので、マイク・スピーカーをつないで遊んでいた。
Googleから”Google AIY Voice Kit”なるものが売りに出され、”Google Home”と同じようなことができるというし、日本での先行発売もされるというニュースを目にし、早速購入した。
RaspberryPi3Bも必要だということだったが、手持ちの3Bの調子が今一なので、思い切ってもう一台購入した。
結構簡単に組立ができ、いろいろ遊んでいる。Google Home miniのような使い方ができるのかと思っていたが、日本語での対応という点で、ちょっと違っていたのは残念だったが、これはこれでいろいろ楽しめそうだ。
(2018.7.17追記)Google-Assistant-SDKの日本語化が実行されたのを機に、自動起動化も実施。ハンズフリーのGoogle Homeもどき品が出来上がった。