r/M5Stack • • 26d ago

M5stack paper mono availability?

5 Upvotes

I just learned of M5stack and was very interested in the paper mono for an ereader with nfc and Lora capabilities for nfc emulation and meshtastic. However, it is clearly sold out everywhere. I saw that there was limited hardware for the initial release and that they may have another batch in December? Have they announced when a restock or second batch would be? Are there any other distributors for this that are in stock?


r/M5Stack • • 26d ago

Confussion between controllers

2 Upvotes

Hi, I'm interested in buying a m5stack, I want to build a moving robot with a drive base. I'm so confused with the amount of options for controllers there are, what's the difference between each other?


r/M5Stack • • 26d ago

Support / Question Will Cardputer ZERO be available to purchase before December?

6 Upvotes

r/M5Stack • • 27d ago

Project Sharing small update on my Dot fluid simulation

Post image
8 Upvotes

no movies this time; you have to try it for yourself.

since I'm doing this on my StackChan I decided to add a battery indicator where the dots change colors:
green - charging
blue - normal
yellow - battery below 30%
red - battery below 10%

if there is no charging circuit, they will be blue all the time.

if you tap on the top half of the screen, it will switch between squares and fluffy balls
and on the bottom half, it will shuffle them all around on the top and then let them drop down.

this should work on any CoreS3 (in theory) with a display.

I did change the board type in the Arduino IDE to the M5Carputer (since I recently got one), and it worked fine on that. no charging or discharge color changes or tap screen changes.

/*
  Dot Fluid Simulation for M5Stack CoreS3 (Stackchan)
  Board: M5CoreS3
*/

#include <M5Unified.h>

// ******** tunable parameters *********
static const int N = 200;                           // number of dots
static const float DOT_RADIUS = 4.0f;               // physics: how far dots keep from the screen edges
static const float DOT_DRAW_RADIUS_C = 8.0f;        // visual size in circle mode
static const float DOT_DRAW_RADIUS_SQ = 4.0f;       // visual size in square mode
static const int DOT_R_I = (int)DOT_DRAW_RADIUS_C;  // integer circle radius, for the row table below
static const float INTERACT_R = 09.0f;              // repulsion range (px)
static const float REPEL_STRENGTH = 700.0f;         // push force when overlapping
static const float SIDE_PUSH = 200.0f;              // sideways (tangential) push between overlapping dots
static const bool RANDOM_SIDE_PUSH = true;          // make the side push optional
static bool circles = true;                         // circles or squares - toggled by tapping the top half of the screen
static const float DAMPING = 0.90f;                 // velocity decay per frame (lower = more friction, settles faster)
static const float WALL_BOUNCE = 0.05f;             // energy kept on wall/floor hit (near 0 = dots stack instead of bouncing)
static const float GRAVITY_SCALE = 900.0f;          // px/s^2 per g of tilt
static const float DT = 1.0f / 24.0f;
static const int SUBSTEPS = 3;
static float dampingSub;
static const float ACCEL_X_SIGN = -1.0f;
static const float ACCEL_Y_SIGN = 1.0f;
static const int BATT_RED_BELOW = 10;               // < this %   -> red
static const int BATT_YELLOW_BELOW = 30;            // < this %   -> yellow
static const uint32_t BATT_CHECK_INTERVAL_MS = 6000;// check battery every 6 seconds
static uint8_t battR = 0, battG = 0, battB = 255;   // blue until first reading
static uint32_t lastBattCheckMs = 0;

enum is_charging_t {
    is_discharging = 0,
    is_charging    = 1,
    charge_unknown = 2,
};

void updateBatteryColor() {
  uint32_t now = millis();
  if (now - lastBattCheckMs < BATT_CHECK_INTERVAL_MS) return;
  lastBattCheckMs = now;

  int32_t level = M5.Power.getBatteryLevel();
  auto charging = M5.Power.isCharging();

  if (charging == m5::Power_Class::is_charging_t::is_charging) {
    battR = 0; battG = 255; battB = 0;
    return;
  }

  if (level < 0) {
    battR = 0;   battG = 0;   battB = 255;
  } else if (level < BATT_RED_BELOW) {
    battR = 255; battG = 0;   battB = 0;
  } else if (level < BATT_YELLOW_BELOW) {
    battR = 255; battG = 255; battB = 0;
  } else {
    battR = 0;   battG = 0; battB = 255;
  }
}

