roboforum.ru

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

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

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

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

Сообщение Dmitry__ » 07 июл 2018, 16:37

посмотрел функцию Servo. Там есть Servo.writeMicroseconds(). Вот ей и надо пользоваться. Все стандартно для серв и PPM:
1000 максимальный поворот против часовой стрелки, 2000 максимальный поворот по часовой стрелке, 1500 посередине.

Думаю управлять одновременно всеми сервами получится. Попробуй написать тестовую прогу: зациклить: запись значений в 3 сервы, инкремент всех значений, задержка 5 мс. И посмотреть как все двигается.
На синусы и косинусы забить, не ардуинское это, хотя можно и вложиться в ресурсы. Все буквы сделать таблицей точек. Брать примерно по 50 точек на букву. Для хранения большой таблицы перейти на PGM. Гуглить "avr/pgmspace.h". Между точками вести линии усреднением. Придется написать свой маленький интерпретатор команд из таблицы. Например: Таблица из байт. Значение "0" - опустить карандаш. Значение "254" - поднять карандаш. Значение 255 "конец буквы". Оставшиеся значения от 1 до 253 равномерно размазать на значение сервы от 1000 до 2000 мкс. Будет 2 таблицы: одна сами буквы по 50 точек на 3 сервы, вторая - индексы букв (начало таблицы нужной буквы). Если останется дофига памяти, то можно потом увеличить колич. точек в букве.
Йа все :)
Аватара пользователя
Dmitry__
 
Сообщения: 8033
Зарегистрирован: 13 янв 2011, 15:25
Откуда: Санкт-Петербург

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

Сообщение Scorpio » 07 июл 2018, 17:15

Servo.writeMicroseconds() позволяет точнее выставить угол. Задавать огромные таблицы точек не рационально и трудоемко. Мы же знаем формулу прямой. Вычислить следующую точку не составляет проблем. Каждая точка задается углами положения серв (реально м.б. 2 комбинации для каждой точки, но одной достаточно) дальше все легко вычисляется. Чем большим количеством точек мы зададим отрезок, тем он будет прямее. Двигаясь от точки к точке одновременно 2-мя сервами что-нибудь получится.
Аватара пользователя
Scorpio
 
Сообщения: 2670
Зарегистрирован: 30 сен 2008, 18:49
Откуда: Где-то в Латинской Америке

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

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

Буду думать, попробовал синус, косинус ни холодно, ни жарко пока
Аватара пользователя
dimamichev
 
Сообщения: 1381
Зарегистрирован: 03 янв 2013, 16:27

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

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

dimamichev писал(а):две и более одновременно никогда поворачиваться не будут в Servo

dimamichev писал(а):Библиотека Servo одновременно позволяет двигать 12 сервами

Код: Выделить всёРазвернуть
/////////////////функция рисования отрезков в разных направлениях по заданным параметрам
  void drawing_line()
  {
  byte K1=0;
  while (K1<p1)
  {A=A+p2;B=B+p3;K1=K1+p4;servo2.write(B);servo1.write(A);delay(n);}
  }

В этом варианте сервы двигаются вполне себе одновременно. Другое дело, программа зациклена только на рисовании. Остановить процесс внешней командой невозможно. SerialEvent() не поможет, т.к. он проверяет СОМ порт только между циклами loop(), а не во время delay(). Я в таких случаях предпочитаю использовать счетчики, крутя drawing_line() в цикле loop() вместе с другими нужными функциями
Аватара пользователя
Scorpio
 
Сообщения: 2670
Зарегистрирован: 30 сен 2008, 18:49
Откуда: Где-то в Латинской Америке

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

Сообщение Dmitry__ » 07 июл 2018, 19:22

Scorpio писал(а): Задавать огромные таблицы точек не рационально и трудоемко.


Проверил свою osd графику для роботов, на базе minimosd-ng. Там табличка "мама не горюй" в 16000 значений :)

Код: Выделить всёРазвернуть
#include <avr/pgmspace.h>
const unsigned char mydata[16384] PROGMEM =
{
   0b01010101,
   0b01010101,
   0b01010101,
   0b01010101,
   0b01010101,
   ...


Расход, все очень пристойно для atmega328p, озу вообще не затронуто :)

Код: Выделить всёРазвернуть
Program:   21260 bytes (64.9% Full)
(.text + .data + .bootloader)

Data:         49 bytes (2.4% Full)
(.data + .bss + .noinit)


Пытаюсь вспомнить, где нагенерил такой эпичный массив букв, не понмю :)
И не знаю, как извращаться с pgm в ардуино, у меня код на чистом gcc. Но не думаю, что в ардуино иде будет пичалька...

Добавлено спустя 5 минут 31 секунду:
Вот какие-то 2 ссылки нашел в проекте:
https://www.1001freefonts.com/bitmap-pixel-fonts.php
http://ukpyr.narod.ru/ind_lcd.htm?lang=eng

Первая ссылка - шикардос :)

2018-07-07-182119_1280x1024_scrot.png
Аватара пользователя
Dmitry__
 
Сообщения: 8033
Зарегистрирован: 13 янв 2011, 15:25
Откуда: Санкт-Петербург

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

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

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

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

Сообщение Dmitry__ » 07 июл 2018, 20:04

