
OpenCalc pcb V2
CoryPearl/opencalc
A new and improved, better than the TI-84, open-source, graphing calculator

A new and improved, better than the TI-84, open-source, graphing calculator
Opencalc pcb V5 is an open-source printed circuit board by CoryPearl, from the CoryPearl/opencalc repository on GitHub. It is a 4-layer board of 75 × 170 mm with 194 parts on 156 nets, routed with 1,494 tracks and 229 vias.
It is built around the ADS1115IDGST, BQ24074RGTR and 1N4148WT, with the AO3401A among its other parts. Its parts include 51 diodes, 51 switches, 40 resistors, 21 capacitors and 3 ICs.
Prototype sponsored by PCBWay.
OpenCalc is an open-source graphing calculator inspired by the TI-84, built around an ESP32-S3, a color LCD, USB-C, Python-style scripting, games, and expandable firmware.
OpenCalc-authored software is licensed under GPL-3.0-or-later. Bundled components retain their original licenses; see Third-Party Notices.
The calculator runs OpenCalc OS, the project’s open-source ESP32-S3 operating environment. OpenCalc OS includes the calculator interface, math and graphing engines, built-in apps, scripting runtime, USB file storage, keypad handling, display drivers, game support, and power management.
Website: https://corypearl.github.io/opencalc/product-website/
Blog: https://corypearl.github.io/opencalc/blog.html
Click an image to enlarge. The UI tour visits all 12 apps and the game menu.
8 m / 2 s.Alpha + Graph opens exact symbolic
analysis for the selected graph, including its derivative, integral, roots,
asymptotes, tangent line, and integral shading. CAS results have selectable
solution branches, exact/decimal views, domain controls, assumptions, and a
searchable command catalog.
All graph modes support per-series colors/styles, mode-aware trace and tables,
scalable image backgrounds, and direct or recurrent sequences.Alpha + Zoom for an interactive periodic table
and browsable math, physics, and engineering formulas and explanations.Alpha + 2nd for Tetris, Doom, Snake, Breakout, and NES/Mario support with
persistent high scores, multi-key controls, and optional audio.| Cost area | Estimate per unit |
|---|---|
| PCB electronics parts from BOM | $11-$16 |
| 320x240 LCD | $5 |
| 3.7 V 2000 mAh Li-ion battery | $3-$5 |
| Cheap keycaps / keypad plastics | $2-$4 |
| 3d printed case | $3-$6 |
| PCB fabrication + SMT assembly | $5-$9 |
| Bulk shipping / logistics allowance | $3-$6 |
| Estimated production cost | $32-$51 |
firmware/ OpenCalc OS source for the ESP32-S3 calculator
hardware/ key layouts, graphics, PCB files, case files, and hardware docs
docs/ notes and project website filesInstall and activate ESP-IDF first; see Espressif's ESP32-S3 Get Started guide. Then connect OpenCalc with a data-capable USB-C cable and build the firmware:
cd firmware
idf.py buildFind the serial port created by OpenCalc:
| System | Terminal | Command |
|---|---|---|
| macOS | Terminal | ls /dev/cu.* |
| Linux | Terminal | ls /dev/ttyACM* /dev/ttyUSB* 2>/dev/null |
| Windows | PowerShell | [System.IO.Ports.SerialPort]::GetPortNames() |
| Windows | Command Prompt | mode |
Look for a new USB serial device after connecting the calculator. Typical names
are /dev/cu.usbmodemopencalc1 on macOS, /dev/ttyACM0 on Linux, or COM5 on
Windows. Replace PORT below with that complete name; do not type the word
PORT literally.
If automatic flashing does not enter the bootloader, hold Boot, tap Reset, and then release Boot. Flash using the detected port:
idf.py -p PORT flashAfter OpenCalc restarts, find the port again because its name can change between bootloader and normal operation. Start the serial monitor with the runtime port:
idf.py -p PORT monitorPress Ctrl+] to exit the monitor. The same USB-C cable supports flashing,
serial monitoring, storage, and charging.
OpenCalc OS is a capable working prototype. Every built-in app has its main workflow in place, and the calculator, graphing, CAS, scripting, USB storage, power controls, and all five games are usable. The remaining work is mostly deeper edge-case handling, long-session reliability, and validation of the new V5-only hardware features.
| Area | Current estimate |
|---|---|
| Primary app workflows implemented | 12/12 (100%) |
| Automated host test groups passing | 19/19 (100%) |
| Planned software feature coverage | About 87% |
| Everyday workflow usability | About 83% |
| Software reliability confidence | About 75% |
| Production-release readiness | About 50% |
These percentages are practical estimates, not test-coverage measurements. The biggest jobs left are closing Tiny Python's compatibility gaps, handling very large CAS results and unusual math edge cases, stress-testing large matrices and long sessions, and validating V5 audio and scientific I/O on real hardware. See the app-by-app status for more detail.
Complete copyright, license, and game-data details are recorded in THIRD_PARTY_NOTICES.md. Doom WADs and NES ROMs are separate game data and are not licensed under the OpenCalc firmware license.
| Qty | Value | Footprint | References |
|---|---|---|---|
| 50 | 1N4148WT | Diode_SMD:D_0805_2012Metric_Pad1.15x1.40mm_HandSolder | D10, D11, D12, D13, D14, D15, D16, D17, D18, D19, D20, D21, D22, D23, D24, D25 +34 |
| 10 | 100nF | Capacitor_SMD:C_0805_2012Metric_Pad1.18x1.45mm_HandSolder | C3, C4, C5, C6, C10, C12, C16, C17, C18, C19 |
| 10 | 46kΩ | Resistor_SMD:R_0805_2012Metric_Pad1.20x1.40mm_HandSolder | R22, R23, R24, R25, R26, R27, R28, R29, R30, R31 |
| 5 | 10kΩ | Resistor_SMD:R_0805_2012Metric_Pad1.20x1.40mm_HandSolder | R2, R3, R11, R35, R37 |
| 5 | 1kΩ | Resistor_SMD:R_0805_2012Metric_Pad1.20x1.40mm_HandSolder | R1, R12, R13, R40, R41 |
| 5 | TestPoint | TestPoint:TestPoint_Pad_D2.0mm | TP1, TP2, TP3, TP4, TP5 |
| 4 | 10uF | Capacitor_SMD:C_0805_2012Metric_Pad1.18x1.45mm_HandSolder | C2, C9, C13, C15 |
| 4 | 27Ω | Resistor_SMD:R_0805_2012Metric_Pad1.20x1.40mm_HandSolder | R4, R5, R6, R7 |
| 3 | 100kΩ | Resistor_SMD:R_0805_2012Metric_Pad1.20x1.40mm_HandSolder | R8, R21, R36 |
| 3 | 1uF | Capacitor_SMD:C_0805_2012Metric_Pad1.18x1.45mm_HandSolder | C1, C7, C8 |
| 2 | 10nF | Capacitor_SMD:C_0805_2012Metric_Pad1.18x1.45mm_HandSolder | C20, C21 |
| 2 | 1MΩ | Resistor_SMD:R_0805_2012Metric_Pad1.20x1.40mm_HandSolder | R18, R19 |
| 2 | 4.7kΩ | Resistor_SMD:R_0805_2012Metric_Pad1.20x1.40mm_HandSolder | R38, R39 |
| 2 | 5.1kΩ | Resistor_SMD:R_0805_2012Metric_Pad1.20x1.40mm_HandSolder | R9, R10 |
| 1 | 1.1kΩ | Resistor_SMD:R_0805_2012Metric_Pad1.20x1.40mm_HandSolder | R15 |
| 1 | 100Ω | Resistor_SMD:R_0805_2012Metric_Pad1.20x1.40mm_HandSolder | R32 |
| 1 | 1Ω | Resistor_SMD:R_0805_2012Metric_Pad1.20x1.40mm_HandSolder | R33 |
| 1 | 22uF | Capacitor_SMD:C_0805_2012Metric_Pad1.18x1.45mm_HandSolder | C14 |
| 1 | 2kΩ | Resistor_SMD:R_0805_2012Metric_Pad1.20x1.40mm_HandSolder | R16 |
| 1 | 4.7uF | Capacitor_SMD:C_0805_2012Metric_Pad1.18x1.45mm_HandSolder | C11 |
| 1 | 46.4kΩ | Resistor_SMD:R_0805_2012Metric_Pad1.20x1.40mm_HandSolder | R17 |
| 1 | 560kΩ | Resistor_SMD:R_0805_2012Metric_Pad1.20x1.40mm_HandSolder | R20 |
| 1 | 590Ω | Resistor_SMD:R_0805_2012Metric_Pad1.20x1.40mm_HandSolder | R14 |
| 1 | 74479275147 | opencalc_footprint_library:74479275147 | L1 |
| 1 | ADS1115IDGST | opencalc_footprint_library:ADS1115IDGST | U7 |
| 1 | AO3401A | Package_TO_SOT_SMD:SOT-23 | Q1 |
| 1 | BLUE | LED_SMD:LED_0805_2012Metric_Pad1.15x1.40mm_HandSolder | D2 |
| 1 | BOOT | Button_Switch_SMD:SW_Push_1P1T_NO_E-Switch_TL3301NxxxxxG | SW2 |
| 1 | BQ24074RGTR | opencalc_footprint_library:BQ24074RGTR | U4 |
| 1 | Button1 | Button_Switch_SMD:SW_Push_1P1T_NO_E-Switch_TL3301NxxxxxG | SW3 |
| 1 | Button10 | Button_Switch_SMD:SW_Push_1P1T_NO_E-Switch_TL3301NxxxxxG | SW12 |
| 1 | Button11 | Button_Switch_SMD:SW_Push_1P1T_NO_E-Switch_TL3301NxxxxxG | SW13 |
| 1 | Button12 | Button_Switch_SMD:SW_Push_1P1T_NO_E-Switch_TL3301NxxxxxG | SW14 |
| 1 | Button13 | Button_Switch_SMD:SW_Push_1P1T_NO_E-Switch_TL3301NxxxxxG | SW15 |
| 1 | Button14 | Button_Switch_SMD:SW_Push_1P1T_NO_E-Switch_TL3301NxxxxxG | SW16 |
| 1 | Button15 | Button_Switch_SMD:SW_Push_1P1T_NO_E-Switch_TL3301NxxxxxG | SW17 |
| 1 | Button16 | Button_Switch_SMD:SW_Push_1P1T_NO_E-Switch_TL3301NxxxxxG | SW18 |
| 1 | Button17 | Button_Switch_SMD:SW_Push_1P1T_NO_E-Switch_TL3301NxxxxxG | SW19 |
| 1 | Button18 | Button_Switch_SMD:SW_Push_1P1T_NO_E-Switch_TL3301NxxxxxG | SW20 |
| 1 | Button19 | Button_Switch_SMD:SW_Push_1P1T_NO_E-Switch_TL3301NxxxxxG | SW21 |
| 1 | Button2 | Button_Switch_SMD:SW_Push_1P1T_NO_E-Switch_TL3301NxxxxxG | SW4 |
| 1 | Button20 | Button_Switch_SMD:SW_Push_1P1T_NO_E-Switch_TL3301NxxxxxG | SW22 |
| 1 | Button21 | Button_Switch_SMD:SW_Push_1P1T_NO_E-Switch_TL3301NxxxxxG | SW23 |
| 1 | Button22 | Button_Switch_SMD:SW_Push_1P1T_NO_E-Switch_TL3301NxxxxxG | SW24 |
| 1 | Button23 | Button_Switch_SMD:SW_Push_1P1T_NO_E-Switch_TL3301NxxxxxG | SW25 |
| 1 | Button24 | Button_Switch_SMD:SW_Push_1P1T_NO_E-Switch_TL3301NxxxxxG | SW26 |
| 1 | Button25 | Button_Switch_SMD:SW_Push_1P1T_NO_E-Switch_TL3301NxxxxxG | SW27 |
| 1 | Button26 | Button_Switch_SMD:SW_Push_1P1T_NO_E-Switch_TL3301NxxxxxG | SW28 |
| 1 | Button27 | Button_Switch_SMD:SW_Push_1P1T_NO_E-Switch_TL3301NxxxxxG | SW29 |
| 1 | Button28 | Button_Switch_SMD:SW_Push_1P1T_NO_E-Switch_TL3301NxxxxxG | SW30 |
| 1 | Button29 | Button_Switch_SMD:SW_Push_1P1T_NO_E-Switch_TL3301NxxxxxG | SW31 |
| 1 | Button3 | Button_Switch_SMD:SW_Push_1P1T_NO_E-Switch_TL3301NxxxxxG | SW5 |
| 1 | Button30 | Button_Switch_SMD:SW_Push_1P1T_NO_E-Switch_TL3301NxxxxxG | SW32 |
| 1 | Button31 | Button_Switch_SMD:SW_Push_1P1T_NO_E-Switch_TL3301NxxxxxG | SW33 |
| 1 | Button32 | Button_Switch_SMD:SW_Push_1P1T_NO_E-Switch_TL3301NxxxxxG | SW34 |
| 1 | Button33 | Button_Switch_SMD:SW_Push_1P1T_NO_E-Switch_TL3301NxxxxxG | SW35 |
| 1 | Button34 | Button_Switch_SMD:SW_Push_1P1T_NO_E-Switch_TL3301NxxxxxG | SW36 |
| 1 | Button35 | Button_Switch_SMD:SW_Push_1P1T_NO_E-Switch_TL3301NxxxxxG | SW37 |
| 1 | Button36 | Button_Switch_SMD:SW_Push_1P1T_NO_E-Switch_TL3301NxxxxxG | SW38 |
| 1 | Button37 | Button_Switch_SMD:SW_Push_1P1T_NO_E-Switch_TL3301NxxxxxG | SW39 |
| 1 | Button38 | Button_Switch_SMD:SW_Push_1P1T_NO_E-Switch_TL3301NxxxxxG | SW40 |
| 1 | Button39 | Button_Switch_SMD:SW_Push_1P1T_NO_E-Switch_TL3301NxxxxxG | SW41 |
| 1 | Button4 | Button_Switch_SMD:SW_Push_1P1T_NO_E-Switch_TL3301NxxxxxG | SW6 |
| 1 | Button40 | Button_Switch_SMD:SW_Push_1P1T_NO_E-Switch_TL3301NxxxxxG | SW42 |
| 1 | Button41 | Button_Switch_SMD:SW_Push_1P1T_NO_E-Switch_TL3301NxxxxxG | SW43 |
| 1 | Button42 | Button_Switch_SMD:SW_Push_1P1T_NO_E-Switch_TL3301NxxxxxG | SW44 |
| 1 | Button43 | Button_Switch_SMD:SW_Push_1P1T_NO_E-Switch_TL3301NxxxxxG | SW45 |
| 1 | Button44 | Button_Switch_SMD:SW_Push_1P1T_NO_E-Switch_TL3301NxxxxxG | SW46 |
| 1 | Button45 | Button_Switch_SMD:SW_Push_1P1T_NO_E-Switch_TL3301NxxxxxG | SW47 |
| 1 | Button46 | Button_Switch_SMD:SW_Push_1P1T_NO_E-Switch_TL3301NxxxxxG | SW48 |
| 1 | Button47 | Button_Switch_SMD:SW_Push_1P1T_NO_E-Switch_TL3301NxxxxxG | SW49 |
| 1 | Button48 | Button_Switch_SMD:SW_Push_1P1T_NO_E-Switch_TL3301NxxxxxG | SW50 |
| 1 | Button49 | Button_Switch_SMD:SW_Push_1P1T_NO_E-Switch_TL3301NxxxxxG | SW51 |
| 1 | Button5 | Button_Switch_SMD:SW_Push_1P1T_NO_E-Switch_TL3301NxxxxxG | SW7 |
| 1 | Button50 | Button_Switch_SMD:SW_Push_1P1T_NO_E-Switch_TL3301NxxxxxG | SW52 |
| 1 | Button6 | Button_Switch_SMD:SW_Push_1P1T_NO_E-Switch_TL3301NxxxxxG | SW8 |
| 1 | Button7 | Button_Switch_SMD:SW_Push_1P1T_NO_E-Switch_TL3301NxxxxxG | SW9 |
| 1 | Button8 | Button_Switch_SMD:SW_Push_1P1T_NO_E-Switch_TL3301NxxxxxG | SW10 |
| 1 | Button9 | Button_Switch_SMD:SW_Push_1P1T_NO_E-Switch_TL3301NxxxxxG | SW11 |
| 1 | CMS-151504-SMT-TR | opencalc_footprint_library:CMS-151504-SMT-TR | U6 |
The 173 most common of 194 parts.

