2020年4月18日土曜日

WEBカメラ

以前スカイプ用に購入したロジクール製C270が使わなくなり、押入れに入れたままだったことを思い出し、ラズパイに接続してなにかできないかな〜と思い、引っ張り出してきました。
色々なサイトを見てみると、監視カメラとして利用していることが多いようなので、今回は監視カメラとして設置できるようにしてみた。

Raspberry Pi 3 Model B+
OS:Raspbian 10.3 (buster)
WEBカメラ:ロジクール HD Webcam C270

以下がUSBカメラを接続する前のlsusbの状態です。
pi@raspberrypi:~ $ lsusb
Bus 001 Device 004: ID 0411:023a BUFFALO INC. (formerly MelCo., Inc.)
Bus 001 Device 006: ID 0411:02c1 BUFFALO INC. (formerly MelCo., Inc.)
Bus 001 Device 005: ID 1c4f:0002 SiGma Micro Keyboard TRACER Gamma Ivory
Bus 001 Device 007: 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

キャプチャデバイスも存在していません。 →存在してるっぽい
pi@raspberrypi:~ $ ls /dev/video*
/dev/video10  /dev/video11  /dev/video12

接続すると以下が追加されました。
pi@raspberrypi:~ $ lsusb
Bus 001 Device 008: ID 046d:0825 Logitech, Inc. Webcam C270

接続して認識されると、ビデオキャプチャデバイスも生成されています。
pi@raspberrypi:~ $ ls /dev/video*
/dev/video0  /dev/video1  /dev/video10  /dev/video11  /dev/video12

これでWEBカメラを使う準備ができました。
次はアプリを使用しての画像取り込みになりますが、どのソフトが良いのかわからないので、
適当に調べて詳しく使い方が乗っているアプリを使うことにします。


★★guvcviewを使用してみました★★
$ sudo apt install guvcview
$ guvcview &
※使い方がよくわかりません。今回はパスします。

★★motionを使用してみた★★ 最新バージョン (4.1.1) 2020/2/25
$ sudo apt install motion
続行しますか? [Y/n] →y
motion.confという設定ファイルをいじりますが、設定ファイルを変更する前に別ファイル名でオリジナルをコピーしておいてください。
$ cd /etc/motion
$ sudo cp motion.conf motion.conf.bak
$ sudo nano motion.conf

confファイルの中を見てみると、、、
logは/var/log/motion/motion.logに出力されるようです。
画像のサイズを変更できるようです。(defaultは320*240)
エンコードにはffmpegを使用しているようです。
defaultのbpsは400000=50KByte/s
コーデックは”mpeg4, msmpeg4, swf,flv, ffv1, mov, mp4, mkv, hevc”を利用可能なようです。
保存先ディレクトリ”/var/lib/motion”のようです。

設定変更!!

$ sudo nano /etc/motion/motion.conf
(Ctrl+oで保存、Ctrl+xで終了)
$ sudo motion
ブラウザで”localhost:8081”と検索するとストリーミングされる。
ブラウザで”localhost:8080”と検索するとブラウザ上で操作できる。
実際に変更項目を確認しながらやるとベター。ALL → action → quitで停止できる。

