Вопросы новичка.

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

Re: Вопросы новичка.

Сообщение dimamichev » 18 июл 2018, 21:19

Код: Выделить всё
////////////////////////////////////////////////////////////////////////
//Рисует линию длины d в направлении a(в градусах)
//либо переставляет перо на конец вектора, при отрицательных d
void DrawVector(float d, float a)
{
  if (d > Dmax || a < 0 || a > 359)return; // не корректные параметры
  if (CurL == 1000 || CurQ == 1000)return; // не задана начальная точка
  if (d < 0) //задана перестановка пера
  {
    //up_down_pen(false);//поднимем перо
    d = abs(d);
    GoToFinLine(d, a);
  } else //задано рисование линии
  {
    up_down_pen(true);//опустим перо
    int n = d / Dstep; //разобьем линию на n отрезков.
    for (int i = 1; i <= n; i++)GoToFinLine(Dstep, a);//нарисуем отрезки по очереди
    d -= n * Dstep;
    if (d > 0)GoToFinLine(d, a); //последнюю точку нарисуем отдельно для точности.
  }
}
// функция перемещает перо в конец заданного вектора
void GoToFinLine(float d,float a)
{
  if(StopFlag)return;
  //определим координаты конца вектора
    float l=CurL+d*sin(GradToRad(90+a-CurQ));
    float g=CurQ-(180*asin(d*cos(GradToRad(90+a-CurQ))/CurL))/PI;
   //переместим перо
    SetServosToPoint(l,g);
    delay(n*d);// выдержка времени для отработки механизма, зависящая от длины пути.
}

Вывел иезуитскую формулу рисования отрезков в полярных координатах. Про дуги пока лес.

Добавлено спустя 1 минуту 33 секунды:
Электромагнит решил из РЭС9 болгаркой извлечь.
Вложения
20180718_201218.jpg
Аватара пользователя
dimamichev
 
Сообщения: 1386
Зарегистрирован: 03 янв 2013, 16:27

Re: Вопросы новичка.

Сообщение Scorpio » 18 июл 2018, 22:32

РЭС9 это на 9В? А сервы от скольки у тебя работают?
Аватара пользователя
Scorpio
 
Сообщения: 2681
Зарегистрирован: 30 сен 2008, 18:49
Откуда: Где-то в Латинской Америке

Re: Вопросы новичка.

Сообщение dimamichev » 18 июл 2018, 23:17

Нет, РЭС9 (просто номер типа), в зависимости от их паспорта бывают на много разных напряжений и токов срабатывания. Внутри у них две катушки (последовательно соединённых). Я распилил-отпилил катушку на 250 ом, питал от 5 В, шайбы от М3 схватывает надёжно при токе, получается около 20мА. Сервы от 5В тоже питаю.
Аватара пользователя
dimamichev
 
Сообщения: 1386
Зарегистрирован: 03 янв 2013, 16:27

Re: Вопросы новичка.

Сообщение Scorpio » 19 июл 2018, 04:19

Ну и славно. Пойду программку пошукаю в чулане... А ты эмулятор пробовал запускать?

Добавлено спустя 2 часа 59 минут 22 секунды:
Вот тебе пока протокол обмена, который надо будет организовать на стороне ардуино:
Protocol.zip
(11.22 КиБ) Скачиваний: 0

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

Re: Вопросы новичка.

Сообщение dimamichev » 19 июл 2018, 12:03

Эмулятор пробовал запускать. Получилось только на 3 компьютере.., у сына. :D Подробно в работу не вникал.
Протокол посмотрел, дремуч я. "На пальцах" - Ардуино через "сериал" получает комбинации символов, её (комбинацию) распознаёт, совершает действия в связи с её получением, после отправляет в ответ свою комбинацию?

