Bipedalism is a form of locomotion where an organism moves by means of its two rear limbs or legs. Biped is an animal or machine that usually moves in the above (bipedal) manner.
Our biped is intended to be autonomous robot. And designed to be interacting with its environment. Its functional purpose is to serve the experimental studies in various locomotion related to humans.
Now the major task lies in understanding the human balance. It is nothing but controlling the body posture without falling in various actions made to move the same.
The advantages of legs over wheels in a robot are that legged robots could navigate on any kind of surfaces. Whereas wheels are designed to work on prepared surfaces like rails, roads, terrain, etc. Legged robots can step over the objects that needed to be avoided in its path. But the wheeled one can’t.
Wheeled bots could not make it over when the path has discontinuity, but the other one could cross it.
And most of all the humanoid body structure allows it to act in human environments.
Design Procedure:Design of biped includes equal amount of mechanical and electronics considerations. Each leg of the robot has Hip and Ankle. The actuators used in the biped to control the joints are servos. They are small electric motors that provide position feedback control. The stability is achieved by moving these joints. The task is to maintain the center of mass within its area of support, and achieving it by using minimal number of actuators.
Here in this biped we use simple U shaped brackets specially designed for this kind of bipeds. Both the hip and ankle joints undergo ROLLING actions. And anyone doesn’t perform steering actions. This biped has 4 Degrees of freedom (D.O.F). The Degree of freedom of a body is defined as number of independent movement it has.
So the biped has 4 joints in which it could make its movement. Next part is to make the biped stable when it lifts a leg off the ground. There are two methods to achieve this when it is in one leg phase.
The first method is to tilt one leg at its ankle so that whole body tilts to one side and maintains the mass while the other leg moves front. And then it comes to rest to attain stability.
The other method is more likely to the human. In humans half of the body above the pelvis region (hip) is moved above one leg when the other one swings to and fro. So a suitable mass should be moved above the two legs (on the hips) and change the centre of the gravity.
The constraint in the first one is the tilt angle should be so accurate enough to lift one leg. If the angle is more it falls on the other side. And the foot pad should be larger.
The second idea is like an inverted pendulum kept above the legs. So it needs more space above the hip. Since the weight is at far distance from the ground, it is very hard to maintain the centre of mass.
We decided to go with inverted pendulum idea and defy its constraint.
The main constraint is in moving the weight at that height makes the biped fall front or back during motions.
So we concluded to make the distance between the weight and the legs zero and roll the weight above the legs on a platform (hip).
Components Used :Used this to make it stop automatically.
Used this to interface the servo to the arduino.
Used this to Move the Biped based on balancing phenomenon.
Used this to Make the Ir sensor detect the black strips and move in the respective direction to balance the weight when one leg is lifted and vice versa..
Weight Balancer track for the gear to rotate on this track.
Gear to rotate on the provided track and balance based on which leg is lifted up.
Introducing Blynk:Blynk app controlling the Biped.
Code Explanation:#include<Servo.h>
#include <SPI.h>
#include <Ethernet.h>
#include <BlynkSimpleEthernet.h>
// You should get Auth Token in the Blynk App.
// Go to the Project Settings (nut icon).
char auth[] = "YourAuthToken";
Servo a1,a2,b1,b2,c1;
int x[20];
String z;
char y;
int d=90;
int h=90;
int s=0,i=0,j=90,t=90;
int k=0,a=0,l=0,p=0,f=1,q=0,o=0;
long duration, distance;
void setup()
{
Serial.begin(9600);
Blynk.begin(auth);
a1.attach(11);
a2.attach(10);
b1.attach(9);
b2.attach(5);
c1.attach(3);
a1.write(90);
a2.write(90);
b1.write(90);
b2.write(90);
c1.write(95);
pinMode(12, OUTPUT);
pinMode(8, INPUT);
pinMode(2,OUTPUT);
digitalWrite(2,HIGH);
}
void loop()
{
Blynk.run();
if(Serial.available()>0)
{
z=Serial.readStringUntil('#');
y= z[z.length()-1];
}
digitalWrite(12, LOW);
delayMicroseconds(2);
digitalWrite(12, HIGH);
delayMicroseconds(10);
digitalWrite(12, LOW);
duration = pulseIn(8, HIGH);
distance = duration/58.2;
if(distance>=25||distance==0)
{
y=y;
}
else
{
y='s';
}
if(y=='f')
{
if(s==0)
{
// delay(5000);
c1.write(105);
delay(600);
while(k==0)
{
c1.write(105);
a=digitalRead(7);
if(a==0)
{
k=1;
}
}
c1.write(95);
delay(100);
k=0;
}
for(i=90;i<=105;i+=1)
{
a1.write(i);
delay(30);
a2.write(j);
j=j-1;
delay(30);
}
delay(100);
for(i=90;i<=105;i+=1)
{
b1.write(i);
delay(30);
b2.write(t);
t=t-1;
delay(30);
}
delay(100);
c1.write(83);
delay(800);
while(k==0)
{
c1.write(83);
a=digitalRead(7);
if(a==0)
{
k=1;
}
}
c1.write(95);
delay(200);
k=0;
c1.write(83);
delay(800);
while(k==0)
{
c1.write(83);
a=digitalRead(7);
if(a==0)
{
k=1;
}
}
c1.write(95);
delay(100);
k=0;
x[0]=a1.read();
x[1]=a2.read();
x[2]=b1.read();
x[3]=b2.read();
for(i=x[0];i>=90;i-=1)
{
a1.write(i);
delay(30);
a2.write(x[1]);
x[1]=x[1]+1;
delay(30);
}
delay(100);
for(i=x[2];i>=90;i-=1)
{
b1.write(i);
delay(30);
b2.write(x[3]);
x[3]=x[3]+1;
delay(30);
}
delay(100);
for(i=90;i>=75;i-=1)
{
b1.write(i);
delay(30);
b2.write(d);
d=d+1;
delay(30);
}
delay(100);
for(i=90;i>=75;i-=1)
{
a1.write(i);
delay(30);
a2.write(h);
h=h+1;
delay(30);
}
c1.write(105);
delay(400);
while(k==0)
{
c1.write(105);
a=digitalRead(7);
if(a==0)
{
k=1;
}
}
k=0;
c1.write(95);
delay(200);
c1.write(105);
delay(400);
while(k==0)
{
c1.write(105);
a=digitalRead(7);
if(a==0)
{
k=1;
}
}
k=0;
c1.write(95);
delay(100);
x[4]=a1.read();
x[5]=a2.read();
x[6]=b1.read();
x[7]=b2.read();
for(i=x[6];i<=90;i++)
{
b1.write(i);
delay(30);
b2.write(x[7]);
x[7]=x[7]-1;
delay(30);
}
delay(100);
for(i=x[4];i<=90;i++)
{
a1.write(i);
delay(30);
a2.write(x[5]);
x[5]=x[5]-1;
delay(30);
}
delay(100);
/*c1.write(83);
delay(400);
while(k==0)
{
c1.write(83);
a=digitalRead(7);
if(a==0)
{
k=1;
}
}
c1.write(95);
delay(100);*/
k=0;
d=90;
h=90;
t=90;
j=90;
s=1;
l=1;
f=0;
q=1;
}
//delay(50);
else if(y=='s')
{
if(l==1)
{
delay(100);
c1.write(83);
delay(800);
while(k==0)
{
c1.write(83);
a=digitalRead(7);
if(a==0)
{
k=1;
}
}
c1.write(95);
delay(100);
k=0;
}
f=1;
p=0;
s=0;
l=0;
o=0;
q=0;
}
else if(y=='k')
{
if(f==1)
{
k=0;
c1.write(105);
delay(400);
while(k==0)
{
c1.write(105);
a=digitalRead(7);
if(a==0)
{
k=1;
}
}
k=0;
c1.write(95);
delay(200);
}
f=0;
if(p==0)
{
/*c1.write(83);
delay(800);
while(k==0)
{
c1.write(83);
a=digitalRead(7);
if(a==0)
{
k=1;
}
}
c1.write(95);
delay(100);
k=0;*/
x[0]=a1.read();
x[1]=a2.read();
for(i=x[0];i<=145;i++)
{
a1.write(i);
delay(30);
a2.write(x[1]);
x[1]=x[1]-1;
delay(30);
}
delay(100);
//
x[0]=a1.read();
x[1]=a2.read();
for(i=x[1];i>=30;i--)
{
a2.write(i);
delay(30);
}
delay(100);
x[0]=a1.read();
x[1]=a2.read();
for(i=x[0];i>=100;i--)
{
a1.write(i);
delay(30);
}
delay(100);
x[2]=b1.read();
x[3]=b2.read();
for(i=x[2];i<=105;i++)
{
b1.write(i);
delay(60);
b2.write(x[3]);
x[3]=x[3]-1;
delay(60);
}
delay(100);
x[2]=b1.read();
x[3]=b2.read();
x[0]=a1.read();
x[1]=a2.read();
for(i=x[0];i>=55;i--)
{
a1.write(i);
delay(30);
}
delay(100);
x[0]=a1.read();
x[1]=a2.read();
for(i=x[0];i<=100;i++)
{
a1.write(i);
delay(30);
}
delay(100);
for(i=x[2];i>=90;i--)
{
b1.write(i);
delay(60);
b2.write(x[3]);
x[3]=x[3]+1;
delay(60);
}
x[0]=a1.read();
x[1]=a2.read();
delay(200);
for(i=x[0];i<=145;i++)
{
a1.write(i);
delay(30);
}
delay(100);
x[0]=a1.read();
x[1]=a2.read();
for(i=x[1];i<=35;i++)
{
a2.write(i);
delay(30);
}
delay(100);
x[0]=a1.read();
x[1]=a2.read();
for(i=x[0];i>=90;i-=1)
{
a1.write(i);
delay(30);
a2.write(x[1]);
x[1]=x[1]+1;
delay(30);
}
delay(100);
//
c1.write(83);
delay(800);
while(k==0)
{
c1.write(83);
a=digitalRead(7);
if(a==0)
{
k=1;
}
}
c1.write(95);
delay(100);
k=0;
p=1;
l=0;
delay(50);
}
}
else if(y=='l')
{
if(q==1)
{
c1.write(83);
delay(800);
while(k==0)
{
c1.write(83);
a=digitalRead(7);
if(a==0)
{
k=1;
}
}
c1.write(95);
delay(100);
k=0;
}
q=0;
delay(100);
if(o==0)
{
x[2]=b1.read();
x[3]=b2.read();
for(i=x[2];i<=105;i+=1)
{
b1.write(i);
delay(30);
b2.write(x[3]);
x[3]=x[3]-1;
delay(30);
}
delay(3000);
x[2]=b1.read();
x[3]=b2.read();
for(i=x[2];i>=90;i--)
{
b1.write(i);
delay(30);
b2.write(x[3]);
delay(30);
x[3]=x[3]+1;
}
delay(100);
}
o=1;
}
}
This code helps the biped to get values by means of the blynk app and send it to the biped to walk if 'f' is detected and to stop if 's' is detected.
Project details:Tried in various codes, finally made it to do wonders. Not everyone finishes what they start, but i had help from my friends to finish the project before the deadline and the happiness really lies in seeing our project do wonders.
This Project took us about 30 days to finish. Interest is what something which makes people do spark in making things. We had the interest and we made it!
Working Video:
Comments