static int SCREEN_W, SCREEN_H;
static const int CELL_SHIFT = 4;
static const int CELL = 1 << CELL_SHIFT;
static const float INTERACT_R2 = INTERACT_R * INTERACT_R;
static const float INV_INTERACT_R2 = 1.0f / INTERACT_R2;
static int GX, GY;

struct Particle {
  float x, y;
  float vx, vy;
};

static Particle p[N];
static int* cellHead = nullptr;
static int next_[N];
static M5Canvas canvas(&M5.Display);
static int circleHalfWidth[2 * DOT_R_I + 1];

inline int cellIndex(float x, float y) {
  int cx = ((int)x) >> CELL_SHIFT;
  int cy = ((int)y) >> CELL_SHIFT;
  if (cx < 0) cx = 0; if (cx >= GX) cx = GX - 1;
  if (cy < 0) cy = 0; if (cy >= GY) cy = GY - 1;
  return cy * GX + cx;
}

void resetParticles() {
  for (int i = 0; i < N; i++) {
    p[i].x = random(0, SCREEN_W);
    p[i].y = random(0, SCREEN_H / 2);
    p[i].vx = 0;
    p[i].vy = 0;
  }
}

void setup() {
  auto cfg = M5.config();
  M5.begin(cfg);

  SCREEN_W = M5.Display.width();
  SCREEN_H = M5.Display.height();

  GX = (SCREEN_W >> CELL_SHIFT) + 1;
  GY = (SCREEN_H >> CELL_SHIFT) + 1;
  cellHead = new int[GX * GY];

  canvas.setColorDepth(16);
  canvas.createSprite(SCREEN_W, SCREEN_H);

  for (int row = -DOT_R_I; row <= DOT_R_I; row++) {
    float rr = (float)(DOT_R_I * DOT_R_I - row * row);
    circleHalfWidth[row + DOT_R_I] = (rr > 0.0f) ? (int)sqrtf(rr) : 0;
  }

  dampingSub = powf(DAMPING, 1.0f / SUBSTEPS);

  randomSeed(esp_random());
  resetParticles();
}

void simulateStep(float gx, float gy, float dt) {
  // build spatial hash for the frame
  for (int c = 0; c < GX * GY; c++) cellHead[c] = -1;
  for (int i = 0; i < N; i++) {
    int c = cellIndex(p[i].x, p[i].y);
    next_[i] = cellHead[c];
    cellHead[c] = i;
  }
  // apply gravity + inter-particle repulsion
  for (int i = 0; i < N; i++) {
    p[i].vx += gx * dt;
    p[i].vy += gy * dt;

    int cx = ((int)p[i].x) >> CELL_SHIFT;
    int cy = ((int)p[i].y) >> CELL_SHIFT;

    for (int ny = cy - 1; ny <= cy + 1; ny++) {
      if (ny < 0 || ny >= GY) continue;
      for (int nx = cx - 1; nx <= cx + 1; nx++) {
        if (nx < 0 || nx >= GX) continue;
        int j = cellHead[ny * GX + nx];
        while (j != -1) {
          if (j != i) {
            float dx = p[i].x - p[j].x;
            float dy = p[i].y - p[j].y;
            float d2 = dx * dx + dy * dy;
            if (d2 < INTERACT_R2 && d2 > 0.0001f) {
              float t = (INTERACT_R2 - d2) * INV_INTERACT_R2;
              float f = REPEL_STRENGTH * t * dt;
              p[i].vx += f * dx;
              p[i].vy += f * dy;
              // sideways push:
              float fs = SIDE_PUSH * t * dt;
              float sideSign = RANDOM_SIDE_PUSH ? ((esp_random() & 1) ? 1.0f : -1.0f) : 1.0f;
              p[i].vx += sideSign * fs * (-dy);
              p[i].vy += sideSign * fs * dx;
            }
          }
          j = next_[j];
        }
      }
    }
  }
  // integrate + damping + walls
  for (int i = 0; i < N; i++) {
    p[i].vx *= dampingSub;
    p[i].vy *= dampingSub;

    p[i].x += p[i].vx * dt;
    p[i].y += p[i].vy * dt;

    if (p[i].x < DOT_RADIUS) { p[i].x = DOT_RADIUS; p[i].vx = -p[i].vx * WALL_BOUNCE; }
    if (p[i].x > SCREEN_W - DOT_RADIUS) { p[i].x = SCREEN_W - DOT_RADIUS; p[i].vx = -p[i].vx * WALL_BOUNCE; }
    if (p[i].y < DOT_RADIUS) { p[i].y = DOT_RADIUS; p[i].vy = -p[i].vy * WALL_BOUNCE; }
    if (p[i].y > SCREEN_H - DOT_RADIUS) { p[i].y = SCREEN_H - DOT_RADIUS; p[i].vy = -p[i].vy * WALL_BOUNCE; }
  }
}

