Скетч для рисующей роборуки

CHISHOK
CHISHOK аватар
Offline
Зарегистрирован: 13.03.2017

http://www.thingiverse.com/thing:989931 Здравствуйте! Распечатал такого вот робота. Собрал,подключил к ардуине,подвигал сервами, всё круто!

Теперь нужно писать код,чтобы рука буквы писала, подскажите пожалуйста хотя бы алгоритм для проведения линии из точки А в Б. Линии думаю делать прямые.

https://geektimes.ru/post/255782/ Видел я этот пост,но интересно осуществить задумку без метаний по сторонним программам,если это как-либо вообще возможно...

Единственное,что для меня видится возможным,это пробовать менять функцию SERVOATTACH, пока нужная линия не выйдет... Но это очень долго и нудно)

Возможно есть уже какие-нибудь библиотеки под это дело,или что-то в этом духе?

Буду очень признателен,если сможете скинуть скетч хотя бы для одной буквы,чтобы мне по аналогии повторить...

ОТКЛИКНИТЕСЬ!!!

Клапауций 112
Клапауций 112 аватар
Offline
Зарегистрирован: 01.03.2017

и, мне для робоноги(левой) напишите скейтчь.

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

CHISHOK пишет:
https://geektimes.ru/post/255782/ Видел я этот пост,но интересно осуществить задумку без метаний по сторонним программам,если это как-либо вообще возможно...Единственное,что для меня видится возможным,это пробовать менять функцию SERVOATTACH, пока нужная линия не выйдет... Но это очень долго и нудно)
Вы сами и ответили на этот вопрос. А то что программу писать сложно и трудно. Так мозг надо тренировать на таких задачах, а не искать шару и халяву в интернете.

Ворота
Ворота аватар
Offline
Зарегистрирован: 10.01.2016

CHISHOK пишет:

подскажите пожалуйста хотя бы алгоритм для проведения линии из точки А в Б. Линии думаю делать прямые.

Пожалуйста - Алгоритм Брезенхэма, Алгоритм Ву, Алгоритм DDA-линии.

Выбирайте, какой Вам больше подходит.

Но по уму, здесь не нужен цифровой алгоритм растеризации. Здесь нужно Вашу линию представить в параметрическом виде и тогда можно одной сервой рисовать x-выражение, а другой - y-выражение

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Ворота пишет:

CHISHOK пишет:

подскажите пожалуйста хотя бы алгоритм для проведения линии из точки А в Б. Линии думаю делать прямые.

Пожалуйста - Алгоритм Брезенхэма, Алгоритм Ву, Алгоритм DDA-линии.

Выбирайте, какой Вам больше подходит.

Но по уму, здесь не нужен цифровой алгоритм растеризации. Здесь нужно Вашу линию представить в параметрическом виде и тогда можно одной сервой рисовать x-выражение, а другой - y-выражение

вот тут как раз LISP бы подошёл )))

CHISHOK
CHISHOK аватар
Offline
Зарегистрирован: 13.03.2017

QWONE,насчёт тренировок моска вы,несомненно,правы) Но я не придерживаюсь тактики создания собственного велосипеда. Думаю есть где-нить на англоязычных форумах эта тема и наработки по ней,нужно только поискать...

Ворота,спасибо за подсказки об этих алгоритмах,попробую в них разобраться и реализовать в роботе)

UA6EM Загуглю про этот LISP,посмотрим что это за такое)

Всем спасибо за помощь!

Если возникнут вопросы,то я знаю,на кого можно положиться)

uni
uni аватар
Offline
Зарегистрирован: 24.09.2015

Возьмите исходник простой графической библиотеки, например, ugui. Там всё есть.

CHISHOK
CHISHOK аватар
Offline
Зарегистрирован: 13.03.2017

