Bye Bye Moore

PoCソルジャーな零細事業主が作業メモを残すブログ

monoをつかってRaspberryPiでC#プロジェクトをやる その1:環境構築

プロジェクトで組み込むべきソフトウェア資産として、C#製のモノがきました。
……C#、ほぼ3年ぶりです。
今だから言いますが、あれは炎上案件でしたね……。
shuzo-kino.hateblo.jp

さて気を取り直して。
今回のターゲットはWindowsではなくRaspberry Pi
OSもCPUも違うモンですが、最近のC#は大分進んでいて、クロスプラットフォーム環境としてmonoちうものが用意されています。

monoをつかうと、C#製Win用プロジェクトをそのままRaspberry Piで使える……こともあるようです。
構造が単純で装置依存の低いやつなら、無改変でいける可能性があります。
すくなくとも、オフィシャルにはクロスプラットフォームを謳っています。

実際のところ

リポジトリ追加。
ubuntuのキーサーバーを指定してますが、Raspberry OSでも大丈夫です。

$ sudo apt install apt-transport-https dirmngr gnupg ca-certificates
$ sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 3FA7E0328081BFF6A14DA29AA6A19B38D3D831EF
$ echo "deb https://download.mono-project.com/repo/debian stable-raspbianbuster main" | sudo tee /etc/apt/sources.list.d/mono-official-stable.list
$ sudo apt update

導入。
285Mbyteもあるので、まったり待ちましょう。
容量もさることながら、ビルドもそこそこ負荷があります。

$ sudo apt install mono-devel


test.csというファイルにhello worldをかいてみます。

using System;

public class HelloWorld
{
    public static void Main(string[] args)
    {
        Console.WriteLine ("Hello Mono World");
    }
}

コンパイル

$ csc test.cs
Microsoft (R) Visual C# Compiler version 3.6.0-4.20224.5 (ec77c100)
Copyright (C) Microsoft Corporation. All rights reserved.

$

実行。拡張子がexeで不安ですけど、monoを噛ませればちゃんと動いてくれます。

$ mono test.exe
Hello Mono World

NMEAフォーマットでてくるトーカID(takler ID)

NMEAフォーマットで来たデータを見ていたときのこと。
普段なら”$GPGGA”というやつに緯度経度情報が入るのですが、これが見当たらない。
似たものに”$GNGGA”とあり、GGAは”Global Positioning System Fix Data"を表しているのでコレっぽい。
ではGNとはなにか。

NMEAフォーマットによると、この頭二つの文字はトーカID(talker ID)*1というもの。

埒があかないので、大元の資料を見に行きますと……GNはGNSSという回答。
https://www.nmea.org/Assets/20190303%20nmea%200183%20talker%20identifier%20mnemonics.pdf

他にも自動操縦だの、ナイトビジョンだのレーダーだのと色々な規格で使える様式だったみたい。

*1:一般的二ホングリッシュではトーカーとしそうなのに何で微妙にネイティブ寄せなんですかね……??

【読書メモ】IoTソフトウェア無線の教科書 (ハッカーの技術書)

ひと昔前、アメリカ軍の無人偵察機が偽のGPS信号を送り込まれて乗っ取られ、敵対国家に鹵獲された事がありました。
それの応用でポケモンGOの位置情報を偽装してレアポケモンをゲットしようとする不心得者がいたり。

この考え方はIoTデバイスにも当然応用できる事で、たとえばBluetoothLTEのパケットを傍受しアタックをかける事ができます。
私がいま作ってるシステムはBluetoothでバリバリ動かすような代物なので、心配してたのですが、とはいえアタック方法がわからず難儀してました。

本誌は、そういう攻撃方法の初歩の初歩を教えてくれる感じの本です。

