2017/06/06

Arduino互換汎用データロガー 2017



4年目のArduino互換データロガー基板。第三世代ということで、今までのプロジェクトで載せたことのある機能を盛り込んで、独立動作する汎用的なオンボードコンピューターとして使えるようにしてみた。
スリープ機能を重視し、目標消費電流は平均3mW以下。


システムブロック図



 今回はATmega644PA/1284Pを8MHzで動作させて、3.3V単電源とした。
オンボードの機器として、MPU-9250とRTCに加えて、気圧センサ(MS5611)とシャントモニタ(INA226)を追加。

 外部電源出力は、この基板では主にGPSやUART接続の通信モジュール等の接続を想定している。
基板の電源と独立した2つのレギュレータを載せ、マイコンから個別に出力をONOFFできるようにした。 EN出力付きのレギュレータは、ロードスイッチとしても使うことができる。レギュレータの各種保護機能により、下流での電源異常時の波及故障を分離できるのも良い。 とショートモードばかり気にするお仕事の癖が出てしまった…。 いろいろな故障モードを発生させることで、システムは強くなっていく。

 また、SPI接続の各種ROMに対応。SO-8サイズのFlashROMやFRAMを搭載できる。
microSDカードでも、ブランド製品は初期化後アクセスしない期間の待機電流は100μA程度まで下がるが、大容量のデータを貯める必要が無ければ、オンボードのメモリは電力的に有利だ。


 初めて素子を45°配置してみたが、なかなかかっこいい。
基板はelecrowにいくつかの基板を一緒に発注している。発注して6日で届くので便利だ。(輸送はShenzenDHL)年々品質が上がっているような気がする。

 実装が一通り終わったところで、スリープモードに移行した場合の消費電流を調べた。
MPU-9250やINA226はデフォルトだと電源投入後すぐに動作を始めるため、何もしなくても数mA消費してしまう。こうしたセンサはパワーダウンを有効化するためにコマンド送信が必要だ。センサをシャットダウンすることで、基板全体での待機電流値は200μA程度にまで落ちた。

消費電流の調査(デバッグ)

200μAは小さいほうだけど、想定よりかなり多い。
ためしに設計的には共通な第二世代のロガー基板を使って同じコードを走らせたところ、こちらは79μAだった。実装途中のマイコンとレギュレーターだけ載せた基板でも200μAとなる。原因を探ると実装したレギュレーターの消費電力にあった。 試作で安く手に入る型番を使っていたけれど、これがかなり自己消費していた様子だ。

いつも使うLT1761に交換してみると、待機時の電流は72μAまで落ちた。一個で安いレギュレータが10個買える値段なのだけれど、逆電圧保護もあって良く使っている。 マイコン系統だけは自己消費の少ないものにするのが折衷案としてよさそうだ。TIのTPSシリーズでは500nAレベルのものもある。効率を目指すのであれば、昇降圧DC/DCも視野に入ってくる。

せっかくなので段階的に部品を実装しながら調べてみた。
マイコンは端子の初期化とデジタルICのスリープコマンドを送った後、WDTで指定時間経過で間欠駆動するコードを入れたもの。

レギュレータ無しで電源装置から3Vを与えたとき、
・ATmega1284P 8MHz 23uA
・ATmega644AP 8MHz 23uA

LT1761ES5を実装し、3.7Vで動作させたとき
・ATmega1284P 8MHz +LT1761ES5    45uA
・第三世代 フル実装基板     72uA

参考 第二世代基板(ATmega644AP 16MHz)
3.7V時 79uA
5V時    110μA

20μAほどは、RTCの動作電流、FlashROMやセンサの待機電流などが現れているようだ。
・ATmega1284P 8MHz +LT1761ES5    45uA
+MPU-9250                                       55μA (データシートでは8μA)
+MS5611                                          55μA

第二世代は5V系なので、第三世代で追加した機能以上に増えてしまっているようだ。第二世代まではArduino互換であることを重視していたので、電源系統は単純な常時供給としていた。

 RTCの割り込み出力はATmegaのINT2に接続されており、外部割込みをつかうことで、長期間にわたり正確なタイミングで動作させられる。
