ひゃまだのblog

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

Raspberry Pi(ラズパイ)でWebカメラを使う

(2022-05-19 初稿)

はじめに

職場でタイムラプス写真を撮る必要があり、デジカメやアクションカメラを検討したが、使い勝手が良いものが無くて、Raspberry Pi(以下 ラズパイ)に市販のWebカメラを接続して撮ることにした。

筆者の撮影は、例えば「昼間は1時間おきに撮影し、夜は暗いので撮影しない」、「平日は、短い間隔で撮影し、土日は長い間隔で写す」等と気まぐれなのである。筆者には、crontabぐらいしか思いつかなかったので、結局ラズパイを利用することにした。

2〜3日前から使い始めたばかりなので、単なるリンク集の記事になってしまいそうだ。^^;

ラズパイにWebカメラを接続して写真を撮る

筆者が利用したWebカメラは、ロジクールのc270nとエレコムのUCAM-C820ABBKである。

エレコムUCAM-C820ABBK とロジクールc270n

ラズパイにWebカメラを接続し、認識できたかlsusbコマンドで確認する。

lsusb
(関係部分のみ抜粋)
Bus 001 Device 007: ID 046d:0825 Logitech, Inc. Webcam C270
Bus 001 Device 005: ID 1bcf:28c4 Sunplus Innovation Technology Inc. FHD Camera Microphone

写真を撮るためにはfswebcamをインストールする必要がある。

sudo apt install fswebcam

以下のようにfswebcamで、写真を撮ることができる。

fswebcam image.jpg

fswebcamの使い方は、man fswebcamで見ることができるが、デフォルトの解像度は 384x288ととても小さいので、以下のように解像度を指定して撮る方が良い。

fswebcam -r 800x600 image.jpg

以下のページでは、-F(フレーム)と-S(スキップ) オプションを変化させて撮影し、ブレずにきれいにピントが合うと報告があった。

具体的には、 -F 1 -S 10とのことだが、カメラによって異なるので、各自テストして欲しい。

ラズパイに複数台のカメラをつなぐ

ラズパイには4つのUSBポートがあるので、複数台のWebカメラを接続できる。

ただし、複数のWebカメラを接続すると、どれがどれだかわからなくなる。^^;

そこで、以下のコマンドをインストールする。

sudo apt install v4l-utils

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

以下のコマンドで、接続しているカメラのリストを取得できる。

v4l2-ctl --list-devices
(関係部分ののみ)
FHD Camera Microphone: FHD Came (usb-3f980000.usb-1.1.2):
    /dev/video0
    /dev/video1
    /dev/media3
UVC Camera (046d:0825) (usb-3f980000.usb-1.1.3):
    /dev/video2
    /dev/video3
    /dev/media4

筆者の試した範囲では、最初に接続したWebカメラが /dev/video0 になり、次に接続したWebカメラが /dev/video2 になるようである。

Webカメラ(デバイス)と解像度を指定して、写真を撮るのは以下のとおりである。

fswebcam -d /dev/video2 -r 1920x1080 image.jpg

ビデオキャプチャの設定の確認

$ v4l2-ctl -V
Format Video Capture:
    Width/Height      : 1920/1080
    Pixel Format      : 'MJPG' (Motion-JPEG)
    Field             : None
    Bytes per Line    : 0
    Size Image        : 4147200
    Colorspace        : sRGB
    Transfer Function : Rec. 709
    YCbCr/HSV Encoding: ITU-R 601
    Quantization      : Default (maps to Full Range)
    Flags             : 

$ v4l2-ctl -V
Format Video Capture:
    Width/Height      : 640/480
    Pixel Format      : 'YUYV' (YUYV 4:2:2)
    Field             : None
    Bytes per Line    : 1280
    Size Image        : 614400
    Colorspace        : sRGB
    Transfer Function : Rec. 709
    YCbCr/HSV Encoding: ITU-R 601
    Quantization      : Default (maps to Limited Range)
    Flags             : 