他の方も言ってますが、その気になればほぼネットで手に入る情報ではあります。
とはいえ、それは詳しい人が教えてくれるだとか、インシデントが発生して血眼で調べたような場合に知識の基礎を得た上での話。
漠然とした不安でそこまで意識を高めるのは至難の業です(すくなくとも僕には)。
こういう本は取っ掛かりとして非常にありがたいですね。

あとはまぁ……手を動かして体験につなげる事ですね。
その成果は本の内容そのまんまだとブログネタにできないので難儀なのですがネ(小声)

【読書メモ】IT農家のラズパイ製ディープ・ラーニング・カメラ (CQ文庫)

CQ文庫の二発目。
名前の通り、農業にディープラーニングを適用しようというアレです。
ターゲットはRasPiとカメラなので、これまでと同じように使えます。

ブラウザ越しに色々実験できるGoogle Colaboratoryを使ってみたり、
教師データの作り方が載ってたりと、前の本と合わせて手を動かすと
とりあえず業界知識の基礎の基礎までは体験できそうな感じです。

一通り体験するための取っ掛かりとして、いい本だったと思います。
あとはまぁ……実際のターゲットを探して自分でやってみるのが一番ですね。


参考もと

colab.research.google.com

以前Collaboratelyを使ったときの

shuzo-kino.hateblo.jp

Waveshare社OV5648USBカメラをつかう その4:GPIOをトリガーにして撮影してみる

実際のところ

BCM2とGNDにそれぞれ線をつなぐ。
f:id:shuzo_kino:20201017132516j:plain

操作スクリプトの”button.sh”はこんな塩梅。

#!/bin/bash

while :
do
  if [ $(gpio -g  read 2) == 0 ]; then
    fswebcam -r 1920x1080 -S 12 -F 1 image/$(date -Iseconds).png
  fi
  printf "."
  sleep 0.5
done

この例だと撮影画像はimageディレクトリ直下にISO8601規格で"2020-8-17T13:11:43+09:00.png"てな感じのファイル名で保存されます。

ボタンを二回おしたログがこんな感じに。

$ bash button.sh
......--- Opening /dev/video0...
Trying source module v4l2...
/dev/video0 opened.
No input was specified, using the first.
--- Capturing frame...
Skipping 12 frames...
Capturing 1 frames...
Captured 13 frames in 0.80 seconds. (16 fps)
--- Processing captured image...
Writing JPEG image to 'image/2020-8-17T13:11:43+09:00.png'.
....--- Opening /dev/video0...
Trying source module v4l2...
/dev/video0 opened.
No input was specified, using the first.
--- Capturing frame...
Skipping 12 frames...
Capturing 1 frames...
Captured 13 frames in 0.80 seconds. (16 fps)
--- Processing captured image...
Writing JPEG image to 'image/2020-8-17T13:11:49+09:00.png'.
....

Waveshare社OV5648USBカメラをつかう その3:fswebcamで静止画を撮影してみる

当初はraspisillを使おうと思ってましたが、RasPi公式の資料によるとfswebcamというのがいいみたい。
www.raspberrypi.org

実際のところ

$ sudo apt install fswebcam

ユーザー名(今回はpi)をユーザーに登録

$ sudo usermod -a -G video pi
$ fswebcam image000.jpg
--- Opening /dev/video0...
Trying source module v4l2...
/dev/video0 opened.
No input was specified, using the first.
Adjusting resolution from 384x288 to 640x480.
--- Capturing frame...
Captured frame in 0.00 seconds.
--- Processing captured image...
Writing JPEG image to 'image000.jpg'.

で、とってみたのがこちら。
なんかメッチャ暗いですね。
f:id:shuzo_kino:20200822020907j:plain

オプションを設定してみます。
オートフォーカス付きだから大分違うのでは……??

$ fswebcam -F 2 -S 12 image003.jpg
--- Opening /dev/video0...
Trying source module v4l2...
/dev/video0 opened.
No input was specified, using the first.
Adjusting resolution from 384x288 to 640x480.
--- Capturing 2 frames...
Skipping 12 frames...
Capturing 2 frames...
Captured 14 frames in 0.55 seconds. (25 fps)
--- Processing captured image...
Writing JPEG image to 'image003.jpg'.