CoryPearl/opencalc
A new and improved, better than the TI-84, open-source, graphing calculator

CoryPearl/opencalc
A new and improved, better than the TI-84, open-source, graphing calculator

Projeto-Guarda-Rios/PCB
O repositório para a PCB do Projeto Guarda Rios! Inclui todos os ficheiros relacionados com a PCB!

dataehora/beatconfused
A small web studio of fast, elegant, install-free music tools. Every tool is plain HTML, CSS and vanilla JavaScript with the Web Audio API — no build step, no dependencies, no accounts, works offline after first load.

arvindsa/decabox
A compact, intelligent battery management system for 6× Decapo batteries used with cochlear speech processors. This project monitors cell voltage, ambient light, and battery state-of-charge in real-time, with visual…

binaryBeachLLC/tradewind
Tradewind TW-1: solar LoRaWAN field sensor. KiCad 9 board, CadQuery enclosure, RUI3 firmware, simulations, test data, report and datasheet.

botsqerebot/AudioDeck
Everything to change, check and test for rev 2. The main goal is power saving while the player is off:


JoeMighty/opentouch-s3
A modern remake of the Bare Conductive Touch Board: 12 capacitive touch electrodes, MP3/WAV/MIDI audio, and now WiFi, Bluetooth LE, USB-C, a proper LiPo power path, a fuel gauge, line-in, MIDI out, Qwiic and an RGB LED.

It measures 75 × 170 mm and has 4 copper layers, 1.6 mm thick.
194 parts, built around the ADS1115IDGST, BQ24074RGTR, 1N4148WT and AO3401A. The full list of its parts is on this page, with links to each part's symbol and footprint where PCBKit's library has them.
From the CoryPearl/opencalc repository on GitHub, at the commit this page was made from: the board is hardware/pcb/opencalc_pcb_V5/opencalc_pcb_V5.kicad_pcb and its schematic hardware/pcb/V1/openCalc-pcb-V1.kicad_sch. PCBKit opens the board in the browser, with nothing to install.
Its repository states no licence, so its author keeps all rights: ask CoryPearl before reusing the design.