例えば、キャプチャーするサイズを指定する場合は以下のようにする。

v4l2-ctl -v width=1280,height=720

その他も機能があるが、詳細は上記サイトを参照のこと。

VLCメディアプレーヤーで表示してみる

VLCメディアプレーヤ等で、キャプチャすることができる。

VLCメディアプレーヤを起動後、メニューの「メディア(M)」、「キャプチャーデバイスを選択(Ctrl+C)」を選択し、「/dev/video0」または「/dev/video2」を選択すれば下図のとおりキャプチャできる。

VLCメディアプレーヤでのキャプチャ

皆さんの参考になれば…

DebianでDVDを観る

(2022-05-06 初稿 )

もうずいぶんと長い間、DebianでDVDビデオを観てなかったのだが、妻がレンタルビデオ屋で「ドライブ・マイ・カー」を借りてきたので、アカデミー賞で数々の賞を受賞したことだし、観てみようと思った。

Debianで市販のDVDを観るためには、デコードするパッケージ(libdvdcss2)が必要だが、以下をaptのソースに追加しないと、インストールすることができない。

deb https://www.deb-multimedia.org bullseye main non-free

インストール後、以下のコマンドでlibdvdcss2をインストールする。

sudo apt install libdvdcss2

インストール後は、VLCメディアプレーヤーSMPlayer等お好きなソフトで観ることができる。

Pythonのインタラクティブシェルのコマンドを保存

(2022-05-02 初稿)

転勤等でしばらくブログをサボっていたので、復帰を目指して今回は小ネタを。

Pythonインタラクティブシェルは、とても便利だけど、なぜ入力したコマンドが保存できないのか、ずっと疑問に思っていた。

ネットで検索して、以下のサイトにそのものズバリの解答があった。

念の為に、上記サイトにあったコードを記載する。

import readline
readline.write_history_file('history.py')

これで、インタラクティブシェルがずいぶん使い勝手が良くなるよ。

 

Ntfyで、超簡単に自分へ通知する

(2022-02-24 初稿 - )

先日、TwitterでNtfyがとっても便利というつぶやきを見た。

筆者は、これまでDebianのServerやRaspberry Piの通知、警告をmail送信、Twitterのつぶやきでスマホに連絡してきた。

筆者は利用したことが無いが、人によっては、Line Notifyで通知している方もいると思う。

いずれにしても、通知までの設定は面倒であることに違いない。

 

今回紹介するAndroidのアプリ Notfy は、無料でタイトルどおり設定が超簡単で、すぐに利用できる点がとても優れている。

f:id:hymd3a:20220224193025p:plain

メッセージを受信したNtfy



Ntfyのインストール

以下のリンクからNtfyをインストール

連絡用URLの設定

例えば、hogeさんのアラームならば、「hoge-alert」とかにする。この際、hoge-alertの部分は「できるだけ推測されないように」との注意書きがあった。

ntfy.sh/hoge-alert

他のオプションはチェックしなくても良い。

 

メッセージの送付

実際のメッセージは、以下のように送る。

curl -d "職場に到着" ntfy.sh/hoge-alert

なお、hoge-alertの部分は、トピック(Topic)といい、いくつでも作ることができる。ただし、くどいようだが、パスワード等がないので、他の人から推測されないようなトピックにする必要がある。

 

これで、しばらく待てば、自分のAndroid端末(スマホ)にメッセージが届く。

  • ラズパイである温度以上になったら警告
  • サーバのエラーが置きたら警告
  • コンパイルが終了したら、メッセージ

等、いろいろと便利に使えそうだ。

なお、詳しい使い方は以下のドキュメントを参照のこと。

特に、publishing messagesのページは読むようにとのこと。

関連ページ

アメダスのデータをGetする

(2022-02-17 初稿 - )

気象庁アメダスのデータ(CSV)をダウンロードするのは、以下のサイトからできる。

GUIでとても使いやすいだが、定期的にスクリプトを用いてダウンロードしたり、ある観測地点の現在のデータを知るのには少し不便だ。

