Some Background:
I have two CatGenies, both of which take a proprietary cartridge that are good for sixty cycles. The CatGenie will not run without a non-empty cartridge installed. In my home, each unit runs four times a day (I have six cats), so a cartridge lasts only fifteen days. Each cartridge is about fifteen bucks. For those of you following along without benefit of a calculator, that totals sixty bucks a month in cartridges.

Environmentally, four cartridges per month equals a lot of foil, plastic and little circuit boards in the landfill - and I really don't see how CatGenie could sell refills without totally redesigning the cartridge.

Proposed Solution:
Adding new solution to an empty cartridge is not that complicated (see my other instructable), but it isn't really helpful because the cartridge has a microchip on it that acts as a counter. When the counter reaches zero, the cartridge is trash. This instructable will demonstrate how to reset the counter on the cartridge to "full" - allowing you to drop it back into the unit and rock on.

This instructable does cover resetting but does not cover refilling the solution in the cartridge; it assumes you have done so already. If you need help with the refilling process, please see my other instructable.

Step 1: Disclaimers, Warnings, Materials and Safety

It should be noted that I am in no way affiliated with CatGenie or PetNovations LTD. This instructable is (obviously) not approved or endorsed by PetNovations LTD. CatGenie is a registered trademark of PetNovations LTD.

Should you break or damage your CatGenie, your CatGenie SaniSolution cartridge, an Arduino, your computer, sprain your thumb get divorced or whatever - you follow these instructions at your own risk and I assume no liability for what you do or what happens to you. You're a big person. Caveat Emptor.

By following this instructable you may in some way void your CatGenie warranty... but as long as you don't send back the cartridge with non-CatGenie cleanser in it, I don't see how they would know.

There really aren't any safety concerns I can think of beyond common sense. If common sense is an uncommon virtue for you, maybe you should find someone to help you. :-) If not, then rock on!

  • an Arduino microprocessor (or clone thereof)**
  • some breadboarding wires and an LED (any color)
  • a computer with which to program said Arduino
  • a "dead" SaniSolution cartridge
  • a CatGenie you're willing to disassemble and put back together.***

**actually, any microprocessor that communicates via I2C (aka "Two Wire) protocol will suffice, but the Arduino is what I have available and one with which I am familiar. Programming a PIC controller or whatever is on you.

***unless you're willing to fabricate your own cartridge holder. You're on your own there.

Step 2: Get Everything Ready: the Arduino Software

The Arduino
Get your Arduino (I will be using a Diecimila so if you're at all intimidated by the Arduino, get that one), then download and install the software onto your computer. I know I'm being pretty vague here, but this is covered much better on the Arduino web site than I could ever do.

Verily thou must venture there, learn much, and return unto me enlightened. :-)

The Software Side

Once you've got everything bought / built / installed and working, you'll need to load this "sketch" (Arduino-ese for "program") into your Arduino (copy & paste it into your development environment, then upload it to your Arduino):
#include <Wire.h>#define CG (B1010000)boolean resetSuccess = false;int isReset = 13;int byteArray []= {01, 01, 01, 60, 60, 60, 60, 60, 60, 8, 8, 8, 33, 33, 33, 255};void setup(){   pinMode(isReset, OUTPUT);  digitalWrite(isReset, LOW);  Wire.begin();        // join i2c bus (address optional for master)}void loop(){  if (resetSuccess)   {    delay (2000);      // our work is done - pause for a while     resetSuccess = false;  } else {    resetCartridge();    resetSuccess = verifyCartridge();    digitalWrite(isReset, resetSuccess);  }}void resetCartridge(){  for (int i=3; i < sizeof(byteArray)/2; i++)  {    Wire.beginTransmission(CG);    Wire.send(i);    Wire.send(byteArray[i]);    Wire.endTransmission();    delay(4);  }}void movePointerTo(int deviceAddr, int memoryAddr){  Wire.beginTransmission(deviceAddr);  Wire.send(memoryAddr);  Wire.endTransmission();}boolean verifyCartridge(){  boolean success = true;  movePointerTo(CG, 3);  Wire.requestFrom(CG, 3);  while (Wire.available())  {    if (Wire.receive() == 60 && success == true)    {       // looking good so far    } else {      success = false;    }  }  return success;}
Those of you who are Arduino programmer gurus please feel free to optimize this code - just send me the improved version so I can post it here.

You needn't trouble yourself with the details of what is actually happening lest you feel so inclined; basically, you connect your cartridge to the Arduino and it turns on an LED when the reset is successful. When you disconnect the cartridge, the light goes out. Lather, rinse, repeat.

on to the hardware...

Step 3: Get Everything Ready: the Arduino Hardware

Okay... if you're going to hook your Arduino up to your cartridge, you're going to have to wire it up. Take a deep breath, find your center and relax. Its easy as can be... and we have pictures. Everyone loves pictures. :-)

