サブディスプレイ①

iPadの利用

iPadをサブディスプレイ化する選択肢

ノートPCのサブディスプレイ(セカンドディスプレイ・モニター)として、iPadを利用してきた。

iOSバイスのサブディスプレイ化の方法は複数あるが、母艦であるノートPCがシステム条件を満たすMacであれば、サードパーティアプリのほか、標準機能のSidecarを利用することができる。
母艦がWindowsの場合は、標準機能は利用できず、サードパーティアプリに頼る必要がある。

母艦 標準機能 サードパーティアプリ
macOS Sidecar Duet Display(有料)、YamDisplay(広告付無料版あり)等
Windows なし Duet Display(有料)、SpaceDeck(無料)等

Duet Display

有線接続

現在主に利用しているノートPCはWindows機であるため、サードパーティアプリ一択となるが、個人的には、複数ある選択肢の中で、元アップルエンジニアの手による、Duet Displayを利用している。

有料アプリであり、apple storeでの価格は1,220円となる。

利用手順は大枠以下の通りであり、後はiPadを通常のサブディスプレイのように扱うことができる。iPad側でのタッチ操作も可能となる。

  1. Duet DisplayをノートPCとiPadにインストール
  2. Duet Displayを起動する
  3. 有線接続する(USBケーブル)
  4. iPad側で「このコンピュータを信頼しますか」のメッセージが出るため、「はい」をタップ

有線接続で書類作成等をする限り遅延は気にならず、何よりも手持ちのiPadをそのまま使えるため、コスト面で優れている。現在は、専ら自席での使用のみだが、旅先や外出時の緊急利用には有力な選択肢となりそうだ(ただし、電力消費が激しく省電力モード推奨とのレビューあり:【iPad】Duet Displayの使い方を詳しく解説!|iPadをサブディスプレイ化する方法)。

しかし、常用には幾つか難点がある。

  • 接続の都度「このコンピュータを信頼しますか」のメッセージが出る。
  • 長時間の離席後に、スリープしたPCを復帰させても、iPad側が連動して復帰するわけではない。
  • また、iPadを復帰させても、Duet Displayが待機状態のまま(接続されていないとの認識)となり、接続を認識させるためには、PC側でDuet Displayの終了→起動を行う必要がある。
  • (当然ではあるが)セカンドディスプレイとして利用中は、iPadの他のアプリを使うことができない。

利用環境によるところも大きいかもしれないが、このような難点があるため、現在ではUSB Type-C (Alt Mode)で接続できるモバイルディスプレイの購入に切り替えている。

無線接続

Duet Displayは無線接続等の機能拡張も可能であるが、その場合は次の通り、サブスクリプションとなる。 f:id:vivitelaeti:20210823122942j:plain

RAW現像ソフト①

Canonのレフ機からSonyのミラーレス機への移行に伴い、常用のRAW現像ソフト変更を検討した。
最終的にSILKYPIXに決めたが、SILKYPIXに至るまで検討過程を簡単に記したい。

RAW現像ソフトに求めるもの

  1. ワークフロー:エクスプローラライク&複数調整
    凝ったレタッチはせず、後から全てのRAWファイルを一括で見直したいこともない。
    PCで複数画像の明るさなどを短時間で調整した上で、RAWファイルも現像により出力されたRAWファイルもNASに移動して終わり。
    そのため、カタログ不使用で、エクスプローラライクでファイルを選択、直ちに調整できることが望ましい。
    複数選択して明るさなどを調整できるとなお助かるが、調整情報のコピー&貼り付けでも可。
  2. 料金体系:買い切り型
    料金体系は、買い切り型の方が望ましい。有名なAdobe Lightroomなどはサブスクリプション型一択となっている。サブスクリプション型も買い替え不要で随時機能追加されるメリットはある。しかし、そこは自分で必要と感じたときに行いたい。
  3. スポットツール(ゴミ取り)
    レンズ交換時にセンサー上にゴミ混入の可能性がある。特にSonyのミラーレスは、α1とα9IIを除いて電源オフ時にシャッターを閉じる機能がない。今のところゴミの混入は避けられているものの、スポットツール(ゴミ取り)は必須。

Canon時代

Canon時代はメーカー製(純正)のRAW現像ソフト、Digital Photo Professional(DPP)にお世話になっていた。カメラの機種によってはiPadアプリも利用できるが、古いカメラのため、プラットフォームはPC一択であった。

ワークフロー

f:id:vivitelaeti:20201127034036p:plain

左側のエクスプローラ(「フォルダー」)からRAWファイルを保存したフォルダを選択し、真ん中のウィンドウに表示されるサムネイルからRAWファイルを選択、右側のツールパレットから調整、最後に現像というワークフローになる。
複数画像を選択して一度に調整可能。 純正ならでは「ピクチャースタイル」や「デジタルレンズオプティマイザ」も利用できる。
インターフェイスは簡明であり、マニュアルやヘルプに頼らなくともおおよその機能は使うことができる。

料金体系

メーカー純正では通常だが、Canonのカメラを所有している以上、利用料金はかからない。
裏を返すと(当然ながら)Canon以外のカメラには対応していない。

スポットツール

f:id:vivitelaeti:20210111103323p:plain

マニュアルでセンサー上のゴミをとるほか、ダストデリートデータを利用した自動処理も可能。

Sony純正

Sony純正は、Imaging Edgeというソフトウェア。プラットフォームはPCのみ。Imaging Edge Mobileという ソフトウェアはあるがこちらはスマホへの画像転送やリモート撮影のみ。
"Remote"、"Viewer"、"Edit"という3種類別々のソフトに分かれている。

ワークフロー

f:id:vivitelaeti:20210111104620p:plain "Remote"、"Viewer"、"Edit"の3種類を統合するソフトとして"Desktop"が存在するが、このような画面であり単なるランチャーに過ぎない。

f:id:vivitelaeti:20210111104751p:plain

