roboforum.ru

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

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

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

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

Сообщение Angel71 » 13 июл 2018, 05:20

Scorpio, жутких потенциометров в микро и стандартных сервах пока ещё не попадалось. вполне сносные, по крайней мере лучше чем некоторые недорогие большие однооборотные с ручкой, у которых легко может резво на максимум скакать от малейшего прикосновения. а вот с чудным обвесом микры и схемой в серве не раз попадалось. переставляешь из другой партии на том же чипе и серва ведёт себя намного лучше. в дорогих сервах естественно механика получше, да и микры иногда поприятней. от как на фото "с новым годом" на предыдущей странице, немного из-за кода, но в основном похоже что это всё же механика.
если потенциометры действетельно не полный ппц, с замерами немного подшаманить вполне можно. 030я стм запаянная на макетку и мелкая керамика по питанию. на потенциометр мгтф 30см, серву, драйвер и стм на "тихий ужас" (беспаечная макетка, цветастые непаянные китавайские проводки). гуляло 4 знака + к вечеру иногда помехи от чего-то усиливались. сохранил кучу замеров, вывел, глянул график, что происходит. сами данные более-менее, иногда резвые всплески. оверсемплинг 10, медиана с окном 3. от небольшого дребезга ещё простенький фильтр - не менять, если от предыдущего отличается меньше, чем на 2. :) условно 4096 значений на 190 градусов, вполне неплохо для беспаечного прототипа на соплях.
для скорости/ускорения калман оказался очень удобным (определяет малейшие движения и попугаи легко настраиваются). :) посмотри, что у тебя с данными, может будет достаточно немного какой фильтр применить. или посмотреть, нужно ли немного с электроникой подшаманить что бы на ацп шуму меньше было.
Аватара пользователя
Angel71
 
Сообщения: 10668
Зарегистрирован: 18 апр 2009, 22:18
Предупреждения: -1

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

Сообщение Scorpio » 13 июл 2018, 06:32

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

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

Сообщение dimamichev » 13 июл 2018, 07:29

Картинки:так в теории (без поправок на посадку качалок). С рычагами - расстояние S1S2=65mm, S2flam=65mm. Ещё раз уточню поправки на посадку качалок, никак не влияют на теоретические вычисления.

Добавлено спустя 29 минут 58 секунд:
По координатам: х от -50 до 50 мм, у от 70 до 120 мм примерно.
Вложения
положения.jpg
Аватара пользователя
dimamichev
 
Сообщения: 1386
Зарегистрирован: 03 янв 2013, 16:27

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

Сообщение Scorpio » 13 июл 2018, 07:30

Поправки влияют. Если я вычислил угол 160, а поправка 30, то угол получится 190, что серва уже не может выдать физически. Из картинки я не понял, кто такой flam (извини, я старый больной человек, измученный сегодня португальским портвейном), к тому же не пойму в чем разница положений S1 на разных картинках.
Аватара пользователя
Scorpio
 
Сообщения: 2681
Зарегистрирован: 30 сен 2008, 18:49
Откуда: Где-то в Латинской Америке

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

Сообщение dimamichev » 13 июл 2018, 07:52

Scorpio писал(а):Поправки влияют. Если я вычислил угол 160, а поправка 30, то угол получится 190, что серва уже не может выдать физически. Из картинки я не понял, кто такой flam (извини, я старый больной человек, измученный сегодня португальским портвейном), к тому же не пойму в чем разница положений S1 на разных картинках.

S1 положение вала первой сервы (начало координат, эта серва неподвижна),S2- вал второй сервы (эта серва подвижна),flam- положение стержня фломастера. Конечно серва не станет в 190 градусов потому что вычисленный угол уходит далеко за данные значений х и у. Его никак не должно получаться в границах координат рабочего поля. Для другого манипулятора, с другими начальными посадками серв и поля пожалуйста, это уже нюанс, который устанавливает сам владелец манипулятора - задаёт границы допустимых значений координат или углов.
Аватара пользователя
dimamichev
 
Сообщения: 1386
Зарегистрирован: 03 янв 2013, 16:27

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

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

Вот такое наложение синий-красный-зелёный.
Вложения
сектора.jpg
Аватара пользователя
dimamichev
 
Сообщения: 1386
Зарегистрирован: 03 янв 2013, 16:27

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

Сообщение Scorpio » 13 июл 2018, 16:07

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

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

Сообщение dimamichev » 13 июл 2018, 17:08

