ひゃまだのblog

ひゃまだ(id:hymd3a)の趣味のブログ

Arduinoで温湿度を測る(シールド AM2302(DHT22))

(2020-09-20 初稿 - 2021-05-14 転記・修正)

 

はじめに

対応するシールド(センサー)の多さに惹かれて、Arduinoを購入した。

このページでは、AM2302(DHT22)をArduinoにつないで温湿度を計測する方法と、計測した温湿度をPCやRaspberry Pi等のPython3で受信する方法について記述する。

AM2302(DHT22)の接続

DHT22単体で、Analog Inに接続する例はたくさんあるが、筆者の買ったものは既にデジタル変換する基盤がついたもので、意外と情報が少なかった。

筆者の購入したAM2302は、以下のとおり。

f:id:hymd3a:20210514153725j:plain

購入したAM2302

f:id:hymd3a:20210514153805j:plain

端子 左から (ー) DATA  (+)

以下のページを参考に接続した。多謝。

下の写真のとおり、(+)をarduinoの5.5Vの端子に、(ー)をGND端子に、真ん中のDATA端子は、ANALOG INの2番に接続する。

f:id:hymd3a:20210514154410j:plain

Arduinoに接続した様子

 

温湿度の測定

温度と湿度の測定のプログラム(以下、スケッチ)作成のために、上記サイトからAM2302 LibraryとSketch Fileをダウンロードする。

ライブラリの追加

まずは、ダウンロードしたLibraryを追加する。

Arduinoの「スケッチ」メニューの「ライブラリを使用」、「Add Library」とクリックし、先程ダウンロードしたライブラリを選択する。

実行後、「ライブラリを使用」を選択したときに、追加したライブラリが選べれば成功。

スケッチファイルの追加

次に、ダウンロードしたSketch Fileを展開して、sketchbookディレクトリに移動する。

ファイルメニューの「開く」で、AM2302_Sketch.ino ファイルが選択可能になる。

ファイルを開いたら、「レ点」でコンパイルし、右矢印(⇒)の記号でArduinoにスケッチを送る。

スケッチを送ったら、右上の虫眼鏡のマークの「シリアルモニタ」を開き、スケッチが正常に動いていることを確認する。

なお、シリアルモニタは、「Ctrl + Shift + M」でも開ける。

AM2302 Humidity - Temperature Sensor
  RH		Temp (C)	Temp (F)	Heat Index (C)	 Heat Index (F)
61.60 %		26.50 *C	79.70 *F	27.57 *C	       81.62 *F
62.10 %		26.50 *C	79.70 *F	27.60 *C	       81.67 *F

pythonでデータを取得する

シリアルモニタには、時々刻々と湿度や温度が表示されるが、記録やtwitter等で活用できないので、pythonでデータを取得する簡単なスクリプトを作成する。

まずは、python(ここでは、python3)にserialのパッケージをインストールする。

この操作は、DebianRaspberry Piともに同じである。

sudo apt install python3-serial

作成したスクリプトは、以下のとおり。

#!/usr/bin/env python3
#coding: UTF-8

# [2020-09-19] ver0.01 started by H. Yamada 

import serial

data = ''
ser = serial.Serial('/dev/ttyACM0', 9600)  #ボーレートはArduino側と合わせる
data = ser.readline()                      # 行単位で読込み
ser.close()

item = data.decode().split()       #byte型をstringに変更して、空白で分割
print(item[0], item[1], item[2], item[3])

以上で、データと単位が別々に取得できたので、データごとにfloatに加工等して、Google DriveTwitterで活用できるようになった。

おわりに

Arduinoを用いて、簡単に温湿度を測る方法について解説した。

また、なにか気がついたことがあれば追記する。

関連ページ

rcloneでGoogle DriveとDropboxを使ってみる

(2020-08-17 初稿 - 2021-05-14 転記・修正)

はじめに

Dropboxが無料では3台のPCしか接続できなくなったので、オンラインストレージの活用方法を検討した結果、rcloneという筆者好みのコマンドラインインターフェース(CLI)のコマンドを見つけた。

ここでは、rcloneのインストール、GoogleDriveとDropboxへの接続設定、簡単な使い方について記述する。

インストール

インストールは、Debianのパッケージになっているので、以下のように簡単できる。

sudo apt install rclone

Google Driveの設定

Google Driveの設定ファイルを作成するが、以下のページを参考にした。多謝 m(__)m

