ESP32にWROVERというSPI RAM付きモデルが出て、大容量のRAMを使えるようになりました。
そこで、200万画素のCMOSセンサーが作る画像をバッファすることも容易になり、M5Stackシリーズを作っているメーカーから出ているM5Cameraをはじめとして、Omnivision OV2640が載ったESP32ボードが続々登場しています。
購入してすぐ、本体がSoftAPモードで立ち上がり、本体のWebサーバーにブラウザでつなぐとカメラの映像がストリーミングできるなどアツい展開になっています。
ただまあ、映像オタク的にはそれをやるなら別にネットワークカメラやWi-Fi付きデジカメのほうが画質もいいしいいじゃんということで、
マイコンにやらせるなら、実際にはなにかのトリガーで写真を撮ってどこかにアップロードさせたいみたいな用途のほうが強みが発揮できそうです。
そこで、M5CameraでGoogle Driveに写真をアップロードしてみました。
Google Driveは、Drive APIというものが用意されており、これを使うとRESTでファイル操作が可能になります。が、
一番冒頭にリンクさせていただいた、cURLでGoogle Driveにアップロードする方法をご覧いただくとわかるように、認証がやや面倒です。
簡単にまとめると
・APIを登録
・クライアントIDとシークレットキーを取得
・ブラウザでクライアントID付きの登録URLを開いて認証コードを取得(OAuth認証)
・認証コードとクライアントIDとシークレットキーをPOSTしてリフレッシュトークンを取得※
ここまでが初期設定です。
次からがファイルをPOSTするたびに行う操作です。
・リフレッシュトークンとクライアントIDとシークレットキーをPOSTしてアクセストークンを取得
・アクセストークンとファイル、ファイル情報をPOSTしてファイルをアップロード
※アクセストークンには有効期限があり、アクセストークンを取得するためのトークンがリフレッシュトークンです。
そのため、毎回リフレッシュトークンから有効なアクセストークンを取得する必要があります。
これらの操作をすべて行い、実際にM5Cameraで画像をアップロードするサンプルをArduinoで作ってみました。この例をちょっといじれば、カメラ画像以外にも、
ローカルのSPIフラッシュやSDカードに貯めたセンサーデータをまとめてCSVでアップロードするなど、ArduinoでGoogle Driveにファイルをアップロードできます。
さて、このサンプルを使う前にはGoogle DriveのAPIキーを取得する必要があります。
この操作がしょっちゅう画面構成が変わって、探してもやり方が見つからない場合があるので自分用にもメモしておきます。
Google Developers Consoleを開く
プロジェクトの選択をクリック
新しいプロジェクトを適当に作成
認証情報→OAuthクライアントID
同意画面を設定
名前を適当につけて保存
アプリケーションの種類:その他
名前適当で作成
クライアントIDとクライアントシークレットが取得できた。
あとはファームを入れ替えたM5Cameraを起動し、シリアルモニターを開くと、これらを聞いてきて、OAuth認証用コード取得URLが表示されるので、
要求されるコードを入力していくと、SPIフラッシュにそれらが保存されて次からは電源を入れるだけでGoogle Driveに写真を撮ってアップロードしてくれます。