Добавлено спустя 3 часа 55 минут 24 секунды:
Код: Выделить всё
/////////////////////////////////////////////////////////////////////////
//Функция выставляет servo1 servo2, на точку с декартовыми координатами Х,Y
//X,Y расстоямие в мм
void SetServosToPointXY(float X, float Y)
{
  float l; float q;
  if(X==0){l=Y;q=90;}
  if (X>0){q=(180/PI)*asin((Y/X)/sqrt(1+((Y*Y)/(X*X))));l=Y/sin(PI*q/180);}
  if (X<0){q=180-((180/PI)*asin((Y/abs(X))/sqrt(1+((Y*Y)/(X*X)))));l=Y/sin(PI*(180-q)/180);}
  SetServosToPoint(l,q);

}

Реализовал функцию перехода на декартовы координаты внутри полярных.
Аватара пользователя
dimamichev
 
Сообщения: 1386
Зарегистрирован: 03 янв 2013, 16:27

Re: Вопросы новичка.

Сообщение Scorpio » 19 июл 2018, 16:41

dimamichev писал(а):Получилось только на 3 компьютере

Вот. Тоже может получиться и с шашками. Программа хоть и написана лет 8 назад, я ее перезаточил под современную винду.
dimamichev писал(а):"На пальцах"

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

Re: Вопросы новичка.

Сообщение dimamichev » 19 июл 2018, 17:30

Такой захват соорудил...


Правильно я понимаю, что с таким надо разбираться?, для восприятия команд протокола. С их исполнением, думаю, справлюсь.А отправлять?, через Serial.println или ..?
Код: Выделить всё
void CheckSerial()
{

  while (Serial.available())
  {
    char inChar = (char)Serial.read();
  if (inChar == '\n')
  {
   MakeCmd();
   inputString="";
   break;
  }
  else inputString += inChar;
  }
}
Вложения
20180719_123240.jpg
Аватара пользователя
dimamichev
 
Сообщения: 1386
Зарегистрирован: 03 янв 2013, 16:27

Re: Вопросы новичка.

Сообщение Scorpio » 19 июл 2018, 17:41

Да. Все как ты уже делал раньше. Можешь для начала в мониторе ардуино отладить. Ямогу написать за тебя, но идея чтоб ты сам научился.
Качни NET Version Detector и запусти на компе, которым будешь управлять роботом. Я постараюсь скомпилировать под имеющуюся у тебя платформу, или включу автозагрузку NET. И напиши, что у тебя там за винда стоит.

Добавлено спустя 1 минуту 23 секунды:
Магнитик выглядит весьма эротично :)
Аватара пользователя
Scorpio
 
Сообщения: 2681
Зарегистрирован: 30 сен 2008, 18:49
Откуда: Где-то в Латинской Америке

Re: Вопросы новичка.

Сообщение dimamichev » 19 июл 2018, 17:52

Понял. Моя задача делать скетч по данным командам - работа манипулятора и ответы по исполнении...
Такой теперь манипулятор... А комп такой... :D
Вложения
Новый точечный рисунок1.jpg
20180719_143903.jpg
Аватара пользователя
dimamichev
 
Сообщения: 1386
Зарегистрирован: 03 янв 2013, 16:27

Re: Вопросы новичка.

Сообщение Scorpio » 19 июл 2018, 20:05

Клево получилось! И оперативно. Не забудь про места для дамок и корзину для сбитых шашек. Комп подходящий. Еще версию Net проверь.

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

Re: Вопросы новичка.

Сообщение dimamichev » 19 июл 2018, 21:06

Версия такая v4.0.30319
(сынка подсказала)
Доска жестко приклеена к картонке, та через магнит к стальной пластине, а та к основанию... вообщем "огород крепкий".
Аватара пользователя
dimamichev
 
Сообщения: 1386
Зарегистрирован: 03 янв 2013, 16:27

Re: Вопросы новичка.

Сообщение Scorpio » 19 июл 2018, 23:41

Скачай архив, распакуй, запусти CheckersRobot1.exe. Если не запустится, сделаю инсталятор.
Скомпилировать под твою NET не удалось пока. При запуске должна попроситься NET4.5.2 для скачивания и установки.
В архиве файл Comm.ino Чтобы ты не мучался с расшифровкой команд. Исполнительные функции напишешь свои.

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

Re: Вопросы новичка.

Сообщение dimamichev » 20 июл 2018, 11:59

