roboforum.ru

Технический форум по робототехнике.

Простая аниматроника на Ардуино

Re: Простая аниматроника на Ардуино

ilalexey » 29 апр 2020, 22:09

dimamichev, ты живёшь где? У меня есть не законченный проект. Желание увидеть его работающим теплется. Может я эти ништяки в тебя почтой отправлю(за ништяки безвозмездно, за пересылку возмездно)? Интересно? Пластик из фильтра монитора. Дихлоретаном клеется.

Re: Простая аниматроника на Ардуино

dimamichev » 30 апр 2020, 08:45

Живу в 50 км от Смоленска.Спасибо, но пока на 18 серв я не созрел, чтоб управлять простецки с UNO или нано. Да и такой парадокс - если уже знаешь как написать управляющий скетч для поделки, ковыряться не очень хочется. Эх, доделать бы гекса на 12 серв, а то ноги ему скрутил и запал пропал.

Re: Простая аниматроника на Ардуино

dimamichev » 07 май 2020, 11:41

Ну вот, скопировал идею шасси на гексапода. Пока нет возможности напечатать буду лобзиком детальки из пористого пластика резать :)
Вложения
sborka4.png
w3_kop.jpg

Re: Простая аниматроника на Ардуино

dimamichev » 07 май 2020, 16:24


Re: Простая аниматроника на Ардуино

Scorpio » 07 май 2020, 23:13

Ходит, как подбитый партизан)))
Замахнись лучше на что-нибудь наподобие этого.

Re: Простая аниматроника на Ардуино

dimamichev » 08 май 2020, 09:13

Надо тогда такие sg90 сделать )))- спаренный и один обязательно с двойным выходом вала.
Вложения
w.png

Re: Простая аниматроника на Ардуино

dimamichev » 23 май 2020, 20:36

Пульты для управления игрушек быстро наскучивают кнопка-прямо, кнопка-влево... Так легко гонять шасси от точки к точке. Другое дело если робот обвешан датчиками и по входящим значениям принимает поведенческое решение... Читал сегодня про нейросети для совсем непонятливых. Окружающая среда формирует ряд воздействий, каждый со своим весом сообразно ранее приобретённому опыту и на основании их сеть принимает решение...
Я вот подумал, а что если наоборот-сделать пульт чтоб гексапод гонял пользователя? :) Есть, например, 3 фактора - корм, угроза, отдых. И 3 реакции "принятие"- прямо (зелёный), "отрицание"- назад (красный), "безразличие"- разворот(жёлтый). Цель пользователя подчинить гекса с помощью факторов (как можно быстрее добраться от одной точки к другой), но вот незадача перекармливание порождает отрицание, угроза - встречную агрессию, чрезмерный отдых-безразличие.Т.е. кнопки меняют своё назначение сообразно поведению пользователя при решении им поставленной задачи - гекс обучает человека через свою программную сеть...
Осталось только реализовать всё это в скетче. А здесь пока не так всё просто.
Вложения
Безымянный.png

Re: Простая аниматроника на Ардуино

dimamichev » 24 май 2020, 08:53

Такая сеть в простом исполнении намечается.
Вложения
схема сети 1.jpg

Re: Простая аниматроника на Ардуино

dimamichev » 25 май 2020, 13:40

Кнопочная станция...
Вложения
СКРИН.jpg

Re: Простая аниматроника на Ардуино

dimamichev » 26 май 2020, 09:55

Заложенные имитационные характеристики структурной сети изделия:
1 Изменение варианта реакции в зависимости от интенсивности фактора воздействия
2 Восстановление исходного варианта реакции при отсутствии фактора воздействия с течением времени
3 Зависимость силы реакции от группы факторов воздействия
4 Реакционная сопротивляемость очевидному сценарию управления при выполнении задания
5 Наличие регулировок (весовые коэффициенты), способных незначительно изменять поведение сети при обучении пользователя
6 Возможность обучающегося описать словами успешную стратегию управления после обучения
7 Возможность объективно оценить успешность обучения

Re: Простая аниматроника на Ардуино

dimamichev » 27 май 2020, 18:11

Код: Выделить всёРазвернуть
//ПАУК (ГЕКСАПОД) 3 СЕРВОПРИВОДА ТЕСТ ОБУЧЕНИЕ ПОЛЬЗОВАТЕЛЯ
//
#include <Servo.h>
byte dd=10;//амплитуда ходьбы
byte n=5;// постоянная временного интервала
byte i=0;//счётчик
byte j=0;//счётчик
byte a=90;//угол "серединный"
byte b=90;//угол "серединный"
byte c=95;//угол "серединный"
long Y=0;//переменная хранения моментов времени
String inputString;// строки данных