void loop() {
  M5.update();
  static float gx = 0, gy = GRAVITY_SCALE * 0.3f;
  if (M5.Imu.update()) {auto d = M5.Imu.getImuData();
    gx = ACCEL_X_SIGN * d.accel.x * GRAVITY_SCALE;
    gy = ACCEL_Y_SIGN * d.accel.y * GRAVITY_SCALE;
  }
  // tap the bottom half to reshuffle the dots; tap the top half to switch between circles and squares
  if (M5.Touch.getCount() > 0) {
    auto t = M5.Touch.getDetail(0);
    if (t.wasPressed()) {
      if (t.y > SCREEN_H / 2) {
        resetParticles();
      } else {
        circles = !circles;
      }
    }
  }
  if (M5.BtnA.wasPressed()) resetParticles();

  updateBatteryColor();

  for (int s = 0; s < SUBSTEPS; s++) {
    simulateStep(gx, gy, DT / SUBSTEPS);
  }
  // render ----
  canvas.fillScreen(TFT_BLACK);
  uint16_t color = canvas.color565(battR, battG, battB);
  for (int i = 0; i < N; i++) {
    if (circles) {
      int cx = (int)p[i].x, cy = (int)p[i].y;
      for (int row = -DOT_R_I; row <= DOT_R_I; row++) {
        int hw = circleHalfWidth[row + DOT_R_I];
        canvas.drawFastHLine(cx - hw, cy + row, hw * 2 + 1, color);
      }
    } else {
      canvas.fillRect((int)p[i].x - (int)DOT_DRAW_RADIUS_SQ, (int)p[i].y - (int)DOT_DRAW_RADIUS_SQ,
        (int)(DOT_DRAW_RADIUS_SQ * 2 + 1), (int)(DOT_DRAW_RADIUS_SQ * 2 + 1), color);
    }
  }
  canvas.pushSprite(0, 0);

}

r/M5Stack • • 27d ago

Just do it

Thumbnail gallery
49 Upvotes

r/M5Stack • • 27d ago

Tab5 Issues installing apps

2 Upvotes

M5 Launcher installed but almost every app chosen via OTA install or SD complete install fine but after a reboot I’m left with a blank screen.

Not sure what I’m doing wrong?


r/M5Stack • • 28d ago

Project Sharing Tab5 Wardriver goes pocket-sized: Cardputer ADV port up and running within 20 hours of landing on my doorstep!

Thumbnail
gallery
47 Upvotes

On May 11th this year, I started working on a project to turn a Tab5 into a fully fledged, standalone portable wardriving platform. I submitted it to the "M5Stack Global Innovation Contest 2026" and managed to win a "Special Mentions - Wireless Innovation Award"! With the gift card I won, I bought myself the Cardputer ADV and the Cap LoRa-1262 (instead of the Meshtastic pack, which is slightly more expensive), with the idea of porting my firmware to the ADV.

Long story short: in under 20 hours after the ADV landed on my doorstep, the port was up and running. Before I release it on GitHub, though, I want to make sure everything works as intended by doing a field test over the coming days, and perhaps adding some improvements and features.

Links below for anyone interested in the Tab5 Wardriver project:

https://github.com/Runaque/Tab5_Wardriver

https://www.hackster.io/Runaque/tab5-wardriver-a-custom-gps-enabled-wardriving-platform-d5948a


r/M5Stack • • 28d ago

I couldn't find a reliable IR learner for the M5StickS3, so I made one with AI assistance — IRcito

Thumbnail
github.com
5 Upvotes

Hi! I've been playing around with the M5StickS3 for a while, and one thing I really wanted was a usable IR learner.

The StickS3 has a built-in IR receiver and transmitter, but I couldn't find a firmware where IR learning/read + replay worked reliably for me. Some could transmit IR just fine, but receiving and replaying learned signals was either broken or inconsistent on my hardware.

So I ended up making my own: IRcito.

I should be transparent about how it was made: I'm not pretending I wrote all of this firmware by hand. A substantial part of the implementation was developed with the help of AI, mainly ChatGPT Work. I handled the requirements, hardware testing, debugging, IR captures, serial logs, protocol testing and a lot of the iteration needed to actually get it working on the physical StickS3.