Scorpio писал(а):Скачай архив, распакуй, запусти CheckersRobot1.exe. Если не запустится, сделаю инсталятор.
Скомпилировать под твою NET не удалось пока. При запуске должна попроситься NET4.5.2 для скачивания и установки.
В архиве файл Comm.ino Чтобы ты не мучался с расшифровкой команд. Исполнительные функции напишешь свои.

Добавлено спустя 3 минуты 26 секунд:
Смотри внимательно на кодировку полей на доске и полей для дамок. Тебе придется ее соблюдать. Игра сам с собой кажется у меня не реализована. Если понадобится прикрутим потом.
Успехов!

Спасибо.Скачал архив. Установил программу. NET не просился :(
Скетч смотрел, начну с адаптации кодировки полей к номерам элементов массивов координат (пришлось каждую клетку чёрную по координатам подбирать - из-за неточности сетки). Пока кумекаю как для последовательности 11,13,15,17,22,24,26... сопоставить 0,1,2,3,4,5,6... без дополнительного массива.

Шашка-берётся, опускается вроде нормально.
Код: Выделить всё
///////////// МАНИПУЛЯТОР ДЛЯ ИГРЫ В ШАШКИ ПРОХОД ПО КЛЕТКАМ С ОПУСКАНИЕМ-ПОДНИМАНИЕМ МАГНИТА И ЗАДАННОЙ ЕДИНИЧНОЙ ПЕРЕСТАНОВКОЙ ШАШКИ //////////////////////////////
#include <Servo.h>
////////////////////////////////////////////////////////////////
#define L1 65  //длина первого плеча манипулятора в мм.
#define L2 65  //длина второго плеча манипулятора в мм.
#define Xmax 120//значение граничных координат
#define Ymax 120//значение граничных координат
#define Acor1 352//поправка на посадку качалки сервы 1
#define Acor2 220//поправка на посадку качалки сервы 2
#define Ymin 50//значение граничных координат
#define Pin 8//вывод для подключения электромагнита
#define nx -25
#define ny 58 //начальные координаты первой игровой клетки (11)
////////////////////////////////////////////////////////////////
int CurX;int CurY;
byte a03=125;
byte a3=a03;
int n=20;//переменная единицы временного интервала

int tablX[32]={ nx,-12,1,14,
                -19,-5,8,21,
                -26,-12,1,14,
                -20,-5,9,22,
                -27,-12,3,18,
                -20,-5,11,25,
                -27,-12,3,18,
                -20,-5,11,26};
int tablY[32]={ny,58,58,58,
               66,64,66,68,
               74,73,73,73,
               82,80,83,83,
               92,92,92,92,
               100,98,100,100,
               107,107,107,107,
               115,115,115,116};// массивы координат клеток
///////////////////////////////////////////////////////////////
Servo servo1;
Servo servo2;
Servo servo3;


void setup() {
Serial.begin(9600);
servo1.attach(5);
servo2.attach(6);
servo3.attach(7);
//servo1.write(98);
//servo2.write(110);
servo3.write(125);
pinMode(Pin, OUTPUT);digitalWrite(Pin, LOW);
up_down_pen(false);//поднимем захват
SetServosToPoint(nx,ny);//установим захват в исходное положение

}

void loop()
  {
   
   for (int j=0;j<=31;j++)
  {
   SetServosToPoint(tablX[j],tablY[j]); up_down_pen(true);if(j==9){digitalWrite(Pin, HIGH);delay(5*n);}if(j==14){digitalWrite(Pin, LOW);delay(5*n); }up_down_pen(false);
   
  }
  digitalWrite(Pin, LOW);
  metka:goto metka;
  }
/////////////////////////////////////////////////////////////////////////
//Функция ПЛАВНО выставляет servo1 servo2, на точку с координатами X,Y
//X<0 для левого квадранта, X>0 для правого
/*void SetServosToPointPl(int X, int Y)
{
byte Step1=2;
while (abs(CurY-Y)>2*Step1)
{
  if(Y-CurY>0){SetServosToPoint(CurX,CurY);CurY=CurY+Step1;}
  if(Y-CurY<0){SetServosToPoint(CurX,CurY);CurY=CurY-Step1;}
  }
while (abs(CurX-X)>2*Step1)
{
  if(X-CurX>0){SetServosToPoint(CurX,CurY);CurX=CurX+Step1;}
  if(X-CurX<0){SetServosToPoint(CurX,CurY);CurX=CurX-Step1;}
  }
  SetServosToPoint(X,Y);
}*/
/////////////////////////////////////////////////////////////////////////
//Функция выставляет servo1 servo2, на точку с координатами X,Y
//X<0 для левого квадранта, X>0 для правого
void SetServosToPoint(int X, int Y)
{
  if(abs(X)>Xmax || Y>Ymax || Y<Ymin) return;
  X=-X;
  float L=sqrt(X*X+Y*Y);
  float a1=acos(X/L);
  float a2=acos((L*L+L1*L1-L2*L2)/(2*L*L1));
  float A=a1+a2;
  A=PI-A;// вариант, если серва1 повернута на 180°
  float b1=PI/2-a1;
  float B=acos((L2*L2 + L1*L1 - L*L) / (2*L2 * L1));

  servo1.writeMicroseconds(RadianToMcs(A)+Acor1);
  servo2.writeMicroseconds(RadianToMcs(B)+Acor2);
  delay(n);
  CurX=X;CurY=Y;   
}
////////////////////////////////////////////////////////////////////////
//Функция перевода радиан в микросекунды для управления сервоприводами
int RadianToMcs(float rad)
{
int grad=2000*rad/PI+500;

return grad;
}
//////////////////////////////////////////////////////////////////////
//////Функция поднимания-опускания фломастера (значения аргумента false и true  соответственно)/////
void  up_down_pen(boolean  ka)
{
  while (a3>85&&ka==1)
  {servo3.write(a3);a3=a3-1;delay(n);}if(ka== true ){a3=85;}
   while (a3<a03&&ka==0)
  {servo3.write(a3);a3=a3+1;delay(n);}if (ka==false){a3=a03;}
  }
/////////////////////////////////////////////////////////////////////////////////////////////////
Вложения
Новый точечный рисунок1.jpg
Аватара пользователя
dimamichev
 
Сообщения: 1386
Зарегистрирован: 03 янв 2013, 16:27

Re: Вопросы новичка.

Сообщение Angel71 » 20 июл 2018, 12:34

с рисовалкой замучались?


Аватара пользователя
Angel71
 
Сообщения: 10668
Зарегистрирован: 18 апр 2009, 22:18

Re: Вопросы новичка.

Сообщение dimamichev » 20 июл 2018, 13:23

Да, нет. Просто (как мне кажется) на таких сервоприводах в такой конструкции манипулятора, что в полярных, что в прямоугольных координатах больше 30 читаемых символов не вместишь. И синусы и косинусы, арктангенсы (Ардуина оказывается считает только через арксинус), арккосинусы и "флоаты" не сильно помогают. А вот рисовать домики-кораблики-флажки на уровне 1-2 класса это можно...Конечно, если перейти от движения кругового к прямолинейному шансы улучшить рисовалку увеличиваются.

Добавлено спустя 13 минут 17 секунд:
Дмитрий, я правильно понимаю прописывание переменной для функции применительно к приложению ? Функция работает (пришлось добавить массив для перенумерации клеток). Не понимаю что сюда аргументом передавать? - SimpleMov(cmd.substring(3));
Код: Выделить всё
//////////////////////////////////////////////////////////////////////
  ///функция поднимания шашки с игрового поля под номером N=11 (TAP11)
  /////////////////////////////////////////////////////////////////////
void TakePiez (byte N)
{
  for(byte ka=0;ka<=40;ka++)
  {
    if (tablP[ka]==N)
    {
      SetServosToPoint(tablX[ka],tablY[ka]);
      up_down_pen(true);digitalWrite(Pin, HIGH);
      delay(5*n);up_down_pen(false);
    }
  }
  }
  //////////////////////////////////////////////////////////////////////
Аватара пользователя
dimamichev
 
Сообщения: 1386
Зарегистрирован: 03 янв 2013, 16:27

Пред.След.

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

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

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