/////////////////////////////
long Y1=0;//переменная хранения моментов времени
long Y2=0;//переменная хранения моментов времени
long Y3=0;//переменная хранения моментов времени
int POR_1=10;//значение порога переключения 1 группы
int POR_2=10;//значение порога переключения 2 группы
int POR_3=10;//значение порога переключения 3 группы
////////////////////////////
byte ves_1=3;//значение веса "зелёный" (значения от 1 до 3 включительно)
byte ves_2=2;//значение веса  "жёлтый"
byte ves_3=1;//значение веса  "красный"
////////////////////////////
byte fl_1=1;//флаг состояний 1 группы
byte fl_2=1;//флаг состояний 2 группы
byte fl_3=1;//флаг состояний 3 группы
byte srab_1=0;//переменные счёта числа срабатываний группы кнопок 1
byte srab_2=0;//переменные счёта числа срабатываний группы кнопок 2
byte srab_3=0;//переменные счёта числа срабатываний группы кнопок 3
////////////////////////////
Servo servo_a;
Servo servo_b;
Servo servo_c;

void setup()
{

  Serial.begin(9600);
  servo_a.attach(5);//вывод управления сервоприводом ПРАВАЯ ПАРА
  servo_a.write(a+dd);// установка начального значения
 
  servo_b.attach(6);//вывод управления сервоприводом ЛЕВАЯ ПАРА
  servo_b.write(b+dd);// установка начального значения
 
  servo_c.attach(7);//вывод управления сервоприводом ЦЕНТРАЛЬНАЯ ПАРА
  servo_c.write(c-dd);// установка начального значения
}
/////////////////////////////////////////////////////////////////////////////////////////
void loop()
{
  CheckSerial();//ЖДЁМ ПОСТУПЛЕНИЯ КОМАНДЫ
  //fl_1=1;fl_2=1;fl_3=1;//режим обычного пульта
}
/////////////////////////////////////////////////////////////////////////////////////////
void vpered(byte k){
   for(j=0;j<k;j++){
  ///////////// ВПЕРЁД  /////////////
  servo_c.write(c-dd);// установка начального значения
  servo_a.write(a+dd);// установка начального значения
  servo_b.write(b+dd);// установка начального значения
 
  /////////// такт 1 ///////////
  for(i=0;i<2*dd;i++)
  {
  servo_a.write(servo_a.read()-1);
  servo_b.write(servo_b.read()-1);
  delay_(n);
  }
  /////////// такт 2 ///////////
  for(i=0;i<2*dd;i++)
  {
  servo_c.write(servo_c.read()+1);
  delay_(n);
  }
/////////// такт 3 ///////////
  for(i=0;i<2*dd;i++)
  {
  servo_a.write(servo_a.read()+1);
  servo_b.write(servo_b.read()+1);
  delay_(n);
  }
   /////////// такт 4 ///////////
  for(i=0;i<2*dd;i++)
  {
  servo_c.write(servo_c.read()-1);
  delay_(n);
  }
}

}
///////////////////////////////////////////////////////////////////////////////////////
void nazad(byte k){
   for(j=0;j<k;j++){
  ///////////// НАЗАД  /////////////
  servo_c.write(c+dd);// установка начального значения
  servo_a.write(a+dd);// установка начального значения
  servo_b.write(b+dd);// установка начального значения
 
  /////////// такт 1 ///////////
  for(i=0;i<2*dd;i++)
  {
  servo_a.write(servo_a.read()-1);
  servo_b.write(servo_b.read()-1);
  delay_(n);
  }
  /////////// такт 2 ///////////
  for(i=0;i<2*dd;i++)
  {
  servo_c.write(servo_c.read()-1);
  delay_(n);
  }
/////////// такт 3 ///////////
  for(i=0;i<2*dd;i++)
  {
  servo_a.write(servo_a.read()+1);
  servo_b.write(servo_b.read()+1);
  delay_(n);
  }
  /////////// такт 4 ///////////
  for(i=0;i<2*dd;i++)
  {
  servo_c.write(servo_c.read()+1);
  delay_(n);
  } 
}

}
/////////////////////////////////////////////////////////////////////////////////////////
void levo(byte k){
   for(j=0;j<k;j++){
  ///////////// ВЛЕВО /////////////
  servo_c.write(c-dd);// установка начального значения
  servo_a.write(a+dd);// установка начального значения
  servo_b.write(b-dd);// установка начального значения
 
  /////////// такт 1 ///////////
  for(i=0;i<2*dd;i++)
  {
  servo_a.write(servo_a.read()-1);
  servo_b.write(servo_b.read()+1);
  delay_(n);
  }
  /////////// такт 2 ///////////
  for(i=0;i<2*dd;i++)
  {
  servo_c.write(servo_c.read()+1);
  delay_(n);
  }
/////////// такт 3 ///////////
  for(i=0;i<2*dd;i++)
  {
  servo_a.write(servo_a.read()+1);
  servo_b.write(servo_b.read()-1);
  delay_(n);
  }
   /////////// такт 4 ///////////
  for(i=0;i<2*dd;i++)
  {
  servo_c.write(servo_c.read()-1);
  delay_(n);
  }
}

}
///////////////////////////////////////////////////////////////////////////////////////////
void pravo(byte k){
   for(j=0;j<k;j++){
  ///////////// ВПРАВО /////////////
  servo_c.write(c-dd);// установка начального значения
  servo_a.write(a-dd);// установка начального значения
  servo_b.write(b+dd);// установка начального значения
 
  /////////// такт 1 ///////////
  for(i=0;i<2*dd;i++)
  {
  servo_a.write(servo_a.read()+1);
  servo_b.write(servo_b.read()-1);
  delay_(n);
  }
  /////////// такт 2 ///////////
  for(i=0;i<2*dd;i++)
  {
  servo_c.write(servo_c.read()+1);
  delay_(n);
  }
/////////// такт 3 ///////////
  for(i=0;i<2*dd;i++)
  {
  servo_a.write(servo_a.read()-1);
  servo_b.write(servo_b.read()+1);
  delay_(n);
  }
   /////////// такт 4 ///////////
  for(i=0;i<2*dd;i++)
  {
  servo_c.write(servo_c.read()-1);
  delay_(n);
  }
}

}
///////////////////////////////////////////////////////////////////////////////////////////
////  ФУНКЦИИ ОПИСАНИЕ // вместо задержки времени через delay  ////////////////////////////////////////
void delay_(int T1)
{
Y=millis();
while(millis()-Y<T1)
  {
    // CheckSerial();//ЖДЁМ ПОСТУПЛЕНИЯ КОМАНДЫ
  }
}
////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////
//ФУНКЦИИ ПРИЁМА И ОБРАБОТКИ ДАННЫХ
void CheckSerial()
{
  //////////////////////////////////////////////////////////////////////////////
  while (Serial.available())//считываем строку данных пока они поступают
  {
    char inChar = (char)Serial.read();
    if (inChar == '\n')     //если окончание строки
    {
     
      MakeCmd();//обрабатываем её данной функцией
      break;
    }
    else inputString += inChar;// иначе удлиняем строку на один символ
  }
}
/////////////////////////////////////////////////////////////////////////////////