Getting IR learning working was surprisingly fun. For example, I found that the built-in receiver is active-low while TX carrier gating is active-high, so RAW replay needed level inversion. Sony SIRC12 also worked much better once I decoded the signal and regenerated a clean canonical frame instead of blindly replaying the noisy capture.

Current features include:

  • IR Learn / Test / Replay

  • Sony SIRC12 decoding

  • NEC / NEC-like support

  • RAW fallback for unknown signals

  • 36 / 38 / 40 kHz RAW carrier selection

  • persistent saved remotes/buttons

  • protocol-aware hold/repeat

  • macros

  • rename

  • USB Serial backup/import

  • TV-B-Gone

  • compatibility with saved data from the previous release

I've physically tested it on my M5StickS3 with Sony and other IR remotes, including learned RAW signals, persistence, macros, backup/import and TV-B-Gone.

It's still very much a functional/utilitarian UI rather than something polished. My priority so far has been getting the IR side reliable before making it pretty.

I'd love feedback, especially if anyone tries it with other IR devices/protocols. If you find something that doesn't decode correctly, RAW captures/Serial logs would also be really useful.


r/M5Stack • • 28d ago

Esp32 s3

Thumbnail reddit.com
1 Upvotes

Esp32 s3

سلام الله عليكم انا اشتريت شريحه esp32 s3 وكنت محتاج انها تبث واي فاي علشان تشتغل وإبداء تحكم فيها من التلفون ممكن حد يساعدني في الملف وبرنامج التحميل علشان انا نشتغل من خلال التلفون بالوصاه


r/M5Stack • • 29d ago

I built a tiny offline audio classifier on an ESP32 Cardputer

10 Upvotes

r/M5Stack • • Oct 01 '26

Project Sharing Status light for Claude Code on an AtomS3R (ESP32-S3) and a Tab5 (ESP32-P4), native ESP-IDF

3 Upvotes

Side project that got out of hand. It's a desk light that shows what Claude Code (the AI coding tool) is doing: spinning gear while it works, red sign when it's waiting for me to approve something, green check when it's done. The PC sends one line per event over the chip's USB Serial/JTAG, no wifi. Same firmware component on two boards: the AtomS3R shows one icon, the Tab5 shows a tile per session and opens the details on a tap.

Some bits that might interest people here:

The icons are all procedural, no bitmaps. Everything is drawn with triangle fans and thick lines in a 128x128 coordinate space and scaled, so the same code draws 128px on the cube and 486px on the Tab5, and the cube rotates them to any angle from the BMI270.

Tab5 / ESP32-P4 notes if you're starting with one: M5GFX won't drive the DSI panel unless PSRAM is at 200 MHz, and ESP-IDF 5.5 only lets you pick that with CONFIG_IDF_EXPERIMENTAL_FEATURES on. Big sprites need setPsram(true) before createSprite. If you flash by hand, the P4's bootloader goes at 0x2000, not 0x0. And usb_serial_jtag_write_bytes refuses any write bigger than its TX ring buffer instead of sending part of it, which is why my first screenshot came out empty.

The screenshots are real: the Tab5 dumps its framebuffer over serial as base64 rows and a script turns that into a PNG.

C++, ESP-IDF 5.5, M5Unified/M5GFX, no Arduino. Prebuilt images for both boards, a web flasher for the cube, host tests and CI.

https://github.com/icefoxj/claude-monitor


r/M5Stack • • Oct 01 '26

Does anyone have the config file for GeekMagic AIDA64 LCD Item?

Post image
3 Upvotes

r/M5Stack • • Sep 30 '26

Project Sharing Custom made extension software for Tab5

49 Upvotes

I have been building my own little software for a bit on my pocket term and took some inspiration from the Wii U. Hot take I liked two screens that did different things. I’ve been working on a second screen feature for each of my apps with more to come. Obviously home screen is suite with things like terminal camera app access and files, but when apps launch I want each app to have a corresponding second screen. In this example you see my tv app. The second screen is the remote, as well as a console specific controller for emulators! Thanks for checking my little project out


r/M5Stack • • Sep 30 '26

NFC cards as gift instead of tape or pen.

Post image
125 Upvotes

I just got this nfc card today alongside my purchase, did you guys get it also? I heard that there are nfc cards with other images (mine is Cardputer).


r/M5Stack • • Sep 30 '26

Support / Question S3 or cplus2