まずは、"Viewer"の起動から。ランチャーの"Desktop"を使う必要はなく、直接起動可能であり、起動するとこのような画面が表示される。エクスプローラライクであり、RAWファイルを保存したフォルダを選択し、真ん中のウィンドウに表示されるサムネイルからRAWファイルを選択するところまではCanon純正と同様。
しかし、編集は別ソフト"Edit"でないと行うことができない。選択後、"Viewer"タイトルバー直下の「E」ボタンを押して、Editにデータを読み込ませることになる。
この操作が迂遠であり、"Viewer"と"Edit"を統合してはいけないのかという疑問が湧いてきてしまう。

f:id:vivitelaeti:20210111111644p:plain

料金体系

Canon純正と同様、利用料金はかからない。

スポットツール

スポットツールはなし。

Scratch with ゲームコントローラー

キーボード操作できるScratchのゲームを、Xboxワイヤレスコントローラーで動かしてみました。JoyToKeyというWindowsのソフトウェアでキーマッピングしています。

Xboxワイヤレスコントローラー

購入

2020 年 11 月 10 日にリリースされたXbox series sのワイアレスコントローラーです。

今回はコントローラー単品を購入しました。ワイアレスアダプタ同梱、USB-Cケーブル同梱などもあるようです。 色はカーボンブラックにしましたが(¥6,304@Amazon)、単品購入ではロボットホワイトやショックブルーの選択肢もありますね。

初期設定

初期設定は、イラストのみの取扱説明書で一目瞭然のはず…ですが電池の向きの表示が分かりにくく、そこで一度躓いてしまいました。 

その後は、次の手順で問題なくペアリングできました。これだけすれば、対応するPCのゲームはコントローラーで操作可能です。日頃ゲームはしないのですが、PCのMinecraftでテスト。コントローラーを握ること自体かなり久しぶりで、おそらくスーパーファミコン(!)以来です。

  1. Xboxのロゴボタン(ガイドボタン)でコントローラーの電源オン
  2. コントローラーの上側面のペアリングボタンの3秒押し
  3. Windows10の設定あるいはタスクバーのBluetoothアイコンからペアリング

なお、USB-Cで有線接続もできます。

電源オフ

自動的に電源が切れますが、手動で電源オフする場合は、Xboxのロゴボタン(ガイドボタン)を6秒程度長押しすればよいようです。

留意点

Xbox series sのワイアレスコントローラーは正式には「Xbox Series X、Xbox Series S、Xbox OneWindows 10、および Android」のみで利用可です。

Appleのデバイスについてですが、「iOS のサポートは将来的に予定されています。」「MicrosoftApple は連携し、Xbox Series X コントローラにも今後のアップデートで対応できるよう取り組んでいます。」とのことであり、2021年1月現在、iOSmacOSいずれも正式対応していません (なお、旧型のXboxコントローラーの一部はOSのバージョン次第で対応している模様)。

ダメ元で、古いmacOS搭載機(将来的なアップデートでも対応が見込まれないmacOS High Sierra)で試してみましたが、非公式ドライバの360 Controllerをインストールしても、無線はもちろん有線もやはり反応しませんでした。

他の選択肢

以上のように、Xboxワイヤレスコントローラーは、現時点では対応デバイスも限定的であり、Scratchで試すためだけには価格も高めです。

価格重視なら有線のものが良さそうです。非公式ドライバでのmacOS接続も、有線のものの方が成功例が多そうでした。

価格を妥協してワイアレスにこだわるとしても、アダプタ利用やBluetoothで、安価なものもありそうです。

JoyToKey

JoyToKeyは「ジョイスティックの入力をキーボードやマウスの入力に変換し、さまざまなアプリケーションを操作できるようにするユーティリティソフト」(公式サイト)です。

Xboxコントローラーには、Xboxアクセサリーという設定ソフトはありますが(USB-Cで有線接続した上で各種設定可能)、これではキーボードへの割当てはできないようです。

JoyToKeyWindowsでは定番ソフトのようです(MacOS版はないため、別のソフトを利用することになります)。

ジョイスティックであれば広く対応しており、Xboxワイヤレスコントローラーももちろん動作します。キーの割り当てはこちらを参考にしました。ひとまず、十字キー系統とABボタンのみ。自動連射は全てありにしています。

f:id:vivitelaeti:20210106061404p:plain

インストール後、管理者権限での実行が必要です。PC立ち上げ時の自動起動は、タスクスケジューラを使う方法が紹介されています。 ノートPCでバッテリー駆動時も自動起動するのであれば、ここに紹介されている点に加えて、「コンピューターをAC電源で使用している場合にのみタスクを開始する」もチェックをオフにした方がよさそうです。 また、JoyToKeyの設定でも「最小化した状態で起動させる」と「最小化した際にタスクトレイのみに表示(タスクバーから隠す)」をチェックしておくと、自動起動時に画面表示されません。

シェアウェア(770円)であり、購入前も機能・期間無制限で使えるものの、気に入ったら購入をという呼び掛けでしたので、購入しています。購入方法によって手数料がかかります。

Scratch

テスト用に適当なゲームを作ってみました。無事、意図した通りに動きました。 f:id:vivitelaeti:20210106061853p:plain f:id:vivitelaeti:20210106061859p:plain f:id:vivitelaeti:20210106061920p:plain

【v1】micro:bit (MicroPython)で温度・明るさのシリアル通信・本体ログ

0. はじめに

micro:bit v1用の記事です。micro:bit v2でも下記方法は可能ですが、便利なlog moduleを利用する方法がありますので、そちらもお試しください。

前回

micro:bit事始め。前回はMakeCode Editorのブロックを使い、シリアル通信による温度変化のグラフ表示を試しました。

vivitelaeti.hatenablog.com

今回

今回は、前回の予告通り、単に等価のコードをMicroPythonで書いてみようかと思っていましたが、MakeCode Editorのブロックから移植するだけでなく、内容も発展させて、測定対象と出力形式を加えてみます。

  • 測定対象:温度に加えて明るさも測定する。
  • 出力形式:グラフ表示やPCへのデータ保存に加えて、MakeCode Editorではできないmicro:bit本体へのログ保存も行う。

