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

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

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

Сообщение Scorpio » 11 июл 2018, 01:46

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

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

Сообщение Dmitry__ » 11 июл 2018, 01:50

Я показал что можно сделать значительно проще, без тригонометрии и флоатов.
Вспоминаем мое сообщение про выравнивание дуг антидугами :)
И еще показал как надо моделировать. Ардуина тут на последнем месте, и нефиг уменьшать ее ресурс 100500 записями программы :)
Перейдите на моделирование на компе...
Аватара пользователя
Dmitry__
 
Сообщения: 8033
Зарегистрирован: 13 янв 2011, 15:25
Откуда: Санкт-Петербург

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

Сообщение Scorpio » 11 июл 2018, 02:01

Dmitry__ писал(а):Поизвращался в гнумерике, получая начальную сетку.
И как нам это поможет нарисовать масштабируемую букву, повернутую под произвольным углом и заданную в векторном виде? Я тоже бывает туплю...

Добавлено спустя 5 минут 45 секунд:
Dmitry__ писал(а): и нефиг уменьшать ее ресурс 100500 записями программы

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

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

Сообщение Dmitry__ » 11 июл 2018, 02:02

Scorpio писал(а):И как нам это поможет нарисовать масштабируемую букву, повернутую под произвольным углом и заданную в векторном виде?

Никак :oops:
Но можно задавать точки в матричном поле например 500х300 точек, соединять прямыми и пропускать через этот исказятор-выпрямлятор :)

Scorpio писал(а):Я тоже бывает туплю...

Скорее я опять не вьехал, чего вы с dimamichev добиваетесь :)

Надо огласить весь список этого опыта:
1)Написать хорошую книжку для детей по ардуине на базе рисовалки (будет крутая книга)
2)Разобраться с преобаз. полярных координат в декартовы
3)Сделать себе рисовалку (на любом железе, чем точнее и дешевле, тем лучше.
4) Что-то другое
Вот в 3-м варианте - вы занимаетесь ерундой. Раздербанить принтер дешевле и в 1000 раз точнее, и в 100 раз полезнее для дома :)
Аватара пользователя
Dmitry__
 
Сообщения: 8033
Зарегистрирован: 13 янв 2011, 15:25
Откуда: Санкт-Петербург

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

Сообщение Scorpio » 11 июл 2018, 02:10

Dmitry__ писал(а):Синусы идут лесом :)
сам ыедь статью про инверсную кинематику нашел. А там синусы! Давай колись, как получить требуемые углы поворота серв без синусов и таблиц Брадиса

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

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

Сообщение Dmitry__ » 11 июл 2018, 02:18

Scorpio писал(а):Давай колись, как получить требуемые углы поворота серв без синусов и таблиц Брадиса

Так я уже показал :)
Когда печатаешь сетку, думая что она декартова, получается сетка в полярных координатах. Если эти декартовы точки пропустить через выпрямлятор, то они станут печататься в антиполярных :) координатах и выведутся на полярном манипуляторе в декартовом виде :)
Давайте замучаем ТС, что же он хочет. Понятно, что тебе интересна векторная графика в полярных координатах и если ваши мысли совпали с ТС, то мне пора удалиться :)
Аватара пользователя
Dmitry__
 
Сообщения: 8033
Зарегистрирован: 13 янв 2011, 15:25
Откуда: Санкт-Петербург

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

Сообщение Scorpio » 11 июл 2018, 02:44

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

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

Сообщение Dmitry__ » 11 июл 2018, 02:51

Scorpio писал(а):Но ты побудь пока. Может еще пригодишься.

Слушаюсь! Сэээээр! :friends: :beer:

Добавлено спустя 4 минуты 7 секунд:
Во, числа укоротил функцией round(x;2), подготовка к уходу от флоат к int, картинка не изменилась:

=round(($B$26+$B$25^2-A1^2)^(1/2);2)
Сгенерилось:
Код: Выделить всё
-10   11,4   9,85   8,4
-9   12,21   10,75   9,44
-8   12,88   11,5   10,29
-7   13,45   12,13   10,98
-6   13,93   12,65   11,55
-5   14,32   13,07   12,01
-4   14,63   13,4   12,37
-3   14,87   13,66   12,65
-2   15,03   13,84   12,84
-1   15,13   13,94   12,95
0   15,17   13,98   12,99
1   15,13   13,94   12,95
2   15,03   13,84   12,84
3   14,87   13,66   12,65
4   14,63   13,4   12,37
5   14,32   13,07   12,01
6   13,93   12,65   11,55
7   13,45   12,13   10,98
8   12,88   11,5   10,29
9   12,21   10,75   9,44
10   11,4   9,85   8,4

