Convert White Resin Cartridge to Black Resin by modifying chip ID

Frustrated with the cost of the form labs resin I ordered some MakerJuice. MakerJuice runs best at FLGPBK03 (Black v3 resin) settings but my only spare cartridge was an old FLGPWH01 (White V1). Running in Open Mode made for worse prints. MakerJuice isn’t near as great as the Form resin but for rough prints it’s much more cost effective for stuff that’s high volume / low detail.

Undeterred I set out to clone the Black chip identifier.

Looking at the chip ID on the bottom of the cartridge I saw it only had 2 pads instead of 3 which meant it was probably speaking 1-Wire protocol by Maxim and was therefore probably one of their external EEPROM chips. After a bunch of digging I narrowed it down to the DS2431. (Only later d`id I see this was recently discovered on the forums here.) Anyways, it is fortuitous as there are a bunch of guides online for interfacing with this chip with a Bus Pirate.

I attached two alligator clips to the DS2431 chip on the cartridge:

And connected the Bus Pirate to the DS2431 chip using 1k ohm pull-up resistor hooked up to the Data line (MOSI on the Bus Pirate - never mind that I’m using the ‘old’ v2go in this pic. The newer v3.6’s work just fine.)

Turning on the Bus Pirate and putting it into 1-Wire mode (with the power supplies enabled!) lets us discover the chip:

(Commands “m; 2; W; (240);”)

From there we can dump the memory of the interesting cartridge using: “(85)(1) 0xf0 0x00 0x00 r:144”

From there, we can copy this data to a notepad and edit our next chip. By hand this is a tedious process as the DS2431 only has an 8byte buffer and should be made into a script but for illustration purposes you can write over the it like so:
#write first 8 bytes to address 0x00 to DS2431 ‘scratchpad’
(0x55) (1) 0x0f 0x00 0x00 0x43 0x00 0x16 0x4E 0xA8 0x20 0xF9 0x06
#optional - confirm it’s in ‘scratchpad’ and get checksum data / write command
(0x55) (1) 0xaa r:3 r:8 r:2
#commit from ‘scratchpad’ to memory
(0x55) (1) 0x55 0x00 0x00 0x07

#write second set of 8 bytes starting at 0x08
(0x55) (1) 0x0f 0x08 0x00 0xB5 0x82 0x6F 0x98 0x7C 0xBA 0x62 0xFC
(0x55) (1) 0x55 0x08 0x00 0x07

#write third set of 8 bytes at address 0x10…forth set 0x18… fifth set 0x20… sixth set0x28…
…seventh and eighth you can skip because their just 0xFF’s…and then…

#write ninth set of 8 bytes at address 0x40
(0x55) (1) 0x0f 0x40 0x00 0x01 0xD3 0x87 0x35 0x94 0x88 0xBF 0x1C
(0x55) (1) 0x55 0x40 0x00 0x07

#write tenth (and final) set of 8 bytes at 0x48
(0x55) (1) 0x0f 0x48 0x00 0x85 0x03 0x3D 0x5D 0x7C 0x03 0x87 0x13
(0x55) (1) 0xaa r:3 r:8 r:2
(0x55) (1) 0x55 0x48 0x00 0x07

confirm the firmware is written by dumping again:
(85)(1) 0xf0 0x00 0x00 r:144

Then :boom: boom :boom: - cloned cartridge with reset fluid count ready to go.

The nozzles don’t last forever but I assume you can put on your big person pants and make a judgment call when things need to replaced at the hardware level. Now you can at least use alternative resins without being crippled by open mode.

Props to @yoderkl and @fantasy2 - wish I saw your posts earlier :cowboy_hat_face:

5 Likes

Simply cloning the data from one to the other cartridge doesn’t work with V2/V3 resins.

As you might have noticed I made a programmer which is a bit more handy than some wires and also have software to do the programming. Happy to implement your findings to make it easier to change the resin type.

[edit]
Just analysing what you did but you are writing set 9 and 10 on the wrong position.

Is it really cloned or just reset? Resetting fluid level is where the group is currently, but not able to change other details.

@fantasy2 yeah, I looked around but didn’t see anything on Github. Are you posting your work to bitbucket or somewhere else? Or is it not open source?

If it is, I’m happy to submit a pull request with some more work I did on the checksum stuff at address 0x48. That’s halfway to making this data editable rather than just resetting it.

You could do either. All I’m doing is copying the data off one chip and putting it onto another (cloning) but putting it back on itself would be resetting.

The project is not open source at the moment.

I honestly can’t see how you’re doing checksum stuff at 0x48 related to the resin type.

Erasing all data from a chip and putting it back exactly the same does not reset your cartridge. If it does you’re placing data on a place where it shouldn’t be. How did you verify it was empty? Via the display?

I tried copying data from many cartridges to other cartridges 1:1 and verified the data. The printer stops recognising the cartridges once you do that.

1 Like

Im very interested in what you have achieved here. Im an EE and I’m looking to achieve something similar but in a neat package and run directly from a uc without the need for a PC. Essentially a battery powered handheld device. Would you be willing to share your findings with me for collaborative development?

If anybody is still interested in this, drop me a line. I develop equipment that talks to thousands of 1-wire devices, and just out of curiosity connected one of the eeproms to the 1 wire bus, gave the micro the command to read eeprom, (I use a couple of different larger ones, but same family), and the info popped right out. I’ve not spent any time trying to decode it, but might be interesting to try.
The code is based on
https://bitbucket.org/StablePoint/stablepoint.hardware.onewire/src/Development/

2 Likes

After the fact, occurred to me to add I’m not looking for compensation, I just don’t want to put any effort into something if nobody will ever use it.

I’m interested.

I am very interested in this project! I would love to help and test it I would love to talk to you offline about this!

I am interested in exploring this further, is anyone here still working on understanding the memory map of the DS2431? Let’s crack this for good and unplug our formlabs printers from skynet to prevent them from being “fixed”.

I’m definitely interested. I understand why FL cripples the printer in “open” mode, but It would be really nice to actually have an open mode. Or in this case a usable “closed” mode.