Спасибо,Uni.Думаю разберусь с ней)
Вообще я сейчас нахожусь на этапе сбора и обработки информации,радостно получаемой от знатоков (ибо сам в этом я -1).
И,раз уж пишу,такой вопросик:нормально ли работает плата Arduino Nano 238p с тремя одновременно работающими сервами?
Я пытался запускать её в проверочном режиме, пример swipe,или как там,только для трёх серв.И плата отключалась от компа каждые 2 секунды работы,а затем заново подключалась и так до бесконечности... Тоесть она не может стабильно питать 3 сервы,или это мой косяк?

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Ваш косяк. Серва требует хорошего блока питания . Работа моторов серв просаживает питание и сбивает работу ардуины.

CHISHOK
CHISHOK аватар
Offline
Зарегистрирован: 13.03.2017

И ещё одно, Uni. Туплю конечно,но вы имеете ввиду разбить листочек на огромные пиксели и для каждого из них узнать положение обеих серв в градусах? Типа пиксель(16;3) и servo1(20),servo2(40)? Тоесть для каждого пикселя иметь значения положений серв? Или это совсем не так,как представляю? Qwone,а если работать ими поочерёдно или вообще отключить от питания третью серву отвечающую за пробелы между линиями,изменится ли ситуация,или нет?

Logik
Offline
Зарегистрирован: 05.08.2014

Фигни вам насоветовали, начиная от теорем и растра до либки. У Вас изначально устройство векторной графики, растра тут нет и не нужен. Векторній построитель рисует линию не по точкам а сплошняком, аналогично человеку, хотя и перемещается дискретно, приводы такие.

Кроме того в конструкции я так вижу нет подёма маркера, значить рисуем без разрывов?

Вся проблема в математике. Необходимо пересчет делать между линейными координатами, привычными нам, удобными в рисовании прямых и угловыми естественно возникшими в данной конструкции. Это относительно не сложно, школьная тригонометрия, но владеть ею хороше надо. Собственно задаем прямую формулой, на ней отрезок ограниченый возможностями достать его точкии. Задаем Х по формуле прямой определяем Y, затем пару координат пересчитываем в углы поворота серв (будет несколько вариантов, изучаем все выбираем лучший). Имея зависимости углов от (X,Y) и параметров прямой реализуем рисование прямых. Из них уже остальное.

ИМХО - я б с этой фигней не возился, область рисования малая и кривая, нет подёма пера. Сильно ограничены возможности. У вас есть 3Д принтер? Поменяйте экструдер на маркер - интересней будет.

Nosferatu
Offline
Зарегистрирован: 04.11.2012

В принципе, можно и по точкам рисовать сплошную линию. Если читать кадр попиксельно в цикле начиная с нижнего левого. Если натыкаемся не на пустой пиксель, тыркаем маркер. Проверяем соседние пиксели по часовой стрелки, продолжая движение маркера всегда на первый попавшийся не пустой пиксель слева и опять проверяем соседей по часовой. Запоминаем обработанные пиксели. Если больше нету соседних необработанных пикселей, продолжаем читать кадр в цикле пропуская обработанные.

Вообще, если задача только писать буквы и примитивные картинки, то можно управлять роборукой с помощью мышки, записав последовательность команд.

CHISHOK
CHISHOK аватар
Offline
Зарегистрирован: 13.03.2017

Logik,есть там серва для подъёма,только её на фотографии не видно,она с другой стороны стоит. Можете пожалуйста дать ссылку на эту формулу и её применение? Тригонометрию ещё не проходили,нас ей пока только пугают)

Nosferatu,нашёл я этот пост,вы об этом говорили?
http://arduino-diy.com/arduino-robot-khudozhnik

Там говорится :

