2020/08/29

Raspberry Pi High Quality Cameraを試す



 ソニー製の1/2.3型 12Mピクセルのセンサモジュール(High Quality Camera)がPi Cameraのラインナップに加わった。
 
 個人的に手持ちの産業用ズームレンズを評価するのにちょうどよさそうなので入手してみた。 背景としてはCマウントレンズがガラクタ箱の中でなぜか増殖しており、我に返ってみれば、Cマウントレンズ沼の中に膝まで浸かっているのだった。

 1/2.3型といえばハイエンドスマートフォンでもおなじみのフォーマットだけれど、フルサイズに比べ、倍率は約5.6倍となり、同じ画を撮るための焦点距離が短くて済む利点がある。OlympusのTGシリーズや、超望遠コンデジなど尖った製品も多い。
 カメラとして、このクラスのセンサでレンズ遊びをするなら、中古市場でPentax Qシリーズを手に入れて、各種マウントアダプタを漁るほうが満足度は高いだろう。 

 センサ基板はしっかりした金属製マウントに取り付けられている。三脚穴もついておりテストしやすい。バックフォーカス調節リングが取り付けられており、Cマウントレンズ毎にバラついている無限遠点を微調整して合わせることができる。単焦点レンズでは不要なこともあるけれど、特にズーム機構を持つレンズではフォーカスリングの表示と一致させる調整が必須となり、マウントだけでもかなりの価値がある。
バックフォーカス調節リングは、マウント上のマイナスネジを緩めて、すこしテンションが無いと動き始めないので注意。

 IRカットフィルタもついているが、これはユーザーが取り外すこともできるようになっている。ただし外すと保証は受けられないようだ。


 基板とマウントは低粘着シートを介して封止してあり、光と埃等の侵入を防いでいる。
基板とマウントのネジはシリコーンスペーサだけで固定されているため、レンズの荷重を基板側のネジ穴で支える構造はやめたほうがよい。

カメラシステムの作成

 個人的には屋外のRaspi地上局に接続して、星空を連続撮影する全天撮影カメラにしてみたいが、まずは使い勝手の良い実験用システムの構築が必要だ。
 今回は手持ちのPi zero Wをベースに、ワンチップLinux時代のネットワークカメラとして使い勝手を考えてみた。 3Dプリンタでフレーム部品を印刷し、ジュラコンスペーサを継いで組み上げる。一年前にも、まったく同じようなことをやっていた


 底面5センチ角の直方体として、Pi zeroを入れたケースを中央と後部の底面板にはめる形で固定する。これでUSBケーブルで給電するだけで、Wifi経由で操作できる軽量なレンズ交換式カメラモジュールとなった。空いた空間にモバイルバッテリを固定すれば、完全なワイヤレス動作が可能。

ただし、基板にフレームを固定しているのであまり重たいものは載せられない。

 試しにPi zeroW上で WebRTC Native Client Momo を動作させながらテスト撮影をしてみた。この構成だと消費電力は 1.5Wほどで済む。 
 Raspistillでは200秒以上の露出時間が取れるとされているが、現状だと最新のファームウェアはバグがあり、V2と同じく10秒程度までしか撮影してくれないので評価はしばらくお預けになりそう。

産業用レンズによる画像作例  

冒頭の写真は、Cマウントのレンズとして、中古で入手していたSpacecom社の手動ズーム・フォーカスレンズ(16~100㎜)を取り付けたもの。
 1インチセンサ機用のレンズだが、1/2.3型センサを取り付けて、35㎜換算するとだいたい128~800㎜のズームレンズとなる。金属製でずっしりとした重さがある。
 絞り解放は明るいけれど、代わりに焦点出しにものすごい苦労する。 ズームレンズがF5.6になる理由が分かってくる。このレンズの真価は、望遠端でレンズ前1mにピントが合うこと。FA向けだけあって、超望遠マクロとして、ワーキングディスタンスを確保しながら拡大撮影する用途にも使える。
 
  1mの距離から撮影したもの。
マクロで基板写真を撮ったもの。
遠くの基地局アンテナ


簡易HDMIカメラとして

RaspberryPiのHDMI出力を、最近数千円ほどで安価に出回っているUSB接続のHDMIキャプチャにつなぐことで、モニタを直接用意せずにFullHDのUSBカメラとして運用することもできる。 このドングルはUVCデバイスとして認識されるため、特別なドライバ等は必要ないのが利点。