///////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////
void MakeCmd()
{
  int y = inputString.length(); // присваиваем переменной у число символов в строке
  if (y < 1 || y > 1)return; //если их меньше 1 или больше, выходим из функции
  String cmd = inputString; // передаём строку другой переменной
  inputString = "";//"обнуляем переменную"
/////////// БЛОК ПРОГРАММНОЙ ОБРАБОТКИ (ВНУТРЕННИЙ СЛОЙ НЕЙРОСЕТИ) ////////////
if(millis()-Y1>ves_3*5000){fl_1=1;srab_1=0;}
if(millis()-Y2>ves_2*4000){fl_2=1;srab_2=0;}
if(millis()-Y3>ves_1*4000){fl_3=1;srab_3=0;}
//////////
  if (cmd == "1") {
Y1=millis(); 
if(fl_1==1){srab_1=srab_1+ves_1;if(srab_1>POR_1){srab_1=0;fl_1=2;}vpered(ves_3);}else{
if(fl_1==2){srab_1=srab_1+ves_3;if(srab_1>POR_1){srab_1=0;fl_1=3;}nazad(ves_3);}else{
if(fl_1==3){srab_1=srab_1+ves_2;if(srab_1>POR_1){srab_1=0;fl_1=1;}levo(ves_3);}
  }}}
  if (cmd == "2") {
   Y1=millis(); 
if(fl_1==1){srab_1=srab_1+ves_2;if(srab_1>POR_1){srab_1=0;fl_1=2;}levo(ves_3);}else{
if(fl_1==2){srab_1=srab_1+ves_1;if(srab_1>POR_1){srab_1=0;fl_1=3;}vpered(ves_3);}else{
if(fl_1==3){srab_1=srab_1+ves_3;if(srab_1>POR_1){srab_1=0;fl_1=1;}nazad(ves_3);}
  }}}
  if (cmd == "3") {
   Y1=millis(); 
if(fl_1==1){srab_1=srab_1+ves_3;if(srab_1>POR_1){srab_1=0;fl_1=2;}nazad(ves_3);}else{
if(fl_1==2){srab_1=srab_1+ves_2;if(srab_1>POR_1){srab_1=0;fl_1=3;}levo(ves_3);}else{
if(fl_1==3){srab_1=srab_1+ves_1;if(srab_1>POR_1){srab_1=0;fl_1=1;}vpered(ves_3);}
  }}}
 
  /////////////
  if (cmd == "4") {
   Y2=millis(); 
if(fl_2==1){srab_2=srab_2+ves_1;if(srab_2>POR_2){srab_2=0;fl_2=2;}vpered(ves_2);}else{
if(fl_2==2){srab_2=srab_2+ves_3;if(srab_2>POR_2){srab_2=0;fl_2=3;}nazad(ves_2);}else{
if(fl_2==3){srab_2=srab_2+ves_2;if(srab_2>POR_2){srab_2=0;fl_2=1;}levo(ves_2);}
  }}}
  if (cmd == "5") {
   Y2=millis(); 
if(fl_2==1){srab_2=srab_2+ves_2;if(srab_2>POR_2){srab_2=0;fl_2=2;}levo(ves_2);}else{
if(fl_2==2){srab_2=srab_2+ves_1;if(srab_2>POR_2){srab_2=0;fl_2=3;}vpered(ves_2);}else{
if(fl_2==3){srab_2=srab_2+ves_3;if(srab_2>POR_2){srab_2=0;fl_2=1;}nazad(ves_2);}
  }}}
 
  if (cmd == "6") {
Y2=millis(); 
if(fl_2==1){srab_2=srab_2+ves_3;if(srab_2>POR_2){srab_2=0;fl_2=2;}nazad(ves_2);}else{
if(fl_2==2){srab_2=srab_2+ves_2;if(srab_2>POR_2){srab_2=0;fl_2=3;}levo(ves_2);}else{
if(fl_2==3){srab_2=srab_2+ves_1;if(srab_2>POR_2){srab_2=0;fl_2=1;}vpered(ves_2);}
  }}}
 
 
  //////////////
  if (cmd == "7") {
  Y3=millis(); 
if(fl_3==1){srab_3=srab_3+ves_1;if(srab_3>POR_3){srab_3=0;fl_3=2;}vpered(ves_1);}else{
if(fl_3==2){srab_3=srab_3+ves_3;if(srab_3>POR_3){srab_3=0;fl_3=3;}nazad(ves_1);}else{
if(fl_3==3){srab_3=srab_3+ves_2;if(srab_3>POR_3){srab_3=0;fl_3=1;}levo(ves_1);}
  }}}
 
  if (cmd == "8") {
  Y3=millis(); 
if(fl_3==1){srab_3=srab_3+ves_2;if(srab_3>POR_3){srab_3=0;fl_3=2;}levo(ves_1);}else{
if(fl_3==2){srab_3=srab_3+ves_1;if(srab_3>POR_3){srab_3=0;fl_3=3;}vpered(ves_1);}else{
if(fl_3==3){srab_3=srab_3+ves_3;if(srab_3>POR_3){srab_3=0;fl_3=1;}nazad(ves_1);}
  }}}
 
  if (cmd == "9") {
Y3=millis(); 
if(fl_3==1){srab_3=srab_3+ves_3;if(srab_3>POR_3){srab_3=0;fl_3=2;}nazad(ves_1);}else{
if(fl_3==2){srab_3=srab_3+ves_2;if(srab_3>POR_3){srab_3=0;fl_3=3;}levo(ves_1);}else{
if(fl_3==3){srab_3=srab_3+ves_1;if(srab_3>POR_3){srab_3=0;fl_3=1;}vpered(ves_1);}
  }}}   
 
/////////////

}

