Roamer, the Self Charging Companion Robot

Roamer is a self-charging, switch free, capacitor powered, wandering robot companion.

Similar projects worth following
Initially, set Roamer on a charging station. Like a pet bug, she will wander around, feed herself and rest at night. The next day, she’ll do it again.

To me, a personal companion robot should have the functionality of an ant or better: no programming, setting controls or recharging batteries.

She can run more than 30 minutes between charges.

The charging station is simply an energized floor plate and energized bump rail. A spring on the bottom of Roamer contacts the floor plate and Roamer’s front bumper contacts the bump rail. The floor plate and bump rail are energized by a bench power supply set at 9 volts dc with current limited to .8 amps. When Roamer makes contact with the bump rail, she turns off her motors and evaluates the voltage between her bumper and spring. If the voltage is greater than 2 volts and less than 8.5 volts, she sits and waits until the voltage rises to 8.5 volts, then she backs up and is on her way--unless it is dark.

Battery life and charging time are significant challenges for companion robots. Aibo, for example, runs for one to two hours followed by a three hour recharge period. If Aibo is charged/discharged once per day (not much of a pet if the thing is resting 22 hours per day), the (not user replaceable) battery will lose half of its capacity within two years (refer to Aibo website). Roamer, using super capacitors, can easily be active 16 hours per day (more time running than charging -- with very little capacity degradation) and she can "sip" a bit of charge anytime the station is handy. 

Set Roamer on a charging station. When charged, she wanders around randomly, sometimes coming into the charging station and topping off. When the room gets dark (night), Roamer “rests” on the charging station. At dawn (light), she resumes her journey to nowhere, charging at every opportunity.

Here is a real time view in action.

Here's the schematic.


Version that measures wheel speed

ino - 7.13 kB - 09/19/2021 at 20:26


f3d - 697.94 kB - 09/12/2021 at 18:52


Standard Tesselated Geometry - 260.82 kB - 09/12/2021 at 18:52


f3d - 121.22 kB - 09/12/2021 at 18:52


body for gear motor.stl

sept revision

Standard Tesselated Geometry - 113.75 kB - 09/12/2021 at 18:52


View all 34 files