2020/06/07

車載冷凍庫で簡易低温環境試験

 作ったものを投入してスイッチを入れると、温度に関連する不具合が観察できる不思議な箱を作っている。

 何らかのシステムの出来を確認するとき、極端な温度環境下の挙動を調べておくことで防げるトラブルは結構多い。それは半田の品質だったり、受動部品の定数だったり、ハードウェア設定に起因するソフトウェアの挙動だったりする。急冷スプレーでもいいのだけど、再現性のある試験環境とは言い難い。

 本格的なサイクル試験は環境試験装置の出番なので、以下の確認だけを目的とする。

 コールドスタート試験、不良個体のスクリーニング。
 温度センサの動作確認。
 クロック回りの回路の定数調整
 低温におけるプロセッサの内蔵OSC周波数などの観察

 DIY的な手法でいろいろ検討した結果、低価格でマイナス10度以下の環境を作ることに絞ると車載冷凍庫というカテゴリが残った。
 ペルチェ式は冷却効率が悪いため除外した。

 現在入手できる低価格な車載冷凍庫のスペックはおおむねマイナス20度までの冷却能力、1℃刻みの操作パネルという共通点がある。コンプレッサー式なので小型とはいえA3対応の大型プリンタ程度の場所を占有する。加温機能が付くと値段が数倍になるので、なんらかの熱源を検討するといいかもしれない。 
 小さめの圧力鍋なら余裕で入るので、簡易熱真空試験装置にも転用できそう。


 動作音はとても静かだが、冷却中はコンプレッサの振動があるため、設置場所によってはゴム足などをつけて防振したほうが良い。
 12V系ということもあり、普通にオフグリッド生活で重宝しそう。 最近マキタから、似たような冷却能力でバッテリ駆動もできるパーフェクト製品が出てきた。

USB配線を引き込む
まず軽く試運転するために、USBポートを庫内に引き込んだ。 延長ケーブルの中間は銅箔テープとし、蓋が閉まるようにした。 この冷凍庫は周囲の壁に冷却パイプがぐるぐる巻いてあり、壁面に触れているものは庫内温度よりも冷やされることになる。 結露対策として、銅箔テープの上からカプトンテープを張り付ける。 

                             


試運転
 とりあえず制御回路には手を加えず、試験を行ってみた。
庫内には乾燥剤(電子乾燥式)とUSBハブ、各種試験機器を設置する。 被検体はオンボードに気圧/温度センサを搭載したマイコン基板。
除湿のため一晩おき、朝から冷却を開始した。昼に最低温度設定に到達したあと、冷却を止めて自然に温度が上昇するまで放置する。



 冷却が働き始めた後のランプレートは1℃/分程度だった。半日程度かけて段階的に温度を下げていったのが下のグラフとなる。温度制御は指定温度前後±2~3℃の変動がみられた。 運転を停止するとだいたい6時間で室温の8割まで戻る。


 被検体は庫内に接しているわけではないため、特に最低温度では設定温度より冷えにくくなる。冷却面に張り付けたり、断熱材で中蓋を作ってはめ込み、庫内の容積を減らしたりして、より冷えやすい環境を作るとよさそうだ。

 正確な温度設定が目的でないなら、無改造でも問題はなさそうだ。一応センサを騙して運転を連続させる方法は見つけたので、マイナス20度以下も作れそうではあるものの、今は付加回路の安全系統を作りこんでいるところ。

2020/05/30

Arduino CLIの導入

Arduinoのコマンドライン環境 arduino-cli を触ってみる。

屋外設置のRaspberry pi3A+に導入し、接続した独自ボードに書き込みができる環境を構築してみた。 結論から言うと、一度コンフィグが済んでしまえば、コンパイル、アップロードはとても快適。 

手順を調べた時の環境 (2020年4月)
実行環境 :  Raspberrypi 3A+ , Raspberry pi 3B, RaspberryPi4B(4GB)
OSはRaspbian Burster(v7)で共通

バイナリ: arduino-cli_0.10.0_Linux-ARMv7.tar.gz
SSHターミナル:MovaXterm (Windows10)
ボード: Arduino Uno,  Arduino互換機 (Sanguinoベース)