そこで、以下のページからWebスクレイピングで、必要なデータ(サンプルとして静岡空港)をいただこうと思ったが、気象庁のサイトが複雑で、素人の筆者には難しくてできなかった。(^^ゞ

他の方法についてネットで検索すると、以下のサイトでjsonでダンロードできるとの記述があった。多謝。m(__)m

実際に試したところ、うまくデータを取得できたので、備忘録として記す。

https://www.jma.go.jp/bosai/amedas/data/map/YYYYMMDDhhmm00.json
YYYYMMDDhhmmは、202202171510等の日付と時刻のデータを入力する。

このURLひとつで、北は宗谷、南は波照間の現在の観測データ(実際には10分程度前)データが一度で手に入れることができるからすごい。

毎回、URLを入力するのも面倒なので、簡単なpythonスクリプトを作った。

このスクリプトは、筆者の近くの静岡空港の直近のデータを取得するが、それぞれ地点のコードを設定すれば、欲しい地点のデータが得られる。

なお、直近と言っても、あまりに直近の場合は、データの登録が完了していなく、エラーになることが多いので、実際には15分程度前で、かつ分数の1の位を切捨てるので、20分程度前のデータを取得する。具体的には、現在時刻が15:25だと、15:10のデータを取得する。

#!/usr/bin/env python3 
#coding: UTF-8
# ver 0.01 Written by Hymd3a

# sample data
#"50477":{"temp":[0.3,0],"humidity":[59,0],"sun10m":[0,0],"sun1h":[0.0,0],"precipitation10m":[0.0,0],"precipitation1h":[0.0,0],"precipitation3h":[0.0,0],"precipitation24h":[0.0,0],"windDirection":[13,0],"wind":[1.2,0]},"50477":{"temp":[1.5,0],"precipitation10m":[0.0,0],"precipitation1h":[0.0,0],"precipitation3h":[0.0,0],"precipitation24h":[0.0,0],"windDirection":[11,0],"wind":[4.8,0]},

import json
import requests
import datetime

# wind direction
wd = { 1:"北北東", 2:"北東", 3:"東北東", 4:"東", 5:"東南東", 6:"南東", 7:"南南東", 8:"南", 9:"南南西", 10:"南西", 11:"西南西", 12:"西", 13:"西北西", 14:"北西", 15:"北北西", 16:"北" } 

# functions
def get_rdate():
  # date time now
  dt_now = datetime.datetime.now()
  gdate = dt_now + datetime.timedelta(minutes=-12)  # 現在時刻から12分引く
  gdate = gdate.strftime('%Y%m%d%H%M')              # 時刻を表す文字列に変換
  return gdate[0:11] + "000"                        # 分の1の位と秒を0に

def dt2str(dt):
  return f"{dt[0:4]}-{dt[4:6]}-{dt[6:8]} {dt[8:10]}:{dt[10:12]}"

get_dt = get_rdate()
dt_str = dt2str( get_dt )
#print(get_dt, dt_str)

# get json
jdata = f"https://www.jma.go.jp/bosai/amedas/data/map/{get_dt}.json"
#jdata = "https://www.jma.go.jp/bosai/amedas/data/map/20220217050000.json"
#print(jdata)

df = requests.get(jdata).json()

print('静岡空港', dt_str)
print("温度(℃):", df['50476']['temp'][0])
print("湿度(%):", df['50476']['humidity'][0])
print("日照時間(10m):", df['50476']['sun10m'][0])
print("日照時間(1h):", df['50476']['sun1h'][0])
print("降水量(10m):", df['50476']['precipitation10m'][0])
print("降水量(1h):", df['50476']['precipitation1h'][0])
print("降水量(3h):", df['50476']['precipitation3h'][0])
print("降水量(24h):", df['50476']['precipitation24h'][0])
print("風向:", wd[df['50476']['windDirection'][0]])
print("風速(m/s):", df['50476']['wind'][0])

実行すると、以下のとおり表示される(データは架空)。

静岡空港 2022-02-17 15:10
温度(℃): 3.8<
湿度(%): 46
日照時間(10m): 10
日照時間(1h): 1.0
降水量(10m): 0.0
降水量(1h): 0.0
降水量(3h): 0.0
降水量(24h): 0.0
風向: 西北西
風速(m/s): 2.7

簡単にデータを取得できるからといって、たくさんデータを取ってサーバに負荷を掛けたりしないように。

大量のデータをGetするときは、気象庁の上記サイトから取得するように

関連ページ

シニア用にRakuten Handを使ってみる

(2022-02-11 初稿 - 2022-02-12 追記)

はじめに

(2022-02-12 追記)

「簡単に電話を掛けられるように」で説明した「直接発信」ウィジェットから電話を掛けるとRakuten LinkではなくAndroid標準の電話から掛けてしまうため、課金されてしまう。

このため、Rakuten Link サポーターというアプリをインストールする対策を追記した。

(追記終了)

 

筆者の父は高齢で、これまでauの携帯電話(俗に言うガラケー)を使ってきたが、auガラケーも2022年3月末で終了とのことで、新しい携帯の契約をしなくてはならない状況となった。

au継続でも良かったが、筆者が昨年9月に楽天モバイルに変更し、安く利用しているので、父にも楽天モバイルを利用してもらうことにした。

父はガラケーのときから、筆者と筆者の妻、筆者の姉の3人にのみ電話ができ、掛かってきた電話を受けることができない。このため、できるだけシニア向けで簡単なスマホを探したが、楽天モバイルでは欲しい機種が売り切れで、小さく持ち運びしやすいRakuten Handを購入した。

楽天モバイルでは、Hand本体を12,980円(要確認)で販売しており、Rakuten Linkで10秒以上通話すると全額ポイントで戻ってくる。

このスマホに変えて一番良かった点は、サイズも小さく軽いため、電話が掛けられない状況でも、最悪持って出掛けてくれれば、現在地情報の共有で父の居場所がわかることである。

f:id:hymd3a:20220211193253j:plain

購入したRakuten Hand(アイコンは3つのみにカスタマイズ後)

【必要な機能】

  • 筆者、筆者の妻、筆者の姉に電話が簡単に掛けられること
  • 位置情報を共有し、筆者らに居場所が特定できるようにすること
  • フォント、アイコンを大きく表示できること
  • 不必要なアイコンは表示させず、誤動作を防げること

購入前に必要なこと

Android端末なので、Googleアカウントを作成する。

また、当然、楽天IDも必要なので申込み前に作成する。

なお、楽天IDを作成する際に、クレジットカードの入力を求められるが、本人のクレジットカードでなくてもIDは作成できる。ちなみに、今回の父の楽天IDは、筆者のクレジットカードで作成した。

購入前の設定については、他所を参考に設定して欲しい。

購入後の設定

購入後は、添付のマニュアルのとおりに、「スマホの初期設定」、「楽天回線の開通」、「Rakuten Linkの設定」を行ったが、マニュアルどおりに行っただけなので、ここでは省略する。

フォント、表示サイズの変更

アプリ一覧の「設定」→ 「ディスプレイ」→ 「詳細設定」→「フォントサイズ」 → 「最大」に設定。

同様に、「表示サイズ」 → 「大」に設定。

デスクトップのアイコンの削除

デスクトップのアイコンは誤動作のもととなるので、削除した。

ただし、Googleの検索窓は、ウィジェットでもディスプレイの設定でも削除できなかった。削除方法をご存知の方は教えてください。m(__)m

簡単に電話を掛けられるように

(2022-02-12 追記)

後述のウィジェットの「直接発信」で電話を掛けるとAndroid標準の電話から掛け課金されてしまう。

このため、Google PlayからRakuten Linkサポーターをインストールする。

設定は、以下のサイトが詳しい。

筆者が試したところ、「オーバーレイ表示」が必要とのことだったので、以下のサイトを参考に設定した。

簡単に設定方法を書くと、「設定」→「アプリと通知」→「詳細設定」→「特別なアプリアクセス」→「他のアプリの上に重ねて表示」で、「表示できる ON」にすれば良い。

(追記終了)

前述のとおり、父はスマホや携帯からは、筆者と筆者の妻と筆者の姉にしか電話を掛けられない。このため、上記3箇所に簡単に電話を掛けられるようにディスプレイにウィジェットを配置した。

ウィジェットは、ディスプレイを長押しし、「ウィジェット」から「連絡帳」「直接発信」を選択し、発信先を選ぶことでできる。

Rakuten Linkで電話をするように

デフォルトの電話機能で、Rakuten Linkは選べなかったが、気休めかもしれないが、Chromeで適当な電話番号を選択し、Rakuten Linkで掛ける選択を「常に選択」した。

位置情報の共有

スマホにして一番良かった点は、位置情報の共有である。

父はよく散歩に出掛けるので、万が一転倒して電話が掛けられない状況に陥っても、位置情報が共有できていれば、探しに行くことができる。

事前に、位置情報を共有したメンバーのメールアドレス等をGoogleコンタクトに登録し、以下のヘルプを参考に設定した。

また、位置情報の共有は「無効にするまで」を選択しないと、時間の経過とともに切れてしまうので注意する。

まだ、使い始めて間もないため、バッテリーの消費等わからないが、スマホに変えて一番便利な機能だと思う。

おわりに

世の中デジタル化が進み、高齢者にとっては住みにくい世の中になってしまった。携帯キャリア各社も、もう少し高齢者が最初から使いやすいスマホを販売してくれると助かる。

関連ページ

 

Raspberry Pi 3B+ にDebian(64bit)をインストールしてみたよ

(2021-02-04 初稿 - )

はじめに

ついに、Raspberry Pi OSの64bit版が正式公開された。早くarn64のChromeChrome Remote Desktopが動いてくれると良いなぁと考えている。

さて、自宅で余っていたRaspberry Pi 3B+ にDebian 11(Bullseye) arm64版をインストールしてみた。Raspberry Piに64bitをインストールするメリットとデメリットは以下のとおり(正直なところ、あまり思いつかなかった (^^ゞ)。

ただし、今回の作業を通じて、fbtermやlocale、keyboard設定などcliで使うときのスキルがいろいろと学べたので、その記録として残す。

【メリット】

  • 通常のDebianとパッケージ更新にタイムラグがなく、細かい操作が同じ

【デメリット】

  • 未確認だが、I2CやGPIOの利用が面倒

筆者はRaspberry PiChromeブラウザを動作させて、Chrome Remote Desktopのサーバにしたかったのだが、残念ながらChromeブラウザのインストールはできなかった(Chromiumブラウザはインストール可)。

 

ちなみに、Chrome Remote Desktopのことは、以下を参照のこと。

Debian 11(Bullseye)のインストール

インストールは、以下のサイトを参考にした。多謝。

Debianイメージのダウンロード

まずは、Debianのインストールイメージのダウンロード。以下のサイトから、Raspberry Pi 3B+用のBullseyeをダウンロードした。

実際にダウンロードしたイメージは、20220121_raspi_3_bullseye.xz。

xz圧縮のファイルは、以下のとおり解凍してimgファイルにする。

xz -d Downloads/20220121_raspi_3_bullseye.xz
⇒ Downloads/20220121_raspi_3_bullseye.img

Imagerを使ってimgファイルをMicroSDカードに焼き付け

まだImagerをインストールしていない場合は、以下のサイトからダウンロード。ここでは、UbuntuDebianの場合のインストールを示す。

sudo apt install imager

f:id:hymd3a:20211130140823p:plain

imagerでSDカードの作成(図のイメージは違うよ)

Imagerは、使い方が難しいソフトではないので、説明は省略する。

Raspberry Piへカードを挿して起動

MicroSDカードの準備ができたら、いよいよ初回の起動を行う。

起動の際に、ディスプレイ、キーボードと有線LANの接続は必須である。インストール後は手動で無線LANも使えるようになるが、Wi-Fi設定は思いの外面倒である。

 

起動後、login: プロンプトが出て、ユーザはroot、パスワードはなし(Enterキーのみ)でログインできる。

login: root
passwd なし

ログイン後、セキュリティの関係上、まずはrootのパスワードを設定する。

# passwd
(root のパスワードの設定)

なお、この時点では、キーボードの設定が jp106ではないので、パスワードに特殊な文字を使わないほうが無難である。

 

ちなみに、筆者はvimを使っているので、いつも「:」を探してしまう。(^_^;)

Shift+;(セミコロン)なので、覚えておくように > 自分

参考までに、以下のサイトから頂いたキーボード画像を貼っておく。多謝

f:id:hymd3a:20220203085830j:plain

インストール時のキーボード

インストールされているパッケージの更新

# apt update;  apt upgrade

一般ユーザの追加とsudoの設定

常にrootで作業するのは、セキュリティ上好ましくないため一般ユーザを作成し、sudoを使えるようにする。ここでは、追加するユーザ名をhogeとする。

# adduser hoge
   (hogeのpasswd 設定等)
# apt install sudo
# visudo
# User privilege specification
root    ALL=(ALL:ALL) ALL
hoge    ALL=(ALL:ALL) ALL   (この行を追加、権限はご自由に)

Hostnameの変更

hostnameが pi3-20220128(インストールするイメージにより異なる)等になっているので、使いやすいhostnameに変更する。ここでは、hostnameをfugaとする。

$ sudo hostnamectl set-hostname fuga
$ sudo vi /etc/hosts
127.0.0.1    localhost
127.0.1.1    fuga.example.com   fuga

ネットワークの設定

ネットワークの設定は、/etc/network/interfaces.d/eth0 で行う。

cat /etc/network/interfaces.d/eth0 
auto eth0
iface eth0 inet dhcp
iface eth0 inet6 auto

なお、ネットワークの初期設定はDHCPだが、サーバ用途等で固定IPアドレスにする場合は、上記ファイルを以下のように変更する。

auto eth0
iface eth0-home inet static
   address 192.168.xxx.xxx
   netmask 255.255.255.0
   gateway         192.168.xxx.1
   dns-nameservers 192.168.xxx.xxx  8.8.8.8

なお、 無線LANで接続する場合は、少々手こずったので別ページに対策をアップした。参考までに載せておく。

sshの設定

筆者が試したイメージでは、インストール直後からsshはインストールされていた。

もし、インストールされていない場合は、以下のとおりインストールする。

$ sudo apt install ssh

localesの設定

sudo apt install locales
sudo dpkg-reconfigure locales
  ja_JP.UTF-8を選択

キーボードの設定

sudo apt install keyboad-configurations console-setup
sudo vi /etc/default/keyboard
XKBMODEL="jp106"
XKBLAYOUT="jp"

タイムゾーンの設定

sudo timedatectl set-timezone Asia/Tokyo

fbtermのインストール

localesを日本語環境に変更すると、日本語でメッセージがでるため、Terminalに表示される日本語が文字化けする。この対策として、fbtermをインストールし、ユーザ hogeをVideoグループに追加、さらにIPAの日本語フォントをインストールする。

sudo apt install fbterm
sudo usermod -aG video hoge
sudo apt isntall fonts-ipafont

再起動後、fbtermを起動してから、コマンドを入力すれば、日本語が正常に表示される。

X環境のインストール

筆者が試した範囲では、少なくともPi 3B+ではX環境をインストールしない方が快適に使えると思う。ただし、どうしてもX環境が必要であったり、Pi 4以降の機種であれば以下のように軽いLXDEをインストールすれば、X環境を整えることができる。

sudo apt install lxde

なお、筆者はいつもディレクトリ名を英語にしているので、以下のコマンドで英語表記にしている。

sudo apt install xdg-user-dirs-gtk
LANG=C xdg-user-dirs-gtk-update

関連ページ