Core 64: Interactive Core Memory Badge

Interact with Core Memory to explore, learn and inspire.

Similar projects worth following
Draw with a magnet directly IN CORE MEMORY!

Many people may have heard of core memory (most recently with the buzz surrounding the Apollo Guidance Computer) but few have experienced it. This project enables interaction and education using core memory that is unexpectedly engaging with the door wide open for more exploration. With this project in hand, you will be able to physically interact with core memory using a magnet. You simply have to try it! The array of LEDs underneath brings the cores to life in a completely new way. You will be able to create your own core/light interactions in the Arduino environment.

This is one of those ideas that seems too simple but needs to be experienced to get it. Based on the feedback I have received from people who have used the proof-of-concept, it is clearly worth sharing with a wider audience as a complete product. The form factor begs for this project to take shape as a badge because it is easier to carry around and share the experience.

The previous work with the proof-of-concept is posted here and runs with 32 cores. The badge version of this project is taking shape on this project page and has 64 cores. The project name is a nod to my favorite 8-bit computer, the Commodore 64.

What does it do?

I just added a VCF West 2020 virtual exhibit video which is a good summary of the project so far.

It allows you to draw in core memory with a magnet like this...

Here is a video demo. In its simplest form, the badge allows you to draw on the RGB LED matrix "screen" with a magnetic stylus. In this first mode, you are directly interacting with the cores which are acting as static screen RAM. It is that simple but it ends up being very engaging on its own. When I share this with people, this is where I start to hear, "Oh, this is cool. Now I get it." At this point you are only seeing a monochrome drawing mode.

There is another mode of operation that enables a much wider range of interaction. In the second mode, the cores are acting as a touch overlay on the RGB LED screen. The cores are effectively acting as "touch RAM." By refreshing and checking the state of the cores, the whole array comes alive and can sense which core (or cores) are being affected by a magnet at a given moment. By decoupling the cores from the screen RAM, the creative juices can be unleashed. Instead of a monochrome drawing mode, full color drawing can come alive. The core array turns into a mesmerizing magnetic flux detector. I have even implemented a simple game of snake that is fun to play.

I need to make a technical clarification for those who know the intricacies of core memory operation. In the present implementation, as far as I can tell, the magnetic stylus is not changing the core polarity to a specific direction. Instead, it works by inhibiting the first write in the read process by holding the core in a fixed polarity so the sense wire doesn't see the effect of a polarity change when the core is written too. This is because the strength of the magnetic field in the wires is not enough to overcome the presence of the stylus magnet. That fixed polarity could be either CCW or CW. I need to do some more testing to clearly understand how it works. For now, it works very well in this mode of operation, but it requires constant scanning of the core array to see the stylus. This makes me think more about an active stylus add-on, or stylus with each end having an opposite magnetic polarity.

Beyond the "core memory + LEDs" party trick, I have several other goals for this project. Here they are, along with the reasoning behind why I think they are valuable:

Deceptively Simple

My aim is to keep the badge clean looking from the front so the focus is entirely on the cores and LEDs themselves. That is, after all, the focal point of this project. Everything will be accessible from a mechanical/electrical/programming perspective which leaves the door open for your creativity to be expressed.

Full Control of the Cores

I made a conscious decision to use a microcontroller to discretely drive the core wiring matrix with transistors. This allows you to develop your own control algorithms and have complete control of each wire in the core matrix to really learn about what is happening. I have seen other projects which decouple the addressing logic through hardware which makes it easier to interface with the cores, but the point of this project is to get you as close to the cores as possible. You can choose to abstract the interface as much or as little on the software side.

Hidden [Magnetic] Tricks

In order to open the door even wider to your creativity, and sticking with the spirit of a project which revolves around magnetism, there will be a few more goodies on the backside of the board. I anticipate these items to be:

  • Several Hall-Effect switches to act as user assignable hot buttons.
  • A reed switch; just 'cause it is magnetic
  • Communication ability. I would like the badges to...
Read more »

Adobe Portable Document Format - 29.86 kB - 08/25/2019 at 12:26


Adobe Portable Document Format - 52.61 kB - 08/25/2019 at 02:59