My directions are for an Arduino Diecimila, so if you got a different version you may see some slight variations, but its probably nothing you can't figure out by your lonesome. If it is, just drop me a line and I'll help you out.

Picture #1 has us installing an LED. You can use any color you like. You'll jam the legs of the LED into Digital Pin 13 and GND (fortuitously situated next to each other) but first check the polarity! The bottom of your LED will have a flat edge. The pin on that edge needs to go into GND.

If you get it backwards, it will never light up. NEVER! Mwuhahaha...... Of course, you could always just turn it around. That might work.

I'm okay now. As I was saying....

We've got our indicator hooked up (cake, wasn't it?), now we just need to connect to the cartridge.

The chip on the cartridge has four contacts. I know, I know - it looks like there are eleven, but trust me... there are only four. Eleven little gold contacts connected to four wires: power, ground, clock and data, so four contacts. These equate to pins 3V3, Gnd, A4 & A5 on the Arduino. These are all on the oppsite edge of the board from the LED - if you want to make it easier on yourself you can use black, white, blue and green wires as I have done here in picture 2.

Step 4: Get Everything Ready: Disassemble Your CatGenie

I know.

You have a love/hate relationship with your CatGenie - but that doesn't mean you're ready to tear it apart. It was hard for me too, at first - but I persevered. I was able to move past my initial shock and horror, and embrace my inner hacker.

You can too. Be strong.