$ rclone config
2020/07/21 19:17:41 NOTICE: Config file "/home/hoge/.config/rclone/rclone.conf" not found - using defaults
No remotes found - make a new one
n) New remote
s) Set configuration password
q) Quit config
n/s/q> n #<= n を入力
name> gdrive #<= gdriveと入力(好きな名前を)
Type of storage to configure.
Enter a string value. Press Enter for the default ("").
Choose a number from below, or type in your own value
1 / A stackable unification remote, which can appear to merge the contents of several remotes
\ "union"
2 / Alias for a existing remote
\ "alias"
3 / Amazon Drive
\ "amazon cloud drive"
4 / Amazon S3 Compliant Storage Providers (AWS, Ceph, Dreamhost, IBM COS, Minio)
\ "s3"
5 / Backblaze B2
\ "b2"
6 / Box
\ "box"
7 / Cache a remote
\ "cache"
8 / Dropbox
\ "dropbox"
9 / Encrypt/Decrypt a remote
\ "crypt"
10 / FTP Connection
\ "ftp"
11 / Google Cloud Storage (this is not Google Drive)
\ "google cloud storage"
12 / Google Drive
\ "drive"
13 / Hubic
\ "hubic"
14 / JottaCloud
\ "jottacloud"
15 / Local Disk
\ "local"
16 / Microsoft Azure Blob Storage
\ "azureblob"
17 / Microsoft OneDrive
\ "onedrive"
18 / OpenDrive
\ "opendrive"
19 / Openstack Swift (Rackspace Cloud Files, Memset Memstore, OVH)
\ "swift"
20 / Pcloud
\ "pcloud"
21 / SSH/SFTP Connection
\ "sftp"
22 / Webdav
\ "webdav"
23 / Yandex Disk
\ "yandex"
24 / http Connection
\ "http"
Storage> 12 #<= 12を入力
** See help for drive backend at: https://rclone.org/drive/ **

Google Application Client Id
Leave blank normally.
Enter a string value. Press Enter for the default ("").
client_id> #<= Enterのみ
Google Application Client Secret
Leave blank normally.
Enter a string value. Press Enter for the default ("").
client_secret> #<= Enterのみ
Scope that rclone should use when requesting access from drive.
Enter a string value. Press Enter for the default ("").
Choose a number from below, or type in your own value
1 / Full access all files, excluding Application Data Folder.
\ "drive"
2 / Read-only access to file metadata and file contents.
\ "drive.readonly"
/ Access to files created by rclone only.
3 | These are visible in the drive website.
| File authorization is revoked when the user deauthorizes the app.
\ "drive.file"
/ Allows read and write access to the Application Data folder.
4 | This is not visible in the drive website.
\ "drive.appfolder"
/ Allows read-only access to file metadata but
5 | does not allow any access to read or download file content.
\ "drive.metadata.readonly"
scope> 1 #<= 1を入力
ID of the root folder
Leave blank normally.
Fill in to access "Computers" folders. (see docs).
Enter a string value. Press Enter for the default ("").
root_folder_id> #<= Enterのみ
Service Account Credentials JSON file path
Leave blank normally.
Needed only if you want use SA instead of interactive login.
Enter a string value. Press Enter for the default ("").
service_account_file> #<= Enterのみ
Edit advanced config? (y/n)
y) Yes
n) No
y/n> n #<= nを入力
Remote config
Use auto config?
* Say Y if not sure
* Say N if you are working on a remote or headless machine or Y didn't work
y) Yes
n) No
y/n> n #<= nを入力
If your browser doesn't open automatically go to the following link: https://accounts.google.com/o/oauth2/auth?(以下省略)
Log in and authorize rclone for access
Enter verification code> (ブラウザに表示されるcodeを入力)
Configure this as a team drive?
y) Yes
n) No
y/n> n #<= nを入力

--------------------
[gdrive]
scope = drive
token = {"access_token":(省略)}
--------------------
y) Yes this is OK
e) Edit this remote
d) Delete this remote
y/e/d> y #<= yを入力
Current remotes:

Name Type
==== ====
gdrive drive

e) Edit existing remote
n) New remote
d) Delete remote
r) Rename remote
c) Copy remote
s) Set configuration password
q) Quit config
e/n/d/r/c/s/q> q #<= qを入力

少々長いが、以上でGoogle Driveの設定は終了。

 

Dropboxの設定

続いて、Dropboxの設定は、以下のサイトを参考に行った。多謝 m(__)m