時折、GPSから時刻情報を得てRTCを補正するという運用なら、かなりの省電力化になる。
実験用に特小長距離無線機とGPSを組み込んだ例

2017/05/30

PIC32ブレイクアウト#2

以前試作したPIC32MM用ボードの修正板を実装してみた。

・SOSC用に32.768kHzの水晶をシリンダタイプに変更。
・ICSP端子を追加
・コンデンサの外形見直し。(10μFを1608へ)
・32MX1xxに対応。(2xxだとICSP端子のデータ、クロック線が使えないけど使うことはできる。)

PIC32MM

32MX1xx


 ピンヘッダつけてしまうと意外とめんどくさいので、いつか端面スルーホール処理にしてみたい。

 プロジェクトファイル置き場 https://github.com/kentN/PIC32-28P-Breakout

2017/05/15

簡易無電源環境光センサ

太陽電池を簡易的な環境光センサとして使ってみた。

CPC1822はとても小さな太陽電池セル。
透明なSO8パッケージに封入されたアレイで構成され、4V 50μA(6000Lux時)の発電能力を持つとデータシートにはある。残念ながらすでに生産中止品なので、部品屋に流通している分で販売終了のようだ。部品箱から発掘されたので、供養と称して特性を調べてみた。

  50μAで何ができるかといえば、アプリケーションとしては光検出、トリクル充電の電源といった用途になる。μAレベルの平均消費電力であれば、コンデンサを充電することでPIC12Fあたりを間欠駆動することもできそう。

光量センサとしては、無電源でADCに直結する簡易的な環境光センサとして使う事もできそうなので、簡単に実験してみた。


CPC1822のパッケージは向きが分かりにくいが、結線されている足は二つだけ。
シャント抵抗を取り付けて、I-V変換された電圧を読み取る。
(写真では100kΩを取り付けたときのもの)
Arduino(AVR系列)なら、基準電圧に1.1Vが使えるので、10kΩでシャントすれば直射日光下で余裕のあるレンジになりそうだ。

10kΩの抵抗を接続し、照度計と一緒に窓辺に置いて、端子間電圧を測定した結果が下記のグラフになる。曇り空のため、あるていど均一な光量が得られていた。

薄曇りの窓辺での計測結果 < 4000Luxまで


その後、雲間を通して直射日光が得られたので、変動の激しい中ではあるけど、プロットしてみた。


 34401Aにつないでシャント電圧を測定してみると、本来のデータシートの発電特性よりも4倍ほど高い電流値を示していた。負荷抵抗を外して直接電流計測しても4倍の電流が計測できている。 そういうものなのかな…。  6万ルクスで50μAが得られることになる。

 雲間の太陽光で計測した結果は、雲の動きが激しすぎて、プロット精度がとても落ちてしまった。快晴下で透過率を調節するのが理想かなぁ。
曇りのプロットと陽光下のプロットの傾きはやや異なる。セル自体はフィルタもないので、赤外線などの影響をかなり受けている。照度で測るなら、可視光帯域に調整された専用のフォトダイオードを使うのが良だろう。

照度計としては怪しいけど、光量センサとしては使える。発電量を刻々とモニタするという意味では役目を果たすので、機械が生き抜く感覚としては十分そうだ。

太陽電池をセンサだけにつかうのはもったいないので、普段は発電していて、時々電流値を測定できると、マイコンのADCのみで太陽電池の健全性確認ができる。
発電電流の大きな太陽電池だと、シャント抵抗に低抵抗が必要なので熱損失がかなり増える。一時的に負荷からセルを切り離し、FETで測定時のみ一時的にシャントする経路を設けておくとよさそう。

2017/04/22

Nexus5X(と寄り道)