★設定変更した項目★
daemon on
norm 1(使用するビデオ規格 0:PAL 1:NTSC 2:SECAM 3:PAL NC no colour)
width 640
height 480
framerate 12(640*480だと概ね12-14fpsしかでない)
output_pictures on(動体検知時に画像を出力する)
ffmpeg_video_codec mp4(mkvから変更)
locate_motion_mode on(動体マーカをつける)
text_double on(日付はフォントが小さいためonとしておけば、大きな文字になる。)
v4l2 17 →8or15 (C270は8:Motion-JPEGと15:YUYVに対応)
(https://motion-project.github.io/4.1.1/motion_guide.html#Options_Video4Linux_Devices)

※デフォルトのまま
stream_localhost on(ストリーム接続をローカルホストのみに制限する)
target_dir /var/lib/motion (静止画や動画を保存するディレクトリ)
ffmpeg_output_movies on(動体検知時に動画を出力する)
event_gap 60


では起動!
$ sudo motion
ブラウザで"localhost:8081"と検索窓に入力すると、カメラの映像を見ることができた。
動体検知された時の映像がtarget_dirである/var/lib/motionに保存されている。
ディレクトリ内のファイルを削除するには管理者権限が必要なので、
$ sudo rm /var/lib/motion/*.jpg
*ワイルドカードを使用すると便利。



監視カメラやWEBカメラとして使えるようになったけど、今のところ利用予定はなし。

2020年2月2日日曜日

RaspberryPi用インデックス

RaspberryPi用インデックス

・購入・組み立て
・5インチ液晶モニタの組み立て

OS:Raspbian
・初期設定
→FTP導入
・WEBカメラ
・デジタルフォトフレーム

OS:OpenMediavault
・初期設定
→エラー対策(仮)

小ネタ
・よく使うコマンド
・ネットワークデバイス名変更
・HDD(ハードディスクドライブ)の自動スピンダウン
・



2020年1月4日土曜日

WI-U3-866DS 購入

ネットワーク周りの改善のために、wifi子機を購入。
アマゾンにて2019.11.19購入 ¥3253

IEEE802.11a/b/g/n/acに対応。ac対応の中から選んだ。
アンテナ2つなので、5GHzなら866Mbps、2.4GHzなら300Mbps。
ビームフォーミング対応。
延長ケーブル付属(地味にうれしい)

メーカーの公称実効速度は491Mbps

googleのspeedtestでは
ダウンロード:81.3Mbps
アップロード:17.5Mbps



ルーターに有線接続しているPCがないので、本機(WI-U3-866DS)をRPTに無線接続し、RPTに有線接続しているラズベリーパイとiperf3で計測してみた。
※PC(クライアント) ~ RPT --- RPi(サーバ) :~無線.---有線
300秒計測 平均58.3Mbps 最小10.2Mbps 最大115Mbps 標準偏差25.0
クライアントマネージャⅤ(バッファローの無線接続ツール)では電波状態76-82%で推移。

ラズベリーパイでよく使うコマンド

ラズベリーパイを使う中で、よく使うコマンド

poweroff
システムのシャットダウン。
$ sudo shutdown -h now でも可。

reboot

システムの再起動。
$ sudo shutdown -r now

ls
ファイルやディレクトリの情報表示。
$ ls -l :で詳細表示可能。

cd
ディレクトリの移動
$ cd .. :一つ上のディレクトリに移動
$ cd ~ :ホームへ戻る

mkdir
ディレクトリを作成
$ mkdir dir  :dirという名前のディレクトリを作成

mv
ファイルやディレクトリの移動、名前の変更。
$ mv file1 /etc  :file1という名前のファイルを/etcディレクトリに移動。
$ mv file1 file2  :file1という名前のファイルをfile2という名前に変更。

cp
ファイルやディレクトリのコピーを作成。
$ cp file1 file2 :file1という名前のファイルをfile2という名前で複写。
$ cp -r dir1 dir2 :ディレクトリdir1の内容をすべてdir2へ複写。

rm
ファイルやディレクトリの削除。ディレクトリを削除するときは-rオプションをつける。
$ rm file1 :file1を削除
$ rm -r dir1 :ディレクトリdir1を削除

cat
ファイルの中身をテキスト表示。(逆順で表示させたい場合はtac)
nano等でも表示できるが、変更しない場合はcatの方が安全。

chmod
ファイルやディレクトリのパーミッション(アクセス権)の変更。
$ sudo chmod 755 file1 :file1のパーミッションを755に変更。

nano
テキストエディタnanoで編集。指定したファイル名が存在しなければ新規作成。
ctrl+oで保存、ctrl+xで終了。

apt
パッケージ管理。以前はapt-getだったが、現在はaptの使用を推奨。
$ sudo apt update
$ sudo apt upgrade
$ sudo apt install パッケージ名


aptの履歴
/var/log/apt/history.logに履歴が残るので確認が可能。

wget
ファイルのダウンロード
$ wget https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhRR-rtHiAbN9DtJ2LjpXtljV9MgPjAwikyH-CPBb7N91OV9M2oNjFfdDBuSpGZvVEuL4f31Fatv19d1fLgf-n5pO_3ojjiBQUMvzDYcPrx8B7JR53_2EFwTndfpig42PbCG590SSqBh_Q/s1600/sh_spindown.png

lsb_release -a
OSのバージョンを確認するコマンド。

raspi-config
RaspberryPiの設定ツール

echo
引数の中身を表示

|(パイプ)
commnd1 | command2
コマンド1の実行結果を引数としてコマンド2に送る。

2019年12月18日水曜日

HDD自動スピンダウン

24時間稼働予定のラズベリーパイで、接続している外付けHDDを常時起動しておくのは、電気代的に避けたい。
バックアップ用途であり、頻繁に使うものでもないので、一定時間アクセスがなければ、スピンダウン(休止状態)になるようにしたい。

環境:
RaspberryPi 3B+
Description:Raspbian GNU/Linux 10 (buster)
sdparm version: 1.10 20160222 [svn: r279]
USB-HDD:HD-AD4U3 4TB
外付けHDDの電源管理としては、sdparmとhdparmというものがある。
私の環境ではsdparmが利用可能だったので、sdparmの設定方法の備忘録。

sdparmのインストール

$ sudo apt update
$ sudo apt install sdparm

デバイスの接続場所を確認
$ df -h
/dev/sdb1        3.7T  428G  3.3T   12% /media/pi/HD-ADU3
USB-HDDは /dev/sdb1として接続されている。


sdparmによるHDDスピンダウンのコマンド
$ sudo sdparm --command=stop /dev/sdb1
>>1回ではゆっくりとした点滅後に点灯に戻るが、同じコマンドで2回目を実行することで、アクセスランプが消灯した。

HDDを監視し、一定時間アクセスがなければ、上記のコマンドを実行するスクリプトを新規作成する。
(adu3_spindownは任意のファイル名でOK)
$ sudo nano /usr/local/bin/adu3_spindown.sh
--------------------
#!/bin/sh
disk=$1
interval=$2
state=`grep " $disk " /proc/diskstats`
count=$interval
up=1
while [ true ]; do
    sleep 60
    count=$(($count-60))
    newstate=`grep " $disk " /proc/diskstats`
    if [ "$state" = "$newstate" ]; then
        if [ $count -lt 0 ]; then
            count=$interval
            if [ $up = 1 ]; then
                echo "spin-down"
                sync
                state=`grep " $disk " /proc/diskstats`
                sudo sdparm --command=stop -r /dev/$disk > /dev/null 2>&1
                up=0
            fi
        fi
    else
        count=$interval
        state="$newstate"
        if [ $up = 0 ]; then
            echo "drive is up"
            up=1
        fi
    fi
done
--------------------


・whileループ関数で監視し続ける
・sleepで60秒ごとに実行するようにする
・/proc/diskstatsの内容を監視し、指定した時間(下記の/etc/rc.localに記載する第2
引数)経っても変更がなかったらスピンダウンさせ、echoでlogにメッセージ記載

・upがHDDの稼働状態の管理。起動時にup=1に設定。スピンダウンしたらup=0に変更。スピンアップしたらup=1に変更。
・ページの下にフローチャートを追記。

上記のファイルを作成したら、実行できるようにパーミッションを変更。
$ sudo chmod 755 /usr/local/bin/adu3_spindown.sh
chmod 755=「rwxr-xr-x」 所有者:全部、グループ&その他:読み出し&実行

起動時に動作させるために上記のスクリプトをrc.localに登録する。
$ sudo nano /etc/rc.local
以下の内容を文末のexit 0 の直前に追記する。
--------------------
/usr/local/bin/adu3_spindown.sh sdb1 3600 2>&1 | logger -t adu3_spindown &
--------------------
・1時間=3600秒。/proc/diskstatsの内容に変更がなかったら、スピンダウンするように設定した。
・3600は使用目的に沿った秒数に変更可能。
・"&"と文末に記載することでバックグラウンドで稼働。

スピンダウン、スピンアップの状況は以下のコマンドで確認可能。
$ tail /var/log/user.log
>>Dec 18 00:07:54 raspberrypi adu3_spindown: spin-down
>>Dec 18 00:11:55 raspberrypi adu3_spindown: drive is up

最初はrc.localへの記載を3600秒等ではなく、120秒など短い秒数で設定して、きちんと動作しているかの確認を行うとよい。
rc.localへの記載は再起動しないと反映されないので、変更した際には、再起動を行う。

2019.12.22追記
シェルスクリプトの内容をフローチャート化してみた。

2019年12月9日月曜日

ラズベリーパイ イーサネットコンバータ化(失敗)


ラズベリーパイ3B+(以下RPi)をイーサネットコンバータ化
※注意:結局挫折します。  
条件:
1.DHCPサーバはRPiではない。RTがDHCPサーバとなる。
2.同一セグメント内で完結させたい。

環境:
RaspberryPi 3B+
Description:Raspbian GNU/Linux 10 (buster)
セグメント:192.168.0.0/24(既存のネットワーク)
192.168.0.1:RT(DHCPサーバ)

以前のネットワーク環境
RT---AP①~conv---AP②---RPi
      ~PC    ---BDレコーダー等

AP②にはイーサネットコンバータ(conv)モードがないため、別途コンバータを導入していた。150Mb/sのはずだが、以前の記事の通り、1MB/s程度しか速度が出ないため、いろいろと検討していた。

 
PCの無線ラン子機には BUFFALO『WI-U3-866DS』を購入。11ac対応で、5GHz866Mb/s、2.4GHz300Mb/sとなる。

イーサネットコンバータもボトルネックになっているため、RPiをコンバータにする(今回の記事はここ)。

構想:
RT---AP①~RPi(conv)---AP②---BDレコーダー等
      ~PC


単純にブリッジ設定すれば、できると思っていたが、、、、
802.11には有線と無線をブリッジする仕様がない?らしく、brctlにてブリッジ設定することが出来なかった。

手を付けすぎて訳の分からなくなった、
----------dhcpcd.conf-----------------------
interface wlan0
static ip_address=192.168.0.209/24
static routers=192.168.0.1
static domain_name_servers=192.168.0.1
static domain_search=192.168.0.1
metric 200
noipv6

interface eth0
static ip_address=192.168.0.208/24
noipv6
static routers=0.0.0.0
static domain_name_servers=0.0.0.0
static domain_search=

denyinterfaces wlan0

------------------------------------------------


手順1. 
Interfacesを操作するのは非推奨ではあるが、他の方法だと上手くいかないので。

$ sudo nano /etc/network/interfaces
----------interfaces-----------------------
auto lo
iface lo inet loopback

auto eth0
allow-hotplug eth0
iface eth0 inet manual
metric300

auto wlan0
allow-hotplug wlan0
iface wlan0 inet manual
metric 100
-------------------------------------------------
※メトリック設定はwlanを優先的にInternet回線に接続させるため。気休め。

手順2. 
 ip_forwardを有効にする。
$ sudo  nano /etc/rc.local
----------rc.local-------------------------------
echo 1 > /proc/sys/net/ipv4/ip_forward(追加)
exit 0
---------------------------------------------------
※文末のexit 0の前に挿入
手順3. 
$ sudo apt dhcp-helper
$ sudo nano /etc/default/dhcp-helper
----------dhcp-helper---------------------
DHCPHELP_OPTS="-b wlan0"
-----------------------------------------------



手順4. 
Proxy ARPブリッジを使う。parproutedというデーモンが一般的らしい。
$ sudo apt install parprouted
$ sudo nano /etc/rc.local

----------rc.local---------------------------------------
echo 1 > /proc/sys/net/ipv4/ip_forward
ip addr add 192.168.0.209 dev wlan0(追加)
parprouted wlan0 eth0(追加)
exit 0
----------------------------------------------------------

文末exit 0の直前に挿入。

ここで一度再起動($ sudo reboot)


手順5. 
マルチキャストルーティング
$ sudo apt install smcroute
$ sudo nano /etc/rc.local

---------rc.local---------------------------------------
echo 1 > /proc/sys/net/ipv4/ip_forward
ip addr add 192.168.0.209 dev wlan0
parprouted wlan0 eth0
smcroute -j eth0 239.255.255.255(追加)
smcroute -a eth0 0.0.0.0 239.255.255.255 wlan0(追加)
smcroute -j wlan0 239.255.255.255(追加)
smcroute -a wlan0 0.0.0.0 239.255.255.255 eth0(追加)
exit 0
----------------------------------------------------------



マルチキャストルーティングが上手くいってない。(><)


他にもいろいろ試しましたが、、、
挫折しました。
1週間程度試行錯誤しましたが、結局eth0がDHCPを取得してくず、諦めました。最終的には、RPi ~wlan0~ AP ~WI-U3-866DS~ PC にて接続して、以下の速度となりました。







挫折して、新しいコンバータを購入した。I-Oデータ製無線ランルータWN-AX1167GR2/E。こちらはコンバータ機能を搭載しており、BUFFALO製と異なり、中継器ではなくコンバータとして機能することも可能です。(取説見たら中継器としての利用でした。)中継器として使用すると本来の性能の半分しか利用できないらしいです。NECも候補にあがったけど、AP①は同じくI-Oデータ製のWN-AX2033GR2なので、同社製のコンバータにしました。


新構想
RT--AP~conv(WN-AX1167GR2/E)---RPi---USBHDD
                                ---BDレコーダー等
          ~PC



2019年11月20日水曜日

ネットワークデバイス名変更

Raspberry Pi 3B+ のネットワークデバイス名が”enxb827********”となっているので、”eth0”にしたい。

環境:
RaspberryPi3 B+
Description:    Raspbian GNU/Linux 10 (buster)
 

命名規則が”enx+MACアドレス”となっている様子。

$ sudo cp /lib/udev/rules.d/73-usb-net-by-mac.rules /lib/udev/rules.d/73-usb-net-by-mac.rules.bak
>>バックアップを取っておく。
$ sudo nano /lib/udev/rules.d/73-usb-net-by-mac.rules

---/lib/udev/rules.d/73-usb-net-by-mac.rules---
# Use MAC based names for network interfaces which are directly or indirectly
# on USB and have an universally administered (stable) MAC address (second bit
# is 0). Don't do this when ifnames is disabled via kernel command line or
# customizing/disabling 99-default.link (or previously 80-net-setup-link.rules)
# or if the interface name was provided by user-space.

ACTION=="remove", GOTO="usb_net_by_mac_end"
SUBSYSTEM!="net", GOTO="usb_net_by_mac_end"
ATTR{name_assign_type}=="3", GOTO="usb_net_by_mac_end"

IMPORT{cmdline}="net.ifnames"
ENV{net.ifnames}=="0", GOTO="usb_net_by_mac_end"

SUBSYSTEMS=="usb", NAME=="", \
    ATTR{address}=="?[014589cd]:*", \
    TEST!="/etc/udev/rules.d/80-net-setup-link.rules", \
    TEST!="/etc/systemd/network/99-default.link", \
    IMPORT{builtin}="net_id", NAME="$env{ID_NET_NAME_MAC}"
------------------------------------------------------------

"$env{ID_NET_NAME_MAC} "を"eth0"に変更する。

今後の更新でこの修正が上書きされないようにするには、次の手順を実行。

$ cp /lib/udev/rules.d/73-usb-net-by-mac.rules /etc/udev/rules.d/