MicroPython

MicroPythonとは、マイクロコントローラなど制限のある環境で動作するPython3と基本的な互換性のあるプログラミング言語です(MicroPython公式)。通常のPython(CPython)との差異は、同サイト上のドキュメントの通りです。

micro:bitのためのMicroPythonについては、このMicroPythonのサイトとは別に次に公式ドキュメントがあります。

公式ドキュメントは、チュートリアルAPIリファレンス、開発者ガイドの3部構成ですが、最初のチュートリアルは遊び心が散りばめられていて読んでいて楽しい。これに沿ってコーディングしていくと主な機能を試すことができます。

micro:bitでのMicroPythonの利用を紹介した日本語のウェブサイトで初心者向けのものとしてはこちらが見つかりました。他に、日本語でも、高度な使い方を紹介しているブログがありますが、やはり全体に英語のリソースが多いです。

Make CodeのPython(参考)

なお、2020/6/12のMake Code 2020へのアップデートにより、Make Code EditorでもPythonへの切り替えがサポートされましたが、これはMicroPythonとは別物です。

Python language support
In addition to being able to view your code in Javascript. You can now switch to a Python view in the editor.
This is a MakeCode flavour of Python and not the same as MicroPython available in the Python Editor and other third party editors, so you won't be able to use MakeCode Python in another editor
MakeCode 2020 update : Help & Support

1. エディタ

micro:bit専用、又はmicro:bitを主な対象とするMicroPython用のエディタ2種類を紹介します。
その他にも、PyChamでのPlugin利用やEduBlocksのようなコードブロックエディタなど多数の選択肢があります(GitHub - carlosperate/awesome-microbit: A curated list of BBC micro:bit resources.)。

Python Editor (Online)

まずは、micro:bit公式のLet's code > Pythonで紹介されているオンラインのPython Editorです。

Makecode Editorと同じく、PCからブラウザでPython Editorにアクセスすれば直ちに使える手軽さ、機能や設定項目もシンプルで、第一候補となりそうです。ただし、グラフ化の機能はなく、micro:bit本体のファイルシステムへのアクセスもできないようです。

Mu (Offline)

次に、micro:bit公式のLet's code > Other editorsで紹介されているMu(ミュー)です。
micro:bitのためのMicroPython公式ドキュメントではMuが推奨されており、こちらを先に紹介すべきなのかもしれません。

機能的にはPlotterでグラフ化できるほか、micro:bit本体のファイルシステムへのアクセスも可能です。

