スマートフォン・ジン | Smartphone-Zine

引っ越し先→ https://smartphone-zine.com/

【ドラレコ】ラズパイで作るバイク用ドラレコ用のGPSで時刻合わせ【スマートバイク】

GPSとラズパイ接続

gpsdインストール

sudo apt install gpsd gpsd-clients pps-tools

シリアルコンソールを無効化

sudo vim /boot/cmdline.txt

既存の行をコメントアウトして無効化します。

新たに1行追加します。console=serial0,115200 を削除した行です。

#console=serial0,115200 console=tty1 root=PARTUUID=8d7b71ea-02 rootfstype=ext4 fsck.repair=yes rootwait
console=tty1 root=PARTUUID=8d7b71ea-02 rootfstype=ext4 fsck.repair=yes rootwait

ついでに、logo.nologo quiteをつけておきます。

console=tty1 root=PARTUUID=8d7b71ea-02 rootfstype=ext4 fsck.repair=yes rootwait logo.nologo quite

Config編集

sudo vim /boot/config.txt

dtoverlay=vc4-kms-v3d は、コメントアウトしておきます。ディスプレイ関係です max_framebuffers=2 は、Raspberry Pi 4のデュアルディスプレイ用。ディスプレイ1個しか繋がないなら不要なのでコメントアウト

[all]以下を追記します。

#dtoverlay=vc4-kms-v3d
#max_framebuffers=2

[all]
dtoverlay=pps-gpio,gpiopin=18,assert_falling_edge=true
dtoverlay=disable-bt
enable_uart=1
core_freq=250

後に マイクモジュールのSPH0645LM4Hが、gpiopin=18を使うことが分かったので GPSのgpiopin=18をgpiopin=17に変更しました。

PPS信号(Pulse-per-second signal)を有効にする

1秒毎のパルス信号です。

GPIOでPPSを受けるモジュールを組み込み

/etc/modulesを編集し、pps-gpioを追加します。

sudo vim /etc/modules

次の一行を追加します

pps-gpio

設定反映のため再起動します

sudo reboot

gpsdの設定

sudo vim /etc/default/gpsd

gpsdが起動時に収集すべきデバイスを指定します。(それらはユーザー gpsd かグループ dialout が読み書きできるようにする必要があります) その他gpsdに渡したいオプションでは、通信速度を115200に設定します。

gpsdctlによるUSB GPSバイスの自動ホットアド/リムーバブル化はOFFにしておきます。

次のように変更

# Devices gpsd should collect to at boot time.
# They need to be read/writeable, either by user gpsd or the group dialout.
#DEVICES=""
DEVICES="/dev/ttyAMA0 /dev/pps0"

# Other options you want to pass to gpsd
#GPSD_OPTIONS=""
GPSD_OPTIONS="-n -s 115200"

# Automatically hot add/remove USB GPS devices via gpsdctl
#USBAUTO="true"
USBAUTO="false"

START_DAEMON="true"
sudo vim /lib/systemd/system/gpsd.socket

IPv6構成をOFFにします。

ListenStream=[::1]:2947 と BindIPv6Only=yes をコメントアウト

[Unit]
Description=GPS (Global Positioning System) Daemon Sockets

[Socket]
ListenStream=/run/gpsd.sock
#ListenStream=[::1]:2947
ListenStream=127.0.0.1:2947
# To allow gpsd remote access, start gpsd with the -G option and
# uncomment the next two lines:
# ListenStream=[::]:2947
# ListenStream=0.0.0.0:2947
SocketMode=0600
#BindIPv6Only=yes

[Install]
WantedBy=sockets.target

gpsdの自動起動設定

sudo systemctl daemon-reload
sudo systemctl enable gpsd
sudo systemctl start gpsd
sudo systemctl enable gpsd.socket
sudo systemctl start gpsd.socket

動作確認します。

信号を受信していると、以下のように1秒おきに受信している内容を表示します。

sudo ppstest /dev/pps0

OKです。念のためラズパイをを再起動してgpsmonコマンドで確認しておきましょう。

sudo gpsmon -n

GPSで受信しているデータから日時情報を得るスクリプト

gpsdata.sh