Adobe Portable Document Format - 68.01 kB - 08/25/2019 at 02:59


Adobe Portable Document Format - 34.86 kB - 08/25/2019 at 02:59


Adobe Portable Document Format - 96.65 kB - 08/25/2019 at 02:52


View all 8 files

  • Time for another round of prototypes

    Andy Geppert08/27/2020 at 04:00 0 comments

    I've kicked off another round of prototypes with what I think is the final configuration. I'm sticking with the dual board design.

    The top Core Board will have four I2C hall sensor buttons in the bottom edge of the frame to enable more flexibility with the user interface (Mode, Set, Minus, Plus). The hall sensors read flux strength, and that makes the sensitivity tunable versus the hall switches which use a fixed flux level for activation. I am also now including an ambient light sensor (upper left corner of this rendering) to automatically adjust the LED array brightness. The LEDs in the LED array have a dynamic range that needs to be adjusted for dim and bright conditions or they end up being blinding in low light, and unusable outside in the sunlight. 

    There are also some traces and pads to allow me to experiment with stacking 8 core planes on a single logic board. Look for that as an entry in the Circuit Sculpture Challenge. I've got something unique planned for that. The core boards and components are ordered and should arrive this weekend.

    The logic board is next for update work. I have a long list of refinements pinned down, and schematic refinement will begin in the next few days. The highlights:

    • Stepping up to a Teensy 3.2 because the LC doesn't have enough IO.
    • Removing the slow IO expanders, so core scanning speed will be greatly increased.
    • Increased usable battery voltage range of ~2.8 to 7V (1S Lipo up to 4 primary AAA or AA Lithium cells)
    • Using much lower drop-out 5V and 3V3 regulators to make better use of the batteries.
    • Creating more room for expansion by exposing several I2C and SPI pins for optional fun stuff: 3.2" LCD to replace LED array, Monochrome or Color 128x64 OLED, 128x32 Teensy View OLED, Micro SD Card, 2x SAO ports, and a QWIIC port. 
    • The battery area will accommodate being powered with an optional 1S LiPo and charge manager for those who prefer not to use primary cells.

    An expansion option that I'd like to see offered is the ability to communicate between badges with magnetic fields. The first choice would be NFMC like the Defcon 27 Badge. I've also see some 3D flux sensors (Infineon) that might work, and I've considered a PN532 Breakout Board. If you have some interest in bringing something like that to life for this project, I'd like to hear from you.

  • Features and Accessories Questions

    Andy Geppert07/30/2020 at 03:14 0 comments

    I have a lot of ideas for expansion to make sure there is room for easily exercising your creativity. But I need to narrow things down and get a produceable design ready.

    What do you think of these as baseline features that would be included?

    • 64 bits of authentic core memory (weave it yourself)
    • 64 RGB LEDs (Pimoroni Unicorn Hat)
    • 4 hall switches (user configurable)
    • Arduino compatible Teensy 3.2 (32-bit NXP Cortex-M4 72 MHz) with all IO accessible
    • Magnetic Stylus with narrow and wide field tips
    • 4x "AAA" battery pack holder
    • Battery Voltage Monitor
    • All of the matrix drive lines, the power rails, and the sense outputs will be easily accessible

    What do you think of these plans to provide the following header rows/pads for additional expansion?

    • Generic I2C OLED
    • Generic SPI OLED or Sparkfun Teensy View SPI OLED
    • SAO Port, quantity 2
    • Adafruit MicroSD breakout board
    • Sparkfun QWIIC port
    • Ambient Light Sensor
    • Proximity Sensor
    • Sparkfun LiPo manager
    • Generic or Adafruit 3.2" LCD to replace LED Array

    What would you consider the must-haves?

    Any ideas for nice-to-haves?

    If you wouldn't mind providing that feedback through the survey form on my website, I'd appreciate it:

  • Power Supply Improvements

    Andy Geppert07/11/2020 at 16:03 0 comments

    I made solid progress on power supply and efficiency for the system. Time for another round of "spot the bodge wires:"

    The improvements:

    1. Simplified ground bus: Reverse Polarity protection moved to high side to simplify all grounding.
    2. Reduced voltage drop/waste: Removed diode as RPP, now using only the P-CH FET. 
    3. Increased operating voltage range: Now 3.6 to 7.0 (was 4.5 to 6.0) with these changes:
      1. Added 5V regulator/bus for LED array and Teensy Vin (Teensy LC max is 5.5, Teensy 3.2 max is 6.0)
      2. Allows use of 4x "AAA" batteries like Energizer Ultimate Lithium, because four of them is almost 7V vs. regular alkaline which might be ~6V maximum, which exceeds what the Teensy can handle. I know this by trial and error.
      3. Opened the door to using a 1S LiPo, if the user chooses to hack in that option. I plan to make it easy to hack in with an Adafruit Micro-LiPo Charger.
    4. Improved efficiency: Powering both 5V and 3V3 regulators separately from the battery/switch, not in series.

    Other notable points:

    • The pin/sockets are working well for the Core & LED & Teensy components. Insertion/removal force is "just right" and it makes it easy to hack and modify. I haven't bent any pins... yet.
    • Lots of optional female headers making 'scoping signals much easier than using test point loops.
    • Battery pack behind the core array is out of the way AND supports LED array at the right height under the Core array. Stack-up is "just right."

    Do you know how to configure both the 5V0 and 3V3 regulators to be automatically bypassed when their respective input voltages drop below 5.5 and 3.8? This would increase efficiency and expand the lower limit of the battery voltage range even further. Right now the 1S LiPo only goes to about 3.6 before the system browns out, and it should easily be able to go down to 3.3 or even 3.0 to use the full range of the LiPo.

    Next up, test the hall switches on analog inputs and some optional add-ons (SD-Card, QWIIC light sensor, LCD).

  • Dual Red Board Prototype is Working!

    Andy Geppert07/08/2020 at 02:32 2 comments

    On July 4th I finally got the newest prototype working. But it runs very slowly...

    I chased some rabbits, learned even more, and figured out that the enable transistor has too much of a voltage drop for the system running at 3.3V. With the enable transistor, there are a total of three transistors in series for each core matrix wire. That doesn't leave much current for flipping bits. As a quick test, I soldered a jumper wire to bypass the enable transistor and then everything started working reliably. I've now replaced the transistor with a FET and gate pull-down resistor. It's just above the section in on the left above the chip, above the text CORE ARRAY ENABLE. 

    With respect to the core matrix drive, there are two big functional changes in this prototype from the last one (single green board). And some big "oh..." learnings.

    1) The core matrix is driven from a 3.3V regulator. And it starts to drop-out around 4.3V. And with a .9V drop diode on top of that (to limit input voltage to the Teensy MCU's weak regulator), I'm wasting a lot of power.

    2) The core matrix transistors are driven by two IO Expanders that are connected to the Teensy MCU with I2C. This makes the effective refresh rate a hundred times slower than direct IO pin manipulation on the Teensy. I'll be dropping those IO Expanders from the next iteration and going with more MCU IO. 

    Combining both of these (wasting input power, and having transistor on-times measured in ms instead of us) results in very poor battery life. That is were most of my learning is recently, but there are a several other things I've learned that I need to refine. I also have a few more peripheral functions to test, so I might uncover a few more opportunities for improvement.

    Overall, I'm very happy with the progress and results. I'm getting close to being able to offer a kit that is robust, and that I can be proud of. I need to rework my power supply approach now.

  • LED Array Holder Prototype

    Andy Geppert05/26/2020 at 03:03 0 comments

    The other circuit board and components did not show up this weekend, so I diverted to other important steps. That is, BOM refinement, assembly instructions, and mechanical design.

    The first prototype design of the Core+LED Array holder is now in hand, ready for testing and design refinement.

    This is the direction I'm headed for a complete assembly:

    More refinement is needed, but just going through one cycle of the design/make process has already illuminated some breakthroughs in the assembly process for the LED Array holder. Even at this stage, I'm surprised how quickly everything comes together for a professional look thanks to quality 3D prints. 

    There is a screen protector layer over the cores (transparency film) and a diffuser layer (from a scrapped LCD panel) between the LEDs and the cores. And because printing this as one part creates a lot of support material (and removal work), I diverted to a two piece design, and now I don't need as many cut-outs, so that open gap on one end of the bezel will be completely filled in. Nice discovery to figure that out after I started printing the first one.

    This project is quickly picking up steam again.

  • Beginning assembly of the Dual Board (red) prototypes

    Andy Geppert05/22/2020 at 12:33 0 comments

    Despite a lack of log updates, I have been making a lot of progress toward the next round of prototypes. I have moved to a dual board design which presents the core array on its own circuit board. The decision incurred a lot of work in creating two new PCBs with proper interconnections. Regardless, I'm happy with the results so far. This time the core weaving went much faster, and the results are more consistent.

    The second board is twice as tall, and will support all of the logic functions. The core board will plug into the top of the logic board, like this:

    I'm looking forward to receiving the logic board in the next 3 days. In the meantime, I aim to complete the assembly of the core board and complete some basic tests.

    The benefits of this revised approach are:

    1. A more physically robust design that does not require a supporting enclosure on the back side. It also sits flat/stable on a table surface.
    2. All of the components on the logic board are on the top which makes troubleshooting much easier.
    3. The core board can be sold separately with a much lower cost so potential buyers can make a minimal investment to see if they want to follow through with the complete project before committing to the more expensive logic board.
    4. It is easier to assemble the smaller core board on its own.
    5. The sandwiched design hides the battery pack between the boards, and provides an area to secure the stylus (with 3D printed balogna between the boards).

    Here's to prompt shipping by FEDEX for the components, and to DHL for the logic boards from It'd be great to receive them this weekend, please!


    Andy Geppert03/01/2020 at 18:17 1 comment

    Updated with a Hex mode demo video:

    Finally got a new mode working, thanks to the suggestion of Morgan. This mode displays the HEX values of the 64 bits, aka 16 nibbles or characters. The upper left nibble on the LED array is the first HEX character, and the lower right nibble on the LED array is the last HEX character. Stated another way, when the LED/CORE array is used as a 64-bit value, MSb is upper left, LSb is lower right.

    I split the nibbles into two rows of eight for the OLED display in order to clearly display some "English" hex words. Yes, it is interactive too! I'll share a video when the OLED stability issue is resolved. The text keeps drifting across the screen, and it's very annoying. I need to figure out if this is an electronic or firmware logic or library problem.

  • Video Demo - Core 64 Prototype is fully functional!

    Andy Geppert02/27/2020 at 06:01 0 comments

    This video shows and describes the "core" functionality I've been trying to achieve. It's a great feeling to finally be at this point in the project! Even though I've had the scrolling text working for awhile on it's own, I'm now able to make it truly interactive by using the core memory as screen RAM.

    I've said it before, but you really do have to experience this to get the feel for how fluid and interactive it is. It is satisfying to use the stylus on the cores, and have the LEDs instantly respond. The mode where the LEDs constantly show the extent of the magnetic flux is similar to moving sand in a zen garden. It just flows.

    I'm noticing some unexpected behavior, which might inspire some new ideas. First, when I hold the stylus with very little pressure, it wants to jump between cores, trying to stay aligned to a discrete core. The effect is subtle, but noticeable. I didn't expect to be able to feel the interaction with the cores. And the second unexpected thing is that I can hear the cores resonating. In all three modes that I've demo'd in the video, the cores are constantly being written to and read from. That translates to a faint ringing noise that I can hear when the badge is close to my ear.

    This continues to be a project with unexpected twists and interesting things to learn. I hope to be able to sell some kits before the end of 2020. 

  • Core sense reliability improved!

    Andy Geppert02/22/2020 at 16:32 0 comments

    The core sensing is now working much more reliably, at least from the perspective of what the MCU can sense. I reduced the threshold required for the Op-Amps to register a change in the sense wires from 22mV to 11mV (corresponds to a 22 Ohm and 11 Ohm resistor change). The increased sensitivity provides a longer output pulse, and gives the MCU more time to see the signal. An improvement I'm considering in a future version is to add a flip-flop as a buffer to make it easier to catch the sense pulse. Right now the timing requirements are very tight, and I am disabling interrupts and using digitalReadFast to catch the core sense wire changes.

    A significant part of this project is to enable others to experiment with the design of the firmware and the core control schemes. I am working toward a clean system architecture (both in the firmware and electronics) with robust sample code and APIs. This opens the door to experimentation at any level of the system.

    Even at this stage of functionality, there is a lot of fun to be had. For instance, holding this cube of magnets above the cores does not affect all of the cores as you might expect. It only affects the cores at the four corners, where the magnetic flux is far less constrained. This mode of operation is what I call "flux detection" mode. The cores are all being polled every 12 ms, with a corresponding LED array update, to show which cores are effectively being blocked from polarity changes as the 1's and 0's are written. It's highly INTERACTIVE!

    Of course, if the cube is held closer to the cores, there is enough flux leakage on the whole surface to affect all of the cores under the magnets.

    Next up, some multicolor drawing with persistent pixel changes. 

    Coincidentally, I just hit a total of 160 hours into this project with this milestone update. That's 4 weeks of full-time work, spread over many months... When I started this, I had the proof-of-concept running, and had just begun watching a great video series on how to use KiCAD. Thank you Shawn Hymel and Digi-Key! This project is my first time designing a PCB from scratch. 10 out of 10, would do again!

  • I can draw!

    Andy Geppert02/22/2020 at 13:55 0 comments

    I can now draw on the screen for real! This means all of the cores are working with both reads and writes, and the the LED matrix is showing the state of the cores in realtime, with an overall refresh rate of 12ms. The following image shows the extent of the flux from the cylindrical magnet on the end of the stylus.

    This milestone has been a long time coming. The breakthrough I made was the discovery that my shared use of a GPIO pin for one of the matrix drive transistors and the LED array was causing interference. The effect was that quickly strobing the matrix transistor fooled the LED array into thinking it was receiving valid data. The array is driven by a series of pulses, and if they are close enough together (less than about 150 us) the first few WS28128 LED pixels in the string start to illuminate. This is a design problem that is obvious now. But fortunately everything is still happening fast enough when I added a necessary delay, a firmware change overcomes the issue. In the next prototype, I plan to implement two 3-8 binary decoders to free up some IO on the Teensy LC. I was already overlapping some of the IO usage, and could use some headroom for other functionality that I need to add. The core matrix itself requires 20 transistors on its own.

    There are several more hurdles to resolve related to the functionality outside of the cores/LEDs, but the last  two hurdles I have to solve for the cores is the sensing signal and the half-select currents. Those need to be tuned up to operate 100% reliably with a wider range of power supply voltage. I am seeing occasional flashes on the LED matrix which are indicating that sometimes the core flip is not being sensed. The allowable input voltage range right now is 3.3 to 4.0V, which works OK with the LiPo battery I'm using. But it needs to be more reliable.

    Also looking forward to the next PCB layout, so I can update it to say 2020!