教育用途を意識したシンプルなデザインであり、本格的なIDEに比肩するものではありませんが、簡単な補完機能など基本的な機能も揃っています。ただし、 Mu Editorは独自環境下のPython3を実行するため、必要なライブラリをインストールした既存環境がある場合にそれを使うことができないという不便さがありそうです(Facilitate installation of 3rd party packages for use with Mu · Issue #675 · mu-editor/mu · GitHub)。

Muのコンセプト

Muのコンセプトについては、公式サイトのAboutにて、アラン・ケイさんの言葉を引用して次のように説明しています。

Alan Kay's quote about learning to program summarizes Mu's outlook. Mu aspires to be "the real thing" as a development environment for beginner programmers taking their first steps with Python.

より詳しいことは開発者向けドキュメントにありますが、同ドキュメントで紹介されている主な開発者であるNicholas H.Tollerveyさんのプレゼンテーションも興味深いです。

youtu.be

プレゼンの17:00〜のScratch/BlockyとMu/Pythonのanalogyに関して、そこまではっきりしたものであるか(Scratchも十二分に右のイメージのようになるのではないか)は素人的には疑問もありますが、Muの意義をどのように考えているかが伝わってきます。

なお、プレゼンのこのあたりで、Scratch/BlockyとMu/Pythonのイメージの間に、EduBlocksを位置付けておくべきだったとの説明があります。EduBlocksは聴き慣れませんでしたが、micro:bit公式のLet's code > Other editorsで紹介されています。開発者のJoshua Loweさんが12歳のときから開発を続けているものです(Joshua Lowe - EduBlocks - Tech4Good Awards)。

ざっと触ってみた限り、EduBlocksは、コードが書かれたブロックを組み立てる形式であり、ビジュアルプログラミングからテキストプログラミングへの橋渡しにうってつけのように感じます(小さなMakerたちの作品が集合! プログラミング好きな小中学生の交流を促すイベント「Kids Maker Festival」レポート - Watch Headline)。EduBlocksにはmicro:bitモードもあり、今回は使用しませんでしたが別の機会に試してみたいです。

Muのインストール方法

Muは、基本的にこちらのDownloadからOS毎のインストーラーをダウンロードしてインストールする必要があり、オンラインのPython Editorと比べれば一手間かかりますが、複雑な設定は必要ありません。
ただし、環境によってはトラブルが生じることもあります。手元のWindows 10 version 1909では問題ないのですが、Mac OS 10.13 High Sierraでは(PortaMuではなくインストールする方の)安定版が起動せず、Alpha版のみ起動する状況です。Alpha版はPython3のREPLが正常に動作しないなど問題もあります。

上記がDownloadページです。

なお、Windows/Mac OSについてはインストールせずに利用可能なPortaMuも準備されていますので、制約のある環境や試しに使って見たいという場合はこれが良さそうです。

micro:bit以外(参考)

Muは、元々micro:bit専用のエディタとして開発されたようですが、現在ではModeの切り替えにより、Alpha版も含めると以下のプログラミングが可能です。ここでは、後の応用編とでPython3モードを試しています。

  • micro:bit
  • CircuitPython
  • ESP8266/ESP32(Alpha版のみ)
  • Pygame Zero
  • Python 3
  • FlaskによるWebサイト(Alpha版のみ)

Modeのアイコンをクリックすると次のようにモードを選ぶことができますので、ここでちゃんとmicro:bitが選択されていることを確認してからコーディングに進みます。

←  安定版             Alpha版  →

2. シリアル通信

コード

10秒毎に温度と明るさを測定しprintするコードです。

from microbit import *

# 初期表示
display.scroll("temp/lt")
sleep(500)

# 10秒毎の測定・printループ
while True:
    # 温度測定
    temp = temperature() 
    # 明るさ測定
    lt = display.read_light_level() 
    # REPL/Plotterでの表示
    print((temp, lt)) 
    # 10秒待つ
    sleep(10000) 

温度測定

公式ドキュメントでは「Microbitモジュール」の箇所に記載があります。

microbit.temperature()
micro:bit の温度を摂氏で返します。
Microbit モジュール — BBC micro:bit MicroPython 1.0.1 ドキュメント

プロセッサ上にセンサーがあるため、周囲の温度より高めに出ます。

温度センサーの値は、このプロセッサーの温度になるので、マイクロビットが置かれている部屋の室温とは異なります。
【micro:bit(マイクロビット)でプログラミング】内蔵された温度センサーによる温度計 | micro:bit Lab.【マイクロビット】

MakeCodeでも温度センサを使ったプロジェクトが紹介されています(Features in depth | micro:bitのTemperature sensor)。
プロジェクトページではMakeCode Editorのブロックが先に出てきますが、PythonをクリックするとMicroPythonのコードに切り替わります。

明るさ測定

公式ドキュメントでは「ディスプレイ」の箇所に記載があります。

microbit.display.read_light_level()
ディスプレイの LED を逆バイアスモードで利用して、ディスプレイのまわりの光量を検出します。戻り値は明度を表す 0 から 255 までの整数値で、値が大きいほど強い明度を意味します。
ディスプレイ — BBC micro:bit MicroPython 1.0.1 ドキュメント

MakeCodeでも明るさセンサを使ったコードが紹介されています(Features in depth | micro:bit のLight sensor)。
プロジェクトページではMakeCode Editorのブロックが先に出てきますが、PythonをクリックするとMicroPythonのコードに切り替わる点は同様です。

REPL/Plotterでの表示

REPLでの表示だけであればタプルにする必要がないですが、MuのPlotterでのグラフ表示をする場合、タプルをprintする必要があります(Plotting Data with Mu)。誤ってprint(temp)print(lt)とするとグラフ表示されない。

今回は、 tempとltの2要素あるため、print((temp, lt))ですが、仮に温度測定のみでtempの一要素だけであっても、print((temp, ))とタプルにしなければなりません。 1要素だけでも、タプル内にカンマが必要です。

個々の要素を表現する式をカンマで区切って構成します。単一の要素からなるタプル (単集合 'singleton') を作るには、要素を表現する式の直後にカンマをつけます
3. Data model — Python 3.10.8 documentation

MakeCode Editorのブロック(参考)

なお、MakeCode Editorのブロックでは次のようなコードとなります。

実行方法・結果

Python Editor (Online)

Python Editorを開きコードを入力。

コードをmicro:bitに書き込む手順は、MakeCode Editorと似ています。

  1. micro:bitとPCのUSBコネクタを繋ぐ
  2. Connectのアイコンをクリック
  3. WebUSB設定画面が表示されたら接続をクリック2
  4. Flashのアイコンをクリック("Flashing micro:bit"とポップアップ表示され、進捗はプログレスバーと完了時のチェックマークで確認可能)

Flash後に再起動したmicro:bitで測定できた温度と明るさは、Open Serial (REPL) をクリックすると次の通りに数字で表示され更新されていきます。

Mu (Offline)

Muでのコードの書き込みは、さらにシンプルです。

  1. micro:bitとPCのUSBコネクタを繋ぐ(最下部のステータスバーにDetected New BBC micro:bit deviceと表示される)
  2. Flashのアイコンをクリック(少し間が空いて、最下部のステータスバーにFinished Flashingと表示される)

Python Editorと違って、Flashプログレスバーの表示がないので、書き込みに時間がかかる場合はトラブルが起きていないか少々不安になりますがじっと待つ。

REPLとPlotterのアイコンをクリックすると、次の通り測定値が数値とグラフで表示されますね。

MuのREPLについての一般的な説明はWhat is a REPL?を参照。Python3モードのREPLで一行ずつコードを打ち込んで実行結果を確認する説明があります。最後の方に、micro:bitモードの記載も少しあります。

MuのPlotterについてはPlotting Data with Muです。データ形式をタプルにしてprintすれば、グラフを表示できるという機能です。

Plotterに表示されたデータは、自動的には mu_codeディレクトリ直下のdata_captureディレクトリに.csv形式のファイルで保存されていますので、micro:bitをPCに繋いだまま温度と明るさを測定する場合、後からデータをこの自動保存されたファイルで後からデータを確認することもできますね。

次のセクションでわざわざ本体でログを取るのは、PCを離れて温度や明るさ測定をするためです。

ターミナル等(参考)

ちなみに、ターミナル等からシリアル通信しても良いです(REPL へのアクセス — BBC micro:bit MicroPython 1.0.1 ドキュメント)。mac OSの場合、ターミナルからscreen /dev/cu.usbmodemXXXX 115200でこのようになります(XXXXは ls /dev/cu.*で調べたポートの情報に置き換える)。

シリアル通信の終了はCtrl-A の後に Ctrl-¥(バックスラッシュ)で質問にYesと回答。

3. 本体ログ

いよいよ本体でログを取ります。micro:bitを屋外に設置してみるため、雨風を防ごうと100均のアクリルケース(外寸W60 * H77 * D 42)に入れてみました。温度をとる観点からは密閉すべきでないのかもしれません。

コード

1時間毎に温度と明るさを測定して結果を本体のファイルに書き込むコードです(printも残しています)。
先程とは違い、本体をPCと繋いでいない状態でも測定・記録できるので、電池をつないで屋外に放置しておき、後でPCと繋いで1日の測定結果を確認するという使い方もできます。

from microbit import *
import time

# 初期化・初期表示
log_count = 0 # ログ回数の初期値。時刻の代わりとする
log_file = "log.csv" # 本体ログファイル名。フラットファイルシステムのためディレクトリは指定不可。
log_data = "time,temp,lt\n" # ログデータの初期値(表の最初の列)
display.scroll("temp/lt") # 本体LEDでプログラム名を表示

# Aボタンが押されるまで待つ
while not button_a.was_pressed():
    sleep(1000)

# Aボタンが押された直後の表示
display.show(Image.SNAKE) # 正常動作確認用
sleep(1000)
display.clear()

# ログ初期化
with open(log_file, "w") as f:
    f.write(log_data)

# 1時間毎の測定・記録ループ
while True:
    # 開始後の初カウントを1、その後1ずつ増加させる。
    log_count += 1
    temp = temperature()
    lt = display.read_light_level()
    print((temp, lt))
    # ログの読み込みと出力
    with open(log_file, "r") as f:
        log_data = f.read()
    with open(log_file, "w") as f:
        f.write(log_data + str(log_count) + "," + str(temp) + "," + str(lt) + "\n")
    # 1時間待つ
    time.sleep(3600)

ファイルシステム

公式ドキュメントに説明がありますが、約30KBのフラットファイルシステムディレクトリ構造なし)です。

