Подумывая о самостоятельности робота при хаотичном шевелении качалками вдруг
осознал: все качалки в любом ходуне просто качаются около центрального положения (чаще 90 градусов) с одинаковой амплитудой и частотой переключений. Прикинул графики углов отклонений от времени, поэкспериментировал с гексаподом на 3 сервы. Сдвиги графиков очень похожих на синусоиды относительно друг друга и даёт все вариации хождений. Неожиданная гипотеза. То есть комбинации прямохождений и поворотов в разных пропорциях, но при целостности походки. Сценарии скетчей теперь будут выглядеть по другому совсем. "Синусоиду любой формы" можно забивать в массив.
Код:
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
// Arduino UNO,Pro mini
//
////////////////////////
//ПАУК (ГЕКСАПОД) 3 СЕРВОПРИВОДА ТЕСТ
//
#include <Servo.h>
byte dd=10;//амплитуда ходьбы
byte n=5;// постоянная временного интервала
byte i=0;//счётчик
byte j=0;//счётчик
byte a=90;//угол "серединный"
byte b=90;//угол "серединный"
byte c=98;//угол "серединный"
long Y=0;//переменная хранения моментов времени
int tabl[]={-4*dd/5,-3*dd/5,-2*dd/5,-dd/5,0,dd/5,2*dd/5,3*dd/5,4*dd/5,dd,dd,dd,dd,dd,dd,dd,dd,dd,dd,dd,
4*dd/5,3*dd/5,2*dd/5,dd/5,0,-dd/5,-2*dd/5,-3*dd/5,-4*dd/5,-dd,-dd,-dd,-dd,-dd,-dd,-dd,-dd,-dd,-dd,-dd};//массив последовательности приращений углов
int DL = sizeof(tabl) / sizeof(tabl[0]);//количество элементов массива
byte sm_1=DL/4;//смещение последовательности приращений углов ВПЕРЁД(sm_1=DL/4,sm_2=0);НАЗАД(sm_1=3*DL/4,sm_2=0)
byte sm_2=0;//смещение последовательности приращений углов ВПРАВО(sm_1=DL/4,sm_2=DL/2);ВЛЕВО(sm_1=3*DL/4,sm_2=DL/2)
////////////////////////////
Servo servo_a;
Servo servo_b;
Servo servo_c;
void setup()
{
servo_a.attach(5);//вывод управления сервоприводом ПРАВАЯ ПАРА
servo_a.write(a);// установка начального значения
servo_b.attach(6);//вывод управления сервоприводом ЛЕВАЯ ПАРА
servo_b.write(b);// установка начального значения
servo_c.attach(7);//вывод управления сервоприводом ЦЕНТРАЛЬНАЯ ПАРА
servo_c.write(c);// установка начального значения
}
/////////////////////////////////////////////////////////////////////////////////////////
void loop()
{
dvig();
}
/////////////////////////////////////////////////////////////////////////////////////////
void dvig(){
for(i=0;i<DL;i++)
{
if(i+sm_2>=DL){servo_a.write(a+tabl[i+sm_2-DL]);}else{servo_a.write(a+tabl[i+sm_2]);}
servo_b.write(b+tabl[i]);
if(i+sm_1>=DL){servo_c.write(c+tabl[i+sm_1-DL]);}else{servo_c.write(c+tabl[i+sm_1]);}
delay_(2*n);
}
}
///////////////////////////////////////////////////////////////////////////////////////
//// ФУНКЦИИ ОПИСАНИЕ // вместо задержки времени через delay ////////////////////////////////////////
void delay_(int T1)
{
Y=millis();
while(millis()-Y<T1)
{
///////////
}
}
////////////////////////////////////////////////////////////////////