PlatformIOでTimer Camera Xを動かしてみる

M5Stack社のTimer Camera XをPlatformIOで動かそうとしましたがうまくいかなかったので記録しておきます。  
といっても要点は1点のみです。  


Timer Camera Xについてはこちらを参照してください。

https://www.switch-science.com/catalog/6742/


Arduino IDEでの開発についてはこちらにドキュメントがあります。

https://docs.m5stack.com/en/quick_start/timer_cam/arduino


このドキュメントに従ってPlatformIOで作成していきます。  
PlatformIOはセットアップ済みとして進めていきます。

## プロジェクト作成

- PlatfromIOのHOME画面からNew Projectを選択します。

![スクリーンショット 2022-07-23 14.52.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8941/535fbfba-c2bd-7708-ff74-1429bb962a1b.png)

- Nameにプロジェクト名を入れます。LEDを点滅させる例なのでTimerCamLEDとしています。  
- BoardでM5Stack Timer CAMを選択します。 
- 他はそのままにしてFinishボタンを押します。

![スクリーンショット 2022-07-23 14.50.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8941/5b27eee6-ea9b-288a-22c4-baad6ec3321b.png)

## Timer-Cam Libraryインストール

LibraryでTimer-Camをインストールします。

- PlatfromIOのHOME画面でLibrariesを選択しTimerCamで検索すると出てきます。

![スクリーンショット 2022-07-23 15.01.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8941/9e458279-6dd3-fbd9-b2c8-ac385f5f0511.png)

- Timer-Camを選択しAdd to Projectボタンを押します。

![スクリーンショット 2022-07-23 15.02.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8941/6e6ab053-3d8a-35ad-67ac-22750c97b430.png)

- Select a projectと表示されている項目で先ほど作ったプロジェクトを選択しAddボタンを押します。

![スクリーンショット 2022-07-23 15.08.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8941/6d3db17d-153f-6c08-e40d-8976a94fe143.png)

## Build

ドキュメントにあるコードをmain.cppに貼り付けます。  
定義が反映されないため生成されたコードから```#include <Arduion.h>```を残し他をドキュメントのコードで書き換えます。

```
#include <Arduino.h>
#include "battery.h"

void setup() {
  Serial.begin(115200);
  bat_init();
  pinMode(2, OUTPUT);
}

void loop() {
  // put your main code here, to run repeatedly:
  digitalWrite(2, HIGH); 
  delay(1000);
  digitalWrite(2, LOW); 
  delay(1000);
}
```

ここでBuildしてみるとうまくいきました。  
Buildは下のステータスバーの✔️マークで行います。


![スクリーンショット 2022-07-23 15.18.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8941/8fe89136-b25d-bcea-c64d-f1d7f2c41f1d.png)

## Upload

Buildが成功したのでTimer Camera XにUploadしてみます。  
Timer Camera Xとパソコンをケーブルで接続しUploadボタン(→アイコン)を押します。


![スクリーンショット 2022-07-23 15.22.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8941/87d6eabc-6201-3bb0-86b7-c68ef9959f88.png)

ここでUploadに失敗してしまいました。通信レートを460800で接続しようとしています。  
Arduino IDEで試してみると1500000で接続している様なのでそれが原因でできないかと思われます。  

Platform.iniファイルに```upload_speed = 1500000```を追加します。(0が5個です)

```
[env:m5stack-timer-cam]
platform = espressif32
board = m5stack-timer-cam
framework = arduino
lib_deps = m5stack/Timer-CAM@^0.0.2
upload_speed = 1500000
```

これでUploadしてみると、ようやくうまくいきました。

![スクリーンショット 2022-07-23 15.44.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8941/845ec5fe-a557-5a17-9f95-938cd3de9089.png)

一応動作した様子もこちらに上げておきます。

https://youtube.com/shorts/kWn_oOoWblY?feature=share

## まとめ

upload_speedが合ってなくて失敗していただけでした。  
Timer Camera Xは本来画像を撮るデバイスなので、そちらも後ほどトライしてみます。


## 追記

Timer Camera XはPower OFFのボタンがないため、バッテリー切れになるまで点滅を繰り返すため、5分後にdeep sleepに入る様にしました。

```
#include <Arduino.h>
#include "battery.h"

unsigned long launched_at;

#define SHOUTDOWN_TIME  (5 * 60 * 1000)

void setup() {
  launched_at = millis();
  Serial.begin(115200);
  bat_init();
  pinMode(2, OUTPUT);
}

void loop() {
  // put your main code here, to run repeatedly:
  digitalWrite(2, HIGH); 
  delay(1000);
  digitalWrite(2, LOW); 
  delay(1000);

  if (millis() - launched_at > SHOUTDOWN_TIME) {
    while(true) {
      esp_deep_sleep(-1);
    }
  }
}
```

deep sleepに入ったらONスイッチを押すと動き出します。