// SP-8 quadruped robot - 27/03/2019 // Copyleft - Roberto Hamm - roberto-hamm@sfr.fr // http://robotix.ah-oui.org #include #include // codes IR remote control #define cod_0 0x40BF #define cod_1 0xC03F #define cod_2 0xE01F #define cod_3 0x807F #define cod_4 0xD827 #define cod_5 0x20DF int IR_signal = A0; IRrecv irrecv(IR_signal); decode_results results; // servo codes Servo servo_footA; Servo servo_armA; Servo servo_footB; Servo servo_armB; Servo servo_footC; Servo servo_armC; Servo servo_footD; Servo servo_armD; int srv_footA = 11; // foot int srv_armA = 10; // arm int srv_footB = 9; // foot int srv_armB = 8; // arm int srv_footC = 7; // foot int srv_armC = 6; // arm int srv_footD = 5; // foot int srv_armD = 4; // arm int del = 1500; int Fdw=60; int Fup=80; int Abw=70; int Afw=110; int spd=5; int p13 =13; void setup() { Serial.begin(9600); Serial.println("Spider-S8 : version-190418 - CASE"); // remote control pinMode(IR_signal, INPUT); irrecv.enableIRIn(); // servo servo_footA.attach(srv_footA); servo_armA.attach(srv_armA); servo_footB.attach(srv_footB); servo_armB.attach(srv_armB); servo_footC.attach(srv_footC); servo_armC.attach(srv_armC); servo_footD.attach(srv_footD); servo_armD.attach(srv_armD); stall(); delay(1000); pinMode(p13, OUTPUT); } void loop() { if (irrecv.decode(&results)) { unsigned int value = results.value; Serial.println(value, HEX); switch(value){ case cod_1: digitalWrite(p13,HIGH); ROUND(); digitalWrite(p13,LOW); break; case cod_2: digitalWrite(p13,HIGH); WALK(); digitalWrite(p13,LOW); break; case cod_3: BLINK(); for(int i = 0; i < 7; i++){WALK();} stall(); flat_up(); delay(1000); flat_dw(); delay(1000); for(int i = 0; i < 7; i++){ROUND();} delay(500); stall(); break; case cod_4: flat_up(); break; case cod_5: flat_dw(); flat_up(); break; case cod_0: stall(); digitalWrite(p13,LOW); break; } // switch irrecv.resume(); }} ///////// grouped movements //////////////// void WALK(){ go_ahead(); Afoup(); armAfw(); Afodw(); Cfoup(); armCbw(); Cfodw(); Bfoup(); armBbw(); Bfodw(); Dfoup(); armDfw(); Dfodw(); } void ROUND(){ armAfw(); armBfw(); armCfw(); armDfw(); Afoup(); armAbw(); Afodw(); Bfoup(); armBbw(); Bfodw(); Cfoup(); armCbw(); Cfodw(); Dfoup(); armDbw(); Dfodw(); } ///////// foot up-down void Afoup(){ int max=Fup+5; int min=Fdw+5; for(int i=min; i<=max; i++) { servo_footA.write(i); delay(spd);}} void Bfoup(){ int max=Fup+5; int min=Fdw+5; for(int i=min; i<=max; i++) { servo_footB.write(i); delay(spd);}} void Cfoup(){ int max=Fup+5; int min=Fdw+5; for(int i=min; i<=max; i++) { servo_footC.write(i); delay(spd);}} void Dfoup(){ int max=Fup+5; int min=Fdw+5; for(int i=min; i<=max; i++) { servo_footD.write(i); delay(spd);}} void Afodw(){ int max=Fup+5; int min=Fdw+5; for(int i=max; i>=min; i--) { servo_footA.write(i); delay(spd);}} void Bfodw(){ int max=Fup+5; int min=Fdw+5; for(int i=max; i>=min; i--) { servo_footB.write(i); delay(spd);}} void Cfodw(){ int max=Fup+5; int min=Fdw+5; for(int i=max; i>=min; i--) { servo_footC.write(i); delay(spd);}} void Dfodw(){ int max=Fup+5; int min=Fdw+5; for(int i=max; i>=min; i--) { servo_footD.write(i); delay(spd);}} ///////////// basic mvmnts /////////////// void go_ahead(){ spd=5; for(int i=Afw; i>=Abw; i--) { servo_armA.write(i); servo_armD.write(i); int y = Abw+Afw-i; servo_armC.write(y); servo_armB.write(y); delay(spd);}} void flat_up(){ int max=Fup+5; int min=Fdw+5; servo_footA.write(min); servo_footB.write(min); servo_footC.write(min); servo_footD.write(min); delay(500); for(int i=min; i<=max+50; i++) { servo_footA.write(i); servo_footB.write(i); servo_footC.write(i); servo_footD.write(i); delay(spd);} delay(500); } void flat_dw(){ int max=Fup+5; int min=Fdw+5; servo_footA.write(max); servo_footB.write(max); servo_footC.write(max); servo_footD.write(max); delay(500); for(int i=max; i>=min; i--) { servo_footA.write(i); servo_footB.write(i); servo_footC.write(i); servo_footD.write(i); delay(spd);} delay(500); } /////////////////////////// // single arm mvt A void armAfw(){ int min=Abw+0; int max=Afw+0; for(int i=min; i<=max; i++) { servo_armA.write(i); delay(spd); }} void armAbw(){ int min=Abw+0; int max=Afw+0; for(int i=max; i>=min; i--) { servo_armA.write(i); delay(spd); }} // single arm mvt B void armBfw(){ int min=Abw+0; int max=Afw+0; for(int i=min; i<=max; i++) { servo_armB.write(i); delay(spd); }} void armBbw(){ int min=Abw+0; int max=Afw+0; for(int i=max; i>=min; i--) { servo_armB.write(i); delay(spd); }} // single arm mvt C void armCfw(){ int min=Abw+0; int max=Afw+0; for(int i=min; i<=max; i++) { servo_armC.write(i); delay(spd); }} void armCbw(){ int min=Abw+0; int max=Afw+0; for(int i=max; i>=min; i--) { servo_armC.write(i); delay(spd); }} // single arm mvt D void armDfw(){ int min=Abw+0; int max=Afw+0; for(int i=min; i<=max; i++) { servo_armD.write(i); delay(spd); }} void armDbw(){ int min=Abw+0; int max=Afw+0; for(int i=max; i>=min; i--) { servo_armD.write(i); delay(spd); }} void stall(){ BLINK(); servo_armA.write(90);servo_footA.write(60); servo_armB.write(90);servo_footB.write(60); servo_armC.write(90);servo_footC.write(60); servo_armD.write(90);servo_footD.write(60); digitalWrite(p13,HIGH); } void BLINK(){ for(int i=0; i<3; i++){ digitalWrite(p13,HIGH); delay(100); digitalWrite(p13,LOW); delay(100); } }