$ rclone config
2020/07/25 17:27:55 NOTICE: Config file "xxxxxxx/.config/rclone/rclone.conf" not found - using defaults
No remotes found - make a new one
n) New remote
s) Set configuration password
q) Quit config
n/s/q> n
name> dropbox <== 名前は dropbox としました。
Type of storage to configure.
Enter a string value. Press Enter for the default ("").
Choose a number from below, or type in your own value
1 / A stackable unification remote, which can appear to merge the contents of several remotes
\ "union"
2 / Alias for a existing remote
\ "alias"
3 / Amazon Drive
\ "amazon cloud drive"
4 / Amazon S3 Compliant Storage Providers (AWS, Ceph, Dreamhost, IBM COS, Minio)
\ "s3"
5 / Backblaze B2
\ "b2"
6 / Box
\ "box"
7 / Cache a remote
\ "cache"
8 / Dropbox
\ "dropbox"
9 / Encrypt/Decrypt a remote
\ "crypt"
10 / FTP Connection
\ "ftp"
11 / Google Cloud Storage (this is not Google Drive)
\ "google cloud storage"
12 / Google Drive
\ "drive"
13 / Hubic
\ "hubic"
14 / JottaCloud
\ "jottacloud"
15 / Local Disk
\ "local"
16 / Microsoft Azure Blob Storage
\ "azureblob"
17 / Microsoft OneDrive
\ "onedrive"
18 / OpenDrive
\ "opendrive"
19 / Openstack Swift (Rackspace Cloud Files, Memset Memstore, OVH)
\ "swift"
20 / Pcloud
\ "pcloud"
21 / SSH/SFTP Connection
\ "sftp"
22 / Webdav
\ "webdav"
23 / Yandex Disk
\ "yandex"
24 / http Connection
\ "http"
Storage> 8
** See help for dropbox backend at: https://rclone.org/dropbox/ **

Dropbox App Client Id
Leave blank normally.
Enter a string value. Press Enter for the default ("").
client_id> ここはブランクのままエンター
Dropbox App Client Secret
Leave blank normally.
Enter a string value. Press Enter for the default ("").
client_secret> ここもブランクのままエンター
Edit advanced config? (y/n)
y) Yes
n) No (default)
y/n> n No を選択
Remote config
Use auto config?
* Say Y if not sure
* Say N if you are working on a remote or headless machine
y) Yes (default)
n) No
y/n> n CUIしか使えないので Noを選択
For this to work, you will need rclone available on a machine that has
a web browser available.

For more help and alternate methods see: https://rclone.org/remote_setup/

Execute the following on the machine with the web browser (same rclone
version recommended):

rclone authorize "dropbox"

Then paste the result below:
result>

hoge@pad:~$ rclone authorize "dropbox"
If your browser doesn't open automatically go to the following link: http://127.0.0.1:53682/auth
Log in and authorize rclone for access
Waiting for code...
Got code
Paste the following into your remote machine --->
{"access_token":"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx","token_type":"bearer","expiry":"0001-01-01T00:00:00Z"}
<---End pastehoge

ちなみに、Dropboxの場合、アプリを介しての接続が3台までで、ブラウザ経由またはrcloneで『Dropbox』を開く場合は、3台までという制限はない。

簡単な使い方

ファイルの一覧の表示

$ rclone ls gdrive:
$ rclone ls dropbox:

ファイルのコピー

$ rclone copy rclone.txt gdrive:
$ rclone copy gdrive:text.txt .

ファイルの同期

rclone sync で同期できるが、リモート側のファイルをいきなり削除する可能性があるので、--dry-run オプションを付けてテスト実行した後、実行した方が良い。

$ rclone sync source:path dest:path --dry-run # テスト実行
$ rclone sync source:path dest:path

おわりに

rcloneは、ファイルの更新等に応じて自動的に同期やコピーを行ってくれない点は、い面倒であるが、rcloneひとつで複数のネットワークデータサービスを活用できる点は、とても便利だ。

特にDropboxは無料で最大3台までの制限があるため、3台より多いPC間のデータ共有には、かなり威力を発揮すると思われる。

また、何かわかったら追記する。

 

関連ページ

Arduino IDEのインストールと設定

(2020-09-20 初稿 - 2021-05-13 転記・修正)

 

はじめに

Raspberry PiArduinoに続けて、M5Stackも買った。

約5.5cm四方の小さなサイズで、WiFiBluetoothの通信機能、小さな液晶、スピーカまでついているので、単独で利用しても楽しそう。

Raspberry Piが1万円前後、M5Stackが4千円と両者ともに高機能なので、やや使い分けが難しいが、M5Stackが単体で液晶やBeep音で確認できる点は、メリット。

ここでは、ArduinoとM5StackのためのArduino IDEのインストールと設定について記述する。

Arduino IDEのインストール

AruduinoやM5Stackのスケッチ(プログラムやスクリプトのこと)を開発する環境として、Arduino IDEを利用する。

Debianには、arduinoパッケージがあるが、Versionが1.0.5と古く、M5Stackのスケッチ開発のためには使えない。

そこで、以下のサイトからtarボールをいただきインストールする。

まずは、以下のサイトからarduinoをダウンロード。

ちなみに、筆者の環境はDebian 64bit、Raspberry Pi 32bit ARMなので、それぞれ別なものをダウンロード。

ダウンロード後、以下のとおりインストール。ダウンロードしたバージョンは、1.8.13。

ダウンロード後、/optに展開したのは、気分的な問題。

cd Downloads/
tar -xf arduino-1.8.13-linux64.tar.xz
sudo mv arduino-1.8.13 /opt/
cd /opt/arduino-1.8.13/
sudo ./install.sh

Arduino IDEの設定

続いて、インストールしたArduino IDEを起動し、IDEの各種設定を行う。

なお、以降の記述は、以下の本を参考に実行した。

この本のサンプルスケッチはとても実用的で良書だ。

ボードマネージャURLの追加

下図のように、「ファイル」、「環境設定」から追加のボードマネージャのURL「を追記する。

 入力文字:  「https://dl.espressif.com/dl/package_esp32_index.json

f:id:hymd3a:20210513134028p:plain

URLの追加

ボードマネージャでesp32の追加

「ツール」、「ボード:Arduino/Genuino UNO」、「ボードマネージャ」を選択。

検索窓に「esp32」と入力すると「esp32 by Espressif Systems」が現れるので、「インストール」を押してインストール。

下図では、既に「M5Stack-Core-ESP32」が選択され、シリアルポートも「/dev/ttyUSB0」が選択されているが、同じように選ぶ。

なお、シリアルポートはM5StackをUSB接続しないと現れないし、環境によって番号は異なるので、注意。

f:id:hymd3a:20210513134822p:plain

esp32の追加

M5Stack ライブラリのインストール

続いて、「ツール」、「ライブラリを管理」から「ライブラリマネージャ」を起動。

検索窓で、「m5stack」と入力すると、「M5Stack by M5Stack」があるので、インストールボタンでインストール。

f:id:hymd3a:20210513135103p:plain

M5Stackライブラリのインストール

python serialのインストール

最後に、python-serial をインストールする。

python3系とpython2系、両方にインストールしておいた方が良い。

sudo apt install python-serial

dialoutグループへの追加

arduino IDEを利用するには、ユーザ(ここでは、hoge)が dialout のグループに入っている必要がある。以下のとおりユーザを dialoutグループに追加する。

sudo adduser hoge dialout

再ログインして、groupsコマンドで、自分(hoge)がdialoutグループに所属していることを確認すること。

groups

以上、インストールは完了。

関連ページ

 

部屋の中心で飽差を叫ぶ!

(2019-04-22 初稿 - 2021-05-13 転記・修正 - 2021-12-02 追記)

はじめに

以下の記事後、飽差についての報告も要望があった。

Raspberry Pi3で温度を測る

飽差は、植物の生育を管理するうえで、重要な指標とのこと。

飽差とは

誤解を恐れずに言えば、「空気中にどれくらい水蒸気を放出できるか」を示す指標。
単位は、g/m3 で、1立方メートル当たりの水分の重さで表す。

植物は、飽差が大き過ぎると気孔が閉じて、小さすぎると蒸散が起こりにくくなる。
このため、植物の生育のためには、換気や冷房よる除湿やミスト噴霧による加湿などの方法で、適度な飽差に管理することが必要。
一般的に、飽差は、3〜6g/m3くらいで管理することが良いと言われている。

飽差の詳細は、以下のサイトを参照のこと。

飽差の計算

飽差の計算は、上記2番めのサイト、または、以下のサイトを参照のこと。

以下のとおり、水蒸気圧、飽和水蒸気量を求め、飽差を計算することができる。

水蒸気圧(WVP) = 6.1078*10^((7.5*気温/(気温+237.3)))
飽和水蒸気量 (SWVA) = 217*WVP/(気温+273.15)
飽差(HD)    = (100-相対湿度)*SWVA/100 

上記のとおり、温度と湿度がわかれば、飽差は計算によって求めることができる。

温度と湿度のセンサー

今回の目的のために、新たに温度と湿度のセンサーを購入した。
1個500〜600円なので、財布には優しい。

このセンサーはDHT22が温度・湿度センサーで、既にハンダ付けされて付属のケーブルでつなぐだけのAM2302を購入した。
以下、このセンサーをAM2302と呼ぶ。

AM2302のつなぎ方

最初に買ったAM2302は、つなぎ方を間違えて壊してしまった。(-_-;)
写真を載せるので、付属ケーブルの接続方法を確認すること。

+    ⇒ pin1
out ⇒ pin7
-     ⇒ pin9

f:id:hymd3a:20210513100734j:plain

AM2302の端子

温度と湿度を測る

接続完了後、以下のとおりプログラムをダウンロードしてインストールする。

まず、python3の pip を事前にインストール。既にインストールされていれば、不要。

$ sudo apt-get update
$ sudo apt-get install python3-pip

プログラムをダウンロードし、ライブラリをインストールする。

(2021-12-02 追記)

以下のライブラリは開発元で非推奨とのこと、正常動作しなくなってしまった。(^_^;)

お手数ですが、今後は以下のページを参考に。

(追記終了)

$ git clone https://github.com/adafruit/Adafruit_Python_DHT.git
$ cd Adafruit_Python_DHT
$ sudo python3 setup.py install

温度の計測テスト。

$ cd /home/pi/Adafruit_Python_DHT/examples
$ python3 ./AdafruitDHT.py 2302 4
Temp=27.1* Humidity=58.6%

上記のとおり、温度と湿度が表示されれば、正常に作している。

さっそくプログラムに付属している simpletest.py を修正し、飽差を計算する関数(calc_hd)を書き加えた hd.py スクリプトを作成する。
(以下、修正部分を赤字で示す)

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

# Copyright (c) 2014 Adafruit Industries
# Author: Tony DiCola

import Adafruit_DHT
# add H.Y 2019-04-22
def calc_hd(temp,humidity):
     WVP=6.1078*10**(7.5*temp/(temp+237.3)) # Water Vapor Pressure
     SWVA=217*WVP/(temp+273.15) # Saturated Water Vapor amount
     return (100-humidity)*SWVA/100

# Adafruit_DHT.DHT22, or Adafruit_DHT.AM2302.
sensor = Adafruit_DHT.AM2302

# Example using a Raspberry Pi with DHT sensor
# connected to GPIO23.
pin = 4

humidity, temperature = Adafruit_DHT.read_retry(sensor, pin)

# calc humidity Defict
# add H.Y 2019-04-22
hd = calc_hd(temperature, humidity)

if humidity is not None and temperature is not None:
    print('温度= {0:0.1f} ℃, 湿度= {1:0.1f} %, 飽差(HD)= {2:0.2f} g/m3'.format(temperature, humidity, hd))
else:
    print('Failed to get reading. Try again!')
$ hd.py
温度= 26.9 ℃, 湿度= 57.7 %, 飽差(HD)= 10.84 g/m3

上記のように、表示されればスクリプトは正常動作している。

つぶやいてみる

twitterでつぶやくために、詳細は以下のページを参照のこと。

上記のページのbashスクリプトを修正して、以下のスクリプトを作成する。

#!/bin/bash
echo "現在時刻は $(date +"%Y-%m-%d %H:%M:%S") です。「ひゃまだ家」の部屋の $(/home/pi/bin/hd.py) で、Raspberry Pi3のCPU温度は $(vcgencmd measure_temp) です。(^^♪" | /usr/local/bin/tw --pipe

上記ページのとおり、作成したスクリプトをcrontabに登録して、実際につぶやくと以下のとおりになる。

現在時刻は 2019-04-22 20:43:42 です。「ひゃまだ家」の部屋の 温度= 27.0 ℃, 湿度= 57.7 %, 飽差(HD)= 10.90 g/m3 で、Raspberry Pi3のCPU温度は temp=53.7'C です。(^^♪</
pre>

実際にtwitterでつぶやいている様子は、以下のようになる(かなり無駄なつぶやきが多い^^;)。

おわりに

不明な部分があったら、hymd3a アット gmail.comか、上記のtwitterアカウントにダイレクトメールして質問を。

それでは、また。

関連ページ

Raspberry Pi3(ラズパイ)で温度を測る

(2019-02-11 初稿 - 2021-05-13 転記・修正)

はじめに

Raspberry Pi3 で、CPUの温度は計測し、つぶやく(twitter)ようにした。

どうせなら、その時の部屋の温度も測るようにする。

f:id:hymd3a:20210513092937j:plain

購入したTEMPer

そこで、USBで接続できる以下の製品を購入した。

この製品を選んだ理由は2つ。

  1. Raspberry Pi3でも計測の実績があること
  2. 加工せずにすぐに使えるUSB接続

インストール

製品のマイナーアップデートがあって、再検索して以下のサイトが見つかり、無事に使えるようになった(多謝 m(__)m)。

本機がUSBで認識されることを確認。
本機をUSBに挿した後、以下のコマンドを入力

$ lsusb
Bus 001 Device 004: ID 093a:2510 Pixart Imaging, Inc. Optical Mouse
Bus 001 Device 005: ID 04d9:1503 Holtek Semiconductor, Inc. Keyboard
Bus 001 Device 007: ID 413d:2107
Bus 001 Device 006: ID 0424:7800 Standard Microsystems Corp. 
Bus 001 Device 003: ID 0424:2514 Standard Microsystems Corp. USB 2.0 Hub
Bus 001 Device 002: ID 0424:2514 Standard Microsystems Corp. USB 2.0 Hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

赤字の413d:2107の行があれば、認識はOK。

実際に、インストールの方法を以下に示す。

$ sudo apt install libusb-1.0-0-dev libudev-dev libfox-1.6-dev cmake
$ git clone https://github.com/signal11/hidapi
$ cd hidapi/linux
$ make -f Makefile-manual
$ sudo cp libhidapi-hidraw.so /usr/local/lib/
$ cd /usr/local/lib
$ sudo ln -s libhidapi-hidraw.so libhidapi-hidraw.so.0
$ cd
$ git clone https://github.com/hughesr/TEMPered
$ cd TEMPered/
$ git checkout hack-413d-2107
$ git reset --hard 75aa1e2
$ cmake .
$ make
$ sudo make install
$ sudo ldconfig

使ってみる

tempered は root user しか使えないので、sudoを使って起動する。

$ sudo tempered
/dev/hidraw1 0: temperature 21.25 °C<
/dev/hidraw1 1: Failed to get the temperature: Not enough data was read from the sensor.
/dev/hidraw1 1: no sensor data available

温度計が2つ付いている製品もあるようで、hidraw1 0 と hidraw1 1の2つのチャンネルがある。

まずは、一般userでも実行できるようにステッキービットを立てる。

$ sudo chmod +s /usr/local/bin/tempered

続いて、不要な表示抑制のために、以下のシェルスクリプトを作成。

$ cat ~/bin/get-temp
#/bin/bash
echo -n "$(date +"%Y-%m-%d %H:%M:%S") :"
/usr/local/bin/tempered 2> /dev/null | grep 0 | cut -d: -f2

作成したシェルスクリプトに実行権を付与。

$ chmod +x ~/bin/get-temp

実行。

$ get-temp
2019-02-11 19:03:42 : temperature 21.18 °C 

実際に温度を測る際には、上の写真のように、USB延長コード等で Raspberry Pi3と離した位置に置かないと、Raspberry Pi3の発熱の影響を受けるので注意。
最低でも、写真奥の白いアダプタのように、直挿しせずに折り曲げて使うこと。

Crontabに登録する

確実に実行できるようになったら、crontab に登録する。

$ crontab -e
# 5分おきにファイルをアップデート すべてメール
*/5 * * * * /home/pi/bin/get-temp
# 同上 エラーのみメール
*/5 * * * * /home/pi/bin/up-gdrive 1> /dev/null
# 同上 エラーメールも送らない
*/5 * * * * /home/pi/bin/up-gdrive > /dev/null 2>&1

 5分毎に温度を測定するが、2番目のエラーが起きたときのみメールが来るように設定するのがおすすめ。

なお、初めてcrontab を設定するときには、exim4またはpostfixなどのメールトランスファーエージェント(MTA)が必要である。

crontabのエラーは、/var/log/syslogに(CRON) info (No MTA installed, discarding output)等と出ますので、つぶやかない場合は確認を。
なお、exim4のインストールと設定は以下のサイトを参照のこと。ただし、メールサーバのエラーは多大な迷惑をかけるので、くれぐれも注意を。

おわりに

少しずつですが、自宅のRaspberry Pi3の活躍の場が広がっている。
また、何かわったら、追記する。

関連ページ

Raspberry Pi3にしゃべってもらう

(2019-03-17 初稿 - 2021-05-12 転記 -2022-02-17 追記)


はじめに

Raspberry Pi3(ラズパイ)の電源を24時間電源ONにしているので、人が近づいて来たら「こんにちは」等とあいさつしたり、パワーポイントの資料がプレゼンできたら、さらに有効に活用できそう。
このページでは、Raspberry Pi3に Open Jtalkのライブラリを使ってしゃべってもらう設定を行う。
なお、このページを記載するにあたり、以下のページを参照した。というか、そのまま利用させていただいた(多謝)。

ネットで検索すると、他にもたくさん有益なページがあるので、ぜひ検索を。(^^)/

f:id:hymd3a:20210512161032p:plain

しゃべるラズパイ

インストール

上記サイトの記述にあるとおり、Open Jtalkのライブラリと音声ファイルをインストールする。

sudo apt-get install open-jtalk open-jtalk-mecab-naist-jdic hts-voice-nitech-jp-atr503-m001

上記インストールが終了したら、以下のとおりスクリプトを作成する。

mkdir ~/bin
vi bin/speak

作成したスクリプト

#!/bin/bash
tempfile=$(tempfile)
option="-m /usr/share/hts-voice/nitech-jp-atr503-m001/nitech_jp_atr503_m001.htsvoice \
-x /var/lib/mecab/dic/open-jtalk/naist-jdic \
-ow $tempfile" 
echo "$1" | open_jtalk $option aplay -q $tempfile
rm $tempfile

出力先の設定

スクリプトが完成したらさっそくしゃべってもらう。
が、その前に出力先の設定を行う。

amixer cset numid=3 0 自動判別
amixer cset numid=3 1 外部スピーカー
amixer cset numid=3 2 HDMI出力

ちなみに、筆者は HDMI出力で行っているが、最初の文字を話してくれない問題がある。(^_^;)

(2022-02-17 追記)

最近のRaspberry PiはPluseAudioで音声を管理しているよう。

出力先の選択は、デスクトップの右上にあるスピーカーを右クリックして選択する。

f:id:hymd3a:20220217140532p:plain

スピーカーのアイコンをクリックして、出力先を選択

(追記終了)

音量の調節

