Open Source · Alpha 0.04a

MI-23

A DIY graphing calculator powered by the Raspberry Pi RP2350 — built for students who refuse to pay $150 for a TI-84.

View on GitHub Get Started →
RP2350 Processor
320×240 Display
MIT License
94% C++ Codebase
$30~ Est. BOM Cost
// capabilities

Built Different.

Dual-platform firmware that runs on real hardware and as a desktop simulator — no RP2350 required to start hacking.

Expression Parser

Full arithmetic evaluation with correct operator precedence, parentheses, and decimal support. Parser is unit-tested with Google Test.

🖥

Desktop Simulator

Run the full MI-23 firmware on Linux, macOS, or Windows via SDL2. Iterate fast without flashing hardware every time.

🔧

Modular HAL

Hardware Abstraction Layer cleanly separates platform-specific code. Adding a new target is straightforward and documented.

📈

Graphing Engine

Graphing mode is under active development. The architecture is in place — contributions are welcome.

🧪

Unit Tested

Expression parser ships with a full Google Test suite. Run ./mi23 --test to verify your build.

🔓

Fully Open Source

MIT licensed. Fork it, hack it, sell it. Inspired by NumWorks — designed to be the affordable, hackable alternative.


// silicon

The Hardware.

Designed around affordable, widely-available components. The full BOM costs a fraction of a commercial graphing calculator.

MCU
Waveshare RP2350-PiZero
16 MB Flash · Dual-core Cortex-M33
Display
2.0" ST7789 TFT
320×240 · SPI interface · Full color
Keypad
4×4 Matrix Keypad
40+ key layout planned
Battery
3.7V LiPo
Portable · Rechargeable

// get started

Up in minutes.

No hardware needed to run the simulator. Clone, build, and launch on your machine.

quickstart.sh
01

Clone the repository

git clone https://github.com/MiracleAig/MI-23
02

Install dependencies

Install cmake g++ libsdl2-dev libgtest-dev for your platform.

Linux macOS Windows
03

Build the simulator

./build.sh --clean --platform=host
04

Run it

./build-host/firmware/platform/host/sdl_simulator/mi23
firmware/math/expr_parser.cpp
// MI-23 Expression Parser
// Supports precedence, parens, decimals

class ExprParser {
public:
  ExprParser(const std::string& input)
    : src_(input), pos_(0) {}

  double parse() {
    auto result = parseExpr();
    if (pos_ != src_.size())
      throw std::runtime_error("Unexpected char");
    return result;
  }

private:
  std::string src_;
  size_t      pos_;

  double parseExpr();   // +, −
  double parseTerm();   // ×, ÷
  double parseFactor(); // literals, ()
};

// architecture

Project structure.

Clean separation between app logic, hardware drivers, math engine, and platform backends.

firmware/
├── app/
│ ├── calculator/ standard calculator mode
│ └── graphing/ graphing engine (in progress)
├── drivers/
│ └── st7789/ display driver
├── graphics/ rendering primitives
├── hal/ hardware abstraction layer
├── math/ expression parser + eval
└── platform/
├── host/
│ └── sdl_simulator/ desktop backend
└── rp2350/ hardware target