Почему не будет масштабироваться? Задаешь больше отрезок между точками и вперед. Длина отрезка между точками будет задавать размер букв. Единственное что плохо, буквы все равно будут направлены от центра основания лапы. А если использовать 16к таблицу, как у меня в osd, то это получается 500 точек на 32 буквы. Там вообще интерполяция между точками не понадобится :)

Добавлено спустя 21 секунду:
Ну смотрите, как знаете :oops:
Аватара пользователя
Dmitry__
 
Сообщения: 8033
Зарегистрирован: 13 янв 2011, 15:25
Откуда: Санкт-Петербург

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

Сообщение dimamichev » 07 июл 2018, 20:09

Вот для расстановок точек над "и" задал поточечно с шагом 1 градус на 2 и правее 1*1. В разных частях по разному точки. Удивительно что хоть так - если аккуратно пошевелить стержень фломастера "в люфтах шестерёнок серв", амплитуда колебаний сравнима с дистанцией между соседними точками.
Вложения
20180707_184825.jpg
Аватара пользователя
dimamichev
 
Сообщения: 1381
Зарегистрирован: 03 янв 2013, 16:27

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

Сообщение Scorpio » 08 июл 2018, 01:25

От механики конечно красивость тоже зависит.
ИА.jpg

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

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

Сообщение dimamichev » 08 июл 2018, 20:34

Распечатал коническую сетку с шагом 2 градуса на 4. Если в фломастер капнуть две капли спирта - точки становятся гораздо различимее и жирнее. Прямоугольной сетки никак не получается. Соответственно и XY пока не вырисовывается. Как же сосиску распрямить?

Может растр попробовать на цифрах 0-9? Или просто картинку точками нарисовать в массиве. Можно же "32 битную числу" написать 19 раз чтоб весь набор в массиве хранить?
Вложения
DSCN0316.JPG
Аватара пользователя
dimamichev
 
Сообщения: 1381
Зарегистрирован: 03 янв 2013, 16:27

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

Сообщение Scorpio » 08 июл 2018, 23:14

dimamichev писал(а):Прямоугольной сетки никак не получается.

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

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

Сообщение dimamichev » 08 июл 2018, 23:39

Да, нет конечно получится - закономерность приращений углов найти не удастся... Смешно, задавал примерно шаг по дуге окружности 0,5 градуса с помощью "микросекондса" - рисунок искривлений сохраняется, получается он индивидуальный для данных серв в заданной компоновке.
Про эмулятор - это мне тёмный лес.
Аватара пользователя
dimamichev
 
Сообщения: 1381
Зарегистрирован: 03 янв 2013, 16:27

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

Сообщение Dmitry__ » 09 июл 2018, 01:23

dimamichev писал(а):Прямоугольной сетки никак не получается. Соответственно и XY пока не вырисовывается. Как же сосиску распрямить?

Советую очень крепко задуматься, для чего все это нужно. Любой шаг вправо, шаг влево - куча работы в помойку. А так "распрямить сосиску" несложно. Надо кривизну сложить с обратной кривизной. Достроить мнимый радиус и рассчитывать точку для каждого угла. Красная дуга получается (физически) по формуле прямоугольного треугольника. Мнимые точки синей дуги находить по формуле, где R - расстояние до опоры лапы. x^2 + y^2 = R^2. Углы известны, R известен, катеты (координаты сетки x,y) считаются через синус и Пифагора. Расстояние до 2-го мнимого центра надо считать по катету сектора доступного окна...
Накассандрил, но нормально, чтоб отпугнуть делать :)

DSCN0316.JPG


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

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

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

Dmitry__ писал(а):Советую очень крепко задуматься

Димон плохого не посоветует. Меня самого так зовут 8)

Добавлено спустя 43 минуты 10 секунд:
dimamichev писал(а):закономерность приращений углов найти не удастся...

servos.jpg

Вот для кого я тут 2 страницы распинался!?
Чтобы попасть из X[0],Y[0] в X[1],Y[1], servo1 должна повернуться на 10° по ЧС, а servo2 на 17° против ЧС за одинаковое время. Если точки отстоят друг от друга далеко, то линия будет кривая из-за несогласованности движения серв. Но, у нас то они будут близко. Поэтому кривизна будет компенсироваться толщиной фломастера. Необходимые углы будем вычислять из координат точки.
Аватара пользователя
Scorpio
 
Сообщения: 2670
Зарегистрирован: 30 сен 2008, 18:49
Откуда: Где-то в Латинской Америке

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

Сообщение Dmitry__ » 09 июл 2018, 09:35

Scorpio писал(а):Чтобы попасть из X[0],Y[0] в X[1],Y[1], servo1 должна повернуться на 10° по ЧС, а servo2 на 17° против ЧС за одинаковое время.

Но это для одного определенного места на поле. Какая зависимость для рисования вертикальной линии в другом секторе? Т.е. понятно, что это все инверсная кинематика, но хочется просто :)

Scorpio писал(а):Димон плохого не посоветует. Меня самого так зовут

Ого, Димонов как собак нерезанных :) :friends:

Добавлено спустя 6 минут 12 секунд:
Вот статейка по теме, ничего так.
Инверсная кинематика в двухмерном пространстве

Ждем собачку :)

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

Пред.След.

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

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

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