いまさらだが、Androidアプリの作成をしてみたくなって、開発機としてNexus5Xを調達した。
 端末のセンサ値をテレメトリみたいに長時間ロギングしてみたいとおもったが、手元にはセンサを積んだ新しめの機種がなく…。

 Nexus5xには製造不良が原因とされるbootloopといった有名な不具合があり、保証切れの個体がオークションで放流されているため、最初は取り寄せてあそんでみることにした。 結局、安定しなかったので 開発機は新品を購入して運用中。

 起動不良を抱えた個体を分解してみた。
分解についてはiFixitに詳細なレポートがある。分解はプラスチックの爪を外すだけなので容易く、基板は数か所のねじを外すだけでアクセスできる。 裏蓋などの分離する筐体にケーブルは伸びておらず、フレキシブルアンテナや指紋センサ、オーディオジャックは基板に配置された金属端子の接触のみで接続されている。基板につながるフレキ端子はLCD、バッテリ、二つのカメラモジュールのみだ。
今どきの端末はかなり設計の合理化が進んでいて、バラしやすい。

 背面カメラはIMX377で、1200万画素、1/2.3型CMOS。 手持ちのTG-4と比較すると、オートホワイトバランスがちょっと頼りないけれど、画素サイズとレンズのおかげか、細部ははかなりシャープに映る。 5Xだと手振れ補正が無く、シャッターボタンを押してから動きの少ない瞬間を狙ってキャプチャしているっぽいので、光量がある場面ではかなり強い。
全球撮影やパノラマモードみたいな撮影についてはAndroidのほうが気に入っている。

 話を基板に戻すと、SoCを覆う金属シールドもツメになっていて、簡単に開く。
放熱シートを介して、DRAMがPoP実装されたCPUが出てくる。 素子を放射温度計でモニタしながら、ヒートガンであぶってはんだクラックの対処をしてみると、たしかにある程度起動しつづけるようになった。
 ただ、2日目に急速充電をテストした際に発熱が増え、bootloopが再発。 常用は難しそうだと見限ることにした。 あとから買った新品と比べると、負荷をかけたときの発熱が多いのも気になった。 バッテリ端子を外して絶縁し、保管中。


 SoCの裏側に、スマートフォン全体の電力管理パッケージが実装されている。
統合チップのデータシートのブロック図を読むと、
・バッテリ管理
・各種電源用DCDC回路
・ハウスキーピング(各部温度、電流電圧モニタリング)
・LEDドライバ
・振動モータードライバ
・待機系

といったものがワンチップになっている。 コンデンサいっぱい。 あとところどころにエミフィルがある。
 仕事で作っている基板の機能図とかぶっていて、個人的にこの部分の仕様を追うのが楽しかった。ここまで統合はされてないものの、太陽電池を電源に、バッテリで動く無線局ということで結果的に同じシステムブロック図が出来上がるのだった…。

 センサまわり。気圧センサと地磁気センサ?が見える。 LEDライト/フラッシュの隣には、レーザーフォーカス用のToFレンジファインダがある。 時期的に以前、単体で動作実験していたものと同じ型番だろうか。

はじめてのUSB-Cな端末で、接続についてはいろいろと参考になった…。机の上にPCにつながったUSB系コネクタが勢ぞろいしていて面倒になりつつある。
試しに4つ全部違うコネクタの端末をつないでみた。
AppleのLightning, USB-typeC(Nexus5X), microUSB(Xperia Ray), mini-B(HTC-03A)


MVNOのデータSIMのサイズ変更(micro→nano)するために、再契約までしばらくはiPhoneをルーターにして、省エネなBluetoothテザリングをすることにした。 この機種はバッテリの容量が少ないため、Wifiオフが結構効いてくる。

2017/03/31

新PIC32(2017)

PIC32MZを久しぶりに触っている。
2015年にFPUが追加された第二世代のEFシリーズが登場した。(初期に登場したECシリーズはエラッタのせいか、ひっそりとNRNDとなっていた)