最初の工程は大まかに4つ (2020年5月現在)

1 最新バイナリを任意のディレクトリに設置。バイナリはPathを通しておく
        RaspianだとLinux ARM 32bitでよいはず(そのうち64bitバージョンになりそう)

2 初期設定
       作業フォルダの設置
        Configファイルの初期化(ホームディレクトリに.arduino15が生成される)
                 $arduino-cli config init    
3 ボード関連のインストール 
       ボードインデックスの初期化
            $arduino-cli core update-index
        (確認)インストール可能なボード定義一覧のリスト表示
                 $arduino-cli core search
        ボード定義のインストール (リスト表示したIDを指定)例えば、
                $arduino-cli core install arduino:avr
        (確認)インストール済みボード定義の表示
                $arduino-cli core list
4 コンパイル、アップロードのテスト
        スケッチの作成
             $arduino-cli sketch new  test
                (ホームディレクトリにtestという名のディレクトリと、同名の.inoファイルが生成される)
        コンパイル(Ardiono UNO向け)
                コンパイルはボード名とディレクトリ名を指定するだけ
                成功するとアップロード用のバイナリがスケッチディレクトリに生成される
            $arduino-cli compile -b Arduino:avr:uno test
        アップロードのテスト (ボードをttyUSB0に繋いでいるとする)
                $arduino-cli upload -p /dev/ttyUSB0 -b arduino:avr:uno test
         
        (コンパイルできたら)何もしないスケッチなので、blink等をtest.inoに記述してみる
          ライブラリは、従来通りにスケッチが保存されるディレクトリにlibrariesフォルダを作成し、その中に置くだけでよい。                                
    
(任意) サードパーティのボード定義の追加、環境設定
        .arduino15内のarduino-cli.ymlの編集
              スケッチ設置場所の指定(デフォルトはホームディレクトリに生成されるArduinoフォルダ)
            (任意)additional urlsへ ボード定義の追加
             その後のインストール作業などは手順3以降の手続きを踏襲
     
  最初はコンパイルやアップロードのボード指定、ポート指定などがとっつきにくいが、随所でヘルプ(-h)を確認しながら慣れるしかない。コンパイルとアップロード回りはたくさんのオプションが存在する。
 
 ターゲットが固定であるなら、board attachでスケッチとボード、ポートを紐付けておくと楽。

     ボード定義には、名前のほかに、オプションで動作周波数やマイコン型番をリスト選択できるものがある。boardコマンドで確認してみよう。
    あらかじめarduino:avrをインストール済みであれば、MegaやPro miniがそれにあたる。
インストール済みのボード一覧を表示
            $arduino-cli board listall (インストールではなくリストオール)
ボードの詳細を確認(Arduino pro miniの場合)
            $ arduino-cli board details arduino:avr:pro
            Board name:     Arduino Pro or Pro Mini
            Required tools: arduino:avr-gcc                   7.3.0-atmel3.6.1-arduino5
                            arduino:avrdude                   6.3.0-arduino17
                            arduino:arduinoOTA                1.3.0
            Option:         Processor                         cpu
                            ATmega328P (5V, 16 MHz)         ✔ cpu=16MHzatmega328
                            ATmega328P (3.3V, 8 MHz)          cpu=8MHzatmega328
                            ATmega168 (5V, 16 MHz)            cpu=16MHzatmega168
                            ATmega168 (3.3V, 8 MHz)           cpu=8MHzatmega168
オプションとして、動作周波数の設定とマイコン型番の組み合わせが確認できる。
コンパイルやアップロード時に指定するときは以下のようにcpu=を追記する。
            $arduino-cli compile -b arduino:avr:pro:cpu=8MHzatmega328  test

その後、Ubuntu20.04をインストールしたRaspberry pi4でも64ビットバイナリで同じように構築できた。    
CUIの良いところは、非力な環境でも使えること。Pi zeroやPocketBeagleでも実行できるので、SSH接続で書き換えられる超ミニマムな開発環境となった。Arduinoレベルでも開発環境の整備って大変なので、VMイメージやddしたSDカードイメージとして管理できるのは楽。

PocketBeagleを組み込んだボード 
性能はPi Zeroとだいたい同じだがCortex-A8。アーキテクチャがオープンなのと、I/O用サブコアが混載されているので弄り甲斐がある