M5Stack社 M5StickC用JoyC HAT

概要

M5Stack社の商品紹介です。今回はM5StickC用のJoyC HATです。結構昔に販売開始していますが最近購入してみました。

JoyC HATとは?

スイッチサイエンスさんで2000円ちょっとで購入できるデュアルジョイスティックです。左右にある2つのジョイスティックとどちらの方向に倒れているのかがわかるLEDが搭載されています。さらに16340バッテリーが内蔵されています。

スケッチ例

/*
 * @Author: Sorzn
 * @Date: 2019-11-22 14:48:10
 * @LastEditTime: 2019-11-22 15:45:27
 * @Description: M5Stack project
 * @FilePath: /M5StickC/examples/Hat/JoyC/JoyC.ino
 */
#include "M5StickC.h"
#include "JoyC.h"
JoyC joyc;
TFT_eSprite img = TFT_eSprite(&M5.Lcd);
uint8_t show_flag = 0;
void setup()
{
    M5.begin();
    Wire.begin(0, 26, 400000);
    img.createSprite(80, 160);
}
void loop()
{
    char text_buff[100];
    
    M5.update();
    img.fillSprite(TFT_BLACK);
    if(show_flag == 0)
    {
        img.drawCentreString("angle right", 40, 6, 1);
        sprintf(text_buff, "%d", joyc.GetAngle(1));
        img.drawCentreString(text_buff, 40, 20, 1);
        img.drawCentreString("dis right", 40, 34, 1);
        sprintf(text_buff, "%d", joyc.GetDistance(1));
        img.drawCentreString(text_buff, 40, 48, 1);
        
        img.drawCentreString("x right", 40, 62, 1);
        sprintf(text_buff, "%d", joyc.GetX(1));
        img.drawCentreString(text_buff, 40, 76, 1);
        
        img.drawCentreString("y right", 40, 90, 1);
        sprintf(text_buff, "%d", joyc.GetY(1));
        img.drawCentreString(text_buff, 40, 104, 1);
        img.drawCentreString("press right", 40, 118, 1);
        sprintf(text_buff, "%d", joyc.GetPress(1));
        img.drawCentreString(text_buff, 40, 132, 1);
    }
    else
    {
        img.drawCentreString("angle left", 40, 6, 1);
        sprintf(text_buff, "%d", joyc.GetAngle(0));
        img.drawCentreString(text_buff, 40, 20, 1);
        img.drawCentreString("dis left", 40, 34, 1);
        sprintf(text_buff, "%d", joyc.GetDistance(0));
        img.drawCentreString(text_buff, 40, 48, 1);
        
        img.drawCentreString("x left", 40, 62, 1);
        sprintf(text_buff, "%d", joyc.GetX(0));
        img.drawCentreString(text_buff, 40, 76, 1);
        
        img.drawCentreString("y left", 40, 90, 1);
        sprintf(text_buff, "%d", joyc.GetY(0));
        img.drawCentreString(text_buff, 40, 104, 1);
        img.drawCentreString("press left", 40, 118, 1);
        sprintf(text_buff, "%d", joyc.GetPress(0));
        img.drawCentreString(text_buff, 40, 132, 1);
    }
    img.pushSprite(0, 0);
    
    if(M5.BtnA.wasPressed())
    {
        joyc.SetLedColor(0x100010);    
        show_flag = 1 - show_flag;
    }
    delay(10);
}

上記はM5StickCのスケッチ例にあるJoyCのスケッチ例です。

関数取得値
joyc.GetAngle(0)ジョイスティックを倒している方向
joyc.GetDistance(0)倒している角度
joyc.GetX(0)X座標の傾き
joyc.GetY(0)Y座標の傾き
joyc.GetPress(0)ボタン(0:押されていない, 1:押されている)

上記の関数群が実装されていました。引数の0が左側のジョイスティックで、1を指定することで右側を取得します。

仕組み

M5StickCに隠れる場所になるのですが、電源スイッチがあります。これを入れ忘れて動かないって思う人が多発しているみたいです。

裏側にはバッテリーがあります。このバッテリーを充電する方法はM5StickCに給電するか、取り外して充電器で充電します。

18650 充電器 Hixon 急速 電池充電器 PSE認証 リチウムイオン/単2単3単4形 ニッケル水素/ニカド充電池対応 LCD付き 電池容量測定 USB出力機能付き 2本同時充電可能 Li-ion Ni-MH Ni-Cd IMR 18650 26650 20700 18490 17500 17700 16340 14500 10440 (RCR123A) 充電器 日本語説明書付き
Hixon
★【 PSE認証 幅広い互換性】リチウムイオン電池、ニッケル水素電池、ニカド電池に対応Li-ion/IMR/LiFePO4:26650 20700 18650 18490 17700 17500 14500 10440 16340(RCR123A)。 NiMH/NiCd(ニッケル水素/ニカド):AA(単三) 、AAA(単四)、A 、C(単二) 、SCなどのバッテリーに適用。1本から2本まで混在して充電できます。USB出力機能付き:モバイルバッテリーとして使用可能、車の中でも充電できます。車の中でも充電できます。

おすすめは専用の充電器です。できれば容量を計測できるタイプがあると便利です。M5Stack社の電池は基本的に問題ありませんがAmazonとかで販売している電池は容量が非常に小さなものが多いです。

また、この電池をはずすと下にICが出てきます。STM32F030F4ですね。この石でジョイスティックの値取得とLEDの制御、M5StickCからのI2C通信を行っています。

バッテリーはこの石とLEDの動作のために準備されていました。ちなみにM5StikCからバッテリーへの方向しか流れないようになっています。つまりこのバッテリーを使ってM5StickCを動かすことはできません。

M5StickC系のHATはみんなこの構成ですね。充電回路を付けていないのでM5StickCからの給電の方向のみになっています。個人的には充電回路もHATに内蔵してM5StickCに給電してくれると長期稼働ができて嬉しいんですけれどね。

そして特徴として、箱のサイズがでかいです。2000円ちょっとでこの大きさだと送料が結構かかりますよね(笑)

まとめ

M5StickCに操作を追加したいときにはかなりおすすめだと思います。Rover系の乗り物の操作として使われる事が多いですが、単体でも使うことが可能です。

M5StickC PlusでもJoyC.cppとJoyC.hをコピーすれば利用可能なのですが、ライブラリ形式になっていないのがちょっと不便ですね。時間があるときにESP32 Lite Packあたりでライブラリ化しておきたいと思います。

コメント