///////////////////////////////////////////////////////////////////////////////////////////////////////

:)
Потренировался минуту, выделил три стратегии успешного прохождения полигона
1 Постоянно чередовать ступени воздействия из разных групп факторов, используя преимущественно движение вперёд
2. Пользоваться одной группой факторов, уяснив на практике закономерности смены реакции на количество воздействий
3. Выбрать неочевидный способ движения игрушки, например, пятиться назад в нужном направлении
Вложения
vid.png

Re: Простая аниматроника на Ардуино

dimamichev » 06 июн 2020, 22:05

Конструктор затягивает... От букв назад, к наскальным "иконкам". Пульт-приложение получилось.
Вложения
структура.jpg
БЛЮЧИКЕН.jpg

Re: Простая аниматроника на Ардуино

dimamichev » 07 июн 2020, 19:50

Испытал простенький редактор анимации Блючикена. Добавил счётчик кадров, выбор порта для связи с игрушкой. Сохранение 8 кадров дало 3 секунды анимации.
Вложения
БЛЮЧИКЕН.jpg

Re: Простая аниматроника на Ардуино

Scorpio » 08 июн 2020, 01:06

Пора налаживать производство птичек на продажу :wink:

Re: Простая аниматроника на Ардуино

dimamichev » 10 июн 2020, 15:18

:)
Чтобы такой колхоз повторить в печатных детальках - сильно постараться надо, одни шестерни в 5 экземплярах чего стоят и сферы глаз на паре из них.
Вложения
РИС.6.jpg


Rambler\'s Top100 Mail.ru counter