roboforum.ru

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


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

Как собрать и запрограммировать робота на Arduino(Freeduino, Roboduino, Seeduino ...). Используем Wiring и Processing.

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

Сообщение Scorpio » 31 мар 2020, 21:09

dimamichev писал(а):А дальше всё?

Ты уже перерос такие игрушки. Надо замахиваться на большой проект!
Аватара пользователя
Scorpio
 
Сообщения: 2681
Зарегистрирован: 30 сен 2008, 18:49
Откуда: Где-то в Латинской Америке

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

Сообщение dimamichev » 01 апр 2020, 13:55

Гексапод на 18 сервоприводах?:)
Аватара пользователя
dimamichev
 
Сообщения: 1386
Зарегистрирован: 03 янв 2013, 16:27

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

Сообщение Scorpio » 01 апр 2020, 17:15

+ ИИ на борту!
Аватара пользователя
Scorpio
 
Сообщения: 2681
Зарегистрирован: 30 сен 2008, 18:49
Откуда: Где-то в Латинской Америке

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

Сообщение dimamichev » 01 апр 2020, 17:38

Как принципиально отделить ИИ гексапода от реакции написанной заранее программы на совокупность показаний датчиков? Если бы датчики могли редактировать скетч и перезаписывать в МК, а не переводить исполнение от одного предписанного фрагмента кода к другому.
Аватара пользователя
dimamichev
 
Сообщения: 1386
Зарегистрирован: 03 янв 2013, 16:27

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

Сообщение Scorpio » 01 апр 2020, 23:02

Почему нет? Писать новый код, затем его компилировать и заливать в дуню датчикам конечно сложновато. Но, сохранять сценарий действий, а потом выполнять его интерпретатором команд - вполне под силу. ИИ не обязательно д.б. суперумный. Достаточно простой сообразительности. Например, когда я изобразил эту позу, хозяин меня похвалил. Значит запомним ее, как "поза, которая нравится хозяину".
Аватара пользователя
Scorpio
 
Сообщения: 2681
Зарегистрирован: 30 сен 2008, 18:49
Откуда: Где-то в Латинской Америке

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

Сообщение dimamichev » 02 апр 2020, 11:01

Обоснованный выбор варианта из двух на основе опыта - это ИИ?..
Если да, то такой вариант скетча можно сваять попробовать:два сценария отхода-обхода от препятствий, робот пробует оба за одинаковый промежуток времени, фиксирует суммарное время сработки датчика препятствия и сравнив результаты - выбирает из двух оптимальный для данного полигона...
Только получается это 3 уровень, выбор сценария из имеющихся.
Аватара пользователя
dimamichev
 
Сообщения: 1386
Зарегистрирован: 03 янв 2013, 16:27

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

Сообщение Scorpio » 02 апр 2020, 18:01

dimamichev писал(а):Только получается это 3 уровень, выбор сценария из имеющихся.

Не, выбор - это скучно. Твое создание должно генерировать новые действия и умения, которые, ты в него не закладывал. В примере с пауком, он будет генерировать позы (случайное сочетание положений серв с некоторыми ограничениями), когда на него кто-нибудь смотрит (датчик движения). Какая то поза тебе понравится и ты похвалишь паука (сообщишь ему об этом голосом через смартфон). Следующую позу, паук будет строить, уже на основе понравившейся, чтобы довести до совершенства. В результате - процесс самообучения, который вполне можно отнести к интеллектуальным функциям.
Обратимся к всезнающей википедии:
Области робототехники и искусственного интеллекта тесно связаны друг с другом. Интегрирование этих двух наук, создание интеллектуальных роботов составляют ещё одно направление ИИ. Интеллектуальность требуется роботам, чтобы манипулировать объектами, выполнять навигацию с проблемами локализации (определять местонахождение, изучать ближайшие области) и планировать движение (как добраться до цели). Примером интеллектуальной робототехники могут служить игрушки-роботы Pleo, AIBO, QRIO.
Аватара пользователя
Scorpio
 
Сообщения: 2681
Зарегистрирован: 30 сен 2008, 18:49
Откуда: Где-то в Латинской Америке

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

Сообщение dimamichev » 02 апр 2020, 20:16

Scorpio писал(а):Не, выбор - это скучно. Твое создание должно генерировать новые действия и умения, которые, ты в него не закладывал. В примере с пауком, он будет генерировать позы (случайное сочетание положений серв с некоторыми ограничениями)

Заманчиво конечно стереть в мк все функции хождения и выставив "кулак перед носом" (датчик препятствия)им помахивать (хозяин доволен или нет) ждать пока он сгенерит прямохождение сам...какие тут подсказки можно закладывать в скетч и как не доподсказываться до имитации самостоятельности?

Добавлено спустя 31 минуту 46 секунд:

Вот 2 уровень-одиночный сценарий поведения.
Код: Выделить всёРазвернуть
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
// 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=95;//угол "серединный"