Вместо прошлого :o :
Код: Выделить всё
-10   11,40175425099138   20,04987562112089   8,402325267042627
-9   12,206555615733702   10,754451150103323   9,443650760992956
-8   12,884098726725126   11,504699910719626   10,288088481701516
-7   13,45362404707371   12,128828005937953   10,98033988749895
Аватара пользователя
Dmitry__
 
Сообщения: 8033
Зарегистрирован: 13 янв 2011, 15:25
Откуда: Санкт-Петербург

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

Сообщение Scorpio » 11 июл 2018, 03:01

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

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

Сообщение Dmitry__ » 11 июл 2018, 03:14

Scorpio писал(а):Нет чтобы сразу так!

:D


А где картинки?
Я запарился гнумерик настраивать на вывод массива точек :)
Аватара пользователя
Dmitry__
 
Сообщения: 8033
Зарегистрирован: 13 янв 2011, 15:25
Откуда: Санкт-Петербург

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

Сообщение dimamichev » 11 июл 2018, 07:16

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

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

Сообщение Scorpio » 11 июл 2018, 07:25

Ну вот, проверил на пыльной дуне-нано.
Теперь все работает. :O:
Забыл скобочки в формулах, и map конечно не годится для float
Код: Выделить всё
#include <Servo.h>

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

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

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

#define L1 65 //длина первого плеча манипулятора в мм.
#define L2 65 //длина второго плеча манипулятора в мм.
#define Xmax 150
#define Ymax 150

//Функция выставляет 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/2-(b1+b2);
  if(X>0)B=PI-B;
  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);
}

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

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

Сообщение dimamichev » 11 июл 2018, 10:41

Попробовал, отсылаю в мониторе порта -40,60 - ответа нет. Или я не понимаю чего?

Добавлено спустя 4 минуты 43 секунды:
Вот такой по сервам ракурс, это 180 или нет?

Добавлено спустя 35 минут 13 секунд:
А оно ведь и не мудрено. В скетче есть связка - обращение к функции внутри функции - просто так разве можно? Я пробовал на своих примерах, мне выдавало ошибку, этот скетч правда прошёл без замечаний.

Добавлено спустя 24 минуты 21 секунду:
Попробовал опять на своих примерах - проходит компиляция. Что за дела? Я спрашивал у других, советовали включить какое то расширение GNU, а теперь всё и так получается.
Вложения
IMG_7390.JPG
Аватара пользователя
dimamichev
 
Сообщения: 1386
Зарегистрирован: 03 янв 2013, 16:27

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

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

dimamichev писал(а):Попробовал, отсылаю в мониторе порта -40,60 - ответа нет. Или я не понимаю чего?

Скорость в мониторе порта 19200? (правый нижний угол)
И конец строки должен стоять NL или NL&CR.

Добавлено спустя 25 минут 4 секунды:
dimamichev писал(а): А оно ведь и не мудрено. В скетче есть связка - обращение к функции внутри функции - просто так разве можно? Я пробовал на своих примерах, мне выдавало ошибку, этот скетч правда прошёл без замечаний.

Можно. Тело вызываемой функции должно располагаться в тексте программы выше места вызова. Или должен быть прописан прототип функции, опять же выше места вызова.
sergey2x
 
Сообщения: 235
Зарегистрирован: 14 янв 2015, 16:18
Откуда: СПб

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

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

Спасибо за всеобуч. Про скорость знал, про каретку - тёмный лес, про функции понятно,теперь руки развязываются.
Вот скриншот, смущают числовые значения для сервы 2...
Попробую второй вариант в скетче - серва 1 повёрнута на 180.

Добавлено спустя 10 минут 53 секунды:
Да, углы не попадают в 0-180 градусов.

Добавлено спустя 1 час 11 минут 30 секунд:
Вот поправки в градусах к углам, выставляемых на данном манипуляторе A'B' по отношению к углам рассчитанным А В. Даны границы поля прорисовки.
Вложения
декартова сетка.jpg
Новый точечный рисунок — копия.jpg
Новый точечный рисунок.jpg
Аватара пользователя
dimamichev
 
Сообщения: 1386
Зарегистрирован: 03 янв 2013, 16:27

Пред.След.

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

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

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