Or, you can build some sort of cartridge adapter. Up to you (I've done both) but this way is VERY reliable, and if you reset all your empty cartridges at once you'll only have to do this every couple of months or so.

We're going to try something different on this step: all the instructions are on the photos.

You will need a longer than normal phillips head screwdriver - I'd say six inch shaft [snort!] to be safe.

Step 5: Let There Be a Joining...

Okay. We've got an Arduino with an LED and four wires sticking out of it, our sketch (aka "program") loaded into the Arduino memory, and our CatGenie cartridge holding unit successfully extracted from the processor. We must connect them.

See the four silver contacts on the side of the holder? Those contacts are how the processor connects to the cartridge. We're hijacking them. Those silver contacts have wires going out of them to a small connector... If you used colored wires and set it up like I did in the photograph, it's easy as 3.14159. Just stick the blue wire into the connector where the blue wire is, etc.

If you didn't use colored wire:

  • Connect the Arduino 3V3 to the connector's red wire
  • Connect the Arduino GND to the connector's black wire
  • Connect the Arduino Analog In 4 to the connector's white wire.
  • Connect the Arduino Analog In 5 to the connector's blue wire.

Just like that, you're ready to go.

Step 6: Let's Reset the Damn Cartridge, Already! Sheesh!

The hard part is over.

Resetting cartridges is best done in bulk - use up all but one, setting the empties aside, then you can knock them all out in a few minutes on a Saturday and be done for a few months. Resetting a cartridge literally takes five seconds once you've done all the prep work.

Hook up your battery (or USB - remember the jumper) to the Arduino and give it about ten seconds to load the program and get it running. There will really be no indication that it's ready - I suppose I could add software for that later.

Slide the cartridge into the holder. The LED will illuminate almost immediately - reset was successful. Slide the cartridge out, and in a couple of seconds the light will go out - its ready to reset another one.

Lather, rinse, repeat.

Putting your CatGenie back together consists of reversing the disassembly.

Unplug your Arduino and set it aside until next time.
<p>Thank you for this post. I have several cartridges that are half full and the Catgenie 120 says that they are empty. Now I'm sitting here with no usable cartridges that are half full and have to wait for a new one to be shipped. I'm going to try this and see if I can get it to work.</p>
<p>If anyone cares...I found a temporary solution...</p><p>1. Take empty/full cartridge (shouldn't matter) and pull it out of the machine.</p><p>2. Insert cartridge and wait for lights to register and immediately press start until you hear the beep and genie starts up.</p><p>3. Pull out cartridge right after the genie starts.</p><p>You will have lights indicating no cartridge, but it will do the whole cycle anyway...The sanisolution is only added in the drying cycle so it's just for scent (it does help improve the smell a lot!!!)</p><p>I saw a post somewhere where someone was doing this...I ordered an Arduino chip and figured out after that it only works on the cg60 NOT 120 :(</p><p>I have been doing this with an &quot;empty&quot; cartridge for a while and it continues to work...possibly due to the CG not having time to recognize the cartridge level, but still enables the start function because it &quot;sees&quot; a cartridge in place for that 1 second.</p><p>I have yet to get a new cartridge to see if this process actually uses up the cycles stored in the cartridge...Try it out and let me know how it goes...You can't lose because it should work with spent cartridges as well</p>
<p>This is an interesting idea.. as long as it doesn't reduce the counter on a good cartridge. Perhaps you could set up a method by using a relay to temporarily disconnect the RFID reader in the control unit, or a servo to remove/position a good tag at the right time using an Arduino or other method. Maybe the relay could be triggered when the bowl motor runs, or a trigger line from the control board that is active when a cycle is running. </p>
<p>I tried this with an empty cartridge and didn't work for me. could it be that your cartridge wasn't quite empty when you started this process? </p>
<p>I think you're right. The cartridge I used must have 1 or 2 washes left...I just tried an empty one and it didn't work.</p><p>...So I guess you need a cartridge with at least a cycle left in it for this to work</p>
<p>has anyone come up with a solution for the 120 model yet?</p>
<p>I am still looking a year later.. Had I know that the darn thing would not run without the cartridge in it I would have never bought it!</p>
<p>cartridge genius.com - Keep checking back for stock on his item or send him an email. I don't think Arduino can do what the CartridgeGenius does...But I'd LOVE someone to prove everyone wrong!!!</p>
Hello I would love one of these for my CG120 please email me if you can help me out Jesse2Caldwell@gmail.com
<p>Did anyone find out if this is usable with the new CG120?</p>
<p>It's not! Different cartridge reading mechanisms doesn't allow this to work on the 120. Check out the solution I posted...</p>
<p>Just wondering if you ever got a reply to your question, and if it was a positive one? Thanks. :)</p>
<p>Hi there! would also like to be able to reset my CG120. do share if you have any info on the reset, please do share!</p>
<p>I am in search of this solution for my 120 as well..</p>
<p>I tried doing all of these instructions. I bought the Arduino UNO. I don't have the 3V3 slot but the 3.3V (which I assume is the same). I get all the way through and when I plug in the cartridge the LED doesn't light up. I'm sure I'm doing something wrong, but not sure if I uploaded the sketch properly (it said download was complete and the lights blinked on the UNO, so again, I assumed it was downloaded).</p><p>I need to get another part (it's the joiner of the two hoses because mine disintegrated and now the two hoses can't be joined). Once I do, I'll try the Genie to see if it will start, but again not sure if it will).</p>
<p>Hi all,</p><p>Unfortunately, the above didn't work. Can someone help me troubleshoot? A couple of items to note:</p><p>1. There are two places on the sketch where I can upload the code. One says &quot;for a loop&quot; and the other is &quot;single time&quot; (I can add a screen shot when I get home)</p><p>2. I have a 60 cartridge that I cracked open to put in a new solution bag and this is the one that I used to reset. Is that a problem?</p><p>Any help would be appreciated.</p>
<p>I just finished making this for my CG60. It seems absurdly complex, however this writeup makes it quite simple, do not be intimidated! I used an Arduino Duemilanove which was 20$ from amazon. I did buy a 9 volt power supply for a total of 25$, shipped. The only change from the original poster's arduino was that I do not have to jumper for changing back and forth. Total cost for me was about 50$ if I included the USB cable I bought (which if you have one, is free and unnecessary after you load the sketch), the spool of wire that I used maybe half for an extended lead from the board, and the LED. Note that I did need to cut a few strands out of the end of the wires that go into the pin slots on the arduino. <br><br>My only major change other than the board, was I fabricated a cardboard holder for the wires (see picture), which also was pretty easy. My cartridges were newer 60s with the 4 tabs so it made placement easier. <br><br>The sketch I used was ponynicker's from 4 years ago at the time of my posting (today is 5/7/2016). It worked fine with 1.6.8 from the arduino website. My LED does blink constantly on standby but it does do a rapid flicker and then back to blinking, so I can tell when it works. <br><br>For those who are asking for one to be made for them, it really is not a hard DIY, despite the intimidation factor. Trust me, I know nothing about arduinos and minimal about any sort of programming and it went together pretty easy for me. Take the plunge, it is well worth it!</p>
Hi does anyone know where i can get a reset box
<p>Checkout cartridgegenius.com. He has some cartridge genius in stock for $99.00.</p>
<p>Anyone know where I can get a 120 reset device please inbox me at annetteb069@yahoo.com..</p>
<p>I need one for my cat genie 120 where can I get this? the one site no longer has available ... Help I have a few cats...</p>
Updated code for Arduino 1.0.1 and above. Power up and LED will light, attach contacts (insert cartridge) and when it is complete LED will flash several times.<br> <br> #include &lt;Wire.h&gt;<br> #define CG (B1010000)<br> boolean resetSuccess = false;<br> int isReset = 13;<br> int byteArray []= {01, 01, 01, 60, 60, 60, 60, 60, 60, 8, 8, 8, 33, 33, 33, 255};<br> void setup()<br> {<br> pinMode(isReset, OUTPUT);<br> digitalWrite(isReset, LOW);<br> if (isReset == HIGH)<br> isReset = LOW;<br> Wire.begin(); // join i2c bus (address optional for master)<br> }<br> void loop()<br> {<br> if (resetSuccess)<br> {<br> delay (2000); // our work is done - pause for a while<br> resetSuccess = false;<br> } else {<br> resetCartridge();<br> resetSuccess = verifyCartridge();<br> digitalWrite(isReset, resetSuccess);<br> }<br> }<br> void resetCartridge()<br> {<br> for (int i=3; i &lt; sizeof(byteArray)/2; i++)<br> {<br> Wire.beginTransmission(CG);<br> Wire.write(i);<br> Wire.write(byteArray[i]);<br> Wire.endTransmission();<br> delay(4);<br> }<br> }<br> void movePointerTo(int deviceAddr, int memoryAddr)<br> {<br> Wire.beginTransmission(deviceAddr);<br> Wire.write(memoryAddr);<br> Wire.endTransmission();<br> }<br> boolean verifyCartridge()<br> {<br> boolean success = true;<br> movePointerTo(CG, 3);<br> Wire.requestFrom(CG, 3);<br> while (Wire.available())<br> {<br> if (Wire.read() == 60 &amp;&amp; success == true)<br> {<br> digitalWrite(isReset, HIGH); // sets the LED on<br> delay(50); // waits for a second<br> digitalWrite(isReset, LOW); // sets the LED off<br> delay(50); // waits for a second<br> digitalWrite(isReset, HIGH); // sets the LED on<br> delay(50); // waits for a second<br> digitalWrite(isReset, LOW); // sets the LED off<br> delay(50); // waits for a second<br> digitalWrite(isReset, HIGH); // sets the LED on<br> delay(50); // waits for a second<br> digitalWrite(isReset, LOW); // sets the LED off<br> delay(50); // waits for a second<br> digitalWrite(isReset, HIGH); // sets the LED on<br> delay(50); // waits for a second<br> digitalWrite(isReset, LOW); // sets the LED off<br> delay(50); // waits for a second<br> <br> // looking good so far<br> } else {<br> success = false;<br> }<br> }<br> return success;<br> }
And no need to tear your cat genie apart. Here is the resetter I made from wire, electrical tape and a little piece of cardboard. I just hold it on the cartridge when I want to reset.
How do you make this?
Does this device you made work for the new cartridges? If so mind sharing how you made it? KWELLS5214@BUCCANEER.ATLANTIC.EDU
<p>Hi.</p><p>You have them marked 1-4, and don't show what they connect to.</p><p>Im assuming one is a 9volt battery..Ground and Power.. and maybe the other 2 are ground and input leads? Question is... what do each of these numbers go to?</p><p>Thanks! </p><p>jemtec@roadrunner.com</p>
<p>what size of wires did you use and what kind</p>
Can you make one for me? I will pay you! I have the CG60, please reply! I need this bad!
<p>your instructions are great i am just techo dumb at some point. i just called cat genie they informed me i need a hole new machine. this one is almost brand new....very devastated because of the money i spent on it and i picked up new kittens last night. wondering if your still making the devices and if so can we talk about the price of you making me one, please? i can send you the pieces if needed from my machine as well. </p>
<p>forgot to leave contact info if some one would be so kind to contact me :) i would be grateful!!! gene32@comcast.net</p>
<p>Just a note to say that the sketch code above and the updated sketch in the comments doesn't work with the current Arduino v1.6.5, but you can download older versions that do work. I used v1.0.5 and it verified fine with no errors.</p>
<p>Hi mamalang. I know your post was 4 years ago, but I wanted to share with you the code I dressed up to current Arduino standard.</p><p>#include &lt;Wire.h&gt;</p><p>#define CG (B1010000)</p><p>boolean resetSuccess = false;int isReset = 13;int byteArray []= {01, 01, 01, 60, 60, 60, 60, 60, 60, 8, 8, 8, 33, 33, 33, 255};void setup(){ pinMode(isReset, OUTPUT); digitalWrite(isReset, LOW); Wire.begin();} </p><p>// join i2c bus (address optional for master)</p><p>void loop(){ if (resetSuccess) { delay (2000);resetSuccess = false; } </p><p>// our work is done - pause for a while</p><p> else { resetCartridge(); resetSuccess = verifyCartridge(); digitalWrite(isReset, resetSuccess); }}void resetCartridge(){ for (int i=3; i &lt; sizeof(byteArray)/2; i++) { Wire.beginTransmission(CG); Wire.write(i); Wire.write(byteArray[i]); Wire.endTransmission(); delay(4); }}void movePointerTo(int deviceAddr, int memoryAddr){ Wire.beginTransmission(deviceAddr); Wire.write(memoryAddr); Wire.endTransmission();}boolean verifyCartridge(){ boolean success = true; movePointerTo(CG, 3); Wire.requestFrom(CG, 3); while (Wire.available()) { if (Wire.read() == 60 &amp;&amp; success == true) { </p><p>// looking good so far</p><p>} else { success = false; } } return success;}</p>
<p>PaulF1- Would you mind telling me if your code or the original arduino code posted works on the 120 cartridge. Id like to try and build my own but i have the 120 model.</p>
<p>Help please! Really need one of these for my 120 sani solution cartridges but am not able to do this.Will someone make one for me? I have a Macbook pro and an old PC running windows 98. Glad to pay through Paypal. Thanks</p><p>maeyer@earthlink.net</p>
<p>There are new units for the catgenie 120 at www.cartridgegenius.com</p>
The 120 Cartridge (clear) do not work within the original <a href="/catbox120.wordpress.com/2010/09/11/catbox/">CatGenie</a>, which only uses the 60 Cartridge (green) The 60 Cartridge do not work within the <a href="/catbox120.wordpress.com/2010/09/11/catbox/">CatGenie</a> 120.
I was wondering if <em><strong>this instructable</strong></em> worked on the cat-genie 120 cartridges, NOT if the cartridges are interchangeable!!! Still waiting on a answer...
Hi <br>I am British (don't hold that against me). I have the Cat Genie 120. Only had it since April 2013, yes I have a love hate relationship with it already. We have 8 cats so it is proving to be expensive. Has anyone managed to refil and re use a 120 cartridge. And if so could you walk me through the steps. Would be grateful. In desperate need of some help <br>Graham
I am also wondering if this will work with the 120, have you gotten a response yet Graham? <br> <br>TIA! <br>~G~
geezus. i am so tech impaired and I managed to do this on the first try. I had a broken cat genie I bought from CL for 10 bucks for the spare parts so I used the cartridge part and now have a separate cartridge holder yay! I cannot believe how amazing this is i'm still shocked how easy it was. The only thing that was weird was that I had to turn the LED around so the flat side had to be the opposite of the directions. But, in the end, I found the LED wasn't necessary at all with the Duemilanove because the board has another blinking light that blinks the same cadence(?) as the LED once it works. GREAT DARN INSTRUCTABLE!
Hi, <br>Does this works with the new 120 sani solution cartridges? <br>Thanks
does anyone know what i have to do with my cat genie, on first cartridge only...it is full of water and wont finish the cycle. i cannot TOLERATE calling them, having serial number found, and waiting for a call back, help!
Great work!<br/><br/>I've made a few mods to the code which :<br/> - Flash the LED on for 5 seconds at startup, to show the program is working<br/> - Correctly lights and blanks the LED on a successful cartridge reset. Previously it was always on.<br/><br/>You should remove the cartridge during the time that the &quot;reset OK&quot; light is on (2 seconds).<br/><br/>This worked well on my Duemilanove.<br/><br/>For some reason they don't allow code to be pasted into comments - new code is available at <a rel="nofollow" href="http://www.poptart.org/catgenie.pde">http://www.poptart.org/catgenie.pde</a><br/>
is there any way to make this unit set for 255 cycles? if so what do i need to change on the program<br /> thanks
It is byteArray[3] that holds the number of uses to be written to the cartridge, so that's the 4th number in the array.<br /> <br /> You can try changing that to a higher number, though beware that the CatGenie might not like it (haven't tried myself as I like to be reminded when the carts are getting empty).<br /> <br /> If it doesn't work, just change it back to 60 and re-flash.<br /> <br /> <br /> J&gt;<br /> <br />
omg that sounds like way to much info for im not that smart is theire any way ican get one all ready made please me im laid off and icat keep buying them they cost way to much and ihave 5 cats the needy cat lady heidi
sorry forgot email see heide1963@aol.com
Every time I do this, the light continually blinks after I put the cartridge in the holder.
Maybe I'm doing this wrong- When I use your program on my Duemilanove, it loads fine and when I reset the board it turns the light on for 5 seconds, then shuts it off. That's it until I reset it again. If I connect the cartridge after the light goes out, still nothing. I don't get the "reset OK" light, at all. And none of this seems to reset the cartridges, regardless of the LED lighting or not. Is the proper sequence turn on board, wait for light to go out, connect cartridge, wait for "reset OK" light, remove cartridge while light is on? How important is it that this all be done exactly right? I have successfully reset all 5 of my cartridges twice before, with the older version of the resetting program. However, I have had some weird issues lately with my cartridges not wanting to work after resetting, or working sporadically. The CG was complaining that the cartridge was empty (it was full), so I reset it and the CG ran a cycle, then started complaining again... Is it possible that I have damaged the chips on the cartridges? I'm just having a really hard time knowing what is going wrong, and I'd like to be sure I'm doing as many things right as possible. Thanks!
UPDATE- I bought new cartridges, and they fixed it. I think I definitely managed to "pop" my chips somehow... I'm still interested in the proper sequence, etc, though. Please, help me not pop my cartridges again!

About This Instructable




More by ScottSEA:Put Your CatGenie in "Tech Mode" CatGenie:  Resetting a SaniSolution Cartridge CatGenie:  Repairing (And Preventing) An Arm Rotation Pin Failure 
Add instructable to: