Дошло до меня, серва с 4 проводом это не исполнительный механизм, это устройство ввода-вывода информации... Заморочился "умным переключателем"- выставляем желаемую последовательность программ, а он сам эту последовательность перещёлкивает. Для опыта взял светодиод на 13 выводе (каждой программе - своя частота миганий).
Написал скетч для двух серв в режиме "ручное программирование". Движения в ролике повторяют хождение робозавра (картинку прилагаю). В принципе теперь можно аниматроника руками шевелить для оживления.
#include <Servo.h> #define kolvoKAD 20//количество кадров-тактов #define kolvoSV 2//количество сервоприводов (1-6 штук) //сервоприводы подключаются Arduino UNO: сигнальный провод - со 2 вывода до 7, обратной связи с 14 по 19 (А0-А5) Servo servo[kolvoSV];
byte ugolServ [kolvoKAD][kolvoSV];//массив-таблица хранения значений углов серв по кадрам int tabl_da[kolvoSV];//массив переменных приращения углов серв int tabl_ga[kolvoSV];//массив переменных длительностей между переключениями серв long tabl_Ya[kolvoSV];//массив переменных хранения моментов времени int tabl_poprFor[kolvoSV];//массив хранения поправок к формуле для каждой сервы
int n=500;//длительность общая шага-цикла в мс int i=0;//счётчик элементов массивов int j=0;//счётчик элементов массивов
void setup() { Serial.begin(9600); pinMode(13,OUTPUT);//вывод канала индикации digitalWrite(13, LOW); pinMode(10,INPUT);//вывод кнопки записи-воспроизведения движений серв for(i=0;i<kolvoSV;i++){servo[i].attach(i+2);servo[i].write(90);delay(500); servo[i].detach();}//начальные установки углов 90 градусов (подкл. на выводы начиная со 2 по возр.)
///////////////// вносим данные поправок для каждой сервы /////////////// tabl_poprFor[0]=0; tabl_poprFor[1]=-4; ///////////////////////////////////////////////////////////////////////// } void loop() { if(digitalRead(10)==LOW) {delay(300);//временная пауза для преодоления дребезга контактов кнопки
if(digitalRead(10)==HIGH){//если происходит краткое нажатие кнопки zapis();}//функция на запись выставленных положений качалок для одного кадра
if(digitalRead(10)==LOW){//если происходит долгое нажатие кнопки ispol_();}//функция на исполнение записанных в массив кадров } } void ispol_() { digitalWrite(13, HIGH);//включаем светодиод постоянно - пошло исполнение записанного for(i=0;i<kolvoSV;i++){servo[i].attach(i+2);servo[i].write((analogRead(14+i) - 75+tabl_poprFor[i]) / 3);}
while(true)//запускается бесконечный цикл ходьбы { for (j=0;j<kolvoKAD;j++)//проверяем все углы по кадрам-тактам
{ if( fl_C==false) {Serial.println(" ");}//печатаем "пустую строку" между каждым кадром-тактом
for(i=0;i<kolvoSV;i++){if(ugolServ [j][i]!=0){fl_A=true;break;}} if(fl_A==true)//если хоть один элемент кадра-такта не 0
{ fl_A=false;//взведение флага /////////////////// for(i=0;i<kolvoSV;i++) { if( fl_C==false){Serial.print("КАДР ");Serial.print(j);Serial.print(" СЕРВОПРИВОД "); Serial.print(i);Serial.print(" УГОЛ ");Serial.println(ugolServ [j][i]);}//печать в монитор выставленных углов по приводам и кадрам при первом проходе массива
if(ugolServ [j][i]-servo[i].read()>0){tabl_da[i]=1;}//определяем есть ли приращение и его знак if(ugolServ [j][i]-servo[i].read()<0){tabl_da[i]=-1;} if(ugolServ [j][i]-servo[i].read()==0){tabl_da[i]=0;} if(tabl_da[i]!=0){tabl_ga[i]=n/abs(ugolServ [j][i]-servo[i].read());}//определяем временную паузу между приращениями шага if(tabl_da[i]==0){tabl_ga[i]=0;} } ///////////////// do { fl_B=true; for (i=0; i<kolvoSV ; i++) { if (ugolServ [j][i]!=servo[i].read()) { fl_B=false; break; } } for(i=0;i<kolvoSV;i++) { if(millis()- tabl_Ya[i]>tabl_ga[i]&&ugolServ [j][i]!=servo[i].read()){tabl_Ya[i]=millis(); servo[i].write(servo[i].read()+tabl_da[i]);}
} }while(!fl_B); // пока все сервы не придут к табличному углу поворота... } } fl_C=true;//сигнал на прерывание повторной печати в монитор порта } } /////////////////////////////////////////////////////////////
Обобщил скетч механического программирования движений качалок сервопривода для 1-6 серв. Максимальное количество ограничивается числом аналоговых входов, это легко изменить с помощью мультиплексоров. А вот как оставить свободные пины после использования 12 серв это вопрос.
Задумался попробовать сделать квадропода с механическим программированием (чисто для знания). Моя конструкция с "лобзиковой печатью на секундном клее" явно не выдержит такого. Насмотрел ходовой вариант для печати. Подскажите сколько такой вариант может стоить и где проще заказать?
Сама по себе вещь любая бесполезна, вопрос в пользователе:) Принтер дорогая вещь и сложная. Сначала надо понять как модельки делать, потом как пользоваться принтером, потом научиться отличать средь них хрен от редьки, потом устройство, потом думать о готовых наборах для сборки. А желалки возникли от зависти читатель решил повторить квадропода, обратился с просьбой переделать приложение и скетч под свой вариант. А вариант реализован на принтере, плату в Китае заказал, короче красивый вариант, не то что у меня. Так что теперь только механическое программирование и голосовое управление квадроподом меня утешит. А десятки тысяч под устройство пока бесполезное в моих руках это рановато.
Распечатали детальки, заказал сервы, саморезы для крепления, нано... пока 2 месяца ждать задумался о создании моделек деталей для своих конструкций. С чего начинать? Какие особенности при разработке элементов корпуса, чтоб проще и дешевле?
На робозавре своём хочу потренироваться, сначала придумать адекватные для принтера детальки-схему шасси, а уже потом пробовать рисовать в программах. "Опенскад" тяжеловат для далёкого от объёмного моделирования человека? А "Тинкеркад" это слишком примитивно?, размерные элементы с отверстиями и внутренними полостями не нарисовать.
Нарисовал первую детальку - основание для крепления серв (без отверстий). Попробовал сохранить изображение в растре - ошибок нет и сохранённого файла в папке (указанной) тоже нет. В формате для печати файл тоже не с первого раза сохранился в указанной папке.