View all 21 project logs

Enjoy this project?



jibril wrote 03/02/2020 at 15:30 point

Your welcome!!

  Are you sure? yes | no

morgan wrote 02/29/2020 at 06:20 point

Look forward to seeing the 0xDEADBEEF (or 0xC0D3C4FE) readout

  Are you sure? yes | no

Andy Geppert wrote 03/01/2020 at 05:15 point

Working on it... 64 bits is just enough room for both of those hex values. I thought it would be easy, but Arduino/GCC 32-bit-land appears to get weird with some bitwise operators greater than 32 bits... And with serial print... And probably with the Adafruit OLED libraries. More "unexpected learning" and am now trying to work around it.


  Are you sure? yes | no

morgan wrote 03/01/2020 at 05:17 point

"By midnight" he says!

  Are you sure? yes | no

jibril wrote 02/28/2020 at 01:49 point

That is soooooo cool, awesome design but it would be nice if you put a plastic casing around the edges so you can put it your pocket and walk around with it without the fear of it breaking.

  Are you sure? yes | no

Andy Geppert wrote 03/01/2020 at 20:44 point

Good feedback on the case. Thanks.

  Are you sure? yes | no

awenisko wrote 01/31/2020 at 15:26 point

Omg, this is amazing. Kudos for your brilliant idea and design!

  Are you sure? yes | no

Similar Projects

Does this project spark your interest?

Become a member to follow this project and never miss any updates