Raspberry PiにプレステやSwitchのワイヤレスコントローラを接続して、操作してみたいと思いませんか?
本記事では、Linuxのbluetoothctlを使ってデバイスをBluetooth接続する方法について解説します。
「bluetoothctl」とは、Linux環境においてBluetoothデバイスの管理や操作を行うためのコマンドラインツールです。Bluetoothデバイスのスキャン、ペアリング、接続、切断などの操作を行うことができます。ターミナルを通じてBluetoothを制御できるため、シェルスクリプトや自動化に役立ちます。
通常のLinux環境では、bluetoothctlコマンドが使えるはずです。インストールされていない場合は、ターミナルで次のように打ち、bluetoothctlをインストールします。
$ sudo apt -y install bluetooth bluez
インストールされたら、bluetoothctlコンソールを起動します。
$ bluetoothctl
起動すると次にように表示されます。
[bluetoothctl]#
bluetoothctコンソールを終了するには
[bluetoothctl]# quit
と打ちます。
次のコマンドを実行することで、近くのBluetoothデバイスをスキャンすることができます。
[bluetoothctl]# scan on
デバイスがスキャンされると、MACアドレスとデバイス名が表示されます。
Discovery started
[NEW] Device XX:XX:XX:XX:XX:XX [デバイス名]
このMACアドレスは、ペアリング、接続に必要のため、コピーしておきましょう。
スキャンを終えるには、次のように打ちます。
[bluetoothctl]# scan off
スキャンで検出したデバイスとペアリングしましょう。
[bluetoothctl]# pair XX:XX:XX:XX:XX:XX
“XX:XX:XX:XX:XX:XX”はデバイスのMACアドレスです。
デバイス側で接続要求を受け入れた後、bluetoothctl側の確認依頼にyesを返答します。
[agent] Confirm passkey xxxxxxx (yes/no): yes
最終的に次のように表示されたらペアリング完了です。
[CHG] Device XX:XX:XX:XX:XX:XX Paired: yes
Pairing successful
まず、デバイスを信頼できるデバイスに設定します。次のように打ちましょう。
[bluetoothctl]# trust XX:XX:XX:XX:XX:XX
設定完了の表示がこちら。
[CHG] Device XX:XX:XX:XX:XX:XX Trusted: yes
Changing XX:XX:XX:XX:XX:XX trust succeeded
次に接続です。
[bluetoothctl]# connect XX:XX:XX:XX:XX:XX
接続に成功すると次のように表示されます。
Attempting to connect to XX:XX:XX:XX:XX:XX
[CHG] Device XX:XX:XX:XX:XX:XX Connected: yes
Connection successful
[CHG] Device XX:XX:XX:XX:XX:XX ServicesResolved: yes
[デバイス名]#
デバイスと切断するには次のようにコマンドを打ちます。
[デバイス名]# disconnect XX:XX:XX:XX:XX:XX
切断完了されると次のように表示されます。
Attempting to disconnect from XX:XX:XX:XX:XX:XX
[CHG] Device XX:XX:XX:XX:XX:XX ServicesResolved: no
Successful disconnected
[CHG] Device XX:XX:XX:XX:XX:XX Connected: no
[bluetooth]#
コマンド | 説明 |
---|---|
scan on | ペアリング・接続可能なデバイスを検索する |
scan off | ペアリング・接続可能なデバイスの検索を停止する |
devices | ペアリング・接続可能なデバイス一覧を表示する |
pair <MACアドレス> | <MACアドレス>のデバイスとペアリングする |
paired-devices | ペアリングされているデバイス一覧を表示する |
trust <MACアドレス> | <MACアドレス>のデバイスを信頼済にする |
untrust <MACアドレス> | <MACアドレス>のデバイスを信頼されていない状態にする |
connect <MACアドレス> | <MACアドレス>のデバイスと接続する |
disconnect <MACアドレス> | <MACアドレス>のデバイスを切断する |
info <MACアドレス> | <MACアドレス>のデバイス情報を表示する |
remove <MACアドレス> | <MACアドレス>のデバイスと切断し、ペアリング情報を削除する |
本記事では、Linuxのbluetoothctlを使ってデバイスをBluetooth接続する方法について解説しました。
bluetoothctlを使えばBluetoothデバイスのスキャン、ペアリング、接続、切断などの操作を簡単に行うことができます。
今回の記事が皆さんのプログラミング学習に役立つなら幸いです。
最後まで読んでいただき、ありがとうございました。
]]>家庭菜園で毎日の温度をチェックすることは大切ですが、毎日計測し続けるのは大変ですよね。
今回、Raspberry Piで計測した温度をGoogleスプレッドシートに自動で記録し、インターネット上から確認出来るシステムを構築したので、作り方を解説します。
システムは、Raspberry Piで計測した温度データをGoogle Sheets APIを使ってGoogleスプレッドシートに書き込む方法で構築しました。
実際に我が家で運用していますが、温度記録が全自動になって楽ちんです。
この記事はこんな人におすすめ!
それでは始めましょう!
Raspberry Piは屋外に設置しています。Raspberry Piを防水ケースの中に収め、電源は屋外コンセントから引っ張りました。
ボックスの中にはRaspberry PiとA/Dコンバータが入っています。配線はぐちゃぐちゃですね。
Raspberry Piは家の中のWifiルータと接続し、インターネットにアクセスします。
Raspberry Piを常時ONにしておくと電気代がかかりますので、必要なときにRaspberry Piの電源がONになるようデジタルプログラムタイマーを接続しました。3時間ごとにタイマーが電源をON/OFFします。
温湿度センサ(DHT20)は、ボックス下の穴から外に出しています。ボックス内は機器で熱がこもり、正確な気温が計測できないためです。DHT20はI2C通信でRaspberry Piに温度データを送信します。
土壌湿度センサ(YL-69)もボックスの下穴から外に出し、プランターの土に刺しています。
YL-69は土の水分量に応じて電圧値が変化します。この電圧値をA/Dコンバータがデジタル値に変換して、Raspberry Piへ送信します。
データ計測、Googleスプレッドシート書き込みのプログラムはPythonで書きました。このPythonスクリプトを3時間おきに実行しています。
Googleスプレッドシートがこちら↓
3時間おきの計測データが次々と蓄積されていきます。毎日の気温、湿度、土壌水分量がどのように変化しているかが一目瞭前ですね。
システムの製作方法について大まかに解説していきます。それぞれの要素については、別記事で詳細に書いていますので、今回は割愛させて頂きます。
今回のシステム構築には、以下のものを準備しました。
防水ケース類は上記に含めていません。こちらの記事で防水ケース類を紹介していますので、興味のある方はぜひご覧ください。
https://craft-gogo.com/raspberry-pi-waterproof/
Raspberry Piで気温・湿度・土壌水分を計測。Wifi経由でRaspberry Piをインターネットに繋ぎ、Google Drive上のGoogleスプレッドシートに計測データを書き込み。PCやスマホでGoogleスプレッドシートを確認する仕組みです。
Raspberry PiとDHT20、YL-69、MCP3208との接続方法は下図の通りです。
プログラムはPythonで書いています。まずは全コードを載せます。
import spidev
import smbus
import RPi.GPIO as GPIO
import datetime
from time import sleep
import gspread
#Googleスプレッドシート
key_name = '***********.json'
sheet_name = 'temp_data'
Vref = 3.3
# I2C設定
i2c = smbus.SMBus(1)
address = 0x38
set = [0xAC, 0x33, 0x00]
dat = [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00]
# DHT20データ取得関数
def readTemp():
# 測定開始
sleep(0.01)
i2c.write_i2c_block_data(address, 0x00, set)
# データの読み込み
sleep(0.08)
dat = i2c.read_i2c_block_data(address, 0x00, 0x07)
# データ変換
hum = dat[1] << 12 | dat[2] << 4 | ((dat[3] & 0xF0) >> 4)
tmp = ((dat[3] & 0x0F) << 16) | dat[4] << 8 | dat[5]
# 物理量変換
hum = hum / 2**20 * 100
tmp = tmp / 2**20 * 200 - 50
return hum, tmp
# 初期チェック
sleep(0.1)
ret = i2c.read_byte_data(address, 0x71)
if ret != 0x18:
exit
GPIO.setmode(GPIO.BCM)
GPIO.setup(17, GPIO.OUT)
GPIO.output(17, GPIO.HIGH)
spi = spidev.SpiDev()
spi.open(0,0) #port 0,cs 0
spi.max_speed_hz = 1000000 # 1MHz
sleep(10)
aveVolt = 0
aveHum = 0
aveTmp = 0
for i in range(10):
# YL-69データ取得
adc = spi.xfer2([0x06,0x00,0x00])
data = ((adc[1] & 0x0f) << 8) | adc[2]
volt = Vref*data/4096
# DHT20データ取得
hum, tmp = readTemp()
aveVolt = (aveVolt * i + volt)/(i+1)
aveHum = (aveHum * i + hum)/(i+1)
aveTmp = (aveTmp * i + tmp)/(i+1)
voltStr = "Volt = " + str(aveVolt) + "V"
humStr = "Humidity = " + str(aveHum) + "%"
tmpStr = "Temperature = " + str(aveTmp) + "'C"
print (voltStr)
print (humStr)
print (tmpStr)
sleep(1)
spi.close()
GPIO.cleanup()
#Googleスプレッドシートに書き込み
gc = gspread.service_account(filename= key_name)
wks = gc.open(sheet_name).sheet1
rowNum = wks.row_count + 1
wks.add_rows(1)
wks.update_cell(rowNum, 1, str(datetime.datetime.now()))
wks.update_cell(rowNum, 2, str(aveVolt))
wks.update_cell(rowNum, 3, str(aveHum))
wks.update_cell(rowNum, 4, str(aveTmp))
ここからは各要素について解説していきます。
DHT20からI2C通信でデータを取得します。下記コードは、DHT20に関する部分の抜粋です。
# I2C設定
i2c = smbus.SMBus(1)
address = 0x38
set = [0xAC, 0x33, 0x00]
dat = [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00]
# DHT20データ取得関数
def readTemp():
# 測定開始
sleep(0.01)
i2c.write_i2c_block_data(address, 0x00, set)
# データの読み込み
sleep(0.08)
dat = i2c.read_i2c_block_data(address, 0x00, 0x07)
# データ変換
hum = dat[1] << 12 | dat[2] << 4 | ((dat[3] & 0xF0) >> 4)
tmp = ((dat[3] & 0x0F) << 16) | dat[4] << 8 | dat[5]
# 物理量変換
hum = hum / 2**20 * 100
tmp = tmp / 2**20 * 200 - 50
return hum, tmp
# 初期チェック
sleep(0.1)
ret = i2c.read_byte_data(address, 0x71)
if ret != 0x18:
exit
# DHT20データ取得
hum, tmp = readTemp()
初期チェック→測定開始→データ読み取り→データ格納→温度・湿度に変換といった流れとなります。
I2C通信にはsmbusライブラリを使用していますので、コード自体はそれほど長くないと思います。
下記の記事でDHT20の使い方を解説していますので、詳しく知りたい方はぜひご覧下さい。
https://craft-gogo.com/raspberry-pi-dht20/
YL-69はA/Dコンバータ MCP3208を経由してSPI通信でデータ取得しています。下記コードは、YL-69に関する部分の抜粋です。
GPIO.setmode(GPIO.BCM)
GPIO.setup(17, GPIO.OUT)
GPIO.output(17, GPIO.HIGH)
spi = spidev.SpiDev()
spi.open(0,0) #port 0,cs 0
spi.max_speed_hz = 1000000 # 1MHz
# YL-69データ取得
adc = spi.xfer2([0x06,0x00,0x00])
data = ((adc[1] & 0x0f) << 8) | adc[2]
volt = Vref*data/4096
spi.close()
GPIO.cleanup()
spidevライブラリを使用していますので、コード自体はシンプルです。
YL-69は通電し続けると電極が錆びてしまいますので、プログラムが動作していないときはYL-69への通電を停止するよう、最後にGPIO.cleanup()を記述しました。
下記の記事でYL-69の使い方を解説していますので、詳しく知りたい方はぜひご覧下さい。
https://craft-gogo.com/raspberry-pi-yl69/
記録するデータは10秒間の平均値としました。
aveVolt = 0
aveHum = 0
aveTmp = 0
for i in range(10):
aveVolt = (aveVolt * i + volt)/(i+1)
aveHum = (aveHum * i + hum)/(i+1)
aveTmp = (aveTmp * i + tmp)/(i+1)
voltStr = "Volt = " + str(aveVolt) + "V"
humStr = "Humidity = " + str(aveHum) + "%"
tmpStr = "Temperature = " + str(aveTmp) + "'C"
print (voltStr)
print (humStr)
print (tmpStr)
sleep(1)
計測した温度・湿度・土壌水分量データをGoogle Sheets APIを使ってGoogleスプレッドシートに書き込みます。下記コードは、Googleスプレッドシートへの書き込みに関する抜粋です。
#Googleスプレッドシート
key_name = '***********.json'
sheet_name = 'temp_data'
#Googleスプレッドシートに書き込み
gc = gspread.service_account(filename= key_name)
wks = gc.open(sheet_name).sheet1
rowNum = wks.row_count + 1
wks.add_rows(1)
wks.update_cell(rowNum, 1, str(datetime.datetime.now()))
wks.update_cell(rowNum, 2, str(aveVolt))
wks.update_cell(rowNum, 3, str(aveHum))
wks.update_cell(rowNum, 4, str(aveTmp))
「temp_data」というGoogleスプレッドシートを作成し、これに計測データを書き込んでいます。
計測データと合わせて計測時間も書き込みました。
ここで、コードをただ書いたのでは、Googleスプレッドシートにデータを書き込むことは出来ません。
Google Cloud PlatformというGoogleが提供するクラウドコンピューティングサービスでの設定が必要となります。
下記の記事でGoogleスプレッドシートへの書き込み方法を解説していますので、詳しく知りたい方はぜひご覧下さい。
https://craft-gogo.com/python-gspread/
3時間ごとのGoogleスプレッドシートへの書き込みは、cronを使用する方法を用いました。
ターミナルソフトからcrontabファイルを開き設定します。
crontabファイルは以下のコマンドを打つことで開くことができます。
crontab -e
3時間おきに作成したPythonスクリプトを実行するよう設定しました。
0 */3 * * * /bin/python3 ******.py
下記の記事でcronの使い方を解説していますので、詳しく知りたい方はぜひご覧下さい。
https://craft-gogo.com/raspberrypi-camera-routine/
Raspberry Piで計測した温度をGoogleスプレッドシートに自動で記録し、インターネット上から確認出来るシステム構築について解説しました。
実際に我が家で、このシステムを運用しています。温度記録が全自動になり、とても助かっています。
興味を持たれた方は、ぜひ参考にして下さい。
最後までお読み頂きありがとうございました。
]]>Raspberry Piで計測したデータがLINEで定期的に送信されてきたら、家庭菜園などデータ管理に便利ですよね。
本記事では、Raspberry Piで計測したデータを「LINE Notify」というサービスを使ってスマホへ送信。更にcronというLinux機能で定期的に送信実行する方法について解説します。
私は温湿度センサDHT20と土壌湿度センサYL-69を使って、家庭菜園の気温・湿度・土壌水分計測に用いていますので、この例を基に解説していきます。
それでは始めましょう!
Raspberry Piで気温・湿度・土壌水分を計測。Wifi経由でRaspberry Piをインターネットに繋ぎ、LINE Notifyへデータ送信リクエスト。LINE Notifyがスマホへデータを送信する仕組みです。
Raspberry PiとDHT20、YL-69、MCP3208との接続方法は下図の通りです。
LINE Notifyについては、別記事で解説していますので、本記事ではPythonでのLINE Notifyの使い方を中心に解説します。
https://craft-gogo.com/m5stack-line/
LINE Notifyを利用するにはまずトークン発行が必要です。
LINE Notifyのホームページからログインし、トークンを発行しましょう。
POSTメソッドを使って計測データを送信するPythonスクリプトは以下の通りです。
messageに送信したい計測データを設定して下さい。
line_notify_token = '****************************'
line_notify_api = 'https://notify-api.line.me/api/notify'
message = '計測データ'
headers = {'Authorization': 'Bearer ' + line_notify_token}
data = {'message': message}
requests.post(line_notify_api, headers = headers, data = data)
気温・湿度はDHT20、土壌湿度センサはYL-69を使って計測しています。
import spidev
import smbus
import RPi.GPIO as GPIO
import requests
from time import sleep
#LINE Notify
line_notify_token = '******************************'
line_notify_api = 'https://notify-api.line.me/api/notify'
Vref = 3.3
# I2C設定
i2c = smbus.SMBus(1)
address = 0x38
set = [0xAC, 0x33, 0x00]
dat = [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00]
# LINEへメッセージを送信する関数
def send_line_message(notification_message):
headers = {'Authorization': 'Bearer ' + line_notify_token}
data = {'message': notification_message}
requests.post(line_notify_api, headers = headers, data = data)
def readTemp():
# 測定開始
sleep(0.01)
i2c.write_i2c_block_data(address, 0x00, set)
# データの読み込み
sleep(0.08)
dat = i2c.read_i2c_block_data(address, 0x00, 0x07)
# データ変換
hum = dat[1] << 12 | dat[2] << 4 | ((dat[3] & 0xF0) >> 4)
tmp = ((dat[3] & 0x0F) << 16) | dat[4] << 8 | dat[5]
# 物理量変換
hum = hum / 2**20 * 100
tmp = tmp / 2**20 * 200 - 50
return hum, tmp
sleep(0.1)
ret = i2c.read_byte_data(address, 0x71)
if ret != 0x18:
exit
GPIO.setmode(GPIO.BCM)
GPIO.setup(17, GPIO.OUT)
GPIO.output(17, GPIO.HIGH)
spi = spidev.SpiDev()
spi.open(0,0) #port 0,cs 0
spi.max_speed_hz = 1000000 # 1MHz
sleep(10)
aveVolt = 0
aveHum = 0
aveTmp = 0
for i in range(10):
adc = spi.xfer2([0x06,0x00,0x00])
data = ((adc[1] & 0x0f) << 8) | adc[2]
volt = Vref*data/4096
hum, tmp = readTemp()
aveVolt = (aveVolt * i + volt)/(i+1)
aveHum = (aveHum * i + hum)/(i+1)
aveTmp = (aveTmp * i + tmp)/(i+1)
voltStr = "Volt = " + str(aveVolt) + "V"
humStr = "Humidity = " + str(aveHum) + "%"
tmpStr = "Temperature = " + str(aveTmp) + "'C"
print (voltStr)
print (humStr)
print (tmpStr)
sleep(1)
messageStr = voltStr + "\n" + humStr + "\n" + tmpStr
send_line_message(messageStr)
spi.close()
GPIO.cleanup()
DHT20、YL-69の使い方については別記事で解説していますので、ここでは割愛させて頂きます。
https://craft-gogo.com/raspberry-pi-yl69/
https://craft-gogo.com/raspberry-pi-dht20/
https://craft-gogo.com/raspberrypi-camera-routine/
作成したPythonスクリプトを定期的に実行するため、crontabファイルに設定を追加していきます。
crontabファイルは以下のコマンドを打つことで開くことができます。
$ crontab -e
今回は3時間おきにPythonスクリプトを実行するようにしました。
0 */3 * * * /bin/python3 ***.py
これで時間になったらPythonスクリプトが実行されるはずです。
スマホのLINE画面です。3時間おきに計測データが受信出来ていますね。
Raspberry Piで計測したデータを「LINE Notify」を使ってスマホへ送信。更にcronで定期的に送信実行する方法について解説しました。
私は温湿度センサDHT20と土壌湿度センサYL-69の計測データをスマホで確認するのに活用しています。
興味を持たれた方は是非挑戦してみて下さい。
最後までお読み頂きありがとうございました。
]]>家庭菜園などで毎日の気温・湿度データを管理出来たら便利ですよね?
今回はRaspberry Piと温湿度センサDHT20を使った気温・湿度計の作り方について解説します。
こんな人におすすめ!
Raspberry Piと温湿度センサDHT20の接続方法は図表の通りです。
DHT20はI2C通信でデータをやり取りできるため、A/Dコンバータは不要となりシンプルですね。
Raspberry Pi | DHT20 |
---|---|
1: 3.3V | 1: VDD |
3: SDA | 2: SDA |
6: GND | 3: GND |
5: SCL | 4: SCL |
DHT20の仕様は下表の通りです。
測定間隔 | 2秒毎 |
湿度分解能 | 0.024%RH |
湿度精度 | ±3%RH |
温度測定範囲 | -40~80℃ |
温度分解能 | 0.01℃ |
温度精度 | ±0.5℃ |
I2Cアドレス | 0x38 |
詳細仕様はデータシートを参照下さい。データシートにはI2C通信方法も記載されています。
まずプログラム全体を記載します。
プログラムは、初期チェック→測定開始→データ読み取り→データ格納→温度・湿度に変換といった流れです。
import smbus
import time
i2c = smbus.SMBus(1)
address = 0x38
trigger = [0xAC, 0x33, 0x00]
dat = [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00]
#初期チェック
time.sleep(0.1)
ret = i2c.read_byte_data(address, 0x71)
if ret != 0x18:
exit
try:
while True:
#測定開始
time.sleep(0.01)
i2c.write_i2c_block_data(address, 0x00, trigger)
#データ読み取り
time.sleep(0.08)
dat = i2c.read_i2c_block_data(address, 0x00, 7)
#データ格納
hum = dat[1] << 12 | dat[2] << 4 | ((dat[3] & 0xF0) >> 4)
tmp = ((dat[3] & 0x0F) << 16) | dat[4] << 8 | dat[5]
#湿度変換
hum = hum / 2**20 * 100
#温度変換
tmp = tmp / 2**20 * 200 - 50
print("Humidity: " + str(hum) + "%")
print("Temperature: " + str(tmp) + "V")
time.sleep(2)
except KeyboardInterrupt:
pass
それぞれの処理について解説していきましょう!
time.sleep(0.1)
ret = i2c.read_byte_data(address, 0x71)
if ret != 0x18:
exit
DHT20に電力供給してから0.1秒後、DH20に「0x71」を送信します。
DHT20から「0x18」が返信されたら初期チェック完了です。
もしDHT20から「0x18」が返ってこなかったらプログラムを終了するようにしました。
trigger = [0xAC, 0x33, 0x00]
time.sleep(0.01)
i2c.write_i2c_block_data(address, 0x00, trigger)
10ms待ってから「0xAC」を送信し、温度・湿度の測定を開始します。このパラメータは2バイトで、1バイト目は「0x33」、2バイト目は「0x00」を設定します。
time.sleep(0.08)
dat = i2c.read_i2c_block_data(address, 0x00, 7)
80ms待ち、温度・湿度測定が完了したら、データを読み取ります。読み取りデータは7バイトです。
hum = dat[1] << 12 | dat[2] << 4 | ((dat[3] & 0xF0) >> 4)
湿度データは2バイト目、3バイト目、4バイト目の上位4ビットです。
よって2バイト目のデータを12ビット分左へシフト、3バイト目のデータを4ビット分左へシフト、4バイト目の上位4ビットを4ビット分右へシフトし論理和(OR)演算することで湿度データを繋げることができます。
tmp = ((dat[3] & 0x0F) << 16) | dat[4] << 8 | dat[5]
温度データは4バイト目の下位4ビット、5バイト目、6バイト目です。
湿度データ同様、4バイト目の下位4ビットを16ビット分左へシフト、5バイト目のデータを8ビット分左へシフト、6バイト目を論理和(OR)演算することで温度データを繋げることができます。
hum = hum / 2**20 * 100
tmp = tmp / 2**20 * 200 - 50
データシートに記載されている通り湿度・温度を変換します。
プログラムを実行すると2秒置きに湿度と温度がターミナルに表示されます。
Raspberry Piと温湿度センサDHT20を使った気温・湿度計の作り方について解説しました。
気温・湿度を計れるようになったことで、家庭菜園などで毎日の気温・湿度データを管理出来、便利でになりました。
最後までお読み頂きありがとうございました。
]]>以前の記事でRaspberry Piと土壌湿度センサで植物の水やりタイミングを分かるシステムを作りました。
https://craft-gogo.com/raspberry-pi-yl69/
しかし、防水処置をしていなかったので、実際の運用には至っていませんでした。
今回、Raspberry Piを防雨ケースに収めて、屋外でRaspberry Piを使用し始めたので記事にします。
Raspberry Piを屋外で使用したいと考えている人は是非参考にして下さい!
購入したもののリンク先を載せておくので参考にして下さい。
私の自宅は屋外に100V電源を設置していますので、そこから電源を確保します。
防雨ケース内に防雨型延長コードを直接引き込もうとしたのですが、引き込み穴よりプラグ穴部の方が大きく通せない・・・。
しょうがないので一旦切断し、角型コンセントに直接接続しました。
この処置は電気工事士資格を持っていないと出来ませんので注意して下さい!
私は資格所持者なので大丈夫ですよー。
土壌湿度は数時間に1回しか計測しない予定なので、Raspberry Piを常時電源ONしておくと電気代がもったいない。
しかし、Raspberry Piはネットワークを通じて起動するWake On LAN機能はありません。
どうしようかと色々検索していると電源ON/OFF時間をプログラム出来る便利なタイマーがありました。
ONの時刻、OFFの時刻をそれぞれ14個登録出来ます。
1時間ごとに電源ON/OFFは出来ないですが、2時間ごとなら出来ます。
もともと3時間ごとに土壌湿度や外気温を計測する予定だったので、これに決めました。
購入した防雨ケースは縦302×横332×深さ150の大きさです。
届いたときはデカすぎるの買ってしまったと思いました。
案の定、Raspberry Pi、電子部品を配置してもスカスカです。
これからもシステム増強していく予定ですので、これぐらいの大きさでも良かったかな。
土壌湿度センサの配線もAC100V同様、下壁の穴を通しました。
土壌湿度センサは端子がむき出しだったので、ホームセンターで購入したバスボンドで端子部を覆いました。
こんなテキトーな処置で良いのかな?
土壌湿度センサは5個入りを購入して予備はたくさんあるので、これでダメだったら考えます。
最近いちごを育てているので、いちご鉢の土の乾き具合を計測し始めました。
水やりをすると土壌湿度センサYL-69は1Vを下回って、乾いてくると1Vを上回ってきます。
水やりタイミングの閾値は1Vぐらいかな。データを集めて様子を見たいと思います。
まだ定期的に自動計測するプログラムは作っていません。
今のところ屋内からRaspberry Piにアクセスし、プログラムを実行して土壌湿度を計測しています。
早いところ自動計測プログラムを作らなきゃ。
Raspberry Piを防雨ケースに収めて、屋外でRaspberry Piを運用した内容について記事にしました。
Raspberry Piが雨風に当たることはないので安心です。
ただ屋内より屋外の方が確実に気温・湿度条件は厳しい。Raspberry Piの耐久性は大丈夫なのだろうか?
実際に運用して確かめていきたいと思います。
Raspberry Piを屋外で使用したい人は是非参考にして下さいね!
最後までお読み頂きありがとうございました。
]]>家庭菜園などで土が乾きそうなのを知らせてくれて、水やりタイミングが分かったら便利ですよね。
今回、土壌湿度センサYL-69を購入して、土壌の水分量を検知するシステムを製作したので作り方を解説しちゃいます。
こんな人におすすめ!
今回使用した土壌湿度センサ YL-69はプローブと電子基板で構成されています。
一般的に土壌の水分量が多いと抵抗値が下がります。この原理を利用して土壌水分量を検出する仕組みです。
電子基板には4本の端子があり、端子の説明は以下の通りです。
VCC | 3.3~5Vを供給 |
GND | グランド |
D0 | デジタル出力: 水分量が多いと1を出力。ポテンショメータを回すことで閾値を変化出来る。 |
A0 | アナログ出力: 水分量が多いほど値は小さくなる。 |
YL-69のアナログ出力(A0)とMCP3208のアナログ入力を接続します。そして、MCP3208とRaspberry PiをSPI接続する回路構成です。
YL-69への通電を制御出来るようVCC端子はRaspberry PiのGPIO端子と接続しています。
Raspberry Pi | MCP3208 | YL-69 |
1: 3.3V | 15: VREF 16: VDD | ー |
6: GND | 14: AGND | GND |
11: GPIO17 | ー | VCC |
19: SPI0 MOSI | 11: DIN | ー |
21: SPI0 MOSO | 12: DOUT | ー |
23: SPI0 SCLK | 13: CLK | ー |
24: SPI0 CE0 | 10: CS/SHDN | ー |
ー | 1: CH0 | A0 |
YL-69のアナログ出力値を計測するサンプルプログラムです。
import spidev
import RPi.GPIO as GPIO
from time import sleep
Vref = 3.3
GPIO.setmode(GPIO.BCM)
GPIO.setup(17, GPIO.OUT)
GPIO.output(17, GPIO.HIGH)
spi = spidev.SpiDev()
spi.open(0,0) #port 0,cs 0
spi.max_speed_hz = 1000000 # 1MHz
try:
while True:
adc = spi.xfer2([0x06,0x00,0x00])
data = ((adc[1] & 0x0f) << 8) | adc[2]
print (str(Vref*data/4096) + "V")
sleep(1)
except KeyboardInterrupt:
pass
spi.close()
GPIO.cleanup()
Raspberry PiとMCP3208はSPI通信します。自力でSPI通信プログラムを作るのは大変なので、spidevライブラリを使用しています。
MCP3208の使い方は別記事で紹介していますので、ここでは割愛させて頂きます。
https://craft-gogo.com/raspberrypi-adconverter/
YL-69は通電し続けると電極が錆びてしまいますので、プログラムが動作していないときはYL-69への通電を停止するよう、最後にGPIO.cleanup()を記述しています。
まずは台上で水分量を検出可能かテストです。
水に付けていない状態では3.2Vを示しました。
全て水に付けると1.3V。半分ぐらい水に付けると1.6Vでした。
うまく水分量を検出出来てそうです。
台上テストが完了したので、実際の土でテストです。
まだ機器や配線がむき出しなので、屋外での使用は難しいです。
実際に運用していくには、防水対策が必要ですね。
土壌湿度センサYL-69で土壌の水分量を検知するシステムを製作したので作り方を解説しました。
まだRaspberry Piにアクセスしなければ土が乾いているか確認出来ないので、水やりタイミングを自動で知らせてくれるにはシステムの改良が必要です。
また、実際の運用には防水対策が必須です。
今後システム改良したら紹介したいと思います。
以上、最後までお読み頂きありがとうございました。
]]>普段Visual Studio Code(VSCode)でプログラミングしている人は、Raspberry PiのPythonプログラミングでもVSCodeを使いたいですよね?
PCのVSCodeでPythonコードを書いて、Raspberry Piに転送。ターミナルソフトでSSH接続してPythonプログラムを実行している人も中にはいるのではないでしょうか。実際、私がそうでした。
VSCodeのRemote-SSHという拡張機能を使えば、コード作成からプログラム実行までVSCodeで完結でき、PCからRaspberry Piへのファイル転送作業から解放されます。
今回はVSCodeのRemote-SSHについてインストール方法から使い方まで解説します。
VSCode上からRaspberry PiにSSH接続するためにRemote-SSHという拡張機能を使います。拡張機能からRemote – SSHを検索し、インストールしましょう。
Remote-SSHがインストールされましたら、Raspberry Piに接続させるための設定です。
画面左タブにあるリモートデスクトップボタンを選択し、現れたConfigureボタンを選択しましょう。
Configファイル選択ウィンドウが表示されるのでUsers下のconfigファイルを選択し、中身を編集していきます。
下図の例にならって、自分の環境に合わせてconfigファイルを編集します。
HostはVSCodeでの表示名です。自分にとって分かりやすい名前を付けましょう。
HostName、User、PortはRaspberry Piで設定した値にします。
IdentityFileは鍵認証方式にしていたら、秘密鍵の保存先を指定。
configファイルを設定しますとリモートエクスプローラーにHostが表示されましたでしょうか。
右クリックし、Connect to Host in Current Windowを選択します。
SSH接続パスワード入力を求められますので入力しましょう。
画面左下にHostが表示されたら、SSH接続完了です。
Raspberry Pi Zeroは、Remote-SSH非対応なので注意。
Pythonコードを作成するために、コードを保存するフォルダを開きます。エクスプローラーからフォルダーを開くを選択します。
好きな保存場所を選択しましょう。
エクスプローラーに保存フォルダが表示されればOK。
Pythonファイルを作成するには、New Fileボタンをクリックし、ファイル名を設定します。
ここでは、HelloWorld.pyとしました。
サンプルとしてターミナルに「Hellow World」と表示されるプログラムを作成。
pythonプログラムを実行するには、エディタ右上のRun Python Fileボタンをクリックします。
ターミナルに「Hellow World」が出力されました。
VSCodeのRemote-SSHについてインストール方法から使い方までの解説でした。
Remote-SSHを使うことで、コード作成からプログラム実行までをVSCodeで完結できるので、Raspberry PiでのPythonプログラム開発もこれではかどりますね。
最後までお読み頂きありがとうございました。
]]>Raspberry PiのSSH接続、まだパスワード認証になっていませんか?
安全にSSH接続するには、公開鍵認証方式にするべきです。
今回、Raspberry PiのSSH接続をパスワード認証から公開鍵認証に変更する方法について解説します。
また、更にセキュリティを強化するため、ポート番号も変更しちゃいましょう!
公開鍵、秘密鍵を生成する方法はいくつかありますが、今回は私が簡単だと思うTeraTermを使った方法を紹介します。
TeraTermウィンドウの「設定」->「SSH鍵生成」を選択すると次の画面が表示されます。
鍵の種類はRSAを選択し、生成ボタンを押しましょう。
次に鍵のパスフレーズを入力し、「公開鍵の保存」、「秘密鍵の保存」ボタンを押し、鍵ファイルを保存します。
これだけで公開鍵、秘密鍵の生成は完了です!簡単ですね。
次に公開鍵をRaspberry Piに保存します。
保存はTeraTermのSCP転送機能を使うと楽ちんです。
SCP転送機能はTeraTermウィンドウに公開鍵ファイルをドラッグ&ドロップするだけ。
以下の画面が現れますのでOKを押しましょう。Raspberry Piのホームディレクトリに公開鍵ファイルが保存されます。
公開鍵をRaspberry Piに保存したら名前をauthorized_keysに変更し.sshディレクトリに移動します。
$ mv id_rsa.pub .ssh/authorized_keys
所有者がauthorized_keysを実行出来るよう.sshのパーミッションを変更しておきます。
$ chmod 700 .ssh
SSHの設定ファイルsshd_configを変更し、パスワード認証から公開鍵認証にします。
まず、念のためsshd_configをバックアップしておきます。
$ cp /etc/ssh/sshd_config /etc/ssh/sshd_config_backup
続いてsshd_configのファイル書き換え作業です。
$ sudo nano /etc/ssh/sshd_config
以下のようにポート番号変更、公開鍵ファイルの指定、パスワード認証を無効化します。
#Port 22
Port XX
AuthorizedKeysFile %h/.ssh/authorized_keys
#PasswordAuthentication yes
PasswordAuthentication no
これで公開鍵認証に変更されたはずです。
最後にSSHサーバーを再起動しましょう。
$ sudo /etc/init.d/ssh restart
パスワード認証から鍵認証に変更したので、TeraTermのSSH接続方法が変わります。
まず、TCPポート欄に設定したポート番号を入力します。
次の表示に進んだらパスフレーズに鍵生成時に設定したパスワードを入力します。
そして、秘密鍵を指定する流れです。
SSH接続出来たでしょうか?
Raspberry PiのSSH接続をパスワード認証から公開鍵認証に変更する方法について解説しました。
安全にSSH接続するために、公開鍵認証方式にしましょう!
最後までお読み頂きありがとうございました。
]]>Raspberry Piを使うにあたってPiユーザーのままではセキュリティ面で不安だと思います。
自分独自のユーザーを追加して、Piユーザーは無効にしちゃいましょう!
新規ユーザーにもpiユーザーと同じグループに所属させたいです。
まず、piユーザーのグループを覚えておきます。
$ groups
とコマンドを打つと
pi adm dialout cdrom sudo audio video plugdev games users input netdev lpadmin gpio i2c spi
とpiユーザーが所属しているグループが返ってきますので、これらを覚えておきます。
次に自分独自のユーザー名を追加しましょう。ここでは追加するユーザー名をnewuserとします。
$ sudo adduser newuser
パスワード設定を求められますので新しいパスワードを入力します。
その次に「Full Name」、「Room Number」、「Work Phone」、「Home Phone」、「Other」の設定を求められます。
これらはすべて空白でEnterすればOK。
覚えておいたpiユーザーのグループと同じグループに新規ユーザーを所属させましょう。
$ sudo usermod -aG adm,dialout,cdrom,sudo,audio,video,plugdev,games,users,input,netdev,lpadmin,gpio,i2c,spi newuser
グループ引数は「,」で区切ります。最後の引数は「newuser」となることに注意して下さい。
新規ユーザーを追加したらホームディレクトリもコピーしておきましょう。
$ sudo cp -r /home/pi/* /home/newuser
新規ユーザーを追加しましたが、このままではRaspberry Piを起動するたびにpiユーザーになってしまいます。そこでオートログインユーザーを変更しましょう。
オートログインユーザーの変更は、lightdm.confファイルの内容を修正します。
$ sudo nano /etc/lightdm/lightdm.conf
ファイルを開いたら
autologin-user=pi
の行を見つけて下さい。「pi」を「newuser」に変更。
autologin-user=newuser
続いてautologin@.serviceファイルも変更します。
sudo nano /etc/systemd/system/autologin@.service
でファイルを開いたら、次の行を探して下さい。
ExecStart=-/sbin/agetty --autologin pi --noclear %I $TERM
「pi」を「newuser」に変更します。
ExecStart=-/sbin/agetty --autologin newuser --noclear %I $TERM
これでRaspberry Pi起動時は「newuser」でログインされます。
最後にpiユーザーを無効化しましょう。この作業移行はpiユーザーではRaspberry Piを操作出来なくなるので注意して下さい。
sudo usermod --expiredate 1 pi
以上で新規ユーザー追加及び設定は完了です。
以上、セキュリティを強化するため新規ユーザーを追加し、piユーザーを無効化する方法についての解説でした。
最後までお読み頂きありがとうございました。
]]>家族の音楽、写真、動画ファイルが各個人のPC、スマホにばらばらに保管されていて、いざ音楽を聴いたり、写真、動画を見たいというときに面倒なことありませんか?
前回の記事では、Raspberry PiとOpenMediaVaultでPCやスマホからアクセス出来るNASサーバーを構築しました。
今回は、更にOpenMediaVaultにDLNAサーバープラグインを追加して、PC、スマホだけでなく、テレビ、ゲーム機器などからもNASサーバーにアクセスする方法を解説していきます。
私は、これによってPS3(PS5時代に古くてごめんなさい)からNASサーバーにアクセスしています。家族で撮った写真や動画をテレビの大画面で見ることが出来て、大変便利です!
こんな人に読んでもらいたい
RaspberryとルーターはLANで繋げます。Raspberry PiとHDDはUSBで繋げます。
PCやスマホ、その他AV機器からルーター→Raspberry Pi経由でHDDにアクセスする構成です。
OpenMediaVaultにDLNAサーバープラグイン「openmediavault-minidlna」をインストールし、必要事項を設定することで、DLNAサーバーが構築出来ます。
DLNAとは「Digital Living Network Alliance」の略で、家庭内LANを使って、PC、スマホ、テレビ、ゲーム機器などを接続し、音楽、写真、動画をやりとりできるようにするガイドラインです。
DLNAサーバーを構築するにはDLNAサーバーソフトウェアが必要となります。
OpenMediaVaultには、Linux系の代表的なDLNAサーバーソフトウェアであるMiniDLNAを使用出来るプラグイン「openmediavault-minidlna」をインストールすることが出来ます。
MiniDLNAでDLNAサーバーを構築するために、OpenMediaVaultに「openmediavault-minidlna」プラグインをインストールします。
システム > プラグインを選択し、openmediavault-minidlnaを検索します。見つかったらインストールボタンを押し、インストールを開始します。
インストールが完了するとサービスにMiniDLNAが追加されます。
デフォルトではMiniDLNAが有効になっていないので、有効のチェックボックスをONにしましょう。
共有するフォルダを設定します。サービス > MiniDLNA > 共有を選択し、作成アイコンをクリックします。
共有するフォルダを選んでください。
コンテンツタイプをクリックし、共有するメディアを選びましょう。選んだら保存ボタンを押して共有フォルダ設定完了です。
これでDLNAサーバーへアクセスする準備が整いました!
私は、Windows Media Playerで音楽を聴くのに利用しています。Windows Media Playerは、DLNAクライアント機能を持っていますので、下図のようにNASに保存されている音楽を再生することが出来ます。
私は、PS3(PS5時代に古くてごめんなさい)から動画ファイルにアクセスし、家族で撮った動画を大画面で見ています。下図のようにDLNAサーバーが表示されます。
今回は、OpenMediaVaultにDLNAサーバープラグインを追加して、PC、スマホだけでなく、テレビ、ゲーム機器などからもNASサーバーにアクセスする方法を解説しました。
DLNA構築のおさらいをしますと
でした。
DLNAサーバーを構築することによって、家族の音楽、写真、動画ファイルがゲーム機器などでも聴く、見ることが出来るようになり、大変便利です!
是非、ネットワークの知識を深めたい方や、既にRaspberry PiでNASサーバーを構築している方は、DLNAサーバーを構築してみて下さい。
最後までお読み頂きありがとうございました。
]]>