(Решение обратной задачи кинематики для перемещения рабочего органа к определенному пикселю. При расчете берутся координаты пикселя и вычисляются соответствующие углы приводов. Как именно решается эта задача можно увидеть на рисунке http://www.arduino-diy.com/wp-content/uploads/2015/07/143637756762_kiss_...) Logik,вы это имели ввиду?

Тоесть,насколько я понял,нам всё-таки нужно для каждого пикселя рассчитывать угол поворота серв? Это же нереально каждый пиксель так рассчитать...

А,вот,нашёл походу :

(Конечно же, вы можете настроить параметры определения положения рабочего органа в соответствии с вашими габаритами конструкции.) Фух,а я уж перепугался...

Ладненько,попробую этот способ...

А вот про управление мышкой,Nosferatu,если можно,поподробнее...

Кстати,Рука моя уже дуги рисует!

Logik
Offline
Зарегистрирован: 05.08.2014

//Можете пожалуйста дать ссылку на эту формулу и её применение? Тригонометрию ещё не проходили,нас ей пока только пугают)

Не могу я её в глаза не видел. я только изложил подход к решению. Вам стимул выучить тригонометрию досрочно.

//....Logik,вы это имели ввиду?

По сути да, но с оговоркой. Нет у Вас никаких пикселей, и быть не может. Есть координаты начала и конца отрезка прямой.  И из таких отрезков все рисуется.  Длина отрезка - компромисный вопрос, чем короче тем точней, но медленей. Обычно на плотерах это несколько милиметров, на нарисованых окружностях хороше видно.

//Тоесть,насколько я понял,нам всё-таки нужно для каждого пикселя рассчитывать угол поворота серв? Это же нереально каждый пиксель так рассчитать...

Да нету у Вас никаких пикселей))) Расчитать углы поворотов серв для начала и конца отрезка. Устаноаить углы начала и плавно равномерно изменить их так, чтоб стали углами конца. При этом маркер нарисует чегото на отрезок похожее. Чем он короче - тем похожее.

ПС. По вашей же ссылке и формула и решение и обяснение

Обратная кинематика робота-художника

Nosferatu
Offline
Зарегистрирован: 04.11.2012

CHISHOK пишет:

А вот про управление мышкой,Nosferatu,если можно,поподробнее...

Для этого надо написать простенькую программу для компьютера, которая будет отсылать координаты курсора мышки в COM порт ардуине. Программная эмуляция джойстика.

CHISHOK
CHISHOK аватар
Offline
Зарегистрирован: 13.03.2017

Nosferatu,если можно,дайте пожалуйста ссылочку на эту программу для эмуляции мыши под ардуину,если не сложно... Хоть протестить бы,как это...

Nosferatu
Offline
Зарегистрирован: 04.11.2012

Ссылок не знаю. Есть скетчь на Processing-е, моя заготовка, можно его использовать.

import processing.serial.*; 

Serial port;

void setup() {
  size(470, 200);
  //=============== размер окна можно изменять
  getSurface().setResizable(true); //
  //===============
  if (Serial.list().length != 0) {
    port = new Serial(this, Serial.list()[0], 9600);
  }
}

void draw() {
  if (Serial.list().length != 0) {
    clear();
    background(255);
    if (keyPressed) {
      port.write(key); // отправляем букву нажатой кнопки
      //println(key);
    }
    int Xm = mouseX - pmouseX;
    int Ym = mouseY - pmouseY;
    //println("X = "+Xm+" | Y = "+Ym);
    if (Xm != 0)
      port.write("Xm"+Xm); // отправляем значение перемещения мышки по X     
    if (Ym != 0) 
      port.write("Ym"+Ym); // отправляем значение перемещения мышки по Y
    fill(0);
    text("X = "+Xm+" | Y = "+Ym, 10, height - 20);
  } else {
    String str_2 = "Не обнаружено подключенных устройств.";
    clear();
    background(255);
    fill(0);
    text(str_2, 10, 20);
  }
}

При перемещении мышки в окне программы, в порт отправляется значение, на сколько передвинулся курсор мышки в "+" или " -" по X и Y.  

Также отсылаются в порт символы нажатых клавиш. Можно назначить клавишам команды: старт, стоп, запись, шаг назад, удалить запись и т.д.

По умолчанию программа подключается к первому по номеру COM порту в системе. Скорость 9600.