デフォルトでは、かなり音量が小さいので、以下のコマンドで音量を調節する。

alsamixer

(2022-02-17 追記)
pavucontrolをインストールして、音量調節。

$ apt install pavucontrol
$ pavucontrol

(追記終了)

しゃべってもらう

さて、準備が整いましたので、以下のとおりしゃべらせる。

./speak "こんにちは。ラズベリーパイです"

音声をメイさんに変更

デフォルトでは、男性の良い声だが、お好みに応じて以下のように、音声をメイさんに変更。

wget https://sourceforge.net/projects/mmdagent/files/MMDAgent_Example/MMDAgent_Example-1.7/MMDAgent_Example-1.7.zip --no-check-certificate

ダウンロードしたzipファイルを解凍。

unzip MMDAgent_Example-1.7.zip

解凍したファイルのうち、メイさんのものをコピー。

sudo cp -R ./MMDAgent_Example-1.7/Voice/mei /usr/share/hts-voice/

スクリプト

インストールしたメイさんの音声を使ってしゃべらせる。

#!/bin/bash
tempfile=`tempfile`
option="-m /usr/share/hts-voice/mei/mei_normal.htsvoice \
-x /var/lib/mecab/dic/open-jtalk/naist-jdic \
-ow $tempfile"

echo "$1" | open_jtalk $option
aplay -q $tempfile rm $tempfile

上記スクリプトを実行すると、最初の何文字かは音声にならない。(-_-;)
ネットで検索すると以下のページを見つけた。

どうも、HDMI出力では、遅延が起こって、最初の何文字かは発声されないよう。
ということで、外部スピーカーをお持ちの方は、外部スピーカーでお試しを。

たくさんのテキストをしゃべってもらう(2019年3月18日追記)

上記のスクリプトは、短いテキスト(200字以内)でしたら問題ないが、長い文章になると途中でしゃべらなってしまう。
せっかく上手にしゃべってくれるのに、残念。

そこで、長い文章でもしゃべってくれるようにスクリプトを変更。

まず最初に、soxというパッケージをインストールする。

sudo apt-get install sox

soxは、複数の wav ファイルを結合してくれる。
以下の例では、input01.wavとinput02.wavを結合して、output.wavを作成する。

sox input01.wav input02.wav output.wav

それでは、実際に話す内容を1行1文の形式で、read.txt というテキストファイルに書き込む。

$ cat read.txt
こんにちは。
ラズベリーパイです。
新しいスクリプトでは、長い文章でもちゃんと読み上げることができます。
皆さんも、使ってくださいね。

最後に作成したスクリプト lot_speak を示す。

#!/bin/bash
option="-m /usr/share/hts-voice/mei/mei_normal.htsvoice \
-x /var/lib/mecab/dic/open-jtalk/naist-jdic"

i=0
cat "$1" | while read line
do
    echo $line | open_jtalk $option -ow temp_$(printf %03d $i).wav
    i=$(($i + 1))
done

/usr/bin/sox $(ls temp_*.wav) "$2"
rm temp_*.wav

使い方は、以下のとおり。

$ lot_speak read.txt out.wav # 読み上げるテキストファイル 出力のwavファイル
$ aplay -q out.wav                # 出力されたwavファイルを読み上げる

長い文章も読み上げることができたでしょうか?
サンプルとして、以下のリンクを貼っておきますので、聞いてみてください。

おわりに

今回は、ラズパイにしゃべってもらう設定をした。しゃべってもらう内容をAIで判断すれば、かなり面白いアプリケーションができるような。
皆さんも、ぜひ、いろいろと挑戦してみて。


また、なにかわかったら、追記します。(^^)/

関連ページ

Raspbbery Pi3のCPU温度をつぶやくようにする(tw-cputemp)

(2018-02-03 初稿 - 2021-05-12 転記・修正)

はじめに

f:id:hymd3a:20210512120107j:plain

購入したラズパイ

自宅サーバとしてRaspberry Pi3(以下、ラズパイと呼びます。)を購入した。
せっかくなので、サーバとして運用する上で気がかりな点をつぶやいてもらうことに。

ラズパイはファンレスなので、冬の時期は心配ないが、超狭い自室の熱のこもった部屋では発熱がとっても心配。
ワンボードマイコンのラズパイ的には、温度を計測して、近くにあるファンのスイッチを入れるなんてことができるととっても良いが、筆者ははんだごてひとつ握れないヘタレなので、ソフト的なことしか。(^_^;)

ということで、ラズパイにプログラム言語rubyをインストールして、gemパッケージtwの力をお借りしてtwittrにつぶやくようにしてみた。

Rubyのインストール

さっそく、まずラズパイにrubyをインストールずる。
以下のコマンドでOK。

$ sudo apt install ruby ruby-dev

ruby-devを忘れると、twのインストールができないので気をつけて。

twのインストール

