PuP – Pretty Useless Playtoy

PuP is just a hack of an old toy that was getting thrown away. Honestly the factory function was likely as entertaining as he is now as it would bark, bark, and drive forward and backwards… but only over and over again. Now he can “see” what’s around him and respond in a couple different manners. Still only forward and backwards but he does move at least.
PuPdate 12/07/2019
Pup was dead due to the five year old lipo battery so surgery was required. Unfortunately I basically built the controller around the battery so I had to go in pretty deep to fix him. I did take the opportunity to replace the nasty transistor H bridge I built with one of the tiny Polulu versions I had. Much cleaner at least. Hopefully he will last another few years before needing more attention.

Original Plans / New Plans

Originally my thoughts were 
pretty grand for such a small little thing. I wanted a Pro-Mini, LiPo battery, 
sonar, sound, IR receiver, LDRs, a wagging tail, servo head, RGB mouth, a piece 
of metal on top of his head using touch sensing for petting, and more. BUT the 
reality of getting just the CPU and battery inside the small ½ section of the 
body stopped those plans. I had even thought about using a “leash” to power him 
to remove battery needs and make more room for CPU, etc but wasn’t sure how well 
that would have worked out.
I still really wanted PuP to move forward and 
backwards, talk, and have a sonar for eyes though. So after some success with an 
ATTiny85 on Buford and Buzz I figured that may work for PuP. So the plan was 
scaled back to ATTiny85, sonar, speaker, RGB LED, and home brew transistor 
H-Bridge.
PuP Build

Pup was decapitated, man that sounds harsh but 
that’s what happened, and a 9g servo replaced his head after some “plastic 
surgery”.  Once mounted up a couple face options came to mine but the easiest 
route was taken. Servo horn, 4 pin header mount, piece of metal across the top 
and some brown printer paper for ears worked for me. I found another small 
speaker, glued it up in between the sonar “eyes” and then thought about what to 
do for light output, tongue or something..
By now I was already running out of pins with the 5 pin limit for an ATTiny85.
I already had:
- Forward drive,
 - Reverse drive,
 - Single Pin Sonar,
 - Speaker Output, and
 - Head servo…
 
Actually I was already OUT of pins but I wanted PuP so have some light of 
some sort!
So the first thing I tried was paralleling the Red of the RGB 
with the speaker output. That works but you can barely see it as the output is 
pulsed and the speaker takes most of the current. Next I hooked the green and 
blue up across the forward and backwards output pins. Since the pins go HIGH to 
make him move and the RGB LED has a common POSITIVE lead, the Blue and Green 
stay ON while sitting still and go off depending on if PuP is moving forward or 
backwards. Works at least and gives a little light show.
Making It Fit

Getting it all to fit was still a challenge, even with the ATTiny85. I had to 
make sure I could get to the ATTiny85 to pull it to reprogram it the million or 
so times it takes me to get code right. Plus I had to fit the battery and the 
tiny Pololu 5v step up/down regulator in to make sure the sonar would run at 5v 
properly. It kind of worked, I really should have put the regulator on top of 
the battery and the ATTiny board in the rear but too late at that point. I had 
to do some more plastic surgery to get the top half to mount properly and now 
PuP has his “brain” sticking out of his back a little but hey, he’s just a PuP.
Fitting things on the head wasn’t quite as complicated. I needed to get signals 
power to the sonar, LED and speaker and signals back for each as well. I ended 
up tapping of the power and ground on the sonar and then added a couple more 
female headers for the speaker and LED. I actually have an extra wire running 
from head to body now but do not see anything to use it for.
Unique Walk

The unique thing about PuP is how he “walks”. There is only ONE motor deep 
inside his guts. It drives some gears that then drive the balls on his feet 
which are splayed out. As the balls turn together one direction, he moves 
forward, the other direction, in reverse. Looks nice and functions pretty good 
actually.
One thing I did NOT realize until he was completed was the 
right front leg not turning when he backs up is apparently a “feature” I was 
unaware of. I thought there was a problem or broken issues with him until I 
watched it a couple times in action. This allows PuP to move reasonably straight 
forward but to turn by backing up to the right. Like some real cheap RC cars you 
see that only have forward / reverse but turn when backing up.
This is something I really need to take advantage of when I further develop the code for 
him to allow him to roam around a bit more.
PuB – Pretty useless Brain
PuPs brain is pretty simply, but has room to grow if I want it to since it’s 
only about ½ full at this time. Right now he starts out just sitting there 
staring out to the world. If you get close enough he’ll lock onto you hand and 
try to follow you, if you move too close though he’ll back up, and if you get 
super close he starts to get worried, his voice goes up in pitch, and he turns 
his head away and continues to back up. Get even closer and he turns his head 
the other direction like “get away from me!”
The next step is to add some 
more modes to him such as roaming while looking around and just avoiding things. 
Trick here is there is no easy way to swap modes as I am out of input pins so I 
will likely use my old tick like on Chomper and others of getting in his face as 
a mode changing option.
Obviously some random features of just getting bored, 
looking around, making some sounds etc if not stimulated for awhile need to be 
added as well. Just makes it a bit more enjoyable to mess with.
Closing – Good Results from Bad Code
 MaxHires and I were chatting in the shoutbox about  “unintended good results of bad code”. Max said he has had that happen in the  Apple coding days with graphics where code  errors can generate some awesome  artistic results. 
PuP has a very simple example of this in my opinion. I am  using the SoftwareServo library in PuP. It works but is a little different in  that it requires you to constantly call the SoftwareServo:Refresh routine to  keep the servo moving and in place. Since I am not using a library to read the  sonar on one pin, I have to go read sonar and wait a bit so the refresh doesn’t  always happen as quickly as it needs to. 
One result of this is that  sometimes, if PuPs head is turned away 90 degrees, he doesn’t just snap it back  to front and center when he’s done hiding, he kind of bumps it a couple times  when the refresh hits. Which is actually more “natural” than speeding back to  center. This results without any intentional coding on my part. Heck if I TRIED  to do it, it would likely not work at all. 
My TED robot has a similar effect  in that in some instances he seems alarmed and jerks back when he sees something  while walking. Reality is I’m not handling the object detection cleanly and am  jumping to different servos positions but it still “works” well. 
So go build, go code, and sometimes, leave the bugs in… may make it a bit more fun! 
Stephen