View all 15 components

  • Pre-school Work

    Mike Rigsby09/29/2021 at 21:24 0 comments

    A section of the front bumper appeared "dead' to receiving charge. My bad. The sticky side of aluminum duct tape does not conduct, thus a good chunk of my front bumper "looked conductive," but wasn't. Note the area (in the photo below) where the wire is taped to the bumper. That big strip doesn't connect to the wire electrically.

    I cut a piece of wire and (using my pre-school skills) cut a piece of tape.

    Taping the wire so that it bridges the "tape that taped the original wire" with main tape, the entire front bumper is now usable.

  • Solving Mobility Issues

    Mike Rigsby09/19/2021 at 20:25 0 comments

    Roamer is now more quiet than the original version and has a run time of over 30 minutes on a charge, so I expanded her territory to the entire room (around 700 square feet) to let her find problems. She did. After solving her mobility problems, she pretty much handles anything and manages to return to the charge station before exhaustion

    First, there are fancy sloped table legs that she liked to "climb and flip".

    Adding a bit to the side of the bump bar seems to have stopped the wheel from slipping onto the leg (angle approach) and climbing for a flip.

    A second problem that emerged involved running under certain objects and snagging the (not well secured) wiring. A shield on the front bumper bar stopped that. Of course I could secure the wiring and add a cover--but that may come later.

    Another situation occurs when she runs into an office chair or gaming chair.

    Because this doesn't result in bumper switch operation, she sits there spinning wheels for up to thirty seconds (at which point a software "no switch bumped for thirty seconds" timeout results in a reverse/do something else maneuver.) 

    When stuck like this, her wheels turn more slowly. I added a magnet to one wheel.

    Coupled with a magnet sensor, I have a way to measure wheel speed.

    This involved a change to the schematic and a change to the Arduino sketch.

    No more waiting for "I'm stuck and can't move" situations--she now frees herself within a couple of seconds.

    This is actually turning into a workable companion--sort of like a turtle that wanders about and feeds itself.  She doesn't seek me out, whining for attention; and she isn't annoying or distracting like a tv--so, a pretty good workroom companion.

  • Motor Change

    Mike Rigsby09/12/2021 at 19:03 0 comments

    I changed dc motors to 70 rpm 12 volt gear motors. These motors are much more quiet and use less energy--hopefully will have a longer lifespan in this high use application. The maximum run time between charges is now 35 minutes (up from 20 minutes).

    This required changes to the body, wheels and front bumper (to accomodate the new motors). The "Sept" files reflect those new parts.

  • Stepper Motor to Drive Wheels

    Mike Rigsby08/28/2021 at 16:37 0 comments

    Now I'm trying a thin Nema 17 stepper motor to replace the geared dc wheel driver motor--it works!

    I'm driving the motor with an Arduino motor shield--motor pin 1 to B-; motor pin 4 to B+; motor pin 6 to A-; motor pin 3 to A+.

    Code (stepper motor short) follows:

    int delaylength=10;
    int volt=220;

    void setup() {


    void loop() {

      //round 1












    //end round 1


    I supplied 10 volts dc with one amp capacity to the motor shield power input.

  • Good News/Bad News

    Mike Rigsby08/27/2021 at 23:20 0 comments

    The good news is that Roamer has run for quite a while, with never a failure to find the charging station.  Like a turtle, Roamer has wound up with wheels off the ground a few times (I think I know how to solve that issue). 

    The bad news is that running for many hours takes a toll on little dc motors--shall we say failure? 

    There are no brushes in these little motors, merely little "fingers" that wear out rather quickly.

    A dc motor with genuine brushes would probably last longer--but a robot that buzzes around twelve to fourteen hours a day is going to strain a brushed motor.

    I'm testing a stepper motor to see if that might provide the reliability I want.  A companion robot needs to run a long time without serious maintenance. I have more work to do.

  • Software

    Mike Rigsby08/22/2021 at 19:32 0 comments

    When Roamer's bumper is depressed, there are five possible "backup and turn" scenarios--the activation choice is random.

    After 30 seconds of forward movement (stuck spinning wheels without depressing the bumper or long distance), she backs up and tries another direction.

    unsigned long timestart;
    unsigned long timeend;
    unsigned long timetotal;

    int a=95;//speed for left? motor, increased from 80
    int b=85;
    int c=650;//value for photoresistor day/night higher = less light to keep going
    int d=820;//upper voltage value

    int t1=1;

    int volt=A1;//bumper input pin
    int val=0;//initial bumper value
    int val1=100;//initial value for photocell

    int bumper=1;//setup bumper not pressed
    long randNumber;
    int x=1;//current read value to be determined in setup
    int x1=0;//first of multiple reads
    int x2=0;
    int x3=0;
    int x4=0;
    int x5=0;

    int y=0;//counts for overcurrent rather than spike
    int z=0;//storage area for temporary current reads

    const int pwmA=3;
    const int pwmB=11;
    const int brakeA=9;
    const int brakeB=8;
    const int dirA=12;
    const int dirB=13;

    void setup() {
      pinMode (dirA,OUTPUT);
      pinMode (brakeA,OUTPUT);
      pinMode (dirB,OUTPUT);
      pinMode (brakeB,OUTPUT);
      pinMode (A1,INPUT);

      pinMode (2,INPUT);
      digitalWrite (2,HIGH);
      randomSeed (analogRead(0));
      analogWrite(pwmA,0);//changed to reflect no overcurrent mode
      //delay(2000);//get motors started
      //x1=analogRead(A0);//set normal motor value
      x=500;//arbitray number

    void loop() {
      if (bumper==0) {//bumper depressed
      randNumber=random(1,5);//changed august 12 from 1,4
      if(randNumber==1) {
        analogWrite(pwmB,0);//check for power station
        delay(500);//stop to read
        if (val>100) {
          while ((val<d && val>100) || (val1>c)) {//was 815 instead of 600
        analogWrite(pwmA,120);//was 150
        analogWrite(pwmB,70);//reverse power
      if (randNumber==2) {
        analogWrite(pwmB,0);//check for power station
        delay(500);//stop to read
        if (val>100) {
          while ((val<d && val>100) ||(val1>c)) {
        analogWrite(pwmA,70);//was 150
        analogWrite(pwmB,120);//reverse power

    Read more »

  • Baseboard Charger

    Mike Rigsby08/21/2021 at 13:12 0 comments

    I set up a baseboard charging station--took about five minutes.

    Start with an eighteen inch by six inch sheet of steel and an eighteen inch piece of 1 x 2 wood.

    Drill holes (I drilled three) in the edge of the steel.

    Screw the wood to the steel.

    Add aluminum duct tape to the wood, making sure that the tape does not touch the base. 

    Set against a wall and attach the bench power supply--it's ready to go!

  • How Roamer was Assembled

    Mike Rigsby08/20/2021 at 19:08 0 comments

    Start with the servo motors--I selected metal gear servos that do not have end stops.

    Remove the circuit board.

    Solder wires to the motor connections.

    Put the motor back together. Place the vacuum belt (tire) on the wheel.

    Attach the servo horn to the wheel using 3mm screws.

    Install the servo motors.

    Secure the wheels to the motor shaft.


    Install the holder for the rear caster ball.

    Insert the caster ball.

    Insert a 3mm screw into one end of the spring.

    Drill a hole in the base and put the screw through the hole.

    On the other side of the base attach the pickup wire.

    Secure the switch holder to the front of the frame.

    Attach aluminum duct tape to the front bumper. Tape a wire (so that it connects to the foil electrically) to the bumper.

    Install a lever switch in the switch holder.

    Attach the bumper to the switch holder using 3mm screws.

    Place the board/capacitor holder onto the frame. Glue together (or lightly melt using a soldering iron).

    Attach two capacitors to the rear part of the frame using Velcro strips.

    Place the boost converter on the electronics holder.

    Secure the charge plate pole to the charge base using 3mm screws.

    Place foil tape on the pole--not touching the base.

    Add the breadboard and wire according to the schematic.

    Add the Arduino and motor shield. Secure using Velcro.

    Add the eyes and smile to the back.

    The spring and the bumper are the contact points for charging. The bumper should receive positive voltage from the power supply and the spring receives negative.

    The photocell enables Roamer to "know" that it is dark--then remain on the charger until morning.

View all 8 project logs

Enjoy this project?



chadherrella wrote 08/27/2022 at 16:55 point

where can i purchase one if I don't want to build myself?

  Are you sure? yes | no

juliachaplinn wrote 08/29/2021 at 09:22 point

Initially, a charging station. She will wander around, feed herself and rest at night. The next day, she’ll do it again.

The charging station is merely a metal plate and a pole with metal foil attached to a bench power supply.

To me, a personal companion robot should have the functionality of an ant or better: no programming, setting controls or recharging batteries.

  Are you sure? yes | no

Mike Rigsby wrote 08/20/2021 at 21:34 point

Thank you! I have tried a "baseboard" section, which increases the probability of the robot finding the "hot" section of a wall. Because I'm using super capacitors, my strategy of "always charge up" is rather simple. I think a bit more cleverness will be required for a "charge the battery" situation and I would love to see how people work that out.

  Are you sure? yes | no

Dejan Ristic wrote 08/20/2021 at 19:46 point

Nice project! I've been thinking on how to implement self charging for my own robot project. Yours is a neat solution.

  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