roboforum.ru

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

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

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

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

Сообщение Scorpio » 05 июл 2018, 05:24

Вполне симпатичные буковки получаются. Или они рукой нарисованы?
if(down) это все равно что if(down==true),if(!down) это if(down==false).
В Arduino IDE также можно писать не только для булевых переменных (классический С этого не допускает). В Ардуино выражение if(down) означает "если down отлично от нуля, то". false эквивалентно нулю.

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

А мне все еще тяжело потому как нет там четко выраженной структуры, какая то куча- мала. Хорошо бы еще пользоваться отступами для {}, чтобы границы логической структуры четко просматривались. В IDE Ардуино есть специальная функция Auto Format или ctrl-T

Добавлено спустя 3 часа 31 минуту:
Indicator 16.jpg
Подобная картинка тоже облегчила бы понимание
Indicator 16.jpg (12.1 КиБ) Просмотров: 1414
Аватара пользователя
Scorpio
 
Сообщения: 2683
Зарегистрирован: 30 сен 2008, 18:49
Откуда: Где-то в Латинской Америке

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

Сообщение dimamichev » 05 июл 2018, 06:47

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

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

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

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

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

Сообщение Dmitry__ » 05 июл 2018, 12:14

Scorpio писал(а):(хотя я еще застал времена, когда "палочками" печатали целые картины.

Правильно, перетянем новичков на темную сторону добра :)
Кста, у меня на аватарке анимированный человек из буковок :)

dimamichev писал(а):Картинку 16 сегментного индикатора желательно в скетче прорисовать-"палочками"?

Есть редакторы, которые рисуют символами. Но я не пользовался. Хорошо бы погуглить: "ascii графика"

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

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

Сообщение dimamichev » 05 июл 2018, 17:32

Интересно-красиво.
У меня так получилось :cry:
Код: Выделить всёРазвернуть
///////////// МАНИПУЛЯТОР ДЛЯ ГРАФИЧЕСКИХ ИЗОБРАЖЕНИЙ скетч №6 буквы алфавита в две строки слов по 7 букв (набор с автономной клавиатуры)  //////////////////////////////
/*3-11--7--12-4
  [ \   ]   / ]
  4 15  5  13 6
  [   \ ] /   ]
  2--9--8--10-5
  [   / [ \   ]
  1 14  2  16 3
  [ /   [   \ ]
  1--7--9--8--6  *///номера узловых точек и сегментов-отрезков букв
  // соответствие бита и номера сегмента в кодировке     1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
  //                                                  0b 0 0 0 0 0 0 0 0 0 0  0  0  0  0  0  0
#include <Servo.h> // подключение библиотеки Servo

Servo servo1;//указываем сервопривод основного поворота (при увел. угла - поворот рычага ВЛЕВО)
Servo servo2;//указываем сервопривод дополнительного поворота (при увел. угла - поворот рычага ВПРАВО)
Servo servo3;//указываем сервопривод подъёмника (при увел. угла - поворот рычага ВВЕРХ)

byte incomingByte = 0;   // для хранения полученного байта

int a=110;//начальный угол 1 сервопривода
int b=114;//начальный угол 2 сервопривода
byte a03=115;//начальный угол 3 сервопривода (угол подъёма фломастера над листом)

int da=8;int db=25;//переменные задающие величину изменения углов
byte K;
byte A; byte B; //переменные для текущих значений углов поворота сервоприводов
byte a3=a03;
byte p1;int p2;byte p3;byte p4;//переменные параметров рисования отрезков
byte i;//счётчик
byte r=0;//счётчик числа рисуемых букв с нуля отсчёта в строке
byte n=15;// единица временного интервала
byte j;// переменная для выбранной буквы
byte s=0;//переменная числа строк с номера 0 до 1 включительно