boolean fl_A=false;//флаг состояний
long Y=0;//переменная хранения моментов времени

////////////////////////////
Servo servo_a;
Servo servo_b;
Servo servo_c;

void setup()
{
  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);// установка начального значения
 
  pinMode (8,INPUT );//подключение датчика препятствий
}
/////////////////////////////////////////////////////////////////////////////////////////
void loop()
{
  //////////// СЦЕНАРИЙ ПОВЕДЕНИЯ ГЕКСАПОДА //////////////////////
  if(fl_A==true){vpered(2);vilanie_2(10);nazad(7);if(random(0,2)==1){levo(5);}else{pravo(5);}}//если на пути преграда пытаемся сдвинуть-пройти,отходим,разворачиваемся
  if(fl_A==false){vpered(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 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);
  }
}
}
///////////////////////////////////////////////////////////////////////////////////////////
void na_meste(byte k){
   for(j=0;j<k;j++){
  ///////////// ТОПТАНИЕ НА МЕСТЕ /////////////
  servo_c.write(c-dd);// установка начального значения
 
  /////////// такт 1 ///////////
  for(i=0;i<2*dd;i++)
  {
  servo_c.write(servo_c.read()+1);
  delay_(2*n);
  }

   /////////// такт 2 ///////////
  for(i=0;i<2*dd;i++)
  {
  servo_c.write(servo_c.read()-1);
  delay_(2*n);
  }
}
}
///////////////////////////////////////////////////////////////////////////////////////////


void vilanie_2(byte k){
   for(j=0;j<k;j++){
  ///////////// ВИЛЯНИЕ ТУШКОЙ 2  /////////////
  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);
  delay(n);
  }
 
/////////// такт 2 ///////////
  for(i=0;i<2*dd;i++)
  {
  servo_a.write(servo_a.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);
  } 
}
}
/////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////
////  ФУНКЦИИ ОПИСАНИЕ // вместо задержки времени через delay  ////////////////////////////////////////
void delay_(int T1)
{
Y=millis();
while(millis()-Y<T1)
  {
   if(digitalRead(8)==LOW){fl_A=true;}else{fl_A=false;}
   }
}
///////////////////////////////////////////////////////////////////////////////////////////////////////
Аватара пользователя
dimamichev
 
Сообщения: 1386
Зарегистрирован: 03 янв 2013, 16:27

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

Сообщение Scorpio » 02 апр 2020, 20:54

Самостоятельно научиться ходить, для робота весьма трудная, хотя и выполнимая задача. Одним кулаком тут не обойдешься. Нужен хотябы акселерометр и гироскоп. Тебе их всяко надо осваивать.
Аватара пользователя
Scorpio
 
Сообщения: 2681
Зарегистрирован: 30 сен 2008, 18:49
Откуда: Где-то в Латинской Америке

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

Сообщение dimamichev » 04 апр 2020, 09:47

Подумывая о самостоятельности робота при хаотичном шевелении качалками вдруг :) осознал: все качалки в любом ходуне просто качаются около центрального положения (чаще 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)
  {
   ///////////
   }
}
////////////////////////////////////////////////////////////////////
Вложения
графики.jpg
Аватара пользователя
dimamichev
 
Сообщения: 1386
Зарегистрирован: 03 янв 2013, 16:27

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

Сообщение dimamichev » 04 апр 2020, 15:24

Из-за эпидемии больше ничего по форме в голову не идёт :( с гексаподом.
Вложения
osnova.png
Аватара пользователя
dimamichev
 
Сообщения: 1386
Зарегистрирован: 03 янв 2013, 16:27

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

Сообщение Scorpio » 04 апр 2020, 19:31

Подвесы сделай с 2мя перемычками. Обидно будет, если отвалится нога.
А еще лучше - возьми готовую модель и переделай под себя.
Аватара пользователя
Scorpio
 
Сообщения: 2681
Зарегистрирован: 30 сен 2008, 18:49
Откуда: Где-то в Латинской Америке

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

Сообщение dimamichev » 04 апр 2020, 20:53

Подправил, остальные детальки от квадропода возьму.
Вложения
osnova 2.png
Аватара пользователя
dimamichev
 
Сообщения: 1386
Зарегистрирован: 03 янв 2013, 16:27

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

Сообщение dimamichev » 05 апр 2020, 10:17

Такой вариант сборки, можно попробовать и квадро и гекса и трёхнога с опорой на брюхо:)
Вложения
sborka1.png
sborka2.png
sborka3.png
Аватара пользователя
dimamichev
 
Сообщения: 1386
Зарегистрирован: 03 янв 2013, 16:27

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

Сообщение Scorpio » 06 апр 2020, 01:52

С 12ю сервами красиво ходить не будет. 18 надо, однако.
Аватара пользователя
Scorpio
 
Сообщения: 2681
Зарегистрирован: 30 сен 2008, 18:49
Откуда: Где-то в Латинской Америке

Пред.След.

Вернуться в Arduino и другие Xduino

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2