ひとしれずひっそり

主にソフトに関することをメモしていきます。過程をそのまま書いていたりするので間違いが含まれます。鵜呑みしない様に。

M5StackデバイスでPC側で通信ポートが認識できない時

M5StackデバイスでPC側で通信ポートが認識できない事がよくある。

(サーボ)モーターやリレーを使っていたりすると良くあって、M5Stackデバイス単体にすると認識される様になったりする。
多分電源が安定しなくなるとか逆起電力のせいとかで影響されて認識できないとかではないかと思う。
そういうときはAボタンなどを押して起動した時に、モーターやリレーのIOを使う前に無限ループの待ち状態にするとハードはそのままで通信できる用になる。

https://github.com/katsuyoshi/info-calc/blob/main/platformio/info_calc/src/main.cpp#L856-L863

    M5.update();
    // サーボが動き出すと通信ができなくなるのでAボタンを押しながら起動すると
    // サーボ初期化せず書き込みできる様にここで停止させる。
    if (M5.BtnA.isPressed()) {
        while(true) {
            delay(1000);
        }
    }

これ以外でも認識できなくなることはあるが、VSCodeを立ち上げ直したら認識できたとか、リセットやAボタン押しながら書き込みするとかある。
それでもダメで何でーってなることもある。

G0をLOWにしてリセットかければダウンロードモードになるというのをラングシップの記事で今知った。
ENがリセットになっているのも知らなかった。M5StampとかリセットボタンがないのでUSBケーブル抜き差ししたり無駄にプログラムをもう一回書いたりしていたがENを一旦LOWにすればいいのか。

lang-ship.com

rst:0x7 (TG0WDT_SYS_RST),boot:0x8 (SPI_FAST_FLASH_BOOT)

なんかの拍子にM5StampS3でプログラム書き込み後に以下のリブートがかかって全然動かなくなってしまった。

rst:0x7 (TG0WDT_SYS_RST),boot:0x8 (SPI_FAST_FLASH_BOOT)

検索して以下が見つかった。

community.platformio.org

platformio.iniに以下を追加して解決した。

board_build.flash_mode = dio

前にもこんな設定した様な気がするが…

Guru Meditation Error: Core 1 panic'ed (IllegalInstruction)

M5StampS3でSakurIOのライブラリーで以下のエラーがでて再起動してしまう。

Guru Meditation Error: Core  1 panic'ed (IllegalInstruction). Exception was unhandled.

I2C通信している箇所でstartReceive()を呼び出して戻って来てないっぽい。

  this->startReceive(reservedResponseLength+3);
  result = this->receiveByte();

startReceiveの終わりに"end startReceive"を出力する様にしたら出力されているのでここまでは実行されている様だ。

uint8_t SakuraIO_I2C::startReceive(uint8_t length){
  dbg("requestForm=");
  dbgln(length);
  Wire.requestFrom((uint8_t)SAKURAIO_SLAVE_ADDR, length, (uint8_t)true);
  mode = MODE_READ;
  dbgln("end startReceive");
  delay(100);
}

あとは戻るだけなのでスタックに問題がありそう。
とここまで書いていて気づいた。

こちらでreturnがない時にとあって、startReceiveにはreturnがないではないか。 多分これか?

reject.tokyo

returnがないとスタックがずれちゃいそうだな。
M5StampPicoで使っていたときは問題なかったけど、レジスタの使い方やスタックの使い方の違いとかでたまたまうまく行ってただけの様だ。

PlatformIOの環境更新したら直るかと思って実行してしまった後で気づいて、更新が終わるまで2時間以上かかりそうなので、明日試す。

追記(1/6):
やっぱりreturn 追加したらクラッシュしなくなった。
一応pull request出した(*1)けどSakuraIOモジュール自体もう供給されてないので反映されるかは分からないのと、他にもWire.begin()しないようにしたりしたいので、今後はforkした自分のプロジェクトを使う事にする。

github.com

*1: masterブランチからpull request出してしまって後から追加した変更がpull requestにも追加されてしまったので一旦取り消した。

lineworks-api-ruby作り始めた

今年はLINE WORKSを活用する予定なのでRubyでアクセスできる様にということで年末から少しずつやっている。
LINE用の

github.com

で endpoint を変更するだけで使えるかと思って作業していたが、APIが異なるのでそうでもないことが分かってきた。
line-bot-sdk-rubyにlineworksフォルダを作って分離して作業していたが、line-bot-sdk-rubyを参照して別Gemにするべきと気づいて

github.com

