Технический форум по робототехнике.
Scorpio » 11 июл 2018, 01:46
Ну дык наложи, формулы то есть. Там скорее всего map не работает с float. Я уже нашел где выковырять дуню. К вашему утру все прояснится )))
Dmitry__ » 11 июл 2018, 01:50
Я показал что можно сделать значительно проще, без тригонометрии и флоатов.
Вспоминаем мое сообщение про выравнивание дуг антидугами

И еще показал как надо моделировать. Ардуина тут на последнем месте, и нефиг уменьшать ее ресурс 100500 записями программы

Перейдите на моделирование на компе...
Scorpio » 11 июл 2018, 02:01
Dmitry__ писал(а):Поизвращался в гнумерике, получая начальную сетку.
И как нам это поможет нарисовать масштабируемую букву, повернутую под произвольным углом и заданную в векторном виде? Я тоже бывает туплю...
Добавлено спустя 5 минут 45 секунд:Dmitry__ писал(а): и нефиг уменьшать ее ресурс 100500 записями программы
Это да. АВРки гарантируют только 100000

Dmitry__ » 11 июл 2018, 02:02
Scorpio писал(а):И как нам это поможет нарисовать масштабируемую букву, повернутую под произвольным углом и заданную в векторном виде?
Никак
Но можно задавать точки в матричном поле например 500х300 точек, соединять прямыми и пропускать через этот исказятор-выпрямлятор

Scorpio писал(а):Я тоже бывает туплю...
Скорее я опять не вьехал, чего вы с dimamichev добиваетесь

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

Scorpio » 11 июл 2018, 02:10
Dmitry__ писал(а):Синусы идут лесом

сам ыедь статью про инверсную кинематику нашел. А там синусы! Давай колись, как получить требуемые углы поворота серв без синусов и таблиц Брадиса
Добавлено спустя 2 минуты 15 секунд:С принтером каждый сможет. А мы из говна конфетку делаем
Dmitry__ » 11 июл 2018, 02:18
Scorpio писал(а):Давай колись, как получить требуемые углы поворота серв без синусов и таблиц Брадиса
Так я уже показал

Когда печатаешь сетку, думая что она декартова, получается сетка в полярных координатах. Если эти декартовы точки пропустить через выпрямлятор, то они станут печататься в антиполярных

координатах и выведутся на полярном манипуляторе в декартовом виде

Давайте замучаем ТС, что же он хочет. Понятно, что тебе интересна векторная графика в полярных координатах и если ваши мысли совпали с ТС, то мне пора удалиться

Scorpio » 11 июл 2018, 02:44
Уже не важно, что хочет ТС. Главное что я хочу!

Но ты побудь пока. Может еще пригодишься.
Dmitry__ » 11 июл 2018, 02:51
Scorpio писал(а):Но ты побудь пока. Может еще пригодишься.
Слушаюсь! Сэээээр!
Добавлено спустя 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
Вместо прошлого

:
- Код: Выделить всё • Развернуть
-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
Scorpio » 11 июл 2018, 03:01
Однако в экселе по твоему совету функции проверил. Там скобок не хватало. Нет чтобы сразу так!
Dmitry__ » 11 июл 2018, 03:14
Scorpio писал(а):Нет чтобы сразу так!
А где картинки?
Я запарился гнумерик настраивать на вывод массива точек

dimamichev » 11 июл 2018, 07:16
Какая цель? На этом этапе сервоприводы дешёвые - их применение в простейшем графическом манипуляторе - координатные сетки в полярной (а она тоже не получена потому что одна координата угол и тут ясно, а вторая фиксированной длины отрезок, а не парный поворот серв как у меня, приводящий к тому, что чем дальше от центра тем меньше расстояние между соседними дугами - искажение изображения букв в разных строках), в прямоугольной, декартовой системе - функции построения отрезков - как следствие простые картинки по точкам, отрезкам, точкам и отрезкам. Далее создание спрайтов-штампиков (буква в массиве или по отдельной функции) - их расположение в полярной,декартовой системах, ну и т.д.
Scorpio » 11 июл 2018, 07:25
Ну вот, проверил на пыльной дуне-нано.
Теперь все работает.
Забыл скобочки в формулах, и 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° (по фотке не очень понятно), то изменить слегка код.
Ждем результатов, прежде чем приступать к рисованию векторов.
dimamichev » 11 июл 2018, 10:41
Попробовал, отсылаю в мониторе порта -40,60 - ответа нет. Или я не понимаю чего?
Добавлено спустя 4 минуты 43 секунды:
Вот такой по сервам ракурс, это 180 или нет?
Добавлено спустя 35 минут 13 секунд:
А оно ведь и не мудрено. В скетче есть связка - обращение к функции внутри функции - просто так разве можно? Я пробовал на своих примерах, мне выдавало ошибку, этот скетч правда прошёл без замечаний.
Добавлено спустя 24 минуты 21 секунду:
Попробовал опять на своих примерах - проходит компиляция. Что за дела? Я спрашивал у других, советовали включить какое то расширение GNU, а теперь всё и так получается.
- Вложения
-

sergey2x » 11 июл 2018, 11:14
dimamichev писал(а):Попробовал, отсылаю в мониторе порта -40,60 - ответа нет. Или я не понимаю чего?
Скорость в мониторе порта 19200? (правый нижний угол)
И конец строки должен стоять NL или NL&CR.
Добавлено спустя 25 минут 4 секунды:dimamichev писал(а): А оно ведь и не мудрено. В скетче есть связка - обращение к функции внутри функции - просто так разве можно? Я пробовал на своих примерах, мне выдавало ошибку, этот скетч правда прошёл без замечаний.
Можно. Тело вызываемой функции должно располагаться в тексте программы выше места вызова. Или должен быть прописан прототип функции, опять же выше места вызова.
dimamichev » 11 июл 2018, 14:55
Спасибо за всеобуч. Про скорость знал, про каретку - тёмный лес, про функции понятно,теперь руки развязываются.
Вот скриншот, смущают числовые значения для сервы 2...
Попробую второй вариант в скетче - серва 1 повёрнута на 180.
Добавлено спустя 10 минут 53 секунды:
Да, углы не попадают в 0-180 градусов.
Добавлено спустя 1 час 11 минут 30 секунд:
Вот поправки в градусах к углам, выставляемых на данном манипуляторе A'B' по отношению к углам рассчитанным А В. Даны границы поля прорисовки.
- Вложения
-

-

-