Попробую в пределах часа поправить и посмотреть.

Добавлено спустя 47 минут 5 секунд:
Код: Выделить всёРазвернуть
///////////// МАНИПУЛЯТОР ДЛЯ ГРАФИЧЕСКИХ ИЗОБРАЖЕНИЙ скетч СЕТКА КООРДИНАТНАЯ ДЕКАРТОВА ПРОТО //////////////////////////////
#include <Servo.h>
#define L1 65 //длина первого плеча манипулятора в мм.
#define L2 65 //длина второго плеча манипулятора в мм.
#define Xmax 120
#define Ymax 120

Servo servo1;
Servo servo2;
String inputString = "";

void setup() {
Serial.begin(9600);
servo1.attach(5);
servo2.attach(6);
}

void loop() {
  CheckSerial();
  delay(100);
}


//Функция выставляет servo1 servo2, на точку с координатами X,Y
//X<0 для левого квадранта, X>0 для правого
void SetServosToPoint(float X, float Y)
{

  if(abs(X)>Xmax || Y>Ymax || Y<0 || X==0) return;
  float L=sqrt(X*X+Y*Y);
  float a1=acos(abs(X)/L);
  float a2=acos((L*L+L1*L1-L2*L2)/(2*L*L1));
  float A=a1+a2;
  if(X<0)A=PI-A;// вариант, если серва1 повернута на 180°
// if(X>0)A=PI-A; // вариант, если серва1 НЕ повернута на 180°
  float b1=PI/2-a1;
  float b2=acos((L2*L2+L*L-L1*L1)/(2*L2*L));
  float B=PI-(b1+b2);
  if(X>0)B=PI-B+PI/2;
  Serial.print("A= ");
  Serial.println(180*A/PI);
  Serial.print("B= ");
  Serial.println(180*B/PI);
  servo1.writeMicroseconds(RadianToMcs(A));
  servo2.writeMicroseconds(RadianToMcs(B));
  Serial.print("servo1= ");
  Serial.println(RadianToMcs(A));
  Serial.print("servo2= ");
  Serial.println(RadianToMcs(B));
}

int RadianToMcs(float rad)
{
  int grad=180*rad/PI;
  grad=map(grad, 0, 180, 500, 2500);
  return grad;
}

//Задавать строку координат в виде X,Y (Например: -40,60)
void CheckSerial()
{

  while (Serial.available())
  {
    char inChar = (char)Serial.read();
  if (inChar == '\n')
  {
   MakeCmd();
   inputString="";
   break;
  }
  else inputString += inChar;
  }
}
void MakeCmd()
{
  if(inputString.length()<3)return;
  int k=inputString.indexOf(',');
  if(k<0)return;
  float x=inputString.substring(0,k).toFloat();
  float y=inputString.substring(++k).toFloat();
  Serial.print("X= ");
  Serial.println(x);
  Serial.print("Y= ");
  Serial.println(y);
  SetServosToPoint(x,y);
}

Всё равно не то с Х - по А смотрю для отрицательных Х углы малые, для положительных большие, а должно наоборот. Может не так я переставил.
Вложения
Новый точечный рисунок — копия (2).jpg
Аватара пользователя
dimamichev
 
Сообщения: 1386
Зарегистрирован: 03 янв 2013, 16:27

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

Сообщение Scorpio » 13 июл 2018, 18:00

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

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

Сообщение Madf » 13 июл 2018, 21:17

Блиин, парни, вы ему ща готовую штуку сделаете, а он побежит сразу в журнал печататься и детишек за бабки учить. Хотя да, согласен, хоть что-то правильное и полезное издаст. ;)
Madf
 
Сообщения: 3298
Зарегистрирован: 03 янв 2012, 12:55
Откуда: Москва
прог. языки: VB6, BASCOM, ASM...

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

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

Детишек учить это хорошо. Даже за бабки.

Добавлено спустя 37 минут 16 секунд:
Формулы пришлось пересмотреть. Теперь функция выглядит так:
Код: Выделить всёРазвернуть
void SetServosToPoint(int X, int Y)
{
  if(abs(X)>Xmax || Y>Ymax || Y<Ymin || X==0) 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));
  Serial.print("A= ");
  Serial.println(180*A/PI);
  Serial.print("B= ");
  Serial.println(180*B/PI);
  servo1.writeMicroseconds(RadianToMcs(A)+Acor1);
  servo2.writeMicroseconds(RadianToMcs(B)+Acor2);
  CurX=X;CurY=Y;