こちらに独立させた。
最後のrubyは不要ではないかという気もするが、line-bot-sdk-rubyに倣って入れてみた。
後で削除するかもしれない。

今のところ勝手仕様で進めているので、後で都合が悪くなるとバッサリ作り変えるかもしれないので、使う場合は注意を。
しばらく誰の目にも止まらないと思うけど…

Fusion360で基板上の名前が表示されなくなったとき

何らかのタイミングでR1とかU1とかのデバイスの名前が表示されなくなった。

こちらが解決策

www.autodesk.co.jp

  • 部品を選択し、右クリック
  • 位置を復元を選択
  • このまま続けて部品の基準点(+マーク)を次々クリックしていくと次々と復元されていく

Fusion360で基板作成時のネットクラス(Net class)設定

Fusion360で基板を作成した事はあるが2年前でもう忘れてしまった。
というか回路作成するところから忘れていたのだが検索を頼りになんとか作れた。

基板の配線をする段階でオートルータで線を引いていくがどうも線が細い気がする。

当然思い出せないのだけど、ネットクラス設定が必要の様だ。
その設定の仕方が分からない。Fusion360は機能が多いので操作を覚えきれないのでメモしておく。

ネットクラス設定

  • デザインマネージャータブを選択する
  • ビューから信号を選択する

  • ネットクラスのビューで右クリックすると編集メニューが表示される。

  • POWRクラスを追加ボタンで作成し関連するメンバー(線番号)をグループ化する
    • 最初VCCやGNDだけ入れていたが、スイッチなどにつながっている線などもあってそれを入れてなかった
    • 電源に関する線はなんらかわかりやすい名前を入れて選びやすくする様にした方が選択肢やくすなる

  • ルールタブで線幅やクリアランスを設定する。
    • 前回何か見て設定した数値を今回も用いる。
    • 本来はきちんと電流値を調べて設定しないといけないと思うが…

という事で基板レイアウトができるところまで来た。

M5Stamp TimerPower

暫く前にM5Stamp TimerPowerを買っていたが放置していたのを試してみた。

公式ドキュメントを見るタイミングでメンテナンスになっていたのか404でどうしょう?ってなったけど次の日には復旧していた。

docs.m5stack.com

サンプルコードはこちらにある。

github.com

M5Atomでの例なのでM5Atom Liteと接続する。
配線はこの様にする。

TimerPower M5Atom Lite 備考
SCL G21(SCL) 4.7KΩプルアップ
SDA G25(SDA) 4.7KΩプルアップ
5V OUT 5V
GND GND
HOLD G19
3V3EN G23
BAT IN リチウムバッテリープラス側
GND リチウムバッテリーのマイナス側

BAT INは3.7Vを想定している様でとりあえずエネループ3本を使用した。

TimerPowerがGROVEコネクタ対応だったのでGROVEコネクタで試したがWireはG21, G25の組み合わせになっていてはまった。
おまけにプルアップしてなくて通信がうまくいってなかった。

動作

動作は次の様になっている。

  • TimerPowerのボタンを押す。
    • これでバッテリーからDC-DCコンバータで5Vが供給されM5Atom Liteが動作する。
    • M5AtomのIO出力がされるまで押さないと電源が切れてしまう。
    • M5AtomがRTCとI2C通信できるとLEDが緑色になる。
    • 通信が失敗するとLEDが紫に色になる。
  • M5Atomのボタンを押す
    • LEDが青色になる。
    • 3V3ENをLOWにするので3V3 OUTの出力が停止し0Vになる。
  • M5Atomのボタンを押す
    • LEDが白色になる。
    • 3V3ENをHIGHにするので3V3 OUTの出力がでて3Vになる。
  • M5Atomのボタンを押す
    • RTCに2秒後にWAKE UPする様にセットしHOLDをOFFにし5V OUTが停止しM5Atomの電源が切れる。
  • 2秒後
    • RTCからTimerPowerがWAKE UPされ再びM5Atomの電源が入る。
  • M5Atomのボタンを長押し
    • LEDが赤色になる。
    • ボタンを離すと電源が切れる。次の起動はTimerPowerのボタンで投入する必要がある。

TimerPowerの出力が切れるので今までM5Atomをdeep sleepさせてもぶら下がっているセンサーやデバイスのせいで待機電流が下がらないのを解決できそう。

TimerPowerのボタンを押して最初の電源を投入したが、WAKE入力があるのでそこから引き出してスイッチと接続して電源投入スイッチとして使うのがよさそう。

5VINから供給するとバッテリーを充電してくれる。多分。

                        rtc.WakeAfterSeconds(2);

の秒数を変えるとインターバルを変更できる。