続いて、twのインストール。twはコマンドラインからつぶやけるスグレモノのgemパッケージ。
twのインストールの前にgemのシステムやパッケージをアップデートしておく。

$ sudo gem update --system $ sudo gem update

結構な時間が掛かりますので、お茶でも飲んで。^^;

本題のtwのインストールは以下のように。

$ sudo gem install tw

twでつぶやいてみる

twでは、以下のようにつぶやく。

$ tw --stream --status_id

なお、初回起動したときは、画面にURIが表示されるので、別のPC等で指示されたURIに行き、認証用の番号をtwに教えること。
上記コマンドでは、User streamsをstatus付きで取得(自動で更新)する。

さっそく、つぶやいてみる。

$ tw "hello from Raspberry Pi3"

いちいち[Y/n]の確認があるので面倒。
そこで、以下のように入力。

$ tw --yes "hello from Raspberry Pi3"

今度は、さっとつぶやけた。

さらに、プログラムからつぶやくときに便利なようにパイプを使ったつぶやきを。

$ echo "Raspberry Pi3からのぶつやきです。" | tw --pipe

これで、つぶやく準備は整った。

CPUの温度を表示してみる

ネットで検索するとラズパイの場合、以下のコマンドでCPUの温度が表示できるよう。

$ vcgencmd measure_temp
temp=44.0'C

簡単だね。

CPUの温度をつぶやいてみる

では、さっそくCPU温度をつぶやいてみる。

$ vcgencmd measure_temp | tw --pipe

「temp=44.0'C」とちょっとそっけないので、現在時刻とメッセージを入れてみる。

$ echo "現在時刻と「ひゃまだ家」のRaspberry Pi3のCPU温度は $(date +"%Y-%m-%d %H:%M:%S") : $(vcgencmd measure_temp) です。(^^♪" | /usr/local/bin/tw --pipe
@hymd3a 1時間1時間前
現在時刻と「ひゃまだ家」のRaspberry Pi3のCPU温度は 2018-02-03 10:20:25 : temp=46.2'C です。(^^♪

これで、少しはつぶやきらしくなった。

毎回、コマンド入力するのは面倒なので、bashスクリプトに。
適当なエディタ(例えば vi) で、~/bin/tw-cputemp 等のファイル名で以下の内容を書き込む。

$ vi ~/bin/tw-cputemp
#!/bin/bash
echo "現在時刻と「ひゃまだ家」のRaspberry Pi3のCPU温度は $(date +"%Y-%m-%d %I:%M:%S") : $(vcgencmd measure_temp) です。(^^♪" | /usr/local/bin/tw --pipe

書き込んだら、以下のコマンドで実行権を与える。

$ chmod +x ~/bin/tw-cputemp

実際に実行してみて、正常につぶやけるか確認して。

$ tw-cputemp

これで、簡単にCPU温度をつぶやけるようになった。

定期的につぶやくようにする

最後に、定期的につぶやけるように、crontabに先ほどのコマンドを登録する。

$ crontab -e

書き込む内容は以下のように。

5 10-15 * * * /home/pi/bin/tw-cputemp

上記の場合は、毎時5分になるとつぶやく設定。
注意点は、先ほど作ったシェルスクリプトをフルパスで指定すること。

(追記 2018-02-04) Twitterを見ていたら、うるさく感じたので、10時から15時のCPU温度が高温になりそうな時間帯だけ実行するようにした。

なお、crontab では、例として以下の記述ができる。

*/10 * * * * /home/pi/bin/tw-cputemp # 10分おきに
15 * * * 0 /home/pi/bin/tw-cputemp # 日曜日のみ毎時15分につぶやく

詳しいことは、「man crontab」やネットで検索してみて。
twitterさんに負荷が掛かるので、あんまり頻繁につぶやかないように。

【追記】 初期設定では、exim4またはpostfixなどのメールトランスファーエージェント(MTA)が必要である。
筆者は、以下のとおりインストールした。

なお、crontabのエラーは、/var/log/syslogにCRON) info (No MTA installed, discarding output)等と出るので、つぶやかない場合は、確認してみて。

$ sudo apt-get install exim4
$ sudo dpkg-reconfigure exim4-config
$ sudo vi /etc/exim4/passwd.client
$ sudo update-exim4.conf

詳細は、以下のページを参考に。

debianサーバでメールを送る(exim4編)

なお、筆者のtwitterは、@hymd3a なので、お暇な方はフォローして、ほめていね。(^^)v

おわりに

twitterにラズパイのCPU温度をつぶやくコマンドを作ってみた。
腕に自信がある方は、はんだごてを持って、ラズパイの温度が上がったらファンを回す等の設定を行うと楽しいかも。
せめて、CPUの温度によって、顔の表情を変化させると楽しいでしょうが、筆者はめんどくさがりやなのでたぶんやらない。(^_^;)

また、何か気がついたら記述する。

関連ページ