//  Serial.print("servo1= ");
//  Serial.println(RadianToMcs(A));
//  Serial.print("servo2= ");
//  Serial.println(RadianToMcs(B));
  Serial.print("Current point: X= ");
  Serial.print(X);
  Serial.print(", Y= ");
  Serial.println(Y);
}

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

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

Сообщение dimamichev » 13 июл 2018, 22:48

Madf писал(а):Блиин, парни, вы ему ща готовую штуку сделаете, а он побежит сразу в журнал печататься и детишек за бабки учить. Хотя да, согласен, хоть что-то правильное и полезное издаст. ;)


Добавлено спустя 23 минуты 53 секунды:

Выжигание.
Вложения
20180712_232621.jpg
Аватара пользователя
dimamichev
 
Сообщения: 1386
Зарегистрирован: 03 янв 2013, 16:27

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

Сообщение Scorpio » 13 июл 2018, 22:54

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

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

Сообщение dimamichev » 14 июл 2018, 00:11

Код: Выделить всёРазвернуть
///////////// МАНИПУЛЯТОР ДЛЯ ГРАФИЧЕСКИХ ИЗОБРАЖЕНИЙ скетч СЕТКА КООРДИНАТНАЯ ДЕКАРТОВА ПРОТО //////////////////////////////
#include <Servo.h>
#define L1 65  //длина первого плеча манипулятора в мм.
#define L2 65  //длина второго плеча манипулятора в мм.
#define Xmax 120
#define Ymax 120
#define Acor1 352
#define Acor2 220
int Ymin=70;


Servo servo1;
Servo servo2;
Servo servo3;
String inputString = "";

void setup() {
Serial.begin(9600);
servo1.attach(5);
servo2.attach(6);
servo3.attach(7);
servo1.write(32);
servo2.write(110);
servo3.write(90);
}

void loop() {
  CheckSerial();
  delay(100);
}


//Функция выставляет servo1 servo2, на точку с координатами X,Y
//X<0 для левого квадранта, X>0 для правого
void SetServosToPoint(int X, int Y)
{

  if(abs(X)>Xmax || Y>Ymax || Y<Ymin || X==0) 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));
  Serial.print("A= ");
  Serial.println(180*A/PI);
  Serial.print("B= ");
  Serial.println(180*B/PI);
  servo1.writeMicroseconds(RadianToMcs(A)+Acor1);
  servo2.writeMicroseconds(RadianToMcs(B)+Acor2);
  float CurX=X;float CurY=Y;
//  Serial.print("servo1= ");
//  Serial.println(RadianToMcs(A));
//  Serial.print("servo2= ");
//  Serial.println(RadianToMcs(B));
  Serial.print("Current point: X= ");
  Serial.print(X);
  Serial.print(", Y= ");
  Serial.println(Y);
}

int RadianToMcs(float rad)
{
  int grad=180*rad/PI;
  grad=map(grad, 0, 180, 500, 2500);
  return grad;
}

//Задавать строку координат в виде X,Y (Например: -40,60)
void CheckSerial()
{

  while (Serial.available())
  {
    char inChar = (char)Serial.read();
  if (inChar == '\n')
  {
   MakeCmd();
   inputString="";
   break;
  }
  else inputString += inChar;
  }
}
void MakeCmd()
{
  if(inputString.length()<3)return;
  int k=inputString.indexOf(',');
  if(k<0)return;
  float x=inputString.substring(0,k).toFloat();
  float y=inputString.substring(++k).toFloat();
  Serial.print("X= ");
  Serial.println(x);
  Serial.print("Y= ");
  Serial.println(y);
  SetServosToPoint(x,y);
}

Такой вариант скетча, снял фломастер, виброиглу, смотрю в отверстие на рычаге как в прицел. Подставляю в окрестностях х=0, У=90. В этой версии всё вроде срастается, рычаги правильно-ожидаемо поворачивают. Где была ошибка?
Код далеко не везде понимаю, завтра попробую наваять сетку - будем надеяться декартову. Интервал для серв может придётся подбирать, он по разным источникам 544-2400, 500-2500. Кстати почему 0 для х исключён?
Аватара пользователя
dimamichev
 
Сообщения: 1386
Зарегистрирован: 03 янв 2013, 16:27

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

Сообщение Scorpio » 14 июл 2018, 00:38

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

Пред.След.

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

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

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