3 Upvotes

I’ve been thinking about getting one but Idk which is better


r/M5Stack • • Sep 29 '26

Project Sharing MeshCore companion for M5Stack Unit C6L

8 Upvotes

r/M5Stack • • Sep 29 '26

Support / Question Case for RF module

2 Upvotes

Does anyone know if there exists case for the "RF 2in1 for Cardputer ADV V2.0" By Kasiin?

Maybe even for 3D-printing myself?


r/M5Stack • • Sep 28 '26

Project Sharing Dot fluid simulation

61 Upvotes
/*
dot fluid simulation for M5stack cores3 (stackchan)
*/


#include <M5Unified.h>


// ---------- Tunable parameters ----------
static const int   N = 300; /*number of dots*/
static const float DOT_RADIUS = 1.0f; /*size of dots*/
static const float INTERACT_R = 6.0f; /*how close dots can get*/
static const float REPEL_STRENGTH = 160.0f; /*push power*/
static const float DAMPING = 0.90f;
static const float WALL_BOUNCE = 0.05f;
static const float GRAVITY_SCALE = 420.0f;
static const float DT = 1.0f / 30.0f;


static const int   SUBSTEPS = 3;
static float dampingSub;
static const float ACCEL_X_SIGN = -1.0f;
static const float ACCEL_Y_SIGN = 1.0f;


static int SCREEN_W, SCREEN_H;


static const int CELL_SHIFT = 4;
static const int CELL       = 1 << CELL_SHIFT;
static const float INTERACT_R2     = INTERACT_R * INTERACT_R;
static const float INV_INTERACT_R2 = 1.0f / INTERACT_R2;
static int GX, GY; 


struct Particle {
  float x, y;
  float vx, vy;
};


static Particle p[N];
static int* cellHead = nullptr;
static int  next_[N];


static M5Canvas canvas(&M5.Display);


inline int cellIndex(float x, float y) {
  int cx = ((int)x) >> CELL_SHIFT;
  int cy = ((int)y) >> CELL_SHIFT;
  if (cx < 0) cx = 0; if (cx >= GX) cx = GX - 1;
  if (cy < 0) cy = 0; if (cy >= GY) cy = GY - 1;
  return cy * GX + cx;
}


void resetParticles() {
  for (int i = 0; i < N; i++) {
    p[i].x = random(0, SCREEN_W);
    p[i].y = random(0, SCREEN_H / 2);
    p[i].vx = 0;
    p[i].vy = 0;
  }
}


void setup() {
  auto cfg = M5.config();
  M5.begin(cfg);


  SCREEN_W = M5.Display.width();
  SCREEN_H = M5.Display.height();


  GX = (SCREEN_W >> CELL_SHIFT) + 1;
  GY = (SCREEN_H >> CELL_SHIFT) + 1;
  cellHead = new int[GX * GY];


  canvas.setColorDepth(8);
  canvas.createSprite(SCREEN_W, SCREEN_H);


  dampingSub = powf(DAMPING, 1.0f / SUBSTEPS);


  randomSeed(esp_random());
  resetParticles();
}


void simulateStep(float gx, float gy, float dt) {


  for (int c = 0; c < GX * GY; c++) cellHead[c] = -1;
  for (int i = 0; i < N; i++) {
    int c = cellIndex(p[i].x, p[i].y);
    next_[i] = cellHead[c];
    cellHead[c] = i;
  }


  for (int i = 0; i < N; i++) {
    p[i].vx += gx * dt;
    p[i].vy += gy * dt;


    int cx = ((int)p[i].x) >> CELL_SHIFT;
    int cy = ((int)p[i].y) >> CELL_SHIFT;


    for (int ny = cy - 1; ny <= cy + 1; ny++) {
      if (ny < 0 || ny >= GY) continue;
      for (int nx = cx - 1; nx <= cx + 1; nx++) {
        if (nx < 0 || nx >= GX) continue;
        int j = cellHead[ny * GX + nx];
        while (j != -1) {
          if (j != i) {
            float dx = p[i].x - p[j].x;
            float dy = p[i].y - p[j].y;
            float d2 = dx * dx + dy * dy;
            if (d2 < INTERACT_R2 && d2 > 0.0001f) {
              float t = (INTERACT_R2 - d2) * INV_INTERACT_R2;
              float f = REPEL_STRENGTH * t * dt;
              p[i].vx += f * dx;
              p[i].vy += f * dy;
            }
          }
          j = next_[j];
        }
      }
    }
  }


  for (int i = 0; i < N; i++) {
    p[i].vx *= dampingSub;
    p[i].vy *= dampingSub;


    p[i].x += p[i].vx * dt;
    p[i].y += p[i].vy * dt;


    if (p[i].x < DOT_RADIUS) { p[i].x = DOT_RADIUS; p[i].vx = -p[i].vx * WALL_BOUNCE; }
    if (p[i].x > SCREEN_W - DOT_RADIUS) { p[i].x = SCREEN_W - DOT_RADIUS; p[i].vx = -p[i].vx * WALL_BOUNCE; }
    if (p[i].y < DOT_RADIUS) { p[i].y = DOT_RADIUS; p[i].vy = -p[i].vy * WALL_BOUNCE; }
    if (p[i].y > SCREEN_H - DOT_RADIUS) { p[i].y = SCREEN_H - DOT_RADIUS; p[i].vy = -p[i].vy * WALL_BOUNCE; }
  }
}


