Mike Rigsby
Published © CC BY

Roamer, the Self-Charging Robot Companion

Roamer is self-charging, switch free and capacitor powered. Like a pet bug, she wanders, feeds herself and rests at night. Next day, repeat.

IntermediateWork in progress8 hours305
Roamer, the Self-Charging Robot Companion

Things used in this project

Story

Read more

Schematics

Schematic

Code

Code

Arduino
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));
  
  digitalWrite(brakeA,LOW);
  digitalWrite(brakeB,LOW);
  
   digitalWrite(dirA,HIGH);
  digitalWrite(dirB,HIGH);
  analogWrite(pwmA,0);//changed to reflect no overcurrent mode
  analogWrite(pwmB,0);
  //delay(2000);//get motors started
  //x1=analogRead(A0);//set normal motor value
  //delay(10);
  //x2=analogRead(A0);
  //delay(10);
  //x3=analogRead(A0);
  //delay(10);
  //x4=analogRead(A0);
  //delay(10);
  //x5=analogRead(A0);
  
  //x=((x1+x2+x3+x4+x5)/5);
  x=500;//arbitray number
  
  timestart=millis();
  
}

void loop() {
  
  bumper=digitalRead(2);
  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
    analogWrite(pwmA,0);
    delay(500);//stop to read
    val=analogRead(A2);
    if (val>100) {
      val1=analogRead(A3);
      while ((val<d && val>100) || (val1>c)) {//was 815 instead of 600
       val1=analogRead(A3);
        val=analogRead(A2);
        delay(100);
      }}
      
    
    
    digitalWrite(dirA,LOW);
    digitalWrite(dirB,LOW);//reverse
    analogWrite(pwmA,120);//was 150
    analogWrite(pwmB,70);//reverse power
    delay(500);
    analogWrite(pwmB,0);
    delay(750);
    analogWrite(pwmA,0);//stop
    
    digitalWrite(dirA,HIGH);
  digitalWrite(dirB,HIGH);
  analogWrite(pwmA,a);
  analogWrite(pwmB,b);
  delay(1000);
  
  t1=0;
  timestart=millis();
  
  }
  
  if (randNumber==2) {
    
    analogWrite(pwmB,0);//check for power station
    analogWrite(pwmA,0);
    delay(500);//stop to read
    val=analogRead(A2);
    if (val>100) {
      val1=analogRead(A3);
      while ((val<d && val>100) ||(val1>c)) {
         val1=analogRead(A3);
       val=analogRead(A2);
        delay(100);
      }}
    
    digitalWrite(dirA,LOW);
    digitalWrite(dirB,LOW);//reverse
    analogWrite(pwmA,70);//was 150
    analogWrite(pwmB,120);//reverse power
    delay(600);
    analogWrite(pwmA,0);
    delay(1000);
    analogWrite(pwmB,0);//stop
    
    digitalWrite(dirA,HIGH);
  digitalWrite(dirB,HIGH);
  analogWrite(pwmA,a);
  analogWrite(pwmB,b);
  delay(1000);
  
  t1=0;
  timestart=millis();
  }
  
  if (randNumber==3) {
    
    analogWrite(pwmB,0);//check for power station
    analogWrite(pwmA,0);
    delay(500);//stop to read
    val=analogRead(A2);
    if (val>100) {
      val1=analogRead(A3);
      while ((val<d && val>100) || (val1>c)) {
         val1=analogRead(A3);
        val=analogRead(A2);
        delay(100);
      }}
    
    digitalWrite(dirA,LOW);
    digitalWrite(dirB,LOW);//reverse
    analogWrite(pwmA,a);//was 150
    analogWrite(pwmB,b);//reverse power
    delay(600);
    digitalWrite(dirB,HIGH);
    analogWrite(pwmB,150);
    delay(800);
    analogWrite(pwmA,0);//stop
    analogWrite(pwmB,0);
    
    digitalWrite(dirA,HIGH);
  digitalWrite(dirB,HIGH);
  analogWrite(pwmA,a);
  analogWrite(pwmB,b);
  delay(1000);
  
  t1=0;
  timestart=millis();
  }

 if(randNumber==4) {
    
    analogWrite(pwmB,0);//check for power station
    analogWrite(pwmA,0);
    delay(500);//stop to read
    val=analogRead(A2);
    if (val>100) {
      val1=analogRead(A3);
      while ((val<d && val>100) || (val1>c)) {//was 815 instead of 600
       val1=analogRead(A3);
        val=analogRead(A2);
        delay(100);
      }}
      
    
    
    digitalWrite(dirA,LOW);
    digitalWrite(dirB,LOW);//reverse
    analogWrite(pwmA,a);//was 150
    analogWrite(pwmB,b);//reverse power
    delay(500);
    analogWrite(pwmB,0);
    delay(1000);
    analogWrite(pwmA,0);//stop
    
    digitalWrite(dirA,HIGH);
  digitalWrite(dirB,HIGH);
  analogWrite(pwmA,a);
  analogWrite(pwmB,b);
  delay(1000);
  
  t1=0;
  timestart=millis();
  
  }
  
   if(randNumber==5) {
    
    analogWrite(pwmB,0);//check for power station
    analogWrite(pwmA,0);
    delay(500);//stop to read
    val=analogRead(A2);
    if (val>100) {
      val1=analogRead(A3);
      while ((val<d && val>100) || (val1>c)) {//was 815 instead of 600
       val1=analogRead(A3);
        val=analogRead(A2);
        delay(100);
      }}
      
    
    
    digitalWrite(dirA,LOW);
    digitalWrite(dirB,LOW);//reverse
    analogWrite(pwmA,a);//was 150
    analogWrite(pwmB,b);//reverse power
    delay(400);
    analogWrite(pwmB,0);
    delay(800);
    analogWrite(pwmA,0);//stop
    
    digitalWrite(dirA,HIGH);
  digitalWrite(dirB,HIGH);
  analogWrite(pwmA,a);
  analogWrite(pwmB,b);
  delay(1000);
  
  t1=0;
  timestart=millis();
  
  }
  
  


}
  
  
  //main body of action
  if (t1=0) {
    timestart = millis();
    t1=1;
  }
  if (t1=1) {
    timeend = millis();
    timetotal= (timeend-timestart);
  }
    if (timetotal>30000) {
     digitalWrite(dirA,LOW);
    digitalWrite(dirB,LOW);//reverse
    analogWrite(pwmA,a);//was 150
    analogWrite(pwmB,b);//reverse power
    delay(1000);
    digitalWrite(dirB,HIGH);
    analogWrite(pwmB,150);
    delay(1000);
    analogWrite(pwmA,0);//stop
    analogWrite(pwmB,0);
    
    digitalWrite(dirA,HIGH);
  digitalWrite(dirB,HIGH);
  analogWrite(pwmA,a);
  analogWrite(pwmB,b);
  delay(1000);
 
 t1=0;
 timestart=millis();
    } 
      
  digitalWrite(dirA,HIGH);
  digitalWrite(dirB,HIGH);
  analogWrite(pwmA,a);
  analogWrite(pwmB,b);
  
  z=analogRead(A0);//read current
  
  if (z>(x+210))  {//turn around and restart
      digitalWrite(dirA,LOW);
    digitalWrite(dirB,LOW);//reverse
    analogWrite(pwmA,150);
    analogWrite(pwmB,150);//reverse power
    delay(1000);
    digitalWrite(dirB,HIGH);
    analogWrite(pwmB,150);
    delay(600);
    analogWrite(pwmA,0);//stop
    analogWrite(pwmB,0);
    
    digitalWrite(dirA,HIGH);//go forward one second
  digitalWrite(dirB,HIGH);
  analogWrite(pwmA,a);
  analogWrite(pwmB,b);
  delay(1000);
  
  t1=0;
  timestart=millis();
    } 
    
  
}

Credits

Mike Rigsby
13 projects • 36 followers
I am an author and a maker. Current projects include Santa's Shop and Little Friend (ultracapacitor powered robot) on hackaday.io.

Comments