ユーザ用ツール

サイト用ツール


ハイハイスクールアドベンチャー_m5stack_m5cardputer版

差分

このページの2つのバージョン間の差分を表示します。

この比較画面へのリンク

両方とも前のリビジョン前のリビジョン
次のリビジョン
前のリビジョン
ハイハイスクールアドベンチャー_m5stack_m5cardputer版 [2024/02/07 08:58] – [概要] arakiハイハイスクールアドベンチャー_m5stack_m5cardputer版 [2024/02/07 09:27] (現在) – [M5Cardputerについて] araki
行 54: 行 54:
 それぞれ、platformio.ini に明記されているので、プロジェクトとして開いたら良しなにやってもらえるはずだ。 それぞれ、platformio.ini に明記されているので、プロジェクトとして開いたら良しなにやってもらえるはずだ。
  
-ターゲットは、M5Stack-grey, M5Stack-core2, M5Cardputerが用意してあるが、M5Stack-core2はPSRAMを使用するケースを想定して定義してあるが、実際は使う必要がないのでこのターゲットを使う必要はない。+ターゲットは、M5Stack-grey, M5Stack-core2, M5Cardputerが用意してあるが、M5Stack-core2はPSRAMを使用するケースを想定して定義してあるものなので使う必要がないため、このターゲットは無視して構わない。((ビルドしてできたバイナリはPSRAM搭載しているCore/Core2で使用可能だが、PSRAMを使わないので意味はない。))
 M5Stack Core2であっても M5Stack-grey でビルドしたバイナリを使用可能である。 M5Stack Core2であっても M5Stack-grey でビルドしたバイナリを使用可能である。
 M5 Cardputer用は M5Cardputerをターゲットとしてビルドしたものを使用する。 M5 Cardputer用は M5Cardputerをターゲットとしてビルドしたものを使用する。
  
 +{{::hhsadv:platformio_targets.png?400|PlatformIOターゲット}}
 +
 +===== あれこれ =====
 +
 +==== M5Cardputerについて ====
 +
 +M5Cardputerについては240x135ピクセルの1.14インチ液晶を持つが、これはハイハイスクールアドベンチャーの画像データが想定してる256x152ピクセルよりも小さい。
 +
 +なので、当初は移植対象から除外していたのだが、GFXライブラリーは、バッファの画像をアフィン変換してLCDに転送する機能を持っていると知ったため、後から対象にした。
 +
 +256x152の画面を縮小しているが、画像についてはおおむね問題ないレベルで表示できていると思う。
 +
 +問題は、メッセージエリアである。
 +勿論ここも8x16/16x16のフォントで描画したものをアフィン変換して転送しているのだが、視力に挑戦といったレベルになっている。
 +頑張れば読めるというレベルで、これを初見でプレイするのは厳しいだろう。
 +
 +キーボードもSIOで通信しているFACESのキーボードと違い、キーマトリックスがGPIOにもろに露出した形になっているため、GPIOから得たキーマップをキーコードに変換してやらないと使い物にならない。
 +幸い、このあたりも M5Cardputerのライブラリがまとめて面倒を見てくれているので、アプリを書くにあたっては困らないが、コードに差異が生じるので理解しておかないといけない。
 +
 +==== ピンアサインなど ====
 +
 +M5シリーズは、ぽいぽいピンアサインが変わるので、このあたりも留意していなければならない。
 +SDカードやキーボードの割り当てはちゃんと機種を見て動作を変えないといけない部分だ。
 +
 +例えば、SDカードのマウントは以下のようにしている。
 +Core/Core2なら 用意されているSPIを使えば動くが、Cardputerはそこもまとめて面倒をみないといけない。
 +
 +<code>
 +    cfg.clear_display = true;
 +    M5.begin(cfg);
 +    uint8_t ssPin = M5.getPin(m5::pin_name_t::sd_spi_ss);
 +    if (M5.getBoard() == m5::board_t::board_M5Cardputer)
 +    {
 +      M5Cardputer.begin(cfg);
 +      spi.begin(
 +        M5.getPin(m5::pin_name_t::sd_spi_sclk),
 +        M5.getPin(m5::pin_name_t::sd_spi_miso),
 +        M5.getPin(m5::pin_name_t::sd_spi_mosi),
 +        M5.getPin(m5::pin_name_t::sd_spi_ss)
 +      );
 +    }
 +    else
 +    {
 +      spi = SPI;
 +    }
 +    M5.Display.setRotation(1);
 +    Serial.printf("Free heap size: %6d\r\n", esp_get_free_heap_size());
 +    // mount SD (need for M5Unified library)
 +    while (false == SD.begin(ssPin /*GPIO_NUM_4*/, spi, 25000000))
 +    {
 +      M5.Display.println("SD Wait ...");
 +      delay(500);
 +    }
 +</code>
 +
 +キーボードも Cardputerはさておき、CoreとCore2とではピンアサインが違うため、コードを変えないといけない。
 +こっちは、KeyBoardという仮想クラスを作っておいてボードによってインスタンスを変えることで対応している。
 +
 +CoreはWireでINTR=5だが、Core2はWire1でINTR=33だ。
 +
 +<code>
 +class M5StackKeyBoard : public KeyBoard
 +{
 +protected:
 +public:
 +    M5StackKeyBoard() : KeyBoard(m5::board_t::board_M5Stack)
 +    {
 +        Wire.begin();
 +        pinMode(INTR, INPUT);
 +        digitalWrite(INTR, HIGH);
 +    }
 +    virtual ~M5StackKeyBoard() { Wire.end(); }
 +    virtual bool wait_any_key() override;
 +    virtual bool fetch_key(uint8_t &c) override;
 +
 +    static const int INTR = 5;
 +};
 +
 +class M5Core2KeyBoard : public KeyBoard
 +{
 +protected:
 +public:
 +    M5Core2KeyBoard() : KeyBoard(m5::board_t::board_M5StackCore2)
 +    { 
 +        Wire1.begin();
 +        pinMode(INTR, INPUT);
 +        digitalWrite(INTR, HIGH);
 +    }
 +    virtual ~M5Core2KeyBoard() { Wire1.end(); }
 +    virtual bool wait_any_key() override;
 +    virtual bool fetch_key(uint8_t &c) override;
 +
 +    static const int INTR = 33;
 +};
 +</code>
ハイハイスクールアドベンチャー_m5stack_m5cardputer版.1707263892.txt.gz · 最終更新: 2024/02/07 08:58 by araki