きっかけ
先日、北海道森町の集まりで、某若狭さんからM5StickVを紹介していただく。
本来は機械学習のデータを使った画像認識向けのもののようだけど(QVGA(320×240ドット)とかで解像度低いし)、
ただ、色々調べてみたら、「プログラミングできるデジカメ」として可能性がありそうだったので、買ってみた。
- カメラついてる
- デフォルトでボタンついてる (若狭さんにM5Cameraを推奨されたけど、
そっちにはデフォでないよねたぶんBボタンはあるっぽい?) - (micro)SDカードスロットついてる
- そして安価(¥3,000くらい)
- プログラミングできる
= 単体で動く!(RasPi+WebCamとか用意しなくてもいい!)
ということで、かなり興奮していたんですが、これだけでなく
- LEDフラッシュがついている
- バッテリーもついている
- 拡張性も高い
ときたもんだ。解像度以外は完全にカメラ向きだろうと。
2012年くらいにIKEAが出していた段ボールデジカメKNÄPPAを出したり https://www.youtube.com/watch?v=OGGFuD5n5go 、
同時期に国内メーカーでライブラリを公開するのをウリにしたカメラを出したり(メーカーと機種名を忘れた...検索しても全然出てこない...ソニーでいうところの「レンズスタイルカメラ」ですね)、
今年2019年に入ってからは、Canonが海外でしか使えなかったEDSDK(EOS Digital Software Development Kit)を日本でも使えるようにしたり、
結構ものづくり欲を高めるカメラを出してきたように思えます。どうもあまり流行っている感じはしませんが。。。
元々、子供たちにプログラミングを教える機会もありそうだったので、教材としてもいいかなと。
まずはどんなものを作るか
- 撮影前にプレビュー画像が出ている
- ボタン押す
- 画像が保存される
まずはシンプルにこれを目指します。
参考
以下のページを参考にしています。
- maixpy 覚書(SIOSALTさん) http://ssj.siosalt.tokyo/?p=72
- 写真の撮り方はこちら
- Wi-FiがないM5StickVを、M5StickCと繋ぎLINEに投稿してみるまでの手順(@aNo研 nnnさん) https://qiita.com/nnn112358/items/5efd926fea20cd6c2c43
- ボタンの使い方はこちら
あとはOpenMVとか、MicroPython、MaixPy関連の情報が参考になるようです。
- M5StickV上で動くMicroPythonのコマンド情報をまとめている方がいらっしゃいましたので、今後こちらも参考にします。 https://qiita.com/Lathe/items/7fbfccafb879de4bf11e
作り方
microSDカード直下に以下のboot.pyファイルを入れ、そのカードをM5StickV本体に差し込んで、USB-Cケーブルで電源と繋げば勝手に起動します。
実際のコード
上記URLにあるSIOSALTさんのコードをベースに、@aNo研 nnnさんのボタン操作の部分を追加してみました。(両者ともコード改造の上転載していいかまだ許可取り中ですが、暫定的に載せてます。まずかったら引っ込めますので…)
ほぼそれぞれの使えるところを使わせてもらった感じです。そういやボタンの省略形ってbtnでなくてbutなのかー。
で、 結局Aボタンを押しても撮影出来てません。何故なんだ。 解決しました。詳細はコード内コメントにて
import sensor
import image
import lcd
import time
from Maix import GPIO # ボタン入力で使います
from fpioa_manager import fm, board_info # @midori564 さんからご指摘いただきましたので1行追加。(何故か私のものは無くても動く→原因解説しているソースありました。 https://maixpy.sipeed.com/en/libs/builtin_py/ )
#タイマー初期設定
clock = time.clock()
#LCD初期設定
lcd.init()
lcd.direction(lcd.YX_LRUD) # デフォルトだとLCD上下逆のため設定。YX:横長 LR 左右順 UD上下順
#カメラ初期設定
sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QVGA)
sensor.set_hmirror(0) # デフォルトだとカメラがミラーに設定されているため
sensor.run(1)
#保存ファイル名初期設定
i = 0 #ファイル名用
#シャッターボタン(ButtonA)初期設定
fm.register(board_info.BUTTON_A, fm.fpioa.GPIO1)
but_a = GPIO(GPIO.GPIO1, GPIO.IN, GPIO.PULL_UP) # GPIO36を指定すると止まってしまったが、桃治トイレBot(Twitter:@momojitoiletbot)さんにfm.register()の設定をした上でGPIO1を使うとうまくいく旨教えてもらい解決しました!
#画面表示
while True:
clock.tick()
img = sensor.snapshot()
lcd.display(img)
#シャッターボタンを押したら
if but_a.value() == 0:
#画像をJPEG形式に保存
filename = "/sd/{0:0=8}.jpg".format(i) # iの数値からファイル名を生成。00000000.jpg から連番
img.save(filename) # ファイル名の初期設定値(filename)で写真を保存
i += 1 # ファイル名の数値を1つ増やす
lcd.draw_string(10,20,filename) # ファイル名を表示
time.sleep(1.0) # 保存した写真をちょっとだけ固定表示
今後どういったものを作りたいか
作っている本人がプログラミング初心者に近いので、
デジカメの基本機能・カスタマイズ要素として、
- 現在、起動ごとにファイル名がリセット・ファイル上書きしてしまうので、その改善
- 起動画面・起動音
- 動作音・シャッター音
- ファイル名を日時分秒プラスαで表現
- Exifデータ(日時場所カメラの情報などのメタデータ)の埋め込み
- セルフタイマー
- 画面回転(縦/横)
- 設定画面
M5StickVの本来の能力を引き出すために
- スマイルシャッター
- 監視カメラ機能(人だけを撮影する)
などもやっていければいいなあと思いました。