ファイルシステムへのアクセスは、後述のMuのFilesを使う方法が簡単ですが、microFSというツールも用意されています(GitHub - ntoll/microfs: A simple command line tool and module for interacting with the simple filesystem on the BBC micro:bit.)。

ファイルI/O

ファイルについては、仕様上、追加的書込み(append)ができないので、一度ログファイル全体を読み込んでから、追加のデータを加えて、書き込んでいます。

注釈
ファイルを開いて書き込むとき、ファイルがすでに存在する場合はファイルの内容を上書きします。
ファイルにデータを追加するには、最初にそれを読み出し、読み出した内容をどこかに保持し、ファイルを閉じ、読み込んだ内容にデータを追加して、再度ファイルを開いて、改訂した内容を書き直す必要があります。
これは MicroPython の場合ですが、 "通常の" Python では "append" モードで書き込むファイルを開くことができます。micro:bit でこれを行うことができないのは、ファイルシステムの実装を簡略化したためです。 ストレージ — BBC micro:bit MicroPython 1.0.1 ドキュメント

今回のように1時間毎で1日分測定・記録するのであれば問題ないですが、高頻度や長時間で測定・記録すると、上記の通り一度ログファイル全体を読み込む関係で、ストレージの上限である約30KBに達する前に、RAMの上限である16KB(Hardware)に達することが原因で020エラー(micro:bit 020 error : Help & Support )が起きます。

なお、本来は次のコードのようにファイルI/Oのエラー処理をすべきですが、端折っています。 Max-min temperature logger | micro:bit

time.sleep()

1時間おきの計測のために、sleepのミリ秒単位を使っても良いのですが、秒単位の方が分かりやすいので最初にtimeをimportしてtime.sleepを使っています。

実行方法・結果

電池を繋いだmicro:bitを持って屋外に行き、Aボタンで測定開始。

1日放置したmicro:bitを回収してPCに繋ぎます。そこから、Muを起動して、でmicro:bit本体のファイルシステムにアクセスするのですが、その方法も至ってシンプル。

Filesアイコンをクリックして、左側のfiles on your micro:bitから、右側のfiles on your computerへとドラッグ&ドロップするだけです(操作のアニメーションはMu and micro:bitのページ中段あたり)。

そのまま、右側のfiles on your computerに移されたファイルを右クリックしてopenすると関連付けられたアプリケーションで開くことができます。
ファイル本体は mu_codeディレクトリにあります。

これをExcelで開き、timeの列を調整(午前6時に測定開始したため、timeにそれぞれ5を加える)。

そして、そのままExcelで、温度と明るさに左右2軸を充ててグラフ化。Plotterのグラフより分かりやすいです。

午前7時頃の明るさがおかしいですが何かの照り返しかもしれません。それ以外は午後1時、2時をピークとする日中の温度や明るさの変化が分かります。
上記の通り、プロセッサ上にあるセンサーを使うため、温度は実際より高めに出るので、予め、他の温度計を使って実際の外気温との差を図っておき、後で補正する対応が必要ですね。明るさも相対値なので、自由研究などで使う場合は、いずれの数値も説明が必要となりそうです。

4. 応用編

応用編として、Pythonによるグラフ描画、そして、測定項目の追加(温度だけでなく湿度や気圧など他の気象観測)もできればと思い、調べてみました。

Pythonによるグラフ描画

このグラフは、Python3の下記コードの通り、pandasを利用してログを読み込み、matplotlib.pyplotで表示しています。細かい調整はしていませんが、Excelのグラフと比べると測定された最低温度がY軸の下限となっており、温度変化が分かり易いです。

どう実行するかですが、本記事で紹介しているMu EditorのPython3モードで次のコードを保存し、単にRunアイコンをクリックすると、ライブラリの不足についてエラーが出ます。実行環境にAnacondaをインストールしているなどpandasとmatplotlibのいずれのライブラリもターミナルからの実行では問題なく利用できる場合にも。

これは、Mu Editorから実行されるPython3は/Applications/mu-editor.app/Contents/Resources/以下にある独自環境のもので、ターミナルからの実行環境とは異なるためのようです。

そこで、pip install XXX --target /Applications/mu-editor.app/Contents/Resources/app_packagesなどとしてpipの--targetオプションでMu Editorの実行環境のapp_packagesに必要なライブラリ(今回はpandasとmatplotlib)をあらかじめインストールしておく必要があります。これをしておけば、エラーは出てしまいますが、Mu Editorからでもこのグラフ描画はできました。

import pandas as pd
from matplotlib import pyplot as plt

# ログ読み込み
log = pd.read_csv("log.csv", index_col=0)

