これは結構いいな。
動体検知すると、こんな感じ。
車内監視用だから、外の景色は余り見えなくていい。
今、HDMIケーブルからカメラまでのケーブルが短くて、HDMIケーブルが動いたら、カメラスタンドが動いてしまう。
カメラケーブル長くして、HDMIケーブル繋いでる基盤とカメラにちょっと遊びを持たせるのと、HDMIケーブルを固定しよう。
I know who Iam.
これの続き。
ちょいとピンぼけだが(笑)、普通にZero用カメラケーブルで接続したら、「使えますし、動作する事を確認しました」(笑)。
このHDMIケーブルは、多分、Raspberry Pi 3のセット買った時に付いてきたヤツだけど、やたら太いな(笑)
という事で、
また接続端子のピン数が少ないRaspberry Pi Zero系統のモデルでは使えません。実際にRaspberry Pi Zero WHでは動作しないことを確認しました。
情報源: Raspberry PiのカメラモジュールをHDMIケーブルで接続する | ガジェライブ!
ここに書かれてるのは、製品付属のケーブルだと、Zero系本体のピン数が少なくて物理的に接続できないから、「使えません」だし、「動作しないことを確認しました。」なんだろうな。
しかし、Zero系用カメラケーブルを使うという、物理的接続する方法を思い付けなかったんだから、接続できない事を確認したのみで、動作しない事は確認できてないよなあ。
フラットケーブルをHDMIケーブルの電線に置き換えてるだけだから、ピン数の合う部分で物理的に接続さえできれば、Raspberry Piの本体要因で、動かないなんて事は有り得ねえだろうに。
Zero系のケーブル延長しようと思ってる奴が、これ、見て買うのやめたら、店にとって、えらい風評被害だわ。事実、わしも諦めかけたけど、書いてる事がおかしいから、実際に買って、自分の仮説を確かめようと思ったんだな。
これで、車載した時のカメラ映像を上に上げられるので、motion で監視状態の時に、空ばっかり写ってるのが、フロントガラスからの景色にできるな。 🙂
Raspberry Pi Zero 2Wの長いカメラケーブル無いかな? と検索していた所、次の記事がヒットして、読んでると、次の様な事が書いてあった。
また接続端子のピン数が少ないRaspberry Pi Zero系統のモデルでは使えません。実際にRaspberry Pi Zero WHでは動作しないことを確認しました。
情報源: Raspberry PiのカメラモジュールをHDMIケーブルで接続する | ガジェライブ!
フラットケーブルをHDMIケーブルで代替するとは思い付かなかったが、Zero系のフラットケーブルでカメラに接続できている以上、それがHDMIになっただけで、動作しないってのはおかしい。
「ピン数が少ない」と書いてあるので、製品付属のケーブルでは、物理的に繋がらないって意味で「使えません」って事?
Zero用のカメラケーブル使ったら、ピン数云々は関係無く、物理的に接続可能なので、それに言及してるって事は、物理的接続すらせずに「使えません」って言ってる可能性があるな。
特徴
- NVIDIA Jetson/ Raspberry Pi 4B、Pi 3B+、Pi 3B、Pi 2、Model A/B/B+、Pi Zeroに対応
情報源: Arducam Raspberry Piカメラ専用 CSI – HDMI ケーブル延長モジュール(15ピン 60mm FPCケーブル) — スイッチサイエンス
売り切れで買えないが、同じ製品と思しきものがスイッチサイエンスにもあったので、見てみたら、「Zeroに対応」と書いてある。
ラズベリーパイボード({{widget type=”catalog/product_widget_link” anchor_text=”A/B/B+,” title=”A/B/B+,” template=”catalog/product/widget/link/link_inline.phtml” id_path=”product/15272″}} または3B)をサポート) カメラボードV1 またはRaspberry Pi カメラモジュールV2 用に設計されています。 最大10mのHDMIケーブルで動作 オーディオまたはGPIO信号用の予約済みマイクとヘッドホンジャック Arducam CSI HDMIケーブル拡張モジュール(2pk
情報源: Arducam CSI HDMIケーブル拡張モジュール(2pk) – RobotShop
という事で、これをポチった。楽天のRobotShopは、「在庫なし」になってたし、在庫ありで買えるのがここ位しか無い。
この製品と同じ様なもので、PES001 ってのがあるけど、そこに「HDMIケーブルによっては、GNDの半田付けが必要」って書いてあったので、先のZero系で動かなかったというのもたまたまHDMIケーブルが悪かったってのがあるかもしれん。
情報源: Petit Studio: HDMI cables are NOT all the same!
ラスタバナナの携帯変換コネクタにテスタ当ててた時に、GNDピンが接続されてなく、口金部分がGNDになっていたが、電子機器業界の暗黙の了解なのか、GNDピンが配線されてない事があるようだ。
aliexpress に$10.8の安物のコピー品が売ってるけど、背面にチップも実装されて無く、二層基盤になってないので、口金にGNDを半田付けしても効果が無いと思われるから、買わなかった。
Arducam CSI HDMIケーブル拡張モジュールは、製品の特性上、単にフラットケーブルをHDMIケーブルに置き換えてるだけだから、フラットケーブルでカメラと接続できている以上、使えないって事は無いと思うんだがなあ。
どうも、/dev/shm をRAM DISKとして使用すると、ファイルが勝手に消されてしまうようで、そのせいで、lock file したつもりだったが、それが消されてしまい、motion が多重起動してしまっていたようだ。
そこで、明示的にRAM DISKを作成する事にした。
1 2 3 4 5 6 |
proc /proc proc defaults 0 0 PARTUUID=8c28c22f-01 /boot vfat defaults 0 2 PARTUUID=8c28c22f-02 / ext4 defaults,noatime 0 1 tmpfs /ramdisk tmpfs defaults 0 0 # a swapfile is not a swap partition, no line here # use dphys-swapfile swap[on|off] for that |
/ramdisk に tmpfs をマウントするようにした。
motion の動画もRAM DISKに作成するようにし、micro SDカードにやさしい運用に 🙂
一応、donedone エントリープラン 128kbps でネットワーク回線が繋がっていて、動画作成後にすぐに家のサーバーに転送するようにしてるので、RAM DISKのパンクは無い想定。
1 2 3 |
# To give the filename as an argument to a command append it with %f ; on_movie_end value on_movie_end rsync -av --remove-source-files %f 192.168.11.254:public_html/motion |
motion の設定で、on_movie_end で実行するコマンドを指定できるので、それでVPN経由でのファイル転送をやっている。
rsync の –remove-source-files で転送元ファイルを削除するので、RAM DISKにはファイルが貯まらない(はず)。
RAM DISK作成に伴い、車載監視プログラムも /ramdisk を使用するように変更。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 |
#!/bin/bash export PATH=/home/noizumi/bin:$PATH GPIO=26 GPIO_DIR=/sys/class/gpio MOTION_MOVIE_DIR=/ramdisk/motion/detected MOTION_PID=/ramdisk/motion/motion.pid MOTION_STOP=/ramdisk/motion.stop GPS_BASE=/ramdisk/gps_base GPS_LATLON=/home/noizumi/bin/gpslatlon.sh # bluetooth 接続による動体検知OFF用 #BTMAC=XX:XX:XX:XX:XX:XX # OPPO Reno3 A BTMAC=XX:XX:XX:XX:XX:XX # OpenRun Pro by Shokz BTKEY=XX:XX:XX:XX:XX:XX # AB Shutter3 BTKEY_ACTIVATE=0 initialize(){ # GPIO26を有効化。プルアップ抵抗ON echo $GPIO >${GPIO_DIR}/export sleep 0.1 echo in >${GPIO_DIR}/gpio${GPIO}/direction sleep 0.1 echo high >${GPIO_DIR}/gpio${GPIO}/direction } shutdown_handler(){ # GPIOクリーンアップ echo $GPIO >$GPIO_DIR/unexport motion_stop exit 0 } mail_send(){ cat << _EOD_|/usr/sbin/sendmail -t -f yuji@noizumi.org From: yuji@noizumi.org To: yuji@noizumi.org Subject: Car Security alert $1 Car Security alarm was $1 at `date +"%Y/%m/%d %H:%M:%S"` $2 _EOD_ } sms_send(){ DATEMES=`date +"%Y/%m/%d %H:%M:%S"` curl -X POST https://api.twilio.com/2010-04-01/Accounts/[twilioアカウント]/Messages.json \ --data-urlencode "Body=Car Security alarm was $1 at $DATEMES" \ --data-urlencode "From=[twilio電話番号]" \ --data-urlencode "To=[わしの携帯電話番号]" \ -u [twilioアカウント]:[twilioパスワード] -o /home/noizumi/logs/twilio.log } button_pushed(){ # 車載警報装置発報で、携帯電話のイヤホンマイクスイッチが押され、GPIO26に信号が来る motion_start mail_send activated sms_send activated # ボタンが押されている間、ループ while [ "`cat ${GPIO_DIR}/gpio${GPIO}/value`" = "0" ]; do sleep 1 done mail_send stopped sms_send stopped } motion_start(){ MOTION_STATUS=`curl -s http://localhost:8080/0/detection/status |grep "Detection status" | /bin/sed -r 's/.*Detection status (.*).*/\1/'` if [ "${MOTION_STATUS}" != "ACTIVE" ]; then curl -s http://localhost:8080/0/detection/start >/dev/null 2>&1 fi if [ ! -e ${GPS_BASE} ]; then GPS_NOW=`${GPS_LATLON}` if [ "${GPS_NOW}" != "" ]; then echo "${GPS_NOW}" > ${GPS_BASE} fi fi } motion_stop(){ MOTION_STATUS=`curl -s http://localhost:8080/0/detection/status |grep "Detection status" | /bin/sed -r 's/.*Detection status (.*).*/\1/'` if [ "${MOTION_STATUS}" = "ACTIVE" ]; then curl -s http://localhost:8080/0/detection/pause >/dev/null 2>&1 fi if [ -e ${GPS_BASE} ]; then rm -f ${GPS_BASE} || true fi } bluetooth_connect(){ # 接続状態確認 CONNECTED=`cat << _EOD_|bluetoothctl|grep "Connected: yes" power on info ${BTMAC} quit _EOD_ ` # bluetooth 接続状態確認 if [ "${CONNECTED}" != "" ] || [ -e ${MOTION_STOP} ]; then # 接続してたら、動体検知止める motion_stop else # 接続してなかったら、動体検知スタート motion_start fi # AB Shutter3 接続状態確認 CONNECTED=`cat << _EOD_|bluetoothctl|grep "Connected: yes" power on info ${BTKEY} quit _EOD_ ` # 接続してたら triggerhappy再起動 if [ "${CONNECTED}" != "" ] && [ -e /dev/input/event0 ]; then if [ "${BTKEY_ACTIVATE}" != "1" ]; then BTKEY_ACTIVATE=1 sudo systemctl restart triggerhappy.service fi fi } initialize trap shutdown_handler 1 2 3 15 # motion を daemon モードで起動 if [ ! -e ${MOTION_PID} ]; then mkdir -p ${MOTION_MOVIE_DIR} motion -b fi while :; do # pulseaudo 起動確認 if [ "`ps ux|grep -e \"${USER}.*pulseaudio\"|grep -v grep`" = "" ]; then pulseaudio --start sudo systemctl restart bluetooth.service fi # イヤホンマイクボタンが押された時(車載警報装置発報) if [ "`cat ${GPIO_DIR}/gpio${GPIO}/value`" = "0" ]; then button_pushed fi bluetooth_connect if [ -e ${GPS_BASE} ]; then GPS_SAVE=`cat ${GPS_BASE}` GPS_NOW=`${GPS_LATLON}` if [ "${GPS_NOW}" != "" ] && [ "${GPS_BASE}" != "" ]; then DISTANCE=`distance.sh ${GPS_SAVE} ${GPS_NOW}` if [ "`echo \"${DISTANCE}>100\"|bc`" = "1" ]; then mail_send "GPS Warning! ${DISTANCE}m moved." "https://maps.google.com/maps?q=${GPS_NOW}" echo "${GPS_NOW}" > ${GPS_BASE} fi fi fi sleep 1 done |
追加してる処理は、AB Shutter3 用 triggerhappy 再起動で、AB Shutter3 が接続してない状態だと、/dev/input/event* が作られておらず、triggerhappy が起動しても、監視対象デバイスが無い状態。
接続後は、デバイスファイルが作成されるので、その時点で triggerhappyを再起動すれば、設定通り動くようになる。
ちなみに、AB Shutter3 用の設定は次の通り。
1 2 |
KEY_VOLUMEUP 1 sudo reboot KEY_VOLUMEDOWN 1 sudo poweroff |
わしの買った AB Shutter3 は長押しのキーコードが出なかったので、上と下だけ。
triggerhappy は root 権限で動いてるので、sudo は要らんけど、まあ、念の為、付けておいた。
1 2 3 |
#!/bin/sh timeout 1 /usr/bin/gpspipe -w -n 5| /bin/grep -E "\"TPV\",.*\"lat\":.*\"lon\":" | /bin/sed -r 's/.*"lat":([^"]*),"lon":([^"]*),.*/\1,\2/' | /usr/bin/head -1 |
他には、gpsd の出力で、”TPV” の行に、lat と lon が存在しない場合があって、緯度、経度が正しく出力されていない事があったので、その対策をした。
gpsdのサイトからソース取ってきて、野良ビルドして動かしてみた。
QZSSのみちびきPRN194〜196まで使ってて、昨日は見られなかったPRN300番台のGAってのが現れているが、これは欧州のGALILEOだな。
Raspberry Pi 4 の gpsd は 3.18 なので、早く新しくならんかのう。
結局、 motion が多重起動するのは防げないっぽいので、daemon モードで常駐させて、web_connect で start と pause の指令を motion に送って対応する事にした。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 |
#!/bin/bash export PATH=/home/noizumi/bin:$PATH GPIO=26 GPIO_DIR=/sys/class/gpio MOTION_PID=/dev/shm/motion.pid MOTION_STOP=/dev/shm/motion.stop GPS_BASE=/dev/shm/gps_base GPS_LATLON=/home/noizumi/bin/gpslatlon.sh # bluetooth 接続による動体検知OFF用 #BTMAC=XX:XX:XX:XX:XX:XX # OPPO Reno3 A BTMAC=XX:XX:XX:XX:XX:XX # OpenRun Pro by Shokz initialize(){ # GPIO26を有効化。プルアップ抵抗ON echo $GPIO >${GPIO_DIR}/export sleep 0.1 echo in >${GPIO_DIR}/gpio${GPIO}/direction sleep 0.1 echo high >${GPIO_DIR}/gpio${GPIO}/direction } shutdown_handler(){ # GPIOクリーンアップ echo $GPIO >$GPIO_DIR/unexport motion_stop exit 0 } mail_send(){ cat << _EOD_|/usr/sbin/sendmail -t -f yuji@noizumi.org From: yuji@noizumi.org To: yuji@noizumi.org Subject: Car Security alert $1 Car Security alarm was $1 at `date +"%Y/%m/%d %H:%M:%S"` $2 _EOD_ } sms_send(){ DATEMES=`date +"%Y/%m/%d %H:%M:%S"` curl -X POST https://api.twilio.com/2010-04-01/Accounts/[twilioアカウント]/Messages.json \ --data-urlencode "Body=Car Security alarm was $1 at $DATEMES" \ --data-urlencode "From=[twilio電話番号]" \ --data-urlencode "To=[わしの携帯電話番号]" \ -u [twilioアカウント]:[twilioパスワード] -o /home/noizumi/logs/twilio.log } button_pushed(){ motion_start mail_send activated sms_send activated # ボタンが押されている間、ループ while [ "`cat ${GPIO_DIR}/gpio${GPIO}/value`" = "0" ]; do sleep 1 done mail_send stopped sms_send stopped } motion_start(){ MOTION_STATUS=`curl -s http://localhost:8080/0/detection/status |grep "Detection status" | /bin/sed -r 's/.*Detection status (.*).*/\1/'` if [ "${MOTION_STATUS}" != "ACTIVE" ]; then curl -s http://localhost:8080/0/detection/start >/dev/null 2>&1 fi if [ ! -e ${GPS_BASE} ]; then GPS_NOW=`${GPS_LATLON}` if [ "${GPS_NOW}" != "" ]; then echo "${GPS_NOW}" > ${GPS_BASE} fi fi } motion_stop(){ MOTION_STATUS=`curl -s http://localhost:8080/0/detection/status |grep "Detection status" | /bin/sed -r 's/.*Detection status (.*).*/\1/'` if [ "${MOTION_STATUS}" = "ACTIVE" ]; then curl -s http://localhost:8080/0/detection/pause >/dev/null 2>&1 fi if [ -e ${GPS_BASE} ]; then rm -f ${GPS_BASE} || true fi } bluetooth_connect(){ # 接続状態確認 CONNECTED=`cat << _EOD_|bluetoothctl|grep "Connected: yes" power on info ${BTMAC} quit _EOD_ ` # bluetooth 接続状態確認 if [ "${CONNECTED}" != "" ] || [ -e ${MOTION_STOP} ]; then # 接続してたら、動体検知止める motion_stop else # 接続してなかったら、動体検知スタート motion_start fi } initialize trap shutdown_handler 1 2 3 15 # motion を daemon モードで起動 if [ ! -e ${MOTION_PID} ]; then motion -b fi while :; do # pulseaudo 起動確認 if [ "`ps ux|grep -e \"${USER}.*pulseaudio\"|grep -v grep`" = "" ]; then pulseaudio --start sudo systemctl restart bluetooth.service fi # イヤホンマイクボタンが押された時 if [ "`cat ${GPIO_DIR}/gpio${GPIO}/value`" = "0" ]; then button_pushed fi bluetooth_connect if [ -e ${GPS_BASE} ]; then GPS_SAVE=`cat ${GPS_BASE}` GPS_NOW=`${GPS_LATLON}` if [ "${GPS_NOW}" != "" ] && [ "${GPS_BASE}" != "" ]; then DISTANCE=`distance.sh ${GPS_SAVE} ${GPS_NOW}` if [ "`echo \"${DISTANCE}>100\"|bc`" = "1" ]; then mail_send "GPS Warning! ${DISTANCE}m moved." "https://maps.google.com/maps?q=${GPS_NOW}" echo "${GPS_NOW}" > ${GPS_BASE} fi fi fi sleep 1 done |
今までは、 motion の起動と終了で動体検知を管理してたけど、常駐した motion に start と pause の指令を送る事で、動体検知ON/OFFを管理するようにした。
MOTION_STATUS=`curl -s http://localhost:8080/0/detection/status |grep “Detection status” | /bin/sed -r ‘s/.*Detection status (.*).*/\1/’`
MOTION_STATUS に ACTIVE か PAUSE が入るので、その状態によって、start か pause かの指令を送る方式。
これで bluetooth ヘッドフォン接続したら、動体検知OFFになればいいけど、暫く様子見。
あと、昼頃に会社から車の rx7pi へ ssh 接続してると通信途絶する事があって、携帯電話のUSBテザリングが終了してる事がある問題がある。
これの対策は bluetooth テザリングとか試してみたけど、リブートしたら自動で再接続しない等問題がある。
あとはWiFiテザリング位しか残された道が無いけど、電力食うのは嫌なんだよなあ。
結局の所、ロックファイルがあれば起動しない処理だったけど、なぜか起動するという事はファイルが無くなっているという事。
プロセスを終了させて、ファイルを消している処理があるので、そこでプロセスが完全に終了するまで待つ事にした。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
motion_start(){ if [ ! -e ${MOTION_PID} ]; then motion -n & echo $! >${MOTION_PID} # ファイルが作成されるまで待つ while [ ! -e ${MOTION_PID} ]; do sleep 0.1 done fi if [ ! -e ${GPS_BASE} ]; then GPS_NOW=`${GPS_LATLON}` if [ "${GPS_NOW}" != "" ]; then echo "${GPS_NOW}" > ${GPS_BASE} fi fi } motion_stop(){ if [ -e ${MOTION_PID} ]; then PID=`cat ${MOTION_PID}` kill -TERM ${PID} # プロセスが完全に終了するまで待つ while [ "`ps h p ${PID}`" != "" ]; do sleep 0.1 done rm -f ${MOTION_PID} || true rm -f ${GPS_BASE} || true fi } |
元は、kill -TERM `cat ${MOTION_PID}`て処理だったけど、それよりも先にファイル削除になって、PIDがkill に渡らないから生存しつづけて、多重起動になっとったんかなあ。
linux ってファイルを処理に渡したら、削除しても内容は消えずに渡ると思ってたが、あれは通常のファイルシステムの話で、RAM DISK上のファイルは違うのかねえ。
とりあえず、プロセス終了を待ってからファイル削除で多重起動しなくなったから、ま、いっか。
【皇紀2682年11月17日 追記】
今日、会社の帰りに車に乗ったら二重起動が発生。
もう、どこが悪いのか分かんね。
【/皇紀2682年11月17日 追記】
車載のRaspberry Pi zero 2 W(以下rx7pi) で、bluetoothヘッドフォン接続時に、motion の動体検知録画を止め、切断時に動体検知録画ONになるようにしている。
だが、確認してみると、朝、車に乗る前に、bluetoothヘッドフォン接続したのに、通勤時の動画が一杯記録されてた。
VPN経由でrx7piへログインしてみたところ、
1 2 3 4 |
noizumi@rx7pi:~ $ ps auxw|grep motion|grep -v grep noizumi 5374 1.4 9.1 206036 34324 ? SLl 11月14 11:56 motion -n noizumi 20643 0.8 7.5 171496 28364 ? SLl 09:29 0:16 motion -n noizumi 23656 0.8 7.5 171496 28112 ? SLl 09:34 0:14 motion -n |
三重起動しとる……。
1 2 |
noizumi@rx7pi:~ $ cat /dev/shm/motion.pid 23656 |
記録されとるのは、一番最後のプロセスIDなので、多重起動防止を突破しとるようだ。
あと、motion が二重起動してる事があって、何でだろうと考えたが、motion -n &でバックグラウンド起動してるので、process IDを出力する前に、ループで二週目の呼び出しで二重起動になってるんだろう。
1234567891011121314 motion_start(){if [ ! -e ${MOTION_PID} ]; thentouch ${MOTION_PID}motion -n &echo $! >${MOTION_PID}fiif [ ! -e ${GPS_BASE} ]; thenGPS_NOW=`gpslatlon.sh`if [ "${GPS_NOW}" != "" ]; thenecho "${GPS_NOW}" > ${GPS_BASE}fifi}という事で、process IDが出力する前に、touch でファイルを作成しておき、二重呼び出しにならないようにした。
情報源: raspberry pi – Yuji Noizumi’s blog
と、対策はしたのだが、なぜに多重起動する!?
9:29 と 9:34 に起動してるが、ドアの開閉でルームランプのLEDライトが点灯した時にLEDのノイズで接続が切れてるのかもしれんな。
しかし、それでも論理的に多重起動するのはあり得んのだが、状況を整理しよう。
これはやっぱりLEDライト点灯による bluetooth 接続断がくさいが、もしかすると、motion の起動完了にすごく時間が掛かってて、sleep 1 のwaitでは足らないのかもしれない。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
motion_start(){ if [ ! -e ${MOTION_PID} ]; then motion -n & echo $! >${MOTION_PID} while [ ! -e ${MOTION_PID} ]; do sleep 0.1 done fi if [ ! -e ${GPS_BASE} ]; then GPS_NOW=`gpslatlon.sh` if [ "${GPS_NOW}" != "" ]; then echo "${GPS_NOW}" > ${GPS_BASE} fi fi } |
という事で、 恐らく、touch したファイルは、リダイレクト指定したら削除されて、ファイルが存在しないから多重呼び出し可能になってしまうのだろう。
そこで、リダイレクトのファイルが作成されるまで待つ処理を入れてみて、様子を見るとしよう。
会社からVPN使ってRX-7搭載Raspberry Pi zero 2 W(以下ラズパイ)へログインして、状態を確認していた所、GPSからデータが一切流れて来ていない。
alarm_monito.sh をKILLして、スクリプト弄ってたら、通信途絶した。
帰宅してWiFi経由でログインしても、別に異常は無いし、何が原因かよく分からん。
とりあえず、GPSがハングアップした時の為に、timeout を入れるのと、応答を良くする為に、gpspipe のパラメータを弄った。
1 2 3 |
#!/bin/sh timeout 1 /usr/bin/gpspipe -w -n 4| /bin/grep TPV | /bin/sed -r 's/.*"lat":([^"]*),"lon":([^"]*),.*/\1,\2/' | /usr/bin/head -1 |
gpspipe は -n 4 指定で、TPVの行が出て、終了するので、多分、これが一番速い。
GPSがハングアップしてても、1秒でタイムアウトなので、警戒監視スクリプトでデッドロックする事もあるまい。
あと、motion が二重起動してる事があって、何でだろうと考えたが、motion -n &でバックグラウンド起動してるので、process IDを出力する前に、ループで二週目の呼び出しで二重起動になってるんだろう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
motion_start(){ if [ ! -e ${MOTION_PID} ]; then touch ${MOTION_PID} motion -n & echo $! >${MOTION_PID} fi if [ ! -e ${GPS_BASE} ]; then GPS_NOW=`gpslatlon.sh` if [ "${GPS_NOW}" != "" ]; then echo "${GPS_NOW}" > ${GPS_BASE} fi fi } |
という事で、process IDが出力する前に、touch でファイルを作成しておき、二重呼び出しにならないようにした。
それと、GPSハングアップに備えて、GPSのデータ参照してる所は、空白データの時に処理しないFail safeを入れた。
まあ、GPSドングルが壊れてる可能性もあるので、TOPGNSSの11.11セールで売ってたものをポチっておいた。
情報源: Topgnss usb gps glonass受信機アンテナモジュールusb出力プロトコル、互換交換BU353S4|GPS レシーバー & アンテナ| – AliExpress
前に買った奴が結構いいので、再び購入したが、前が1,500円位だったのに、今はセールで2,200円になっとるから、円安は海外通販には痛いのう。