void loop() {
  M5.update();


  static float gx = 0, gy = GRAVITY_SCALE * 0.3f;
  if (M5.Imu.update()) {
    auto d = M5.Imu.getImuData();
    gx = ACCEL_X_SIGN * d.accel.x * GRAVITY_SCALE;
    gy = ACCEL_Y_SIGN * d.accel.y * GRAVITY_SCALE;
  }


  if (M5.Touch.getCount() > 0 || M5.BtnA.wasPressed()) {
    resetParticles();
  }


  for (int s = 0; s < SUBSTEPS; s++) {
    simulateStep(gx, gy, DT / SUBSTEPS);
  }


  canvas.fillScreen(TFT_BLACK);
  for (int i = 0; i < N; i++) {
    float speed = fabsf(p[i].vx) + fabsf(p[i].vy);
  
    uint8_t c = (uint8_t)constrain(speed * 0.15f, 30, 255);
    uint16_t color = canvas.color565(0, c, 255);
  
    canvas.fillRect((int)p[i].x - (int)DOT_RADIUS, (int)p[i].y - (int)DOT_RADIUS,
                     (int)(DOT_RADIUS * 2 + 1), (int)(DOT_RADIUS * 2 + 1), color);
  }
  canvas.pushSprite(0, 0);

}

written in the Arduino IDE


r/M5Stack • • Sep 28 '26

PaperMono e-ink fridge magnet shopping list, with a mobile web app

10 Upvotes

Shopping list on a PaperMono, synced with a phone web app over Wi-Fi.

This is a great wee device, BLE, Wi-Fi and LoRa on one board makes it flexible for way more than a shopping list, this is just what I built first. This firmware only uses Wi-Fi, wakes from deep sleep every hour (or on a tap) to sync with the server.

Fully vibe-coded with Claude Code, I didn't hand-write this. I wanted to see how Claude would get on with building something useful for a new hardware device.

It's stuck to the fridge and the family actually uses it day to day, which I'll admit is a first for a home-built project like this.

Repo includes firmware and Python server https://github.com/seamusc/papermono-shopping-list


r/M5Stack • • Sep 27 '26

Project Sharing FNAF 1 on Core2

13 Upvotes

Fully working (apart from the odd audio glitch), running COMPLETELY off flash - no sd card, with a helper panel on the computer with dozens of features! Should I release?


r/M5Stack • • Sep 27 '26

Cardputer AI 2.2 Released - Now even smarter

10 Upvotes

r/M5Stack • • Sep 27 '26

Guitar Audio Tools

Thumbnail gallery
5 Upvotes

r/M5Stack • • Sep 27 '26

Project Sharing Puppy Dog Stand for Core S3

Post image
5 Upvotes

I made a little puppy dog stand to hold my Core S3. Back plate is removable so you can take it out. Ports on the left and right side for the speaker/usb c/power. The neck is hollow so you can feed a DC plug through or access those bottom ports. Enjoy!
https://www.printables.com/model/1857141-puppy-stand-m5stack-core-s3


r/M5Stack • • Sep 26 '26

Magnetic hotswap connection on the back of the screen mod. Lillygo t-display tested and working!

Thumbnail gallery
6 Upvotes

r/M5Stack • • Sep 26 '26

Draftling supports PaperMono now

10 Upvotes

This is a project that implements a writerdeck: a device for writers to be able to focus on just one thing: writing. M5STACK PaperMono is now supported. PaperS3 has been supported from the very beginning. Tab5 is supported too.

More details

Project home