[{"element_type":"user_image","content":"https://cdn-learn.adafruit.com/user_assets/assets/000/001/784/original/21-base-with-carts.jpeg?1746224693","metadata":{}},{"element_type":"text","content":"\n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n        \u003ch2\u003eOverview\u003c/h2\u003e\n      \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n","metadata":{}},{"element_type":"text","content":"\n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n        \u003cp\u003eThese removable non-volatile memory cartridges should work with the new Fruit Jam board and many other Adafruit microcontroller boards with I2C. The 3D printed shells hold a perma-proto PCB with a 4-pin magnetic connector and an I2C FRAM breakout board. To avoid I2C bus glitches, the base includes TCA4307 hot-swap I2C buffers and a PCA9546 4-channel I2C multiplexer. The multiplexer makes it possible to use two FRAM chips with the same I2C address at the same time.\u003c/p\u003e\n\u003cp\u003eThe CircuitPython code for this project is just a simple demo of writing to and reading from FRAM using the byte array interface provided by the \u003ca href=\"https://docs.circuitpython.org/projects/fram/en/latest/\" target=\"_blank\"\u003eadafruit-circuitpython-fram\u003c/a\u003e library. To use these memory cartridges for game save files, you would need to come up with a way to encode whatever data you want to store into a byte array of 32KB or less.\u003c/p\u003e\n\u003cp\u003eTransparency note \u0026amp; shameless plug: Adafruit provided most of the parts I used for this guide (Thanks Adafruit!). Adafruit makes good stuff, please support them by buying from the Adafruit shop.\u003c/p\u003e\n      \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n","metadata":{}},{"element_type":"text","content":"\n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n        \u003ch2\u003eParts\u003c/h2\u003e\n\u003cp\u003e\u0026nbsp;\u003c/p\u003e\n      \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n","metadata":{}},{"element_type":"markdown","content":"\u003cp\u003eThis guide is written for a build with two cartridge slots. But, if you only want one cartridge slot, you can omit the PCA9546 mux and adjust the order quantities for other items (see table below).\u003c/p\u003e\n\n\u003ctable\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003cth\u003eItem\u003c/th\u003e\n\u003cth\u003e2-slot Qty.\u003c/th\u003e\n\u003cth\u003e1-slot Qty.\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003eI2C FRAM breakout\u003c/td\u003e\n\u003ctd\u003e2\u003c/td\u003e\n\u003ctd\u003e1\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003ePerma-proto PCB 3-pack\u003c/td\u003e\n\u003ctd\u003e2\u003c/td\u003e\n\u003ctd\u003e1\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e4-pin Magnetic Connector\u003c/td\u003e\n\u003ctd\u003e2\u003c/td\u003e\n\u003ctd\u003e1\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eQwiic / Stemma QT breakout\u003c/td\u003e\n\u003ctd\u003e2\u003c/td\u003e\n\u003ctd\u003e1\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eTCA4307 I2C buffer breakout\u003c/td\u003e\n\u003ctd\u003e2\u003c/td\u003e\n\u003ctd\u003e1\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eShort STEMMA QT / Qwiic cable\u003c/td\u003e\n\u003ctd\u003e4\u003c/td\u003e\n\u003ctd\u003e1\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eLong STEMMA QT / Qwiic cable\u003c/td\u003e\n\u003ctd\u003e1\u003c/td\u003e\n\u003ctd\u003e1\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003ePCA9546 I2C mux breakout\u003c/td\u003e\n\u003ctd\u003e1\u003c/td\u003e\n\u003ctd\u003e0\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\n\u003cp\u003eFor the base, you will need:\u003c/p\u003e\n\n\u003ctable\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003cth\u003eItem\u003c/th\u003e\n\u003cth\u003eQty.\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e10x10 swirly grid\u003c/td\u003e\n\u003ctd\u003e1\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e10x5 swirly grid\u003c/td\u003e\n\u003ctd\u003e1\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eTT motor mount\u003c/td\u003e\n\u003ctd\u003e2\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eM2.5 nylon screw kit\u003c/td\u003e\n\u003ctd\u003e1\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n","metadata":{"markdown":"This guide is written for a build with two cartridge slots. But, if you only want one cartridge slot, you can omit the PCA9546 mux and adjust the order quantities for other items (see table below).\n\n| Item | 2-slot Qty. | 1-slot Qty. |\n| --- | --- | --- |\n| I2C FRAM breakout | 2 | 1 |\n| Perma-proto PCB 3-pack | 2 | 1 |\n| 4-pin Magnetic Connector | 2 | 1 |\n| Qwiic / Stemma QT breakout | 2 | 1 |\n| TCA4307 I2C buffer breakout | 2 | 1 |\n| Short STEMMA QT / Qwiic cable | 4 | 1 |\n| Long STEMMA QT / Qwiic cable | 1 | 1 |\n| PCA9546 I2C mux breakout | 1 | 0 |\n\nFor the base, you will need:\n\n| Item | Qty. |\n| --- | --- |\n| 10x10 swirly grid | 1 |\n| 10x5 swirly grid | 1 |\n| TT motor mount | 2 |\n| M2.5 nylon screw kit | 1 |"}},{"element_type":"text","content":"\n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n        \u003ch3\u003eI2C \u0026amp; Mechanical\u003c/h3\u003e\n      \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n","metadata":{}},{"element_type":"product","content":"https://www.adafruit.com/product/1895","metadata":{}},{"element_type":"product","content":"https://www.adafruit.com/product/1214","metadata":{}},{"element_type":"product","content":"https://www.adafruit.com/product/5358","metadata":{}},{"element_type":"product","content":"https://www.adafruit.com/product/5961","metadata":{}},{"element_type":"product","content":"https://www.adafruit.com/product/5159","metadata":{}},{"element_type":"product","content":"https://www.adafruit.com/product/4399","metadata":{}},{"element_type":"product","content":"https://www.adafruit.com/product/5664","metadata":{}},{"element_type":"product","content":"https://www.adafruit.com/product/4210","metadata":{}},{"element_type":"product","content":"https://www.adafruit.com/product/4401","metadata":{}},{"element_type":"product","content":"https://www.adafruit.com/product/5781","metadata":{}},{"element_type":"product","content":"https://www.adafruit.com/product/5774","metadata":{}},{"element_type":"product","content":"https://www.adafruit.com/product/3299","metadata":{}},{"element_type":"product","content":"https://www.adafruit.com/product/3768","metadata":{}},{"element_type":"text","content":"\n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n        \u003ch3\u003eThread Rolling Screws\u003c/h3\u003e\n\u003cp\u003eThe 3D print for this project is designed for #2-28 thread rolling screws (pan head, 5/16 inch long). People often use fine thread metric machine screws for 3D prints, but I wanted something that was intended for use in plastic. These thread rolling screws use a coarse thread pitch with a profile that's designed to self-tap into plastic without creating chips. These work great with 2mm holes.\u003c/p\u003e\n      \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n","metadata":{}},{"element_type":"parts","content":"\n  \u003cdiv class=\"parts-details\"\u003e\n    \u003cdiv\u003e\n      \u003cspan class=\"parts-quantity\"\u003e1\u003c/span\u003e\u003cspan\u003e x \u003c/span\u003e\n        \u003ca href=\"https://www.amazon.com/dp/B00GDXU4WM\" class=\"parts-name\" target=\"_blank\"\u003e#2-28 Thread rolling screws (pack of 100)\u003c/a\u003e\n      \u003cdiv class=\"parts-description\"\u003ePan Head, Phillips Drive, #2-28 Thread Size, 5/16\" Length\u003c/div\u003e\n    \u003c/div\u003e\n  \u003c/div\u003e\n  \u003cdiv class=\"parts-action\"\u003e\n  \u003cdiv\u003e\n      \u003ca href=\"https://www.amazon.com/dp/B00GDXU4WM\" class=\"parts-url btn-primary\" target=\"_blank\"\u003eBuy Now\u003c/a\u003e\n\n  \u003c/div\u003e\n\u003c/div\u003e\n\n  \u003cdiv class=\"clearfix\"\u003e\u003c/div\u003e\n","metadata":{"name":"#2-28 Thread rolling screws (pack of 100)","url":"https://www.amazon.com/dp/B00GDXU4WM","description":"Pan Head, Phillips Drive, #2-28 Thread Size, 5/16\" Length","quantity":"1"}},{"element_type":"text","content":"\n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n        \u003ch3\u003eMicrocontroller board\u003c/h3\u003e\n\u003cp\u003eThis should work with many Adafruit Dev boards as long as they have a STEMMA QT / Qwiic I2C port and mounting holes (to avoid shorts on the swirly grid). I tested the code on a rev B Fruit Jam prototype and an ESP32-S3 Feather.\u003c/p\u003e\n\u003ch3\u003eTools \u0026amp; Materials\u003c/h3\u003e\n\u003cp\u003eYou will need:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eSoldering iron and solder\u003c/li\u003e\n\u003cli\u003eDiagonal flush cutters\u003c/li\u003e\n\u003cli\u003eNeedle nose pliers\u003c/li\u003e\n\u003cli\u003eWire strippers\u003c/li\u003e\n\u003cli\u003eSmall Phillips head screwdriver\u003c/li\u003e\n\u003cli\u003eKapton tape (or good quality electrical tape)\u003c/li\u003e\n\u003cli\u003eHookup wire such as \u003ca href=\"https://www.adafruit.com/product/3174\" target=\"_blank\"\u003eAdafruit #3174\u003c/a\u003e\n\u003c/li\u003e\n\u003cli\u003e3D printer (e.g. P1S, X1C, etc) and PLA filament\u003c/li\u003e\n\u003cli\u003ePCB holder vise with channels long enough to hold two boards in the same plane\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eThe PCB vise is important for making sure that the perma-proto PCBs and magnetic connectors are aligned properly. In particular, if the magnetic connectors get soldered at a weird angle, the memory card assembly may not fit into the 3D printed shell, or the cartridge may sit at an angle when it is connected to the base.\u003c/p\u003e\n      \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n","metadata":{}},{"element_type":"product","content":"https://www.adafruit.com/product/3197","metadata":{}},{"element_type":"text","content":"\n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n        \u003ch2\u003eSoldering\u003c/h2\u003e\n\u003cp\u003e1. Line up two PCBs in the vise, leaving a gap for the magnetic connector. Make the vise jaws tight enough to avoid dropping the boards but loose enough that you can slide one board to adjust the size of the gap.\u0026nbsp;\u003c/p\u003e\n      \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n","metadata":{}},{"element_type":"user_image","content":"https://cdn-learn.adafruit.com/user_assets/assets/000/001/785/original/01-stick-vise-separate.jpeg?1746227814","metadata":{}},{"element_type":"text","content":"\n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n        \u003cp\u003e2. Carefully seat the pins of the magnetic connectors into the holes of the perma-proto boards. Make sure the 4 pins are centered on the short side of the perma-proto boards. Gently slide the boards in the vise to get the right gap so the magnetic connector pins go in as far as possible. Once the connector is seated, make sure the vise jaws are parallel, then tighten the jaws.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eCAUTION: This is one of the most important steps in the whole assembly procedure. Please be sure the vise jaws are parallel and the magnetic connector is fully seated against both boards before soldering. The cartridge shell's opening allows 1 mm of clearance for variations in the magnetic connector's alignment. You can be a little off, but not way off. (check pictures below for examples of what good alignment looks like)\u003c/strong\u003e\u003c/p\u003e\n      \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n","metadata":{}},{"element_type":"user_image","content":"https://cdn-learn.adafruit.com/user_assets/assets/000/001/786/original/02-stick-vise-assembled.jpeg?1746228278","metadata":{}},{"element_type":"text","content":"\n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n        \u003cp\u003e3. Solder the magnetic connector pins from the top side of the boards. Then, on the board that has the magnetic connector with pins (as opposed to the one with pads), place a Qwiic / STEMMA QT breakout board on header pins next to the magnetic connector. To keep the board level, you can take a piece of header pin, cut off the leads on the top side, and place it into the board underneath one end of the breakout.\u003c/p\u003e\n      \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n","metadata":{}},{"element_type":"user_image","content":"https://cdn-learn.adafruit.com/user_assets/assets/000/001/787/original/03-mag-conn-soldered.jpeg?1746228716","metadata":{}},{"element_type":"text","content":"\n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n        \u003cp\u003e4. Solder the header pins on the top side of the I2C breakout board. Pull out the piece of header that was propping up the other side of the board and turn it on its side (so you can remove it later). Insert the I2C breakout with its header pins aligned to the magnetic connector pins, then tape it to the perma-proto PCB.\u003c/p\u003e\n      \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n","metadata":{}},{"element_type":"user_image","content":"https://cdn-learn.adafruit.com/user_assets/assets/000/001/788/original/04-breakout-taped.jpeg?1746228977","metadata":{}},{"element_type":"text","content":"\n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n        \u003cp\u003e5. Turn the perma-proto board assembly over in the vise to prepare for bending and soldering the header pins.\u003c/p\u003e\n      \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n","metadata":{}},{"element_type":"user_image","content":"https://cdn-learn.adafruit.com/user_assets/assets/000/001/789/original/05-back-before-solder.jpeg?1746229102","metadata":{}},{"element_type":"text","content":"\n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n        \u003cp\u003e6. Use needle nose pliers (or the tip of a flat-head screwdriver, the side of your diagonal flush cutter jaws, or whatever) to bend the header pins toward the magnetic connector pins. Solder the header pins and bridge them to the corresponding magnetic connector pins. Once the soldering is done, use diagonal flush cutters to trim the pins.\u0026nbsp;\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eCAUTION: Be careful to avoid unintentional solder bridges.\u003c/strong\u003e\u003c/p\u003e\n      \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n","metadata":{}},{"element_type":"user_image","content":"https://cdn-learn.adafruit.com/user_assets/assets/000/001/790/original/06-pins-bent-and-soldered.jpeg?1746229419","metadata":{}},{"element_type":"text","content":"\n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n        \u003cp\u003e7. Flip the perma-proto PCB assembly over in the vise (remove tape and the sideways piece of header). Now, on the perma-proto board whose magnetic connector has the pads (as opposed to the pogo pins), prepare hookup wires as shown in the picture below. Remove about 1/4\" of insulation from each end with your wire strippers, then form the leads with needle nose pliers. Your goal is to connect the \u003cstrong\u003eVCC\u003c/strong\u003e, \u003cstrong\u003eGND\u003c/strong\u003e, \u003cstrong\u003eSCL\u003c/strong\u003e, and \u003cstrong\u003eSDA\u003c/strong\u003e pins on the FRAM breakout to the matching pins on the magnetic connector. Once the wires are ready, secure them with tape.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eNote:\u003c/strong\u003e the FRAM board has a \u003cstrong\u003eWP\u003c/strong\u003e pin between \u003cstrong\u003eGND\u003c/strong\u003e and \u003cstrong\u003eSCL\u003c/strong\u003e. Be sure to skip that row as you arrange the hookup wire.\u003c/p\u003e\n      \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n","metadata":{}},{"element_type":"user_image","content":"https://cdn-learn.adafruit.com/user_assets/assets/000/001/791/original/07-fram-wires-front-taped.jpeg?1746229846","metadata":{}},{"element_type":"text","content":"\n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n        \u003cp\u003e8. Flip the PCB assembly over in the vise so you can see the back. Bend the ends of the hookup wire next to the magnetic connector so that they touch the corresponding magnetic connector pins. Trim the excess hookup wire (see picture below).\u003c/p\u003e\n      \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n","metadata":{}},{"element_type":"user_image","content":"https://cdn-learn.adafruit.com/user_assets/assets/000/001/792/original/08-fram-wires-back-prepped.jpeg?1746230752","metadata":{}},{"element_type":"text","content":"\n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n        \u003cp\u003e9. For the hookup wire ends next to the magnetic connector, solder the wires to their corresponding magnetic connector pins. For the hookup wires in the breadboard area, just solder each wire into place in its breadboard row. Trim all the protruding wire ends with your diagonal flush cutters.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eCAUTION: Inspect carefully for unintended solder bridges or incomplete connections and clean them up if needed. For example, in the picture below, I still need to clean up the top two breadboard rows (not enough solder)\u0026nbsp;\u003c/strong\u003e\u003c/p\u003e\n      \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n","metadata":{}},{"element_type":"user_image","content":"https://cdn-learn.adafruit.com/user_assets/assets/000/001/793/original/09-fram-wires-back-soldered.jpeg?1746230973","metadata":{}},{"element_type":"text","content":"\n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n        \u003cp\u003e10. Flip the perma-proto assembly over in the vise so you can see the top (remove tape). Prepare a row of header pins for the FRAM breakout board, lining up the \u003cstrong\u003eVCC\u003c/strong\u003e, \u003cstrong\u003eGND\u003c/strong\u003e, \u003cstrong\u003eSCL\u003c/strong\u003e, and \u003cstrong\u003eSDA\u003c/strong\u003e pins with the corresponding wires. Put a piece of header turned on its side on the opposite side of the board to provide mechanical support during soldering.\u003c/p\u003e\n      \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n","metadata":{}},{"element_type":"user_image","content":"https://cdn-learn.adafruit.com/user_assets/assets/000/001/794/original/10-fram-headers-presolder-front.jpeg?1746231252","metadata":{}},{"element_type":"text","content":"\n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n        \u003cp\u003e11. Put the FRAM breakout board on the header pins and tape it in place. Solder the header pins onto the FRAM breakout board.\u003c/p\u003e\n      \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n","metadata":{}},{"element_type":"user_image","content":"https://cdn-learn.adafruit.com/user_assets/assets/000/001/795/original/11-fram-breakout-taped-front.jpeg?1746231369","metadata":{}},{"element_type":"text","content":"\n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n        \u003cp\u003e12. Flip the perma-proto assembly over in the vise so you can see the back. Solder the header pins. Trim the excess pin length with diagonal flush cutters. After you finish soldering and trimming pins, Take the perma-proto assembly out of the vise. Remove tape and the sideways piece of header.\u003c/p\u003e\n      \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n","metadata":{}},{"element_type":"user_image","content":"https://cdn-learn.adafruit.com/user_assets/assets/000/001/796/original/12-fram-header-soldered-back.jpeg?1746231534","metadata":{}},{"element_type":"text","content":"\n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n        \u003ch2\u003e3D Printing\u003c/h2\u003e\n      \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n","metadata":{}},{"element_type":"text","content":"\n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n        \u003cp\u003eUse the download buttons below to get files for 3D printing the cart shell.\u003c/p\u003e\n\u003cp\u003eIf you have a Bambu Lab Printer, you can try the .3mf build plate (PLA, standard 0.2mm layer height preset modified for cubic infill and slower maximum acceleration).\u003c/p\u003e\n\u003cp\u003eIf you want to set up your own print job, get both the front and back cart shell STL files.\u003c/p\u003e\n\u003cp\u003eIf you want to edit the model in Blender, get the .blend file.\u003c/p\u003e\n      \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n","metadata":{}},{"element_type":"button","content":"https://github.com/samblenny/hotswap-i2c-fram/raw/refs/tags/v0.2.0/fram-cart-shell-both.3mf","metadata":{"class":"btn btn-large btn-block btn-primary","button_type":"primary","target":"_blank","zip_folder":"false"}},{"element_type":"button","content":"https://github.com/samblenny/hotswap-i2c-fram/raw/refs/tags/v0.2.0/fram-cart-shell-front.stl","metadata":{"class":"btn btn-large btn-block btn-primary","button_type":"primary","target":"_blank","zip_folder":"false"}},{"element_type":"button","content":"https://github.com/samblenny/hotswap-i2c-fram/raw/refs/tags/v0.2.0/fram-cart-shell-back.stl","metadata":{"class":"btn btn-large btn-block btn-primary","button_type":"primary","target":"_blank","zip_folder":"false"}},{"element_type":"button","content":"https://github.com/samblenny/hotswap-i2c-fram/raw/refs/tags/v0.2.0/fram-cart.blend","metadata":{"class":"btn btn-large btn-block btn-primary","button_type":"primary","target":"_blank","zip_folder":"false"}},{"element_type":"text","content":"\n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n        \u003cp\u003eOnce the print is done, your cart shell should look like this:\u003c/p\u003e\n      \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n","metadata":{}},{"element_type":"user_image","content":"https://cdn-learn.adafruit.com/user_assets/assets/000/001/797/original/13-shell-interiors.jpeg?1746231789","metadata":{}},{"element_type":"user_image","content":"https://cdn-learn.adafruit.com/user_assets/assets/000/001/798/original/14-shell-exteriors.jpeg?1746231816","metadata":{}},{"element_type":"text","content":"\n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n        \u003ch2\u003eFinal Assembly\u003c/h2\u003e\n\u003ch3\u003eScrew Shell Together\u003c/h3\u003e\n\u003cp\u003ePut the FRAM card assembly in one half of the cart shell. If you start with the back half of the shell, the top of the perma-proto PCB should face outward, like this:\u003c/p\u003e\n      \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n","metadata":{}},{"element_type":"user_image","content":"https://cdn-learn.adafruit.com/user_assets/assets/000/001/799/original/15-fram-card-in-shell-front.jpeg?1746232046","metadata":{}},{"element_type":"text","content":"\n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n        \u003cp\u003eOr, if you start with the top half of the shell (the one with the arrow), the bottom of the perma-proto board should face outward, like this:\u003c/p\u003e\n      \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n","metadata":{}},{"element_type":"user_image","content":"https://cdn-learn.adafruit.com/user_assets/assets/000/001/801/original/16-fram-card-in-shell-back.jpeg?1746232171","metadata":{}},{"element_type":"text","content":"\n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n        \u003cp\u003ePut the other half of the cart shell on and prepare four #2-28 x 5/16 inch thread rolling screws.\u003c/p\u003e\n      \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n","metadata":{}},{"element_type":"user_image","content":"https://cdn-learn.adafruit.com/user_assets/assets/000/001/802/original/17-shell-back-with-screws.jpeg?1746232330","metadata":{}},{"element_type":"text","content":"\n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n        \u003cp\u003eDouble check that the shell halves and FRAM card assembly are aligned properly, then screw the shell together. The result should look like this:\u003c/p\u003e\n      \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n","metadata":{}},{"element_type":"user_image","content":"https://cdn-learn.adafruit.com/user_assets/assets/000/001/803/original/18-assembled-cart.jpeg?1746232391","metadata":{}},{"element_type":"text","content":"\n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n        \u003ch3\u003eSwirly Grid Base\u003c/h3\u003e\n\u003col\u003e\n\u003cli\u003eAssemble the two swirly grids with the L-bracket TT motor mounts and M2.5 nylon screws with nuts.\u003c/li\u003e\n\u003cli\u003eMount the perma-proto boards, \u003cspan\u003eTCA4307 I2C buffer breakouts, and PCA9546 I2C mux breakout to the swirly grids with M2.5 nylon standoffs and screws.\u003c/span\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003cspan\u003eMount your choice of microcontroller dev board to the swirly grid (dev board not shown in picture)\u003c/span\u003e\u003c/li\u003e\n\u003cli\u003e\u003cspan\u003eConnect everything up with STEMMA QT / Qwiic jumper cables as shown in the pictures below. I used 50 mm cables from the breakout to the TCA4307 and from the TCA4307 to the PCA9545. I used a 100mm cable from the PCA9545 to the microcontroller board.\u0026nbsp;\u003cstrong\u003eNOTE\u003c/strong\u003e: Use\u0026nbsp;\u003cstrong\u003ePCA9545\u003c/strong\u003e I2C mux \u003cstrong\u003eport 0\u003c/strong\u003e for the \u003cstrong\u003eleft cart slot\u003c/strong\u003e and \u003cstrong\u003eport 1\u003c/strong\u003e for the \u003cstrong\u003eright cart slot\u003c/strong\u003e.\u003c/span\u003e\u003c/li\u003e\n\u003c/ol\u003e\n      \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n","metadata":{}},{"element_type":"user_image","content":"https://cdn-learn.adafruit.com/user_assets/assets/000/001/804/original/19-base-breakouts-for-2-slots.jpeg?1746233873","metadata":{}},{"element_type":"user_image","content":"https://cdn-learn.adafruit.com/user_assets/assets/000/001/805/original/20-base-i2c-mux-closeup.jpeg?1746233909","metadata":{}},{"element_type":"text","content":"\n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n        \u003cp\u003eTo slot a memory cart, line it up with the arrow on the bottom front, then move it near one of the magnetic connectors on the base. The magnets should pull the connector into place.\u003c/p\u003e\n\u003cp\u003eTo remove a memory cart, tilt it sideways slightly, then pull.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eCAUTION: The I2C bus GND and VCC lines are on adjacent pogo pins of the magnetic connectors. Be careful not to accidentally short them together.\u003c/strong\u003e\u003c/p\u003e\n      \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n","metadata":{}},{"element_type":"user_image","content":"https://cdn-learn.adafruit.com/user_assets/assets/000/001/806/original/21-base-with-carts.jpeg?1746234063","metadata":{}},{"element_type":"text","content":"\n  \n  \n  \n  \n  \n  \n        \u003ch2\u003eCircuitPython Code\u003c/h2\u003e\n\u003cp\u003eThis CircuitPython code should work on most Adafruit microcontroller boards as long as they have a STEMMA QT I2C port. I tested this on an ESP32S3 Feather running CircuitPython 9.2.7 and a Fruit Jam rev B prototype board running the 10.0.0-alpha.3 build.\u003c/p\u003e\n\u003cp\u003eIt isn't always this way across major version releases, but it currently happens to be the case that libraries from the 9.x bundle run fine on 10.x. Since 10.0.0 hasn't been released yet, I'm only including the 9.x libraries in my bundle file.\u003c/p\u003e\n\u003ch3\u003eDownload \u0026amp; Install Project Bundle\u003c/h3\u003e\n\u003cp\u003eTo copy the project bundle files to your CIRCUITPY drive:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003eDownload the project bundle .zip file using the Download Project Bundle button below.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eExpand the zip file by opening it, or use\u003cspan\u003e\u0026nbsp;\u003c/span\u003e\u003ccode class=\"inline\"\u003eunzip\u003c/code\u003e\u003cspan\u003e\u0026nbsp;\u003c/span\u003ein a Terminal. The zip archive should expand to a folder. When you open the folder, it should contain a\u003cspan\u003e\u0026nbsp;\u003c/span\u003e\u003ccode class=\"inline\"\u003eREADME.txt\u003c/code\u003e\u003cspan\u003e\u0026nbsp;\u003c/span\u003efile and a\u003cspan\u003e\u0026nbsp;\u003c/span\u003e\u003ccode class=\"inline\"\u003eCircuitPython 9.x\u003c/code\u003e\u003cspan\u003e\u0026nbsp;\u003c/span\u003efolder.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eOpen the CircuitPython 9.x folder and copy all of its contents to your CIRCUITPY drive.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003eTo learn more about copying libraries to your CIRCUITPY drive, check out the\u003cspan\u003e\u0026nbsp;\u003c/span\u003e\u003ca href=\"https://learn.adafruit.com/welcome-to-circuitpython/circuitpython-libraries\"\u003eCircuitPython Libraries\u003c/a\u003e\u003cspan\u003e\u0026nbsp;\u003c/span\u003esection of the\u003cspan\u003e\u0026nbsp;\u003c/span\u003e\u003ca href=\"https://learn.adafruit.com/welcome-to-circuitpython\"\u003eWelcome to CircuitPython!\u003c/a\u003e\u003cspan\u003e\u0026nbsp;\u003c/span\u003elearn guide.\u003c/p\u003e\n      \n\n\n\n\n\n","metadata":{}},{"element_type":"button","content":"https://github.com/samblenny/hotswap-i2c-fram/releases/download/v0.2.0/hotswap-i2c-fram-225a6b1.zip","metadata":{"class":"btn btn-large btn-block btn-primary","button_type":"primary","target":"_blank","zip_folder":"false"}},{"element_type":"text","content":"\n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n        \u003ch3\u003eCIRCUITPY/code.py\u003c/h3\u003e\n\u003cp\u003eThis is what the code looks like. It's built to automatically start up in 1 slot mode or 2 slot mode depending on whether you connect a PCA9546A I2C multiplexer to the I2C bus.\u003c/p\u003e\n\u003ch4\u003e\u0026nbsp;\u003c/h4\u003e\n      \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n","metadata":{}},{"element_type":"embed","content":"https://github.com/samblenny/hotswap-i2c-fram/blob/v0.2.0/code.py"},{"element_type":"text","content":"\n  \n        \u003ch2\u003eSerial Console Logs\u003c/h2\u003e\n\u003cp\u003eThese are some examples of running the code with the hardware configured for either 2 slot mode (with a mux) or 1 slot mode (no mux and only one TCA4307).\u003c/p\u003e\n\u003ch3\u003eTwo Slots with Mux\u003c/h3\u003e\n\u003cp\u003eHere's a serial console log where I:\u003c/p\u003e\n\u003cp\u003e1. Start with both slots are empty\u003cbr\u003e2. Slot gray FRAM cart into slot 0\u003cbr\u003e3. Slot green FRAM cart into slot 1\u003cbr\u003e4. Erase both carts\u003cbr\u003e5. Set a new message for both carts\u003cbr\u003e6. Remove both carts\u003cbr\u003e7. Slot the carts back on the opposite slots\u003c/p\u003e\n\u003cp\u003eThe lines with \u003ccode\u003eMenu:\u003c/code\u003e ... \u003ccode\u003echoice [1]:\u003c/code\u003e\u0026nbsp; are prompts to input a number to make a selection from the menu of actions.\u003c/p\u003e\n      \n","metadata":{}},{"element_type":"code","content":"Slot 0: Empty\n\nSlot 1: Empty\n\nMenu:\n 1  Scan for FRAM carts and print their header bytes\n 2  Write message to slot 0 FRAM (max 64 bytes)\n 3  Write message to slot 1 FRAM (max 64 bytes)\n 4  Erase first 64 bytes (set to 0) of slot 0 FRAM\n 5  Erase first 64 bytes (set to 0) of slot 1 FRAM\nchoice [1]: 1\n\nSlot 0 fram_bytes[0:64]:\n  54 68 69 73 20 69 73 20 74 68 65 20 67 72 61 79   This is the gray\n  20 63 61 72 74 00 00 00 00 00 00 00 00 00 00 00    cart...........\n  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00   ................\n  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00   ................\n\nSlot 1: Empty\n\nMenu:\n 1  Scan for FRAM carts and print their header bytes\n 2  Write message to slot 0 FRAM (max 64 bytes)\n 3  Write message to slot 1 FRAM (max 64 bytes)\n 4  Erase first 64 bytes (set to 0) of slot 0 FRAM\n 5  Erase first 64 bytes (set to 0) of slot 1 FRAM\nchoice [1]: 1\n\nSlot 0 fram_bytes[0:64]:\n  54 68 69 73 20 69 73 20 74 68 65 20 67 72 61 79   This is the gray\n  20 63 61 72 74 00 00 00 00 00 00 00 00 00 00 00    cart...........\n  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00   ................\n  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00   ................\n\nSlot 1 fram_bytes[0:64]:\n  54 68 69 73 20 69 73 20 74 68 65 20 67 72 65 65   This is the gree\n  6e 20 63 61 72 74 00 00 00 00 00 00 00 00 00 00   n cart..........\n  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00   ................\n  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00   ................\n\nMenu:\n 1  Scan for FRAM carts and print their header bytes\n 2  Write message to slot 0 FRAM (max 64 bytes)\n 3  Write message to slot 1 FRAM (max 64 bytes)\n 4  Erase first 64 bytes (set to 0) of slot 0 FRAM\n 5  Erase first 64 bytes (set to 0) of slot 1 FRAM\nchoice [1]: 4\nok\n\nSlot 0 fram_bytes[0:64]:\n  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00   ................\n  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00   ................\n  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00   ................\n  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00   ................\n\nSlot 1 fram_bytes[0:64]:\n  54 68 69 73 20 69 73 20 74 68 65 20 67 72 65 65   This is the gree\n  6e 20 63 61 72 74 00 00 00 00 00 00 00 00 00 00   n cart..........\n  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00   ................\n  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00   ................\n\nMenu:\n 1  Scan for FRAM carts and print their header bytes\n 2  Write message to slot 0 FRAM (max 64 bytes)\n 3  Write message to slot 1 FRAM (max 64 bytes)\n 4  Erase first 64 bytes (set to 0) of slot 0 FRAM\n 5  Erase first 64 bytes (set to 0) of slot 1 FRAM\nchoice [1]: 5\nok\n\nSlot 0 fram_bytes[0:64]:\n  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00   ................\n  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00   ................\n  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00   ................\n  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00   ................\n\nSlot 1 fram_bytes[0:64]:\n  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00   ................\n  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00   ................\n  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00   ................\n  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00   ................\n\nMenu:\n 1  Scan for FRAM carts and print their header bytes\n 2  Write message to slot 0 FRAM (max 64 bytes)\n 3  Write message to slot 1 FRAM (max 64 bytes)\n 4  Erase first 64 bytes (set to 0) of slot 0 FRAM\n 5  Erase first 64 bytes (set to 0) of slot 1 FRAM\nchoice [1]: 2\nMessage to write? (max 64 chars): GRAY CART\nok\n\nSlot 0 fram_bytes[0:64]:\n  47 52 41 59 20 43 41 52 54 00 00 00 00 00 00 00   GRAY CART.......\n  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00   ................\n  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00   ................\n  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00   ................\n\nSlot 1 fram_bytes[0:64]:\n  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00   ................\n  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00   ................\n  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00   ................\n  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00   ................\n\nMenu:\n 1  Scan for FRAM carts and print their header bytes\n 2  Write message to slot 0 FRAM (max 64 bytes)\n 3  Write message to slot 1 FRAM (max 64 bytes)\n 4  Erase first 64 bytes (set to 0) of slot 0 FRAM\n 5  Erase first 64 bytes (set to 0) of slot 1 FRAM\nchoice [1]: 3\nMessage to write? (max 64 chars): GREEN CART\nok\n\nSlot 0 fram_bytes[0:64]:\n  47 52 41 59 20 43 41 52 54 00 00 00 00 00 00 00   GRAY CART.......\n  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00   ................\n  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00   ................\n  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00   ................\n\nSlot 1 fram_bytes[0:64]:\n  47 52 45 45 4e 20 43 41 52 54 00 00 00 00 00 00   GREEN CART......\n  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00   ................\n  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00   ................\n  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00   ................\n\nMenu:\n 1  Scan for FRAM carts and print their header bytes\n 2  Write message to slot 0 FRAM (max 64 bytes)\n 3  Write message to slot 1 FRAM (max 64 bytes)\n 4  Erase first 64 bytes (set to 0) of slot 0 FRAM\n 5  Erase first 64 bytes (set to 0) of slot 1 FRAM\nchoice [1]: 1\n\nSlot 0: Empty\n\nSlot 1: Empty\n\nMenu:\n 1  Scan for FRAM carts and print their header bytes\n 2  Write message to slot 0 FRAM (max 64 bytes)\n 3  Write message to slot 1 FRAM (max 64 bytes)\n 4  Erase first 64 bytes (set to 0) of slot 0 FRAM\n 5  Erase first 64 bytes (set to 0) of slot 1 FRAM\nchoice [1]: 1\n\nSlot 0 fram_bytes[0:64]:\n  47 52 45 45 4e 20 43 41 52 54 00 00 00 00 00 00   GREEN CART......\n  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00   ................\n  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00   ................\n  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00   ................\n\nSlot 1 fram_bytes[0:64]:\n  47 52 41 59 20 43 41 52 54 00 00 00 00 00 00 00   GRAY CART.......\n  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00   ................\n  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00   ................\n  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00   ................\n\nMenu:\n 1  Scan for FRAM carts and print their header bytes\n 2  Write message to slot 0 FRAM (max 64 bytes)\n 3  Write message to slot 1 FRAM (max 64 bytes)\n 4  Erase first 64 bytes (set to 0) of slot 0 FRAM\n 5  Erase first 64 bytes (set to 0) of slot 1 FRAM\nchoice [1]:","metadata":{"language":"terminal","linenums":false}},{"element_type":"text","content":"\n        \u003ch3\u003eOne Slot No Mux\u003c/h3\u003e\n\u003cp\u003eHere's a serial console log where I:\u003c/p\u003e\n\u003cp\u003e1. Start with the slot empty\u003cbr\u003e2. Slot gray FRAM cart\u003cbr\u003e3. Erase gray cart then change its message\u003cbr\u003e3. Remove gray cart\u003cbr\u003e4. Slot green cart then change its message\u003c/p\u003e\n\u003cp\u003eThe lines with \u003ccode\u003eMenu:\u003c/code\u003e ... \u003ccode\u003echoice [1]:\u003c/code\u003e\u0026nbsp; are prompts to input a number to make a selection from the menu of actions.\u003c/p\u003e\n      ","metadata":{}},{"element_type":"code","content":"PCA9546A MUX NOT FOUND. STARTING IN ONE SLOT MODE.\n\n\nSlot: Empty\n\nMenu:\n 1  Print FRAM cart header bytes\n 2  Write message to FRAM (max 64 bytes)\n 3  Erase first 64 bytes of FRAM\nchoice [1]: 1\n\nfram_bytes[0:64]:\n  47 52 41 59 20 43 41 52 54 00 00 00 00 00 00 00   GRAY CART.......\n  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00   ................\n  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00   ................\n  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00   ................\n\nMenu:\n 1  Print FRAM cart header bytes\n 2  Write message to FRAM (max 64 bytes)\n 3  Erase first 64 bytes of FRAM\nchoice [1]: 3\nok\n\nfram_bytes[0:64]:\n  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00   ................\n  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00   ................\n  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00   ................\n  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00   ................\n\nMenu:\n 1  Print FRAM cart header bytes\n 2  Write message to FRAM (max 64 bytes)\n 3  Erase first 64 bytes of FRAM\nchoice [1]: 2\nMessage to write? (max 64 chars): This is the gray cart\nok\n\nfram_bytes[0:64]:\n  54 68 69 73 20 69 73 20 74 68 65 20 67 72 61 79   This is the gray\n  20 63 61 72 74 00 00 00 00 00 00 00 00 00 00 00    cart...........\n  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00   ................\n  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00   ................\n\nMenu:\n 1  Print FRAM cart header bytes\n 2  Write message to FRAM (max 64 bytes)\n 3  Erase first 64 bytes of FRAM\nchoice [1]: 1\n\nSlot: Empty\n\nMenu:\n 1  Print FRAM cart header bytes\n 2  Write message to FRAM (max 64 bytes)\n 3  Erase first 64 bytes of FRAM\nchoice [1]: 1\n\nfram_bytes[0:64]:\n  47 52 45 45 4e 20 43 41 52 54 00 00 00 00 00 00   GREEN CART......\n  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00   ................\n  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00   ................\n  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00   ................\n\nMenu:\n 1  Print FRAM cart header bytes\n 2  Write message to FRAM (max 64 bytes)\n 3  Erase first 64 bytes of FRAM\nchoice [1]: 3\nok\n\nfram_bytes[0:64]:\n  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00   ................\n  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00   ................\n  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00   ................\n  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00   ................\n\nMenu:\n 1  Print FRAM cart header bytes\n 2  Write message to FRAM (max 64 bytes)\n 3  Erase first 64 bytes of FRAM\nchoice [1]: 2\nMessage to write? (max 64 chars): This is the green cart\nok\n\nfram_bytes[0:64]:\n  54 68 69 73 20 69 73 20 74 68 65 20 67 72 65 65   This is the gree\n  6e 20 63 61 72 74 00 00 00 00 00 00 00 00 00 00   n cart..........\n  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00   ................\n  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00   ................\n\nMenu:\n 1  Print FRAM cart header bytes\n 2  Write message to FRAM (max 64 bytes)\n 3  Erase first 64 bytes of FRAM\nchoice [1]:","metadata":{"language":"terminal","linenums":false}},{"element_type":"text","content":"\n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n        \u003ch2\u003eNotes on 3D Modeling in Blender\u003c/h2\u003e\n\u003cp\u003eAfter trying several different 3d modeling tools, I've come to really like working in Blender. In particular, by using \u003ca href=\"https://docs.blender.org/manual/en/latest/modeling/geometry_nodes/introduction.html\" target=\"_blank\"\u003egeometry node modifiers\u003c/a\u003e, it's possible to get precise control over complex geometry using dimensions computed from other objects. For example, here's a screenshot showing some of the geometry nodes involved in making the cavity around the perma-proto PCB (space for the FRAM breakout):\u003c/p\u003e\n      \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n","metadata":{}},{"element_type":"user_image","content":"https://cdn-learn.adafruit.com/user_assets/assets/000/001/807/original/25-geometry-nodes-example.jpeg?1746264603","metadata":{}},{"element_type":"text","content":"\n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n        \u003cp\u003eHere are a few more Blender screenshots showing orthographic wireframe views of my model:\u003c/p\u003e\n      \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n","metadata":{}},{"element_type":"user_image","content":"https://cdn-learn.adafruit.com/user_assets/assets/000/001/808/original/22-wireframe-x-ortho.jpeg?1746264673","metadata":{}},{"element_type":"user_image","content":"https://cdn-learn.adafruit.com/user_assets/assets/000/001/809/original/23-wireframe-y-ortho.jpeg?1746264690","metadata":{}},{"element_type":"user_image","content":"https://cdn-learn.adafruit.com/user_assets/assets/000/001/810/original/24-wireframe-z-ortho.jpeg?1746264708","metadata":{}}]