【Raspberry Pi zero 2 W】スクリプト調整

【Raspberry Pi zero 2 W】gpsドングル追加

会社からVPN使ってRX-7搭載Raspberry Pi zero 2 W(以下ラズパイ)へログインして、状態を確認していた所、GPSからデータが一切流れて来ていない。

alarm_monito.sh をKILLして、スクリプト弄ってたら、通信途絶した。

帰宅してWiFi経由でログインしても、別に異常は無いし、何が原因かよく分からん。

とりあえず、GPSがハングアップした時の為に、timeout を入れるのと、応答を良くする為に、gpspipe のパラメータを弄った。

gpspipe は -n 4 指定で、TPVの行が出て、終了するので、多分、これが一番速い。

GPSがハングアップしてても、1秒でタイムアウトなので、警戒監視スクリプトでデッドロックする事もあるまい。

あと、motion が二重起動してる事があって、何でだろうと考えたが、motion -n &でバックグラウンド起動してるので、process IDを出力する前に、ループで二週目の呼び出しで二重起動になってるんだろう。

という事で、process IDが出力する前に、touch でファイルを作成しておき、二重呼び出しにならないようにした。

それと、GPSハングアップに備えて、GPSのデータ参照してる所は、空白データの時に処理しないFail safeを入れた。

まあ、GPSドングルが壊れてる可能性もあるので、TOPGNSSの11.11セールで売ってたものをポチっておいた。

情報源: Topgnss usb gps glonass受信機アンテナモジュールusb出力プロトコル、互換交換BU353S4|GPS レシーバー & アンテナ| – AliExpress

前に買った奴が結構いいので、再び購入したが、前が1,500円位だったのに、今はセールで2,200円になっとるから、円安は海外通販には痛いのう。

【Raspberry Pi zero 2 W】gpsドングル追加

今の車載Raspberry Pi zero 2 W は、車載警報装置のイヤホンマイクをGPIOに接続して、発報すると、イヤホンマイクスイッチがONになるので、それをトリガにメール&SMS送信するようになっている。

加えて、カメラを追加して、bluetooth ヘッドホンの Open Run Proが接続していないと、motion をスタートさせて、動体検知記録する。

つまり、車に乗って、bluetooth ヘッドホンを接続していれば、動体検知はOFFで、車から離れて、bluetooth接続が切れたら、動体検知ONになるようにしている。

今回やろうとしてるのは、動体検知ONの時に、GPSで現在位置を保存して、定期的に車の移動距離を測定し、車が100m移動してたらメールを飛ばそうというもの。

【rx7pi新スペック】

  • 車載警報装置 発報でガラケーのイヤホンマイクスイッチをONにしてくれるやつで、ラスタバナナのステレオ変換アダプタに接続して、GPIOに配線。
  • LTE回線 donedone ASUS zenfone max pro(m2)に挿して、USBテザリング
  • カメラOV5647
  • USB GPSドングルVK172

※写真貼るのが面倒なので、アフィリエイト利用

とりあえず、USBのGPSドングルが余っていたので、Raspberry Pi zero 2 Wへ接続。

VK172って、2019年に1,090円で買ったけど、円安のせいで値上がりしとるなあ。

gpsd をインストール。

既定の動作の設定

VPN経由で、FoxtrotGPSや、xgps、gpsmonが自端末で見れるようにListenStream=0.0.0.0:2947 にする。

設定ファイルの再読込と、サービスの再起動

ガレージを中心にそこそこの精度。

今回、新規作成した gpsd の出力から、緯度、経度を抜き出すプログラム。巷で出回ってるGPS出力から時間を抜くスクリプトの改造版(笑)

そして、2点の緯度経度から、距離を計算するプログラムだが、これは、次のページのpythonプログラムをシェルスクリプト用に書き直した。

情報源: Python で2点の緯度経度から距離を計測する方法 – GIS奮闘記

ありがとうございます。

distance.sh 緯度1,経度1 緯度2,経度2 で距離(m)を出力する。

元のページは km 単位で、最後に1,000で割ってたけど、わしが欲しいのはメートル単位なので、1,000では割ってない。

ただ、 bc で、平方根使うと、小数点以下20位まで有効になるので、最後に scale=2を指定して、1で割り算して、小数点以下2桁までにしている。

どうせ、GPSの測定誤差が数十メートル単位で出るので、メートルの小数点以下はほぼ無意味だけどね。 🙂

上の2つを新たに組み込んだ車載警報装置モニタプログラムがこちら。

そして、1m以上移動で異常にして、強引にメール送信させてみた。

google maps のURL付きにしたので、クリックすれば、車の位置がすぐ分かるようになっている。座標の方は、すり替えておいたのさ 🙂

【Raspberry Pi zero 2 W】動体検知とbluetooth連携

※商品画像貼るの面倒なので、アフィリエイト使用

結局、Amazonで調達したチルト機能付きカメラはこんな感じに設置した。

証拠というよりは、車に乗り込まれたかどうかを判定する程度。

結局の所、カメラケーブル50cmでは、自由な位置に取り付けができなかったのだ。

で、RX-7搭載のRaspberry Pi zero 2 Wは、わしの携帯電話のbluetoothに接続を試み、接続できた場合は、カメラの動体検知OFFで、運転中のノイズをカット。

駐車場に停めて、車から離れて、bluetooth接続が切れたら、動態検知ONというようにした。

車から離れたら動体検知ONになって欲しいのだが、わしの部屋から車庫までの距離だと、ギリギリbluetooth接続できてしまうので、動体検知がOFFになってしまう。

まあ、家では他に監視カメラがあるので、特に問題は無いけど、ゆくゆくは信号強度見て判断できるようになったらいいなとは思っている。

【機能】

  • 車載警報装置の発報で、GPIO26 が 0になるので、メールとSMSを送信。
  • わしの携帯のbluetoothとの接続が切れたら、カメラの動体検知ON、接続したら、動体検知OFF

車載Raspberry Pi zero 2 W の監視スクリプトも結構な長さになったなあ。

【Raspberry Pi zero 2 W】WiFi接続時のぐだぐだ解決

家に帰って、車のラズパイがWiFiに繋がった時に、WireGuard のネットワークとカチ合ってぐだぐだになる問題があって、dhcpcd の hook で何とかするとかやってたが、もっと簡単な方法があった。

WireGuard の接続設定で、AllowedIPs = 0.0.0.0/0 とやれば良かったのだ。

wg-quick up wg0 を手動でやってみたら、tcp forward ONにしたりしていたが、そうだよ! ルーターモードにしたら、192.168.30.254 から、WireGuard クライアントの 192.168.40.1に接続しても応答できるじゃん。何で気付かなかったんだろう。

ま、困った時には、「てきとーに握ってくれ」やね 🙂

【Raspberry Pi zero 2 W】SMS送信

車載警報装置が発報したら、メールで携帯電話に通知するようにしてあるが、メールだと、携帯電話の省電力機能のせいで、10分位遅れる事もある。

そこで、SMSも送信する事にした。
使うのは、twilio で、1通あたり、$0.08(約11.53円)。

ログインして、コンソールを見ると、チュートリアルで、簡単にSMSが送れるようになっている。

ステップ1で、twilio 番号(米国の電話番号)を取得して、linux で端末開いて、curl でサンプルコードを実行したら、携帯電話にSMSが届いた。

トライアルアカウントで、約2,000円位のお金がチャージされていて、使う事ができるので、これだけでイケるんじゃね? と思ったら、30日以上使用されていない場合に電話番号が削除される可能性があるそうな。

警報発報なんて、年に1回、あるかないかなので、無料で使い続けるのは難しそうで、アップグレード(最低2,000円〜)して正式なアカウントにしたら大丈夫のようだが、良いサービスなので、金払ってもいいな。

そして、RX-7に積んでいる Raspberry Pi zero 2 W のプログラムをSMS送信するように更新。

【Raspberry Pi zero 2 W】カメラごたごた

※商品紹介画像用意するのが面倒なので、Amazon アフィリエイトを使ってます。

結局の所、ここで買ったカメラとケーブルは到着予定が10月22日予定と、Aliexpressに注文してるのと変わらないのでキャンセルした。

そして、代わりのものを物色していたら、カメラにチルト機能があり、まさにこれを探しておりました。それと、30cmの長さのPi zero用ケーブルも併せて注文した。

GeekPiのケースは、一応、部屋監視用に使えるので、キャンセルしなかった。

到着速度優先なので結構なお値段になったけど、最初からこれ選んどけばごたごたしなかったなあ。

家のネットワーク構成図2

何かもう色々設定したので、忘れないように防備録(笑)

家とKagoya VPSで、SoftEther によるVPNを構築していて、最近、移動体のRaspberry Pi zero 2 W(以下ラズパイ)を WireGuard によるVPNを追加した。

SoftEther のVPNは、仮想HUBに接続するという概念なので、例えば、Kagoya VPSの192.168.11.0/24 の仮想HUBに接続すると、家のBUFFALOルータから、DHCP でIPアドレスが払い出され、さも家のネットワークに接続したかの様にネット接続できる。

ただ、この場合、インターネットへの経路が、端末→Kagoya VPS→家→インターネット となるので、特別な理由が無ければ、家の 192.168.11.0/24 の仮想HUBに接続した方が良い。

そもそも、こういう VPSに接続できる方法にしたのは、今は亡き(笑)楽天モバイルによる家のネットワーク回線置き換えを考えていたから。

移動体通信の場合、固定IPアドレスが払い出される訳でなく、携帯電話通信網のプライベートIPアドレスで接続し、携帯電話会社のゲートウェイからインターネットへ出るという経路となり、外からの直接アクセスが不可能になる。

その為、インターネットで VPSの固定のIPアドレスがあれば、家からそこへ接続して、端末はVPSを経由すれば、携帯電話会社のファイヤーウォールを越えて家のネットワークへ接続する事ができる。

RX-7に搭載しているラズパイも、donedone 128kbps SIMを挿した携帯電話にUSBテザリングで接続していて、これも、携帯電話のファイヤーウォールにより、外から直接アクセスできない。

そこで、WireGuard というVPNで、家のサーバーに接続し、家のサーバー経由で、携帯電話会社のファイヤーウォールを越えて、ラズパイへアクセス可能としている。

SoftEther にする事も考えたが、ラズパイにとっては結構負荷が大きく、負荷が大きい=消費電力の増大という事で、車のバッテリにはよろしくない為、負荷の軽い WireGuardにした。

携帯電話のUSBテザリングは、省電力機能のせいで、一定期間通信をしないと沈黙してしまうので、ラズパイで、10分毎に家のサーバーへ ping を打つようにすると、経路が復活し、外からアクセス可能になるようにしている。

こうして、VPN網を構築すると、IoTで色々な機器を接続して、それに指令を送る事が容易になるので、VPNのソフトウェア開発者には感謝ですなあ。

家のネットワーク構成図

【Raspberry Pi zero 2 W】カメラヘボす

フル画面にしたら分かるけど、何か、もう縦線出てるし(笑)

確かにレビューには、「縦線が出る」ってのがあって、わしの場合は右の一番端に灰色の縦線が出とるので、999円だとこんなもんかって感じ。

まあ、motion による動体検知には問題が無いし、320×240 10FPSだったら、128kbps のdonedone でもVPN経由でカメラ映像を確認するのも問題が無いのでこのまま使い続けるぞい。

【追記 皇紀2682年10月8日】

raspistill -ex night -o image.jpg で撮影した画像には縦線は入ってない。
つまり、motion によるものと判明。激安カメラすまーん。

【/追記 皇紀2682年10月8日】

【Raspberry Pi zero 2 W】WiFi接続したらroute変更

VPNで、192.168.40.0/24 を使っているが、家のどのマシンからもRaspberry Pi zero 2 W(以下ラズパイ)に繋がるように、次の様なルーティングにしている。

しかし、家に帰ると、WiFiが繋がり、192.168.11.0/24 のルーティングが非常にマズい事になってしまうので、削除して、家のWiFiのルーティングを適用したい。

前まで、ネットワークに接続したら、/etc/network/if-up.d とかにスクリプト入れてたら動いていたのだが、Raspberry Pi の buster では、動かなくなっている。

色々探してみたけど、「ifup,ifdownは使えなくなった」という情報しか出てこず、ルーティングを自動変更する手段が分からない。

raspberry pi run script when connected to wifi」でググれカスしてみると、

https://raspberrypi.stackexchange.com/questions/120705/run-script-when-pi-connects-to-any-network

なるものがあり、参考にして、次の /lib/dhcpcd/dhcpcd-hooks/05-changeroute.sh を作成。

家のWiFi 接続時に、192.168.11.0/24 dev wg0 を削除して、wpa_supplicant がネットワークを設定し、WiFi が切れた時は、192.168.11.0/24 dev wg0 を設定するって感じで、うまく動いている。

WiFi に接続したらこんな感じ

しかし、英語情報に当たらないと分からないとは、困ったもんですなあ。 🙁

【Raspberry Pi zero 2 W】カメラこうにう

Amazon で 999円のカメラ買って、リボンケーブルを Raspberry Pi zero 2 Wに接続

sudo raspi-config して、3.Interfaces Option > P1 Camera > はい で設定完了

車の警報装置が作動したら、motion で動体検知やろうと思って、alarm_monitor.sh に motion 起動のプログラムを追加。

前回から変わったのが次のコード。

【RX-7】警報発報メール通知プログラム

スマートフォンにUSBテザリングしていて、省電力モードのせいで、Raspberry Pi zero 2 Wから通信を発信してないと、外からVPNで接続できないので、10分毎に ping を打ってる。

その時に、motion が起動していたら、動体検知動画を家のサーバーに転送して元のファイルは消すようにプログラムを組んだ。

家では、サーバーの Web を見れば、動画が閲覧できる状態。

だが、車にカメラを設置してみると、次の状態。

リボンケーブル短いのと、電源の関係上、こんな感じでしか設置できない。

それにカメラ基盤むき出しだし、いつ、カメラ部品が剥がれるのか気が気じゃない。

長いリボンケーブルと、カメラケース欲しいなあと Amazon を物色してたら

同じ値段でカメラモジュールもついてて、まんまの奴あるやんけ!!

【追記】よーく見たら、ケーブルが30mm!? 説明文には、15cmって書いてあるな。騙されたでござる

しかし、ケースついてるから注文はキャンセルしないでおこう【/追記】

単体で、長いリボンケーブルとケースを個別に買うより、こっちの方が安いので即ポチった。

カメラ2台になっちゃったけど、家のサーバーに接続して、部屋のソーラー発電で火が出てないか監視するのに使ってもいいな。

【追記】

仕方ないので30cmのリボンケーブルを追加購入したでござる。

【/追記】