#!/bin/sh
echo start at `/bin/date`
GPSDATE="`/usr/bin/gpspipe -w | /usr/bin/head -10 | /bin/grep TPV | /bin/sed -r 's/.*"time":"([^"]*)".*/\1/' | /usr/bin/head -1`"
echo $GPSDATE
/bin/date -s "$GPSDATE"
echo end at `/bin/date`
chmod 755 gpsdata.sh 

crontabで定期実行

crontab -e

10分毎に実行されるように設定。

*/10 * * * * sudo bash /home/pi/gpsdata.sh

起動時に毎回実行されるように設定する場合はこうする。ログ出力付き。

@reboot sudo bash /home/pi/gpsdata.sh > /home/pi/gpsdata.log 2>&1

これで、ネットワークが無い状態でもGPSの時計からRaspberry Piの時計設定ができるようになりました。

今日はここまでです。

Raspberry Pi Zero 2 w に、ffmpegをインストールしてカメラのチェックを行う その3(解決編)

ffmpegだとうまくh264入力に切り替えられない様子なので、v4l2の標準出力(stdout)をつかう

まとめ

Raspberry Pi Zero 2 wの場合、本来ならffmpegがカメラからH.264データを取得できるはずが、コマンドがKilledで止まってしまい、うまくいかない。

Raspberry Pi 4ならうまくいった。

  • PiZero2とPi4とのメモリやハードウェア性能の違いによるものか?
  • もしかしたら、ffmpegのバージョンの問題か?

とにかく、Raspberry Pi Zero 2 wではffmpegだけではやりたいことが実現できない。

そのため、間にv4l2を挟んでstdout経由でH.264データを渡す。

これでうまくいくはず。

解決方法

v4l2でh264に切り替えて録画、その標準出力をパイプでffmpegに繋いでそのまま保存しようという作戦

$ v4l2-ctl -v width=1920,height=1080,pixelformat=H264 --device /dev/video0
$ v4l2-ctl -p 30 --device /dev/video0
$ v4l2-ctl --device /dev/video0 --stream-mmap=3 --stream-to=- | ffmpeg -y -i pipe:0 -c:v copy https://blog.hatena.ne.jp/eeesode/smartphone-zine.hatenablog.com/out0.mp4 &

録画を止めるときは別のターミナルを開いて次のコマンドを実行します。

killall v4l2-ctl

うまくいきました!!ようやく、USBカメラ側のハードウェアエンコードを用いたH264録画が完成です。

ここまで本当に長い道のりでした・・・

2台のUSBカメラで、フルハイビジョン(フルHD)画像を撮影する!形式はデータ量の少ないH264形式!

v4l2-ctl -v width=1920,height=1080,pixelformat=H264 --device /dev/video0
v4l2-ctl -p 30 --device /dev/video0
v4l2-ctl -v width=1920,height=1080,pixelformat=H264 --device /dev/video2
v4l2-ctl -p 30 --device /dev/video2
v4l2-ctl --device /dev/video0 --stream-mmap=3 --stream-to=- | ffmpeg -y -i pipe:0 -c:v copy out0.mp4 &
v4l2-ctl --device /dev/video2 --stream-mmap=3 --stream-to=- | ffmpeg -y -i pipe:0 -c:v copy out2.mp4 &

問題なく動作しました!!良かった、これで一歩前進です。

色々試した結果、次のコマンドならffmpegだけでも録画出来ました!!

v4l2-ctl でパイプなんてしなくてもffmpegだけでうまく録画出来たパターンです。

ffmpeg -f v4l2 -input_format h264 -video_size 1920x1080 -framerate 30 -i /dev/video0 -c:v copy tesutout.mp4

今日はここまで。

Raspberry Pi Zero 2 w に、ffmpegをインストールしてカメラのチェックを行う その2

前回、うまく行かなかったファイル出力を再チャレンジ。

試行錯誤してみる。

まずは、Zero2のキャッシュを増やしてみる。→駄目

  1. $ sudo dphys-swapfile swapoff
  2. $ sudo nano /etc/dphys-swapfile
  3. Edit in nano CONF_SWAPSIZE=4096 ,CONF_MAXSWAP=4096 ans save the file 4.$ sudo dphys-swapfile setup 5.$ sudo dphys-swapfile swapon

下記サイトを参考にffmpegRaspberry Pi Zero 2 Wでビルドしてみる。→駄目

pimylifeup.com

ラズパイ4で実行してみる→OK

結果

Raspberry Pi 4では問題なく

ffmpeg -input_format h264 -s 1280x720 -r 60 -i /dev/video0 -c:v copy testshot.mp4

できるが、 Raspberry Pi zero 2 wではKilledになってしまうようだ。

 $ ffmpeg -input_format h264 -s 1280x720 -r 60 -i /dev/video0 -c:v copy testshot.mp4
ffmpeg version 376a1eb Copyright (c) 2000-2022 the FFmpeg developers
  built with gcc 10 (Raspbian 10.2.1-6+rpi1)
  configuration: --extra-cflags=-I/usr/local/include --extra-ldflags=-L/usr/local/lib --extra-libs='-lpthread -lm -latomic' --arch=armel --enable-gmp --enable-gpl --enable-libaom --enable-libass --enable-libdav1d --enable-libdrm --enable-libfdk-aac --enable-libfreetype --enable-libkvazaar --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopus --enable-librtmp --enable-libsnappy --enable-libsoxr --enable-libssh --enable-libvorbis --enable-libvpx --enable-libzimg --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxml2 --enable-mmal --enable-nonfree --enable-version3 --target-os=linux --enable-pthreads --enable-openssl --enable-hardcoded-tables
  libavutil      57. 17.100 / 57. 17.100
  libavcodec     59. 18.100 / 59. 18.100
  libavformat    59. 16.100 / 59. 16.100
  libavdevice    59.  4.100 / 59.  4.100
  libavfilter     8. 24.100 /  8. 24.100
  libswscale      6.  4.100 /  6.  4.100
  libswresample   4.  3.100 /  4.  3.100
  libpostproc    56.  3.100 / 56.  3.100
Killed

ラズパイZero2Wを諦めてラズパイ4にするか、Zero2Wでのffmpegは諦めるか。

今日はここまでです。

Raspberry Pi Zero 2 w に、ffmpegをインストールしてカメラのチェックを行う その1

Raspberry Pi Zero 2 w に、ffmpegをインストールしてUSBカメラのチェックを行う

ドラレコ用に購入したカメラを使って録画できるか試してみる。ドラレコには前方と後方、2台のカメラを使う。

目的:

  • ffmpegで動画コーデックがH.264であるmp4の動画で記録したい。
  • カメラはUSBカメラを使いたい
  • 使用するカメラがH.264エンコード対応しているので、ラズパイ側のハードウェアエンコードやソフトウェアエンコードを使わないようにしたい。
  • 2台のカメラを同時録画したい

結果:

  • v4l2-ctl というソフトで、H.264の生データで録画可能。
  • ffmpegでV4L2経由でカメラでH264エンコードしたデータをmp4保存する、ということはできなかった。ffmpegがKilledで停止してしまう。

試したこと

ラズパイを最新の状態にします

$ sudo apt update $ sudo apt upgrade

ffmpegのインストール

sudo apt install ffmpeg

カメラの情報を表示します

$ v4l2-ctl --list-devices
bcm2835-codec-decode (platform:bcm2835-codec):
    /dev/video10
    /dev/video11
    /dev/video12
    /dev/video18
    /dev/video31
    /dev/media0

bcm2835-isp (platform:bcm2835-isp):
    /dev/video13
    /dev/video14
    /dev/video15
    /dev/video16
    /dev/video20
    /dev/video21
    /dev/video22
    /dev/video23
    /dev/media1
    /dev/media2

CS-USB-IMX307: UVC Camera (usb-3f980000.usb-1.2):
    /dev/video0
    /dev/video1
    /dev/media3

CS-USB-IMX307: UVC Camera (usb-3f980000.usb-1.4):
    /dev/video2
    /dev/video3
    /dev/media4

2台カメラが接続されているので、デバイスを指定して対応解像度を表示してみます。

$ v4l2-ctl --device /dev/video0 --list-formats-ext
ioctl: VIDIOC_ENUM_FMT
    Type: Video Capture

    [0]: 'YUYV' (YUYV 4:2:2)
        Size: Discrete 640x360
            Interval: Discrete 0.033s (30.000 fps)
    [1]: 'MJPG' (Motion-JPEG, compressed)
        Size: Discrete 640x360
            Interval: Discrete 0.033s (30.000 fps)
        Size: Discrete 1280x720
            Interval: Discrete 0.017s (60.000 fps)
        Size: Discrete1920x1080
            Interval: Discrete 0.033s (30.000 fps)
    [2]: 'H264' (H.264, compressed)
        Size: Discrete 640x360
            Interval: Discrete 0.033s (30.000 fps)
        Size: Discrete 1280x720
            Interval: Discrete 0.017s (60.000 fps)
        Size: Discrete 1920x1080
            Interval: Discrete 0.033s (30.000 fps)

録画に使うツールをインストールします。

$ sudo apt install -y ffmpeg

このカメラは、H.264にも対応しています。 Data fromat : YUY2 / MJPG / H.264

smartphone-zine.hatenablog.com

v4l2を使って、カメラの設定を変更します。

$ v4l2-ctl -v width=1920,height=1080,pixelformat=H264 --device /dev/video0
$ v4l2-ctl -p 30 --device /dev/video0

$ v4l2-ctl -v width=1920,height=1080,pixelformat=H264 --device /dev/video2
$ v4l2-ctl -p 30 --device /dev/video2

$ v4l2-ctl -V --device /dev/video0
Format Video Capture:
    Width/Height      : 1920/1080
    Pixel Format      : 'H264' (H.264)
    Field             : None
    Bytes per Line    : 3840
    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 --device /dev/video2
Format Video Capture:
    Width/Height      : 1920/1080
    Pixel Format      : 'H264' (H.264)
    Field             : None
    Bytes per Line    : 3840
    Size Image        : 4147200
    Colorspace        : sRGB
    Transfer Function : Rec. 709
    YCbCr/HSV Encoding: ITU-R 601
    Quantization      : Default (maps to Full Range)
    Flags             : 

入力フォーマットにh264を指定(カメラ側でエンコードさせて、ラズパイの負荷を下げる)

 ffmpeg  -i /dev/video0  -input_format h264  -c:v copy   testshot.mp4

うまういかない。

v4l2-ctl -v width=1920,height=1080,pixelformat=H264
v4l2-ctl -p 30
v4l2-ctl --stream-mmap=3 --stream-count=300 --stream-to=testrec.raw 

これはうまくいった。画像もちゃんと撮れてる。

CPUの監視インストール

sudo pip install s-tui

実行

s-tui

ファイルのフォーマット確認

mediainfo ファイル名

ffmpegがKilledになる

どうしても、-input_format h264したものを-c:v copy して保存することができない。Killedと表示されて止まってしまう。

そのため、一度v4l2-ctlで、生のh264ファイルとして保存する。stream-count=1800とすると約1分のファイルができる。

v4l2-ctl -v width=1920,height=1080,pixelformat=H264
v4l2-ctl -p 30
v4l2-ctl --stream-mmap=3 --stream-count=1800 --stream-to=video0.raw  --device /dev/video0

後からffmpegでmp4ファイルに変換する。

ffmpeg -i testrec.raw -c:v copy -y -f mp4 out2.mp4

とりあえず、生のH264ファイルでもVLCなどのプレイヤーで見ることができるので、ドラレコとしてはH264保存で十分。

色々試すがどれももうまく行かない

ffmpeg -input_format h264 -s 1280x720 -r 60 -i /dev/video0 -c:v copy testshot.mp4

【ドラレコ】ラズパイで作るバイク用ドラレコ用のカメラを購入【スマートバイク】

ラズパイで作るバイク用ドラレコ

Raspberry Piで、バイク用のドラレコを作ってみます。最終的にいろんな機能を乗っけてスマートバイクを作り上げようというプロジェクトとなっています。

カメラを購入

AliExpressでドラレコに良さげなカメラを見つけて購入してみました。前カメラ、後方カメラの2つを購入。視野角134度のカメラがついています。

https://ja.aliexpress.com/item/4000612857464.html?spm=a2g0o.order_list.order_list_main.17.1875585abXgKHq&gatewayAdapt=glo2jpn

データシートはこちら。

CS-USB-IMX307 - wiki_veye

初めてのAliExpress利用でした。無事カメラ到着しました。

データシートによると、J1がUSB2.0 Interfaceになっているようですので、付属のUSBケーブルはJ1に繋げば良いようです。

カメラをMacに繋いで、QuickTime Playerで写りの確認です。 部屋の電気を夜間照明にしてみましたが、暗くても十分撮影できてます!暗視能力に驚きを隠せません。多少薄暗いくらいなら、とてもはっきりと写ります。これなら夜の走行時もちゃんとドライブレコーダーとしての能力を発揮してくれると思います。

Micro B USB2.0 Interfaceもあり、付属のUSBケーブルをつかなわくても、ここにMicroBのケーブルを使ってPCと接続してもOKです。

IMX307

このカメラには、SonyのIMX307というカメラが使われています。STARVISというカメラシリーズで、暗視能力に特化していいます。なんと、0.24lx(ルクス)に対応。数値が低ければ低いほど、暗い中でも撮影をすることができます。高感度カメラの最低照度は1ルクス未満で、0.24はこの手のカメラの中では優秀な数値です。値段も手頃かつ暗視能力も十分というバランスの良いカメラだと思います。IMX462といった上記機種になると0.17lxとさらに暗い場所も明るく撮影することができますが、価格は5倍以上になってしまいます。

さて次はこれをラズパイに接続して撮影テストしてみましょう!今日はここまでです。

開封とカメラの動作チェックの様子はこちら

youtu.be

【ヤマハFZS25】リアキャリア装着したらヘルメットホルダーが無くなってしまう?!

グラブバー取り外し

グラブバー(grab bar)は、二人乗りするときに掴む場所なわけですが、今回FZSにはリアキャリを装着しちゃったので、もともとあったグラブバーは取り外してあります。

グラブバー部分には、ヘルメットホルダーとなるフック部分があったのですが、グラブバーを取り外したことにより、ヘルメットホルダーも無くなったというわけです。

ヘルメットホルダー購入

まあ最悪、ヘルメットを持ち歩いてしまえばいいのでしょうが、訪問先にヘルメット持っていくのも邪魔だし嫌なので、急きょヘルメットホルダーを購入、FZS25に取り付けてみました。

ネットで適当に探して購入しました。Amazonで1499円、まあお手頃だし十分だろうということで速攻ポチッと注文しちゃいます。

ステップにつかない?!

最初はバイクの後ろの方、ステップの部分につけようかと考えていたのですが、パイプの太さが合わず断念。(ちゃんとノギスで測って注文すべきでしたね!)

最終的にハンドルに取り付け

というわけで、ハンドルの方に付けることにしました!

でも場所が悪くって、上手にヘルメットを引っ掛けないと、ヘルメットがセルスタータースイッチを押してしまう。ちょっと失敗だったかも?!

とりあえずホルダーが無いよりはマシということで使っています。

取り付けの様子

悪戦苦闘の末なんとか取り付け完了している動画はこちらです笑

youtu.be

【FZS25】バイクのシート取り外しを簡単にする小ワザ

FZS25のタンデムシート下ってめっちゃ狭いので、ETCがギリギリはいりましたがもうこれ以上何も入らない、といった状況です。最近のバイクはデザイン重視のためか、書類を入れておく場所もないほどですよね。

そこで、メインのシートの下も有効活用してやろうという事です。まあこっちもそんなに広いわけじゃないのですが、書類とかをいれておくのにはちょうどいいスペースなんですよ。

シート下には薄いものなら載せておけそう

ですがFZS25のバイクのシートはM6のネジで固定されているんですね、気軽に取り外しができない。毎回スパナを持ち出して、このネジを外したり、戻したりするのってめちゃくちゃ面倒じゃないですか?

シート下にアクセスするにはスパナが必要

ネジのサイズはM6でした。

太さは6mmのネジでした

長さは15mm程度あればOKそうです。

というわけで、このM6ネジを、手で取り外せちゃうようにノブつきのネジに交換しちゃいます。アマゾンで探して購入します。もしかしたらホームセンターで探したらもっと安く入手出来るかもしれませんね!

ネジはM6で、長さは15mmでピッタリ入りました!(当たり前ですね!)

たったこれだけのことですが、気軽にシート下に書類とかを入れておくことが出来るようになりました!将来的にはRaspberry pi をここに配置する想定なので、シート下へのアクセスが簡単になると助かるんですよね。

ノブ付きネジに交換してる様子はこちらです

youtu.be