前言:
现时兄弟们对“运动控制源代码”可能比较关切,咱们都想要知道一些“运动控制源代码”的相关文章。那么小编同时在网摘上搜集了一些有关“运动控制源代码””的相关内容,希望朋友们能喜欢,看官们快快来了解一下吧!四足机器人8个舵机实现蜘蛛类的的仿生运动arduino源代码
说明: 通过8个舵机 实现蜘蛛类的的仿生运动,文件包含所有的打印件及嵌入程序,提供arduino源代码,实现10多种运动模式,可以通过蓝牙或者wifi控制。
#include <EEPROM.h>
#include <Servo.h>
#include <SoftwareSerial.h>
// ---------------------------------------------------------------------------------------------------------------
SoftwareSerial BluetoothSerial(12 13);
String robotName = "Q1 mini"; // Robot name
const int enableCalibration = true; // Enable calibration button
// ---------------------------------------------------------------------------------------------------------------
const int numberOfServos = 8; // Number of servos
const int numberOfACE = 9; // Number of action code elements
int servoCal[] = { 0 0 0 0 0 0 0 0 }; // Servo calibration data
int servoPos[] = { 0 0 0 0 0 0 0 0 }; // Servo current position
int servoPrgPeriod = 20; // 20 ms
Servo servo[numberOfServos]; // Servo obxxxxject
// Action code
// --------------------------------------------------------------------------------
// Servo zero position
// -------------------------- P02 P03 P05 P15 P07 P08 P11 P16
const int servoAct00 [] PROGMEM = { 135 45 135 45 45 135 45 135 };
// Zero
int servoPrg00step = 1;
const int servoPrg00 [][numberOfACE] PROGMEM = {
// P02 P03 P05 P15 P07 P08 P11 P16 ms
{ 135 45 135 45 45 135 45 135 400 } // zero position
};
// Standby
int servoPrg01step = 2;
const int servoPrg01 [][numberOfACE] PROGMEM = {
// P02 P03 P05 P15 P07 P08 P11 P16 ms
{ 90 90 90 90 90 90 90 90 200 } // servo center point
{ 70 90 90 110 110 90 90 70 200 } // standby
};
// Forward
int servoPrg02step = 11;
const int servoPrg02 [][numberOfACE] PROGMEM = {
// P02 P03 P05 P15 P07 P08 P11 P16 ms
{ 70 90 90 110 110 90 90 70 100 } // standby
{ 90 90 90 110 110 90 45 90 100 } // leg14 up; leg4 fw
{ 70 90 90 110 110 90 45 70 100 } // leg14 dn
{ 70 90 90 90 90 90 45 70 100 } // leg23 up
{ 70 45 135 90 90 90 90 70 100 } // leg14 bk; leg2 fw
{ 70 45 135 110 110 90 90 70 100 } // leg23 dn
{ 90 90 135 110 110 90 90 90 100 } // leg14 up; leg1 fw
{ 90 90 90 110 110 135 90 90 100 } // leg23 bk
{ 70 90 90 110 110 135 90 70 100 } // leg14 dn
{ 70 90 90 110 90 135 90 70 100 } // leg3 up
{ 70 90 90 110 110 90 90 70 100 } // leg3 fw dn
};
// Backward
int servoPrg03step = 11;
const int servoPrg03 [][numberOfACE] PROGMEM = {
// P02 P03 P05 P15 P07 P08 P11 P16 ms
{ 70 90 90 110 110 90 90 70 100 } // standby
{ 90 45 90 110 110 90 90 90 100 } // leg41 up; leg1 fw
{ 70 45 90 110 110 90 90 70 100 } // leg41 dn
{ 70 45 90 90 90 90 90 70 100 } // leg32 up
{ 70 90 90 90 90 135 45 70 100 } // leg41 bk; leg3 fw
{ 70 90 90 110 110 135 45 70 100 } // leg32 dn
{ 90 90 90 110 110 135 90 90 100 } // leg41 up; leg4 fw
{ 90 90 135 110 110 90 90 90 100 } // leg31 bk
{ 70 90 135 110 110 90 90 70 100 } // leg41 dn
{ 70 90 135 90 110 90 90 70 100 } // leg2 up
{ 70 90 90 110 110 90 90 70 100 } // leg2 fw dn
};
// Move Left
int servoPrg04step = 11;
const int servoPrg04 [][numberOfACE] PROGMEM = {
// P02 P03 P05 P15 P07 P08 P11 P16 ms
{ 70 90 90 110 110 90 90 70 100 } // standby
{ 70 90 45 90 90 90 90 70 100 } // leg32 up; leg2 fw
{ 70 90 45 110 110 90 90 70 100 } // leg32 dn
{ 90 90 45 110 110 90 90 90 100 } // leg14 up
{ 90 135 90 110 110 45 90 90 100 } // leg32 bk; leg1 fw
{ 70 135 90 110 110 45 90 70 100 } // leg14 dn
{ 70 135 90 90 90 90 90 70 100 } // leg32 up; leg3 fw
{ 70 90 90 90 90 90 135 70 100 } // leg14 bk
{ 70 90 90 110 110 90 135 70 100 } // leg32 dn
{ 70 90 90 110 110 90 135 90 100 } // leg4 up
{ 70 90 90 110 110 90 90 70 100 } // leg4 fw dn
};
// Move Right
int servoPrg05step = 11;
const int servoPrg05 [][numberOfACE] PROGMEM = {
// P02 P03 P05 P15 P07 P08 P11 P16 ms
{ 70 90 90 110 110 90 90 70 100 } // standby
{ 70 90 90 90 90 45 90 70 100 } // leg23 up; leg3 fw
{ 70 90 90 110 110 45 90 70 100 } // leg23 dn
{ 90 90 90 110 110 45 90 90 100 } // leg41 up
{ 90 90 45 110 110 90 135 90 100 } // leg23 bk; leg4 fw
{ 70 90 45 110 110 90 135 70 100 } // leg41 dn
{ 70 90 90 90 90 90 135 70 100 } // leg23 up; leg2 fw
{ 70 135 90 90 90 90 90 70 100 } // leg41 bk
{ 70 135 90 110 110 90 90 70 100 } // leg23 dn
{ 90 135 90 110 110 90 90 70 100 } // leg1 up
{ 70 90 90 110 110 90 90 70 100 } // leg1 fw dn
};
// Turn left
int servoPrg06step = 8;
const int servoPrg06 [][numberOfACE] PROGMEM = {
// P02 P03 P05 P15 P07 P08 P11 P16 ms
{ 70 90 90 110 110 90 90 70 100 } // standby
{ 90 90 90 110 110 90 90 90 100 } // leg14 up
{ 90 135 90 110 110 90 135 90 100 } // leg14 turn
{ 70 135 90 110 110 90 135 70 100 } // leg14 dn
{ 70 135 90 90 90 90 135 70 100 } // leg23 up
{ 70 135 135 90 90 135 135 70 100 } // leg23 turn
{ 70 135 135 110 110 135 135 70 100 } // leg23 dn
{ 70 90 90 110 110 90 90 70 100 } // leg1234 turn
};
// Turn right
int servoPrg07step = 8;
const int servoPrg07 [][numberOfACE] PROGMEM = {
// P02 P03 P05 P15 P07 P08 P11 P16 ms
{ 70 90 90 110 110 90 90 70 100 } // standby
{ 70 90 90 90 90 90 90 70 100 } // leg23 up
{ 70 90 45 90 90 45 90 70 100 } // leg23 turn
{ 70 90 45 110 110 45 90 70 100 } // leg23 dn
{ 90 90 45 110 110 45 90 90 100 } // leg14 up
{ 90 45 45 110 110 45 45 90 100 } // leg14 turn
{ 70 45 45 110 110 45 45 70 100 } // leg14 dn
{ 70 90 90 110 110 90 90 70 100 } // leg1234 turn
};
// Lie
int servoPrg08step = 1;
const int servoPrg08 [][numberOfACE] PROGMEM = {
// P02 P03 P05 P15 P07 P08 P11 P16 ms
{ 110 90 90 70 70 90 90 110 500 } // leg14 up
};
// Say Hi
int servoPrg09step = 4;
const int servoPrg09 [][numberOfACE] PROGMEM = {
// P02 P03 P05 P15 P07 P08 P11 P16 ms
{ 120 90 90 110 60 90 90 70 200 } // leg1 3 down
{ 70 90 90 110 110 90 90 70 200 } // standby
{ 120 90 90 110 60 90 90 70 200 } // leg1 3 down
{ 70 90 90 110 110 90 90 70 200 } // standby
};
// Fighting
int servoPrg10step = 11;
const int servoPrg10 [][numberOfACE] PROGMEM = {
// P02 P03 P05 P15 P07 P08 P11 P16 ms
{ 120 90 90 110 60 90 90 70 200 } // leg1 2 down
{ 120 70 70 110 60 70 70 70 200 } // body turn left
{ 120 110 110 110 60 110 110 70 200 } // body turn right
{ 120 70 70 110 60 70 70 70 200 } // body turn left
{ 120 110 110 110 60 110 110 70 200 } // body turn right
{ 70 90 90 70 110 90 90 110 200 } // leg1 2 up ; leg3 4 down
{ 70 70 70 70 110 70 70 110 200 } // body turn left
{ 70 110 110 70 110 110 110 110 200 } // body turn right
{ 70 70 70 70 110 70 70 110 200 } // body turn left
{ 70 110 110 70 110 110 110 110 200 } // body turn right
{ 70 90 90 70 110 90 90 110 200 } // leg1 2 up ; leg3 4 down
};
// Push up
int servoPrg11step = 11;
const int servoPrg11 [][numberOfACE] PROGMEM = {
// P02 P03 P05 P15 P07 P08 P11 P16 ms
{ 70 90 90 110 110 90 90 70 300 } // start
{ 100 90 90 80 80 90 90 100 400 } // down
{ 70 90 90 110 110 90 90 70 500 } // up
{ 100 90 90 80 80 90 90 100 600 } // down
{ 70 90 90 110 110 90 90 70 700 } // up
{ 100 90 90 80 80 90 90 100 1300 } // down
{ 70 90 90 110 110 90 90 70 1800 } // up
{ 135 90 90 45 45 90 90 135 200 } // fast down
{ 70 90 90 45 60 90 90 135 500 } // leg1 up
{ 70 90 90 45 110 90 90 135 500 } // leg2 up
{ 70 90 90 110 110 90 90 70 500 } // leg3 leg4 up
};
// Sleep
int servoPrg12step = 2;
const int servoPrg12 [][numberOfACE] PROGMEM = {
// P02 P03 P05 P15 P07 P08 P11 P16 ms
{ 30 90 90 150 150 90 90 30 200 } // leg14 dn
{ 30 45 135 150 150 135 45 30 200 } // protect myself
};
// Dancing 1
int servoPrg13step = 10;
const int servoPrg13 [][numberOfACE] PROGMEM = {
// P02 P03 P05 P15 P07 P08 P11 P16 ms
{ 90 90 90 90 90 90 90 90 300 } // leg1234 up
{ 50 90 90 90 90 90 90 90 300 } // leg1 dn
{ 90 90 90 130 90 90 90 90 300 } // leg1 up; leg2 dn
{ 90 90 90 90 90 90 90 50 300 } // leg2 up; leg4 dn
{ 90 90 90 90 130 90 90 90 300 } // leg4 up; leg3 dn
{ 50 90 90 90 90 90 90 90 300 } // leg3 up; leg1 dn
{ 90 90 90 130 90 90 90 90 300 } // leg1 up; leg2 dn
{ 90 90 90 90 90 90 90 50 300 } // leg2 up; leg4 dn
{ 90 90 90 90 130 90 90 90 300 } // leg4 up; leg3 dn
{ 90 90 90 90 90 90 90 90 300 } // leg3 up
};
// Dancing 2
int servoPrg14step = 9;
const int servoPrg14 [][numberOfACE] PROGMEM = {
// P02 P03 P05 P15 P07 P08 P11 P16 ms
{ 70 45 135 110 110 135 45 70 300 } // leg1234 two sides
{ 115 45 135 65 110 135 45 70 300 } // leg12 up
{ 70 45 135 110 65 135 45 115 300 } // leg12 dn; leg34 up
{ 115 45 135 65 110 135 45 70 300 } // leg34 dn; leg12 up
{ 70 45 135 110 65 135 45 115 300 } // leg12 dn; leg34 up
{ 115 45 135 65 110 135 45 70 300 } // leg34 dn; leg12 up
{ 70 45 135 110 65 135 45 115 300 } // leg12 dn; leg34 up
{ 115 45 135 65 110 135 45 70 300 } // leg34 dn; leg12 up
{ 75 45 135 105 110 135 45 70 300 } // leg12 dn
};
// Dancing 3
int servoPrg15step = 10;
const int servoPrg15 [][numberOfACE] PROGMEM = {
// P02 P03 P05 P15 P07 P08 P11 P16 ms
{ 70 45 45 110 110 135 135 70 300 } // leg1234 bk
{ 110 45 45 60 70 135 135 70 300 } // leg123 up
{ 70 45 45 110 110 135 135 70 300 } // leg123 dn
{ 110 45 45 110 70 135 135 120 300 } // leg134 up
{ 70 45 45 110 110 135 135 70 300 } // leg134 dn
{ 110 45 45 60 70 135 135 70 300 } // leg123 up
{ 70 45 45 110 110 135 135 70 300 } // leg123 dn
{ 110 45 45 110 70 135 135 120 300 } // leg134 up
{ 70 45 45 110 110 135 135 70 300 } // leg134 dn
{ 70 90 90 110 110 90 90 70 300 } // standby
};
// --------------------------------------------------------------------------------
// Setup
// --------------------------------------------------------------------------------
void setup()
{
// EEPROM Clear (For Debug Only)
// eepromClear();
Serial.begin(115200); // Open serial communications
BluetoothSerial.begin(115200);
getServoCal(); // Get servoCal from EEP ROM
// Servo Pin Set
servo[0].attach(2);
servo[1].attach(3);
servo[2].attach(5);
servo[3].attach(15);
servo[4].attach(7);
servo[5].attach(8);
servo[6].attach(11);
servo[7].attach(16);
runServoPrg(servoPrg00 servoPrg00step); // zero position
}
// --------------------------------------------------------------------------------
// Loop
// --------------------------------------------------------------------------------
void loop()
{
if (BluetoothSerial.available()) {//检测蓝牙模块串口状态
char value = BluetoothSerial.read();
Serial.println(value);
// When button pressed
if (value == '1') {
runServoPrg(servoPrg06 servoPrg06step); // turnLeft
} else if (value == '2') {
runServoPrg(servoPrg02 servoPrg02step); // forward
} else if (value == '3') {
runServoPrg(servoPrg07 servoPrg07step); // turnRight
} else if (value == '4') {
runServoPrg(servoPrg04 servoPrg04step); // moveLeft
} else if (value == '5') {
runServoPrg(servoPrg03 servoPrg03step); // backward
} else if (value == '6') {
runServoPrg(servoPrg05 servoPrg05step); // moveRight
} else if (value == '7') {
runServoPrg(servoPrg01 servoPrg01step); // standby
} else if (value == '8') {
runServoPrg(servoPrg09 servoPrg09step); // sayHi
} else if (value == '9') {
runServoPrg(servoPrg11 servoPrg11step); // pushUp
} else if (value == '0') {
runServoPrg(servoPrg08 servoPrg08step); // lie
} else if (value == 'a') {
runServoPrg(servoPrg10 servoPrg10step); // fighting
} else if (value == 'b') {
runServoPrg(servoPrg12 servoPrg12step); // sleep
} else if (value == 'c') {
runServoPrg(servoPrg13 servoPrg13step); // dancing1
} else if (value == 'd') {
runServoPrg(servoPrg14 servoPrg14step); // dancing2
} else if (value == 'e') {
runServoPrg(servoPrg15 servoPrg15step); // dancing3
} else if (value == 'f') {
runServoPrg(servoPrg00 servoPrg00step); // zero position
} else if (value == 'g') {
clearCal(); // Clear Servo calibration data
} else if (value == 'h') {
calibration(0 1);
} else if (value == 'i') {
calibration(0 -1);
} else if (value == 'j') {
calibration(1 1);
} else if (value == 'k') {
calibration(1 -1);
} else if (value == 'l') {
calibration(2 1);
} else if (value == 'm') {
calibration(2 -1);
} else if (value == 'n') {
calibration(3 1);
} else if (value == 'o') {
calibration(3 -1);
} else if (value == 'p') {
calibration(4 1);
} else if (value == 'q') {
calibration(4 -1);
} else if (value == 'i') {
calibration(5 1);
} else if (value == 's') {
calibration(5 -1);
} else if (value == 't') {
calibration(6 1);
} else if (value == 'u') {
calibration(6 -1);
} else if (value == 'v') {
calibration(7 1);
} else if (value == 'w') {
calibration(7 -1);
}
}
}
// --------------------------------------------------------------------------------
// Function
// --------------------------------------------------------------------------------
// EEPROM Clear (For debug only)
void eepromClear()
{
for (int i = 0; i < EEPROM.length(); i++) {
EEPROM.write(i 0);
}
}
// Get servoCal from EEPROM
void getServoCal()
{
int eeAddress = 0;
for (int i = 0; i < numberOfServos; i++) {
EEPROM.get(eeAddress servoCal[i]);
eeAddress += sizeof(servoCal[i]);
}
}
// Put servoCal to EEPROM
void putServoCal()
{
int eeAddress = 0;
for (int i = 0; i < numberOfServos; i++) {
EEPROM.put(eeAddress servoCal[i]);
eeAddress += sizeof(servoCal[i]);
}
}
// Clear Servo calibration data
void clearCal()
{
for (int i = 0; i < numberOfServos; i++) {
servoCal[i] = 0;
}
putServoCal(); // Put servoCal to EEPROM
runServoPrg(servoPrg00 servoPrg00step); // zero position
}
// Calibration
void calibration(int i int change)
{
servoCal[i] = servoCal[i] + change;
servo[i].write(pgm_read_word_near(servoAct00+i) + servoCal[i]);
putServoCal(); // Put servoCal to EEPROM
delay(400);
}
void runServoPrg(int servoPrg[][numberOfACE] int step)
{
for (int i = 0; i < step; i++) { // Loop for step
int totalTime = pgm_read_word_near(servoPrg[i]+(numberOfACE - 1)); // Total time of this step
// Get servo start position
for (int s = 0; s < numberOfServos; s++) {
servoPos[s] = servo[s].read() - servoCal[s];
}
for (int j = 0; j < totalTime / servoPrgPeriod; j++) { // Loop for time section
for (int k = 0; k < numberOfServos; k++) { // Loop for servo
servo[k].write((map(j 0 totalTime / servoPrgPeriod servoPos[k] pgm_read_word_near(servoPrg[i]+k))) + servoCal[k]);
}
delay(servoPrgPeriod);
}
}
}
// --------------------------------------------------------------------------------
标签: #运动控制源代码