// таблица кодов сегментов-букв
unsigned short  tablB[34]={0b0010010001001100, //0-А//
                           0b1011001111110000, //1-Б//
                           0b1001001110111001, //2-В//
                           0b1001000000110000, //3-Г//
                           0b0010011100001100, //4-Д//
                           0b1001001110110000, //5-Е//
                           0b0100100000001111, //6-Ж//
                           0b0010001101111000, //7-З//
                           0b1011010000001100, //8-И//
                           0b1011110000001100, //9-Й//
                           0b1001000010001001, //10-К//
                           0b0010010000001100, //11-Л//
                           0b1011010000001010, //12-М//
                           0b1011010011000000, //13-Н//
                           0b1011011100110000, //14-О// 
                           0b1011010000110000, //15-П//
                           0b1001010011110000, //16-Р//
                           0b1001001100110000, //17-С//
                           0b0100100000110000, //18-Т//
                           0b0011011111000000, //19-У//
                           0b0101110011110000, //20-Ф//
                           0b0000000000001111, //21-Х//
                           0b1011011100000001, //22-Ц//
                           0b0011010011000000, //23-Ч//
                           0b1111111100000000, //24-Ш//
                           0b1111111100000001, //25-Щ//
                           0b0110100101100000, //26-Ъ//
                           0b1111011010000000, //27-Ы//
                           0b1011001111000000, //28-Ь//
                           0b0010011101110000, //29-Э//
                           0b1111110110010000, //30-Ю//
                           0b0011010011110100, //31-Я//
                           0b1111111111111111, //32// рисуем все 16 сегментов//
                           0b0000000000000000};//33-пробел

byte tablD[32]={0,1,16,17,10,11,2,3,14,15,8,9,0,1,16,17,2,3,14,15,4,5,12,13,14,15,0,1,14,15,10,11};//номера элементов из массива координат узловых точек сегментов
//нужна таблица для прохождения стержнем фломастера по всем 16 сегментам буквы           
void setup()
{
pinMode(8,INPUT);  //кнопка запуска рисования буквы/ 
//Serial.begin(9600);
servo1.attach(5);// подключаем переменную servo к соответствующему выводу платы Ардуино
servo2.attach(6);
servo3.attach(7);
servo1.write(a);//начальная установка положения
servo2.write(b);
servo3.write(a03);
delay(1000);
}
//////////////////////////////////////////////////////////////////////////////////////////////
void loop()
{

if (s<2)//условие рисования 2 строк букв
{
up_down_pen(false);
for (r=0;r<7;r++)// условие числа рисуемых букв
{
int tablA[18]={a,          b,
               a+db/4,     b+db/2,
               a+db/2,     b+db,
               a+db/2-da,  b+db,
               a+db/4-da,  b+db/2,
               a-da,       b,
               a+db/2-da/2,b+db,
               a+db/4-da/2,b+db/2,
               a-da/2,     b }; // координаты узловых точек сегментов
/////////////////////////////////////////////////////////////////////
metka:if (digitalRead (8)==LOW)//если кнопка рисования установленного символа нажата
{ delay(50*n);//ждём отпускания - пауза
j=(analogRead(A0)/175)+6*(analogRead(A1)/175);//определяем номер рисуемой буквы по данным с "клавиатуры"
if(j>33){delay (n);goto metka;}//запрет на использование номера несуществующего символа
}else {delay (n);goto metka;}//возврат в ожидании нажатия кнопки
///////////////////////////////////////////////////////////////////////

for( K=0;K<=31;K=K+2)//исходное условие прохождения 16 сегментов символа буквы фломастером
{A=tablA[tablD[K]];B=tablA[tablD[K+1]];//задание координат исходной точки каждого сегмента
if(bitRead(tablB[j],15-K/2)==1)//проверка условия - нужно ли рисовать данный сегмент
{servo1.write(A);servo2.write(B);delay(n);
up_down_pen(true);
if(K>=0&&K<11){p1=db/2;p2=1;p3=2;p4=2;drawing_line();}//условие рисования вертикальных отрезков-сегментов
if(K>=12&&K<23){p1=da/2;p2=-1;p3=0;p4=1;drawing_line();}//условие рисования горизонтальных отрезков-сегментов
if(K>=24&&K<27){p1=db/4;p2=0;p3=1;p4=1;drawing_line();servo1.write(A+db/4-da/2);p1=(db/4)-2;drawing_line();}//условие рисования диагональных вверх-вправо отрезков-сегментов
if(K>=28&&K<31){p1=3*db/16;p2=2;p3=3;p4=2;drawing_line();p2=1;p3=1;p4=1;drawing_line();}//условие рисования диагональных вверх-влево отрезков-сегментов
up_down_pen(false);}}
//////////////////////////////////////////////////////////////////////
a=a-da-2;
}
s++;a=98;b=85;
}
}
//////функция поднимания-опускания фломастера (значения аргумента false и true  соответственно)/////
void  up_down_pen(boolean  down)
{
  if(down)while (a3>85){servo3.write(a3--);delay(n);}
  else  while (a3<a03){servo3.write(a3++);delay(n);}
}