2014年に買った100pのプラグイン基板(PIM)をEFのチップに換装し、Chipkit CoreをインストールしたArduino環境上で試してみた。
 32MZ EFが積まれたボードは、DigilentからChipkit Wi-FIREとして販売されている。http://store.digilentinc.com/chipkit-wi-fire-wifi-enabled-mz-microcontroller-board/

 32MXを置き換えるという観点で見ると、
・下位構成ではROM512k/RAM128kも選択できて、チップ単体で1000円前後から入手可能になっている。
・最大で144ピンのパッケージが選択できる。
・12bit 18MSPSのADCを内蔵
・倍精度にも対応したFPU
・ピンアサインは互換性なし

DSPの仕様的には、ARMのCortex-M7クラスの仕様になる。小ロット入手だと単価は32MXとほとんど変わらない。
 手軽さだけなら最近はRaspiに流れてしまうんだろうけれど、カスタムボードでも、HALとAPIの選択肢が増えてきたのもあって、いろいろな情報が得られるのでとっつきやすくなった。
 多ピンをコンフィグする場合、予めMPLAB Harmony Configurator上でバスの機能ピンの割り当てを検討できるようになり、PPSピンの機能マトリクスを並べてにらめっこしていた頃と比べるとだいぶ検討が楽になった。

最大のパッケージで、UARTx6, I2Cx2, SPIx2 OC(PWM)x6,CAN, ADC (の一部) , 16bitパラレルx1を引き出してみた。

PIC32MXのほうは、従来のPPS対応の1XX, 2XXシリーズのラインナップが再び拡張され、64/100ピンファミリーが追加されていた。
最大でRAM64k、ROM512kで、第一世代とピン互換がある。シリアルバスなどのペリフェラルも増やされていて、PPS化で実質使えるバス数が増えている。クロック勝負でなければ、やや省電力になり、移植しやすそうなこちらを選ぶのも良いかもしれない。

2017/03/04

Olympus TG-4

オリンパスの防水コンデジ TG-4。 だんだんと入手しにくくなってきつつある。特価で入手。
単体で海中撮影できるし、Exifには撮影方位、緯度経度、気圧(水深)が記録されるので、旅カメラとしては最強クラス。
画像をスマートフォンにダウンロードするだけなら、内蔵Wifiで転送が可能。
別売りのLEDライトガイドを装着した写真
特にマクロ機能が飛びぬけている。顕微鏡モードでも望遠端1cmで、直尺を接写してみるたものが以下の写真となる。


被写界深度合成機能もあり、カメラ上での合成と、焦点を変えながら静止画を連続撮影するオプションが選べる。もっぱら基板上の実装確認に使う予定なので、この機能にはやや期待している…。 (アウトドア用なのに申し訳ない気分に)

古いCMOSセンサを被写体にして確認してみた。
被写界深度合成なし(1枚目)

被写界深度合成あり。ダイの奥までシャープになった
もともと初めに買ったのがGX-200なので、鞄に入らないカメラはちょっと抵抗がある。Pentax Qでレンズをそろえるかどうか迷って、望遠レンズとマクロレンズの代わりに、中古だけどSP-100EEとTG-4をそろえた。
市場の縮小を受けてか、コンパクトな筐体に向いた1/2.3型素子採用のカメラが最近あまり発表されなくなっているのが寂しい。画質や暗部性能では太刀打ちできないものなぁ…

<作例>
AirSPY チューナー部

植物だと、拡大撮影時の倍率を一発で理解してもらえる被写体というのがなかなかないことに気付く。
1週間後の撮影

4kテレビの画面を光学望遠端で。(顕微鏡モード)RGBW配列が確認できる

2017/02/22

RISC-Vなマイコンボード (HiFive1) を試す

オープンな命令セットアーキテクチャとして注目されているRISC-VベースのMCU評価ボード HiFive1が届いたので、さっそく使ってみた。
開発元 SiFive社<https://www.sifive.com/

入手はCloudsupplyから<https://www.crowdsupply.com/sifive/hifive1/>




HiFive1のMCUとボード上の実装

MCUとしてFreedom E310が搭載されている。<https://www.sifive.com/products/freedom-e310/>

パッケージは結構小さい

MCU
・ISA:RV32IMAC(RV32Iベース)
・180nmプロセス
・16kb SRAM, 16kb L1 Chache
・1.61DMIPS/MHz
・ROMレス(128MbitのQSPI Flashが実装済み)
・Clock HFOSC: 16MHz XTal (内蔵PLLにより、最大320+MHz)
・LFOSC: 32.768kHz (RTC用)
・コア電圧は1.8V (VDDIOには3.3Vが入力されていた)
I/O
・ピンヘッダには双方向レベルシフタ(TXS0108ERGYR)を挟んであり、ジャンパピンでI/O電圧レベルを5Vと3.3Vから選択(IOREF)
・外部バスは SPI x1, UART(デバッガと兼用) x1, I2C x1(ソフトウェア実装)
・ADCは無し
・PWM x9
JTAG
・OpenOCD(FT2232H)

Freedom E310 manual
https://dev.sifive.com/documentation/freedom-e310-g000-manual/

RISC-Vアーキテクチャそのものは、クラシックなRISCをベースにしつつ、分岐遅延スロットを持たない(ARMやPPCのように)系統で、可変長命令をはじめからサポートしている。
<https://riscv.org/specifications/>

開発環境のセットアップ

今のところ対応環境はUbuntuのみだが、ArduinoIDEを使って開発できる。
設定は以下のPDFの手順に従った。
https://dev.sifive.com/hifive1/hifive1-getting-started-guide/

Arduino IDEでの開発であれば、SDKのビルドは不要。
UbuntuなのでUSB Serialのパーミッションを設定する必要がある。
スタートガイドの18ページから、Ubuntu上で認識されたFT2232Hにudevルールを追加する手順が紹介されている。

スタートガイドの23ページからArduinoIDEの設定手順になる。

個人的に手順の中でボードのプログラマー選択を見落としていて、スケッチのアップロードに失敗してしばらく悩むことになった。
ボードを選択しただけではプログラマーの選択は連動しないので、忘れるとAVR用のプロトコルが選択されたままとなる。ここもOpenOCDに変更する。
プログラマー設定を忘れずに。

 無事Lチカまでこぎつけた。
 円周率の多倍長演算をさせてみたところ、パフォーマンスは他の32ビットMCUと同等の性能が出せた。低コスト化で除算器などが省かれない限りは、アーキテクチャの差を実感することがあまりない分野ではある…。

 基本は16MHzの外付け水晶のクロックで動作し、ボード選択時にPLLを有効化した256MHz,320MHz超えも選択できる。消費電力は増えるけど、クロックでごり押しすることも可能。

開発環境は、Virtualbox上のUbuntuと、UbuntuをクリーンインストールしたChromebookで動作確認している。

できたてのシンプルなSoCだけど、Arduinoベースの環境が用意されていて完成度が高く、あっさりと動かせてしまうので面白い。

2017/01/24

H-IIA F32 ロケット雲

17:55 RX100M3  70mm 1.3秒露光 ISO100  トリミングと明るさ補正済み

1年ほど前にロケット由来の発光雲を目撃していたが、今回再び目撃することができた。

H-IIA 32号機の打ち上げは16時44分で、関東では17時に日没となり、その30分後あたりから南南西の方角に雲が現れた。

今回は定点で現れてから消えるまでを撮影することができたが、雲全体が南に移動するにしたがって大きく広がっていく過程を捉えることができた。
17時半ごろの出現当初の様子

18時を過ぎると、肉眼ではほとんど見えなくなっていた(10秒露光)
前回も今回も冬季だったので、高層大気では東向きの風が吹き、雲を運んでいたのだろうか。
雲といっても、発生高度から算出すると、直線距離にして数百キロ以上先のものを見ていることになるので、普段の生活とはかけ離れたスケールのものを眺めていることになる。
つい先日まで、鹿児島の南端でお仕事していたこともあって、なかなか感慨深い。