Hackster is hosting Hackster Holidays, Ep. 6: Livestream & Giveaway Drawing. Watch previous episodes or stream live on Monday!Stream Hackster Holidays, Ep. 6 on Monday!
Published © MIT

Wolf: Search and Rescue Multi-Terrain Robot

Wolf is an IoT multi-terrain robot running on the Arduino 101 platform.

AdvancedFull instructions provided2 days10,877
Wolf: Search and  Rescue Multi-Terrain Robot

Things used in this project

Hardware components

Raspberry Pi 2 Model B
Raspberry Pi 2 Model B
×1
Arduino 101
Arduino 101
×1
Mini Maestro 18-Channel USB Servo Controller
×1
Raspberry Pi motor hat
×1
Pololu-Maestro 75:1 DC Micromotor
×4
Turnigy 6V / 2300 mAH Ni-MH Rechargeable Battery
×1
HobbyKingβ„’ High Torque Servo
×12
Micro Servo
×2
3D Printed Parts
×1
M3 Cap Head Screws
OpenBuilds M3 Cap Head Screws
×3
standoff M3
×1

Software apps and online services

Arduino IDE
Arduino IDE
Watson
IBM Watson

Hand tools and fabrication machines

3D Printer (generic)
3D Printer (generic)
Soldering iron (generic)
Soldering iron (generic)

Story

Read more

Custom parts and enclosures

wolf

Schematics

Wiring Schematics

Code

Arduino 101 servo code

Arduino
#include

const int ServoNum = 12;

Servo legServo[ServoNum];
int servoPos[ServoNum];
int servoIndex;

int servoPin[ServoNum] = {23, 24, 25,
26, 27, 28,
29, 30, 31,
32, 33, 34};

void setup() {

Serial.begin(9600);
servoIndex = 0;

// ================ Servos ==================
for (int i=0; i<ServoNum; i++){
legServo[i].attach(servoPin[i]);
delay(50);
legServo[i].writeMicroseconds(1500);
servoPos[i] = 1500;
delay(100);
}
delay(500);

Serial.println(β€œReady”);
Serial.println(β€œenter + to increment”);
Serial.println(β€œenter – to decrement”);
Serial.println(β€œenter n to proceed to next servo”);
Serial.println(β€œenter l to go back to last servo”);

}

void loop(){

if ( Serial.available()) {
char ch = Serial.read();

switch(ch){
case β€˜+’:
servoPos[servoIndex] += 3;
if(servoPos[servoIndex] >= 2350){
servoIndex = 2350;
Serial.println(β€œYou can’t turn it up anymore (you might damage it!”);
}
else{
legServo[servoIndex].write(servoPos[servoIndex]);
Serial.println(servoPos[servoIndex]);
delay(100);
}
break;

case β€˜-β€˜:
servoPos[servoIndex] -= 3;
if(servoPos[servoIndex] <= 650){
servoIndex = 650;
Serial.println(β€œYou can’t turn it down anymore (you might damage it!”);
}
else{
legServo[servoIndex].write(servoPos[servoIndex]);
Serial.println(servoPos[servoIndex]);
delay(100);
}
break;

case β€˜n’:
if(++servoIndex >= 12){
servoIndex = 11;
Serial.println(β€œwe have reached last servo”);
}
else{
Serial.print(β€œSwitched to Pin β€œ);
Serial.println(servoPin[servoIndex]);
}
break;

case β€˜l’:
if(–servoIndex < 0){
servoIndex = 0;
Serial.println(β€œwe have reached first servo”);
}
else{
Serial.print(β€œSwitched to Pin β€œ);
Serial.println(servoPin[servoIndex]);
}
break;

default:
Serial.println(β€œUnknown Command… β€œ);

}

coor GaitCalculate (){
//Calculate Gait positions

for (int LegIndex = 0; LegIndex < 4; LegIndex++){

if (GaitStep == GaitLegNr[LegIndex]) {
GaitPos[LegIndex].Y = -LegLiftHeight/2;
}
else if (GaitStep == GaitLegNr[LegIndex]+1) {
GaitPos[LegIndex].Z = 0;
GaitPos[LegIndex].Y = -LegLiftHeight;
}
else if (GaitStep == GaitLegNr[LegIndex]+2) {
GaitPos[LegIndex].Z = WalkLength/2;
GaitPos[LegIndex].Y = -LegLiftHeight/2;
}
else if (GaitStep == GaitLegNr[LegIndex]+3) {
GaitPos[LegIndex].Y = 0;
}
else{
// move body forward
GaitPos[LegIndex].Z -= WalkLength/TLDivFactor;

}

}

//Advance to the next step
if (++GaitStep > StepsInGait)
GaitStep = 1;
}

all code here

Credits

Comments