# 温度と明るさ毎にグラフ関連付け
s = log.index
fig, ax1 = plt.subplots()
ax1.plot(s, log['temp'], color="r", label="temp")
ax2 = ax1.twinx()
ax2.plot(s, log["lt"], color="b", label="lt")

# タイトルや軸ラベル
ax1.set_title("temp/lt")
ax1.set_ylabel("temp")
ax2.set_ylabel("lt")

# 凡例
ax1.legend(loc="upper left")
ax2.legend(loc="upper right")

# 表示
plt.show()

拡張ボード+Make Code Editorによる測定項目の追加

weather:bitやTFW-EN1といった拡張ボードを利用する方法がメジャーのようです。この場合、製造元が提供されている拡張ブロックをMake Code Editorで読み込んで使うことになり、MicroPythonを利用した方法の説明はないようです。

Grove拡張ボードとBME280を組み合わせた例でも、TFW-EN1の拡張ブロックが使えたとの報告がありますので、この方法ならば選択肢は色々あります。

I2C通信+MicroPythonによる測定項目の追加

他方、MicroPythonにこだわる場合、MicroPythonを使ってI2C通信もできるので、micro:bitをI2Cの機器と直接つないでやるのが良さそうですね。Make Code Editorでも出来そうです。大人の夏休みの自由研究…としては、自分の技量を考えるとハードルが高いですが、またいつか。


  1. Alpha版はQtを利用しているところ、その対象プラットフォームが限定的なので安定版より動作環境が限定されているようです。もっとも、Qtは現時点ではmacOS 10.13以上のサポートのようであり(Supported Platforms | Qt 5.15)やはり良くわかりません。

  2. WebUSBの利用には、micro:bitファームウェア0243以上であること、ブラウザが対応していることが必要となる。WebUSB Troubleshooting : Help & Supportを参照。

M5Cameraでタイムラプス(NAS利用)

コンセプト編

ベランダで植物を育てることになり、唐突ながら、タイムラプス撮影をしたいと思い立ちました。

タイムラプスとは、一定時間ごとに定点撮影した静止画を繋げて作成したコマ送り動画です。

ある自然ドキュメンタリーで植物が育つ様子を年通しで撮影したものに触発され、四季折々の風景までは望めないし、高精細なものも無理だとしても、似たようなことをコストパフォーマンス良く手早くできないかと。

タイムラプスが可能なスマホ・デジカメなどを犠牲にする(ベランダに据え置く)、あるいは、タイムラプス専用機を使うのが手っ取り早いのですが、コスト面、そして、何か手を動かしたかったので、どうしたらできるか調べ考えて、途中まで実装しました。

以下ではコンセプトから書き始めていますが、結局、実装に必要なものは以下の通りです。

  1. NAS
  2. ベランダのコンセント
  3. M5Camera
  4. 電源アダプタ(スマホ用を転用)
  5. カメラケース(手作りで適当に)

PCを常時起動しておけば代替できますが現実にはNASは必須。他方、電源については、バッテリーは何日も持ちませんし、ソーラーパネルを使いこなすという凄い方もいますがそうでもしない限り、コンセント頼みになります。室内からは延長コードでエアコンの配管の穴を利用するなど手間がかかりそうです。

本命のラズパイ

本命はやはりラズパイ。色々な方が実装されていますが、↓からあげさんのラズパイ活用はどれを見てもわくわくするところ、特にこの定点観測カメラ、プログラムは用意していただいており、クロージャも真似したくなる仕様です。

ラズパイ定点観測カメラの動画とタイムスタックフォト - karaage. [からあげ]

しかし、手元にディスプレイもなく、ssh接続のみでラズパイセットアップできるか自信がない、簡易防水も自らの力量を踏まえるとどこかで躓くのではと思うと踏み切れませんでした。

ラズパイもzero wならば小さめのカメラも入るケースがあり、それをベースに何とか防水できないかと思索したものの、ざっと調べる限り供給が限られているようでした。 ピンヘッダを実装したzero whならばあるのですが、目当てのケースと干渉するようです。ピンヘッダを外せば良いかのかもしれませんが簡単とは思えず。。

NAS+α

ラズパイの場合、撮影、画像保存、動画作成まで、基本的に、全てベランダのラズパイ(常時起動)で行うことになります。

この点、自宅ではやや年季のはいったNAS(Arm系QNAP)が常時起動しているため、ラズパイが担う役割をできるだけNASに担ってもらう、具体的には、ベランダにカメラを置き、常時起動しているNASからそれを操作して撮影、画像保存以降はNAS側で行う仕組みならばどうかと思いました。

ステーションモード化したM5CameraF(魚眼レンズ)にPCからnodeでアクセスして、画像保存と動画作成するこちらの実装例を参考にし、PCをNASに入れ替えれば(ざっくりと)できそうです。

M5Cameraで超安価なタイムラプスカメラを作ってみた

実装編(道半ば)

カメラ側

M5Cameraの入手と試用(AP)

魚眼レンズのFはなかったため、ノーマルM5Cameraをスイッチサイエンスから購入。アームの色は指定できず、赤や橙もあるようですが灰色でした。値段の手頃さ(税込2,035円)、コンパクトさ(48 mm x 24 mm(アームおよびアーム固定穴含まず))、軽さ(5g)が際立つ。

f:id:vivitelaeti:20200720113049j:plain

M5Camera - スイッチサイエンス

上記からリンクされた公式ドキュメントは、図面など画像が表示されないようでしたが、こちらから画像も含めて閲覧可能です。

M5Camera - Makerfactory Documentation

デフォルトではM5Cameraがアクセスポイント(AP)になり、アクセスしてブラウザから静止画・動画を撮影できるので、まずはそれを試してみました。 同梱の取扱説明書にある通りですが、手順は以下の通りです。こうして手軽に動作を試せるのは嬉しい。

  1. 電源アダプタ(スマホ用を転用)と付属コードでM5Cameraを電源に繋ぐ
  2. 端末(PC、タブレットスマホ)から"M5CAM_なんとか"のWi-Fiに接続する
  3. 192.168.4.1(取扱説明書に異なるIPアドレスの記載があればそちら)に接続

CameraWebServerのプログラム(STA化)

デフォルトではM5Cameraそれ自体がアクセスポイント(AP)になるところを、NASから接続しているルーターを介してアクセスできるよう、M5Cameraの方からルーターに繋ぐステーションモード(STA)に変更しました。ESP32は初めてで勝手がわからなかったのですが、下記の手順に従いArduino IDEからプログラムを書き込みました。なお、これをすると、デフォルトのプログラムは上書きされてしまいます。出荷時に戻すことができるかは確認未了です。

M5Camera をレビューしてみた。分解したり、Arduino IDE でスマホに映したりする実験 | ページ 3 / 3 | mgo-tec電子工作

上記ではArduino IDEでESP32用のCameraWebServerサンプルプログラムを一部変更するのですが、このサンプルはGitHubにて公開されているものと同等のようです。

いまだにこのサンプル仕組みは理解できていませんが、いずれにせよ(と逃げて良いのでしょうか)、STA化ルーターを介した接続までは比較的スムーズに行きました。

カメラケース

ここに載せられるほどの完成品ではありませんが、お菓子の空き箱で高さを稼ぎ、穴を開けてビニールタイでM5Cameraをくくりつけるなど手作り感満載のものです。もう少し工夫して、見栄えの良い小型の簡易防水仕様にできると良いのですが。

NAS

シェルスクリプト

QNAPはLinuxベースのNASであり、画像取得だけであればシェルスクリプトの利用がシンプルです。

シェルスクリプトは以下の通りですが、M5Cameraにアクセスするためにcurlを利用している他、縦位置に設置したため画像回転が必要となり1、convertも使っています2

#! /bin/sh
base_dir="(作業ディレクトリのフルパス)"
tmp_file="${base_dir}tmp.jpg" #一時ファイル
img_file="${base_dir}`date +"%Y%m%d_%H%M%S"`.jpg" #撮影時刻をファイル名にする

img_url="http://(m5cameraのIPアドレス)/capture" #スチルの撮影は/captureにアクセスすることにより可能
curl -o $tmp_file $img_url

convert -rotate -90 $tmp_file $img_file #90度回転(縦位置に設置する場合)

なお、convertを利用するためには、パッケージマネージャからImage Magickをインストールすることになります。このパッケージマネージャ以前はipkgという名で組み込まれていたように思いますが廃止されてしまい、opkgになりましたので、そちらのインストールを先に済ませておく必要があります。opkgも含めて、QNAP固有の問題でだいぶ苦労しました。

ARM 系 QNAP に git/php7.4 などをパッケージでコマンドインストールする [Entware で Opkg 編] - Qiita

Python3(別の方法・成功)

なお、当初は、シェルスクリプトでなくPython3を利用していました。

なお、Python3は、opkgからインストールしたものでないと正常に動かないようです。AppCenterからインストールしたものを下記に記載された方法(. /etc/profile.d/python3.bash)で一時的には起動できるのですが、再起動などするとやはり動かない。やはりQNAP固有の問題で苦労しました。

コミュニティのおかげで解決のヒントが分かるので、それを手掛かりに歩みを進められるのはありがたいことです。いつか、ターミナルでQNAPを使う場合の躓きポイントを別エントリでまとめたい。

install python 3 - QNAP NAS Community Forum

IFTTT(別の方法・失敗)

QNAPのIFTTTを利用して、時間になったらDownload from URLで"(m5cameraのIPアドレス)/capture"にアクセスできれば、画像取得は格段に簡単ではないかとも思い試しました。しかし、こちらは失敗に終わりました。

IFTTT Agent ユーザーガイド | QNAP

cronによる定期実行

シェルスクリプト(又はPythonスクリプト)をcronに登録して定期実行。手順は、主に下記記事を参考にさせていただきました。ただし、エディタは、viではなくopkgでインストールしたnanoを使いました。

QNAPでcronをあつかう - Qiita

IPアドレス問題とmDNS

M5CameraのIPアドレスルーターで固定しない限り、メンテナンスのために電源を抜いてまた挿す都度、IPアドレスが変わり、スクリプトも変更の手間がかかります。これを回避するためのM5Camera側のmDNSの設定については、前述の下記記事の通りです。

タイムラプスカメラとして利用しないまでも、同じネットワーク内の端末からm5camera.localなどでアクセスできるのは便利なのですが、mDNSは端末により非対応です。Android、そして、今回利用したQNAPも。QNAPはavahiを入れてmDNSへの対応を試みたのですが解決できていません。

M5Cameraで超安価なタイムラプスカメラを作ってみた

タイムラプス動画作成その他

定期撮影までできたため、タイムラプス動画作成も自動化したい。QNAPでffmpegは実行できるのですが、その先が進まず、道半ばです。何より、最近の悪天候、強風により、育てつつあった植物が倒れて枯れてしまうという悲しい出来事にあい、プロジェクト凍結中…園芸スキルにも課題ありです。

定期的な画像取得までは成功したので、これにめげずに動画も作成し、また、M5CameraはGroveコネクタがあり温湿度計などを接続することもできるので、そちらで取得したデータをMQTTでQNAPに送信するなどまた徐々に進めて行きます。

プラレールに乗せて(番外編)

タイムラプスとは関係ないのですが、M5Cameraをプラレールに乗せて撮影も試してみました。形状とレンズ位置・ケーブル位置がプラレールとは折合わずバランスがとりにくかったですが一応、スチルもビデオも撮影できました。

f:id:vivitelaeti:20200614075359j:plain


  1. 本来はM5Cameraの設定で対応できるはずなのですが、うまくいかず事後的に画像回転することにしました。

  2. 一時ファイルを作ってからconvertで回転させつつコピーするのではなく、mogrifyで回転して上書きできるはずなのですが、うまくいかず、あえて一時ファイルを作成してconvertしています。

micro:bit(MakeCode)とGitHubの連携+温度測定シリアル通信

microbit事始め。前回はScatch3.0との連携を試しました。

vivitelaeti.hatenablog.com

今回は、王道のMakeCodeを使ってみます。

2020アップデート

サヌキテックネットさんの下記解説の通り、2020/06/12のMakeCodeのアップデートによりGitHubとの連携が可能になりました。作成したプログラムはGitHubに保存して、編集時にはそこから読み込み、編集して、上書き保存(コミット)できる快適仕様。

sanuki-tech.net

MakeCodeのブログにもリリースノートとGitHub連携の詳細記事があります。

makecode.com

makecode.com

プロジェクト作成時のGitHub連携

ポイントは、新しいプロジェクト作成時に「読み込む」をクリックして、Your GitHub Repositoryを選択、新規作成すること。この方法で作成するとプロジェクトのロゴはGitHubのマスコットのタコのようなネコ(ネコのようなタコ?)、モナリサ(OctCat)シルエットとなります。

f:id:vivitelaeti:20200720061101p:plain

f:id:vivitelaeti:20200720042841p:plain

f:id:vivitelaeti:20200720061702p:plain

通常プロジェクトを後から連携する

直感にしたがい「+新しいプロジェクト」をクリックしてしまうと、その時点ではGitHub連携は叶わず、従前と同じブロックのロゴです。

f:id:vivitelaeti:20200720061749p:plain

そのままプログラムを書いてしまったとしても、エディタ下のフロッピーディスク隣のモナリサマークのボタンからGitHub連携は可能。

f:id:vivitelaeti:20200720044630p:plain

ただし、この方法の場合、そのままでは、プロジェクトページにあるのは、あくまでブロックロゴの(従前形式の)プロジェクト。

「読み込む」からYour GitHub Repositoryを選択してプロジェクトページに加える必要があります。無事モナリサのロゴのプロジェクトができた後も従前形式のブロックロゴのプロジェクトが残るので、そちらを削除するといった手間がかかります。やはり、プロジェクト作成時のGitHub連携の方が良さそうです。

温度測定シリアル通信(試作品)

MakeCodeのウェブサイトには魅力的なサンプルが多いのですが、温度を1秒ごとに測り、シリアル接続でCSVに保存してグラフ化する方法(2台のmicro:bitを使った遠隔での方法も含む)まで、分かりやすく楽しく解説したこの動画が目にとまりました。はっきりゆっくり喋ってくれるので、こうしたことに興味を持つ子供にとっては英語の聞き取りの練習にも良いかもしれません。

www.youtube.com

早速、こちらを参考に少し改変してやってみました。この画像ファイルはGitHubのページに自動生成されるものです。これも便利。

f:id:vivitelaeti:20200720061911p:plain

MuのMicroPythonでもplotterを使えば同じようなことはできそうです。今後試してみたいです。

codewith.mu

microbit.org

microbit on scratch

Scratch 3.0との接続

micro:bit事始め。Make Codeのビジュアルコーディング(テキストコーディングへの切替可)やMu のMicropythonという選択肢もありますが、まずは、オンラインのScratch 3.0とのBLE(Bluetooth Low Energy)接続を試してみました。

必要なもの

Micro:bit本体とMicroUSB-USB Aケーブルがあることを前提として、PCについては以下のいずれかのOSで動作します(2020/07/19現在)。

Linuxは公式には未対応です。残念。公式には、と書いているのは、pythonでの実装例があるためです(Linuxでmicro:bitをScratchにつなぐ - Qiita)。子供用にLinux PCを用意しているので、ぜひ試してみたいです。

なお、PCでなくAndroidタブレットでも、Android 6.0以上であれば、Scratchアプリから利用可能です(Androidスマートフォンは不可)。iPadはそもそもScrachアプリが存在せず未対応です。これは本当に残念。

接続方法

接続方法はScratchのウェブサイトの解説にて一目瞭然ですが、以下の通りです。これ以外に特にBluetoothの設定なども不要であり、簡単でした。

  1. Scratch Linkのインストール
  2. micro:bitを接続してHEXファイルを転送(USBドライブとして認識されたmicro:bitにドラッグ&ドロップ)
  3. Scratch拡張機能からmicro:bitを選択して接続

手持ちのmacbook air(mid 2011なので何とかmacOS High Sierraに対応、それ以降のバージョンにはアップグレードできない)との接続はこんな感じです。

f:id:vivitelaeti:20200719051536j:plain

ボタンでネコを動かしてみる

小学生からはじめるわくわくプログラミングの100メートルハードルを作りかけていたところに、スペースキーの代わりにボタンA、上向き矢印の代わりにボタンBと雑に割り当ててみましたが意図した通りに動きました。

f:id:vivitelaeti:20200719062453p:plain

「スペースキーがおされた」ではないとのブロックは不要ですね(そもそもmicro:bitのボタンにキーリピート機能はない)。

その後、子供に手綱を渡したところ、水平センサーを利用して、micro:bitを傾けるとネコが移動するプログラムまでたどり着いていました。物理的なボタンやセンサーも楽しいようです。

ただ、やはりmicro:bitの機能の一部に限られてしまうので、Scratchとの連続性にこだわるとしても、先々はmicrobit moreに進みたいところです。

電池ボックス(番外編)

Scratch3.0との接続とは直接関係なく番外編ですが、せっかくBLEで繋げるので、電源供給用にだけUSBを挿しておくこともなかろうと、電池ボックスを導入しました。

f:id:vivitelaeti:20200719051620j:plain

共立プロダクツ311-635 マイクロビット バッテリーホルダー 3×2

なお、この電池ボックスに限った話ではありませんが、コネクタを奥深く押し込むと抜けにくくなるので要注意です。

ケース(番外編)

PimoroniのKittyケースを使っています。カラーバリエーションは4種類。
micro:bit Kits, Add-ons, and Accessories - Next Day UK Delivery – Pimoroni Store

上記は製造元ですが、Amazonやスイッチサイエンスでも購入可。