/////////////////функция рисования отрезков в разных направлениях по заданным параметрам
  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);}
  }


Добавлено спустя 3 часа 3 минуты 33 секунды:
Всё таки предел по градусному хождению серв исчерпан. Лучше не будет на таком приводе. От 0-180 надо переходить на 500-2500. И искать как строить отрезки между двумя точками таким манипулятором. Вот нашёл старый проект молодого человека, но там не понятно - чтоб построить прямой отрезок надо самопальную библиотеку включать. Да и точность не намного лучше этой, но сетка координатная - обычная, а не коническая.
http://arduino.ru/forum/proekty/pishush ... oprivodakh
Вложения
привет ардуино.jpg
Аватара пользователя
dimamichev
 
Сообщения: 1386
Зарегистрирован: 03 янв 2013, 16:27

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

Сообщение Madf » 05 июл 2018, 18:28

Не лучше? У него нет дерганья как у паралитика. :)
Madf
 
Сообщения: 3298
Зарегистрирован: 03 янв 2012, 12:55
Откуда: Москва
прог. языки: VB6, BASCOM, ASM...

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

Сообщение dimamichev » 05 июл 2018, 21:45

Madf писал(а):Не лучше? У него нет дерганья как у паралитика. :)

А по моему нормальный рабочий процесс.
Аватара пользователя
dimamichev
 
Сообщения: 1386
Зарегистрирован: 03 янв 2013, 16:27

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

Сообщение Madf » 05 июл 2018, 22:58

Ну если сравнивать с этим:


То работы ещё непочатый край.
Madf
 
Сообщения: 3298
Зарегистрирован: 03 янв 2012, 12:55
Откуда: Москва
прог. языки: VB6, BASCOM, ASM...

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

Сообщение Scorpio » 05 июл 2018, 23:26

dimamichev писал(а):А по моему нормальный рабочий процесс.

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

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

Сообщение dimamichev » 05 июл 2018, 23:58

Можно, надо поднимать стержень если только следующий сегмент не рисуем - было уже сказано, запамятовал я.
Сейчас пытаюсь (у парня по ссылкам ничего уже нет) вывести связи приращений углов поворота серв с приращениями координат х и у. Без этого понижать градус нет смысла :D , а соответственно и пытаться получить прямую линию.
Аватара пользователя
dimamichev
 
Сообщения: 1386
Зарегистрирован: 03 янв 2013, 16:27

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

Сообщение Scorpio » 06 июл 2018, 02:18

dimamichev писал(а):Можно, надо поднимать стержень если только следующий сегмент не рисуем

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

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

Сообщение dimamichev » 06 июл 2018, 07:39

Scorpio писал(а):
dimamichev писал(а):Можно, надо поднимать стержень если только следующий сегмент не рисуем

И выстраивать логически последовательность сегментов (а не рисовать их тупо по порядку нумерации), чтобы получить ключевые точки для рисования максимума линий без отрыва.

А это уже посложней...
Аватара пользователя
dimamichev
 
Сообщения: 1386
Зарегистрирован: 03 янв 2013, 16:27

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

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

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

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

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

Надо попробовать-подумать, условие "надо поднимать стержень если только следующий сегмент не рисуем" оказалось обломным при одинаковой последовательности прохождения сегментов всех букв.
Аватара пользователя
dimamichev
 
Сообщения: 1386
Зарегистрирован: 03 янв 2013, 16:27

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

Сообщение Madf » 06 июл 2018, 13:58

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

Пред.След.

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

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

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