……輪郭はくっきりしましたが、まだまだですね。
f:id:shuzo_kino:20200822021000j:plain

解像度を上げることができるので、Sを増してやってみましょう。

$ fswebcam -r 1920x1080 -F 1 -S 20 image004.jpg
--- Opening /dev/video0...
Trying source module v4l2...
/dev/video0 opened.
No input was specified, using the first.
--- Capturing frame...
Skipping 20 frames...
Capturing 1 frames...
Captured 21 frames in 1.33 seconds. (15 fps)
--- Processing captured image...
Writing JPEG image to 'image004.jpg'.

ちょっと離れてしまいましたが、輪郭がより明細になり文字も読もうと思えば読めるレベルになりました。
f:id:shuzo_kino:20200822022501j:plain

Waveshare社OV5648USBカメラをつかう その2:v4l2でカメラ情報をみる

前回の記事で"/dev/video0"という名前でデバイスを認識したものの、このvideo0の正体が不明で色々調べていました。
debian系では外部カメラ用ユーティリティライブラリとしてvideo for linux 略してv4lというのがあり
これを使えば中身を確認できるってわけです。

実際のところ

デフォのRasPiなら入っているはずですが、念のため。

$ sudo apt install v4l-utils

早速カメラをみてみましょう。

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

SIT USB2.0 Camera: SIT USB2.0 C (usb-3f980000.usb-1.3):
        /dev/video0
        /dev/video1

list-formatsで、モジュールが使える様式の情報が出てきます。

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

        [0]: 'MJPG' (Motion-JPEG, compressed)
        [1]: 'YUYV' (YUYV 4:2:2)

”ext”をつけると、さらに詳しい情報が。
fps値の目安なんかでるんですね。

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

        [0]: 'MJPG' (Motion-JPEG, compressed)
                Size: Discrete 2592x1944
                        Interval: Discrete 0.067s (15.000 fps)
                Size: Discrete 1280x960
                        Interval: Discrete 0.067s (15.000 fps)
                Size: Discrete 1024x768
                        Interval: Discrete 0.033s (30.000 fps)
                Size: Discrete 640x480
                        Interval: Discrete 0.033s (30.000 fps)
                Size: Discrete 1280x720
                        Interval: Discrete 0.033s (30.000 fps)
                Size: Discrete 1600x1200
                        Interval: Discrete 0.067s (15.000 fps)
                Size: Discrete 2048x1536
                        Interval: Discrete 0.067s (15.000 fps)
                Size: Discrete 800x600
                        Interval: Discrete 0.033s (30.000 fps)
                Size: Discrete 1920x1080
                        Interval: Discrete 0.067s (15.000 fps)
        [1]: 'YUYV' (YUYV 4:2:2)
                Size: Discrete 2592x1944
                        Interval: Discrete 0.500s (2.000 fps)
                Size: Discrete 1280x960
                        Interval: Discrete 0.200s (5.000 fps)
                Size: Discrete 1024x768
                        Interval: Discrete 0.100s (10.000 fps)
                Size: Discrete 640x480
                        Interval: Discrete 0.033s (30.000 fps)
                Size: Discrete 1280x720
                        Interval: Discrete 0.100s (10.000 fps)
                Size: Discrete 1600x1200
                        Interval: Discrete 0.200s (5.000 fps)
                Size: Discrete 2048x1536
                        Interval: Discrete 0.500s (2.000 fps)
                Size: Discrete 800x600
                        Interval: Discrete 0.050s (20.000 fps)
                Size: Discrete 1920x1080
                        Interval: Discrete 0.500s (2.000 fps)

参考もと

  • "v4l2-ctl --help"

GitHub - gjasny/v4l-utils