roboforum.ru

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

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

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

dimamichev » 12 авг 2018, 16:52

Мой день 800, я в отпуске...
Везде есть ключи в разном количестве, проще заказать конечно готовое, пока придут - отдохнуть. Сервы дают наивность в рисовании в отличии от шаговиков.
Вложения
IMG.jpg

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

Dmitry__ » 12 авг 2018, 16:59

dimamichev писал(а):Мой день 800, я в отпуске...

А цена монтажной платы? А цена ключей? Вот тебе прям выгоднее потратить день на пайку плат, чем потратить 110р x2 ? НЕ ВЕРЮ! :)

dimamichev писал(а): Сервы дают наивность в рисовании в отличии от шаговиков.

Функция random сделает любую наивность с точной механикой. Наоборот - нет :)

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

ilalexey » 12 авг 2018, 17:01

Dmitry__ писал(а):А вот паять на рассыпухе - это как нужно себя не любить?

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

Я это давно прочувствовал. Тебе ли не знать :)
Пол часа работы(этот проект):
Вложения
03.jpg

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

dimamichev » 12 авг 2018, 17:09

Ну значит надо остановится пока на отрезках, заказать платки, и разбираться с библиотекой. А за одно искать связь между скоростью вращения одного ШД относительно другого и рисуемой в итоге траекторией.

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

Dmitry__ » 12 авг 2018, 17:31

dimamichev писал(а):А за одно искать связь между скоростью вращения одного ШД относительно другого и рисуемой в итоге траекторией.

В поисковике: "AccelStepper XY plotter"

https://ngin.pro/arduino/158-kak-sdelat-mini-chpu-2d-plotter-s-ispolzovaniem-dvd-privodov-l293d-motor-shield-i-arduino.html


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

Scorpio » 12 авг 2018, 18:17

А мне нравится, что dimamichev делает все сам, а не копирует чужие проекты. У него же цель научится. Нарисовать домик можно и рукой или распечатать на принтере. Это не самоцель.
Можем прикрутить генератор надписей красивыми шрифтами. Надо наладить связь с ПК, как в предыдущем проекте. Уметь получать координаты точек x,y для рисования очередного отрезка, выполнять команды "PDWN", "PUP" (опустить/поднять перо) и сообщать ПК "FIN", после окончания каждой операции. Мне понадобится рабочая область и где начало координат.
В будущем, действительно научиться обрабатывать G-коды, чтобы как-то стандартизировать свое устройство.

Добавлено спустя 7 минут 22 секунды:
Вообще, первая рисовалка была интереснее в интерактивном плане. Больше похожа на руку с пером, чем на станок. И робот с мордочкой при ней был. А тут бездушная железяка :)

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

ilalexey » 12 авг 2018, 18:21

Так с самого начала ветер веет в сторону обучения учеников. Толку их учить библам(чужим к тому же).
----
Кстати при пайке драйверов не меньше времени/энергии расходуется чем при пайке улн. УЛН мне показалось быстрей паять. Можно по контактам прикинуть. У драйверов ещё нужно свичи подпаивать, а это дохрена пайки лишних контактов.
Последний раз редактировалось ilalexey 12 авг 2018, 18:52, всего редактировалось 1 раз.

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

Dmitry__ » 12 авг 2018, 18:46

Scorpio писал(а):А мне нравится, что dimamichev делает все сам, а не копирует чужие проекты.

Так он топчется на одном месте уже 2-й год. Это просто жесть, столько убить времени. Ардуина и придумана так, чтоб следующая поделка самоделкина была лучше оригинала. :pardon:

Все надо начинать с плана, я не просто так раньше задал вопрос о плане. Так и знал, что с серв все перейдет на плоттер с шаговиками. Эту туеву хучу времени можно было потратить со смыслом, но dimamichev слушает советы только после десятой грабли :)
В плане изучения языка Си - ничего не сделано, все на уровне 2-х летней давности. Как раз из-за того, что не смотрит код других программистов. Все сама, сама :)
Представь, ему сейчас сказать, что в контроллере есть прерывания и без них никуда? :)

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

Scorpio » 12 авг 2018, 18:55

Это да. Уже бы к ООП перейти. Те же шаговики правильнее оформить в виде классов. А мы опять к глобальным переменным скатываемся.

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

Dmitry__ » 12 авг 2018, 20:47

Ооооооо, гляньте что человек сделал. И шаговики, и BLE. Надо его разводить на исходники :crazy:
Мне нужен BLE :)
http://roboforum.ru/forum10/topic18053.html

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

dimamichev » 12 авг 2018, 20:50

Scorpio писал(а):А мне нравится, что dimamichev делает все сам, а не копирует чужие проекты. У него же цель научится. Нарисовать домик можно и рукой или распечатать на принтере. Это не самоцель.
Можем прикрутить генератор надписей красивыми шрифтами. Надо наладить связь с ПК, как в предыдущем проекте. Уметь получать координаты точек x,y для рисования очередного отрезка, выполнять команды "PDWN", "PUP" (опустить/поднять перо) и сообщать ПК "FIN", после окончания каждой операции. Мне понадобится рабочая область и где начало координат.
В будущем, действительно научиться обрабатывать G-коды, чтобы как-то стандартизировать свое устройство.

Добавлено спустя 7 минут 22 секунды:
Вообще, первая рисовалка была интереснее в интерактивном плане. Больше похожа на руку с пером, чем на станок. И робот с мордочкой при ней был. А тут бездушная железяка :)

Рабочая область составляет по - Y 35 мм, по - X 75 мм. Начало координат как таковое отсутствует, шаговики не запоминают своего положения, задаю обратным ходом по отрезку с "минус суммой всех пройденных координат". Эта функция даёт иногда сбой - тогда просто корректирую руками, по меткам фломастера. Если на картинке объёмных фигур, то так. Соответственно, шаги по горизонтали с минусом - вправо, с плюсом - влево, по вертикали вниз и вверх соответственно.
Конечно первая рисовалка интереснее, была мысль крестики - нолики сделать с голосовым общением, без компа, но увлеклись прямоугольной системой и буквами порядка 10мм размера и меньше - отсюда шаговики (таков план, или его отсутствие). Хватит ли моих скудных ресурсов без библиотек, прерываний и переделки схемы для букав ? - возможно.
Вложения
IMG — копия.jpg

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

Scorpio » 12 авг 2018, 21:42

dimamichev писал(а): шаговики не запоминают своего положения

Поэтому в 3Д принтерах сначала выполняется установка начального положения по концевикам. Тебе придется это внедрить, иначе так и будешь руками двигать. Я, в любом случае, буду выдавать тебе абсолютные координаты для рисования. Только сначала реализуй, то что я тебе писал выше по протоколу обмена с ПК и отладь на СОМ мониторе.
Dmitry__ писал(а):Мне нужен BLE :)

На ESP32 нормальный BLE. Сам пробовал.

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

Scorpio » 13 авг 2018, 03:53

Лови программку
stepper1.jpg

Запуск по аналогии с шашками. Коннектится на скорости 19200.
Для начала попробуй перемещать на точку GO (можно задавать кликом на поле). Посмотреть надпись после выбора шрифта - SHOW, очистить экран - CLR, WRITE дает задание на отрисовку. Если рисовалка при этом не подключена выведет массив точек в окошко под кнопкой CONNECT. Таким способом можно нагенерить библиотеку букв для дуины. Чем мельче и витееватей шрифт, тем больше отрезков. Т.к. максимальное разрешение 1мм, при мелком шрифте будет топтаться на месте. Попробуй для начала шрифт по умолчанию, как на картинке.
Не забудь, что после каждого отрезка ждет подтверждения "FIN". И, что координаты конца отрезка абсолютные.

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

dimamichev » 13 авг 2018, 07:30

Спасибо, буду переделывать скетч на монитор и координаты конца, схему с концевиками делать.

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

dimamichev » 13 авг 2018, 11:31

Скетч подправил, программа находит СОМ3, арда на СОМ 5- в IDE переставляю на 3 - ничего не происходит.
Код: Выделить всёРазвернуть
///////////// СТАНОК ДЛЯ РИСОВАНИЯ //////////////////////////////
#include <Servo.h>

#define motor_Y_f1 8
#define motor_Y_f2 9
#define motor_Y_f3 10
#define motor_Y_f4 11

#define motor_X_f1 4
#define motor_X_f2 5
#define motor_X_f3 6
#define motor_X_f4 7
String inputString = ""; 
byte a0=140;byte a=a0;// угол исходного положения пера - поднято
int n=10;//переменная единицы временного интервала
int i=0;// счётчик
int i1=0;// счётчик
float X=0;float Y=0;//переменные учёта положения пера относительно начала координат

byte tablY[16]={0,1,1,1,
                1,1,0,1,
                1,0,1,1,
                1,1,1,0};// ТАКТЫ ВКЛЮЧЕНИЯ - полношаговый режим в одну обмотку питанием (биполярный)
byte tablX[16]={1,0,0,0,
                0,1,0,0,
                0,0,1,0,
                0,0,0,1};// ТАКТЫ ВКЛЮЧЕНИЯ - полношаговый режим в одну обмотку питанием (униполярный)
                           

Servo servo1;



void setup() {
Serial.begin(19200);
servo1.attach(12);
servo1.write(a0);delay(10*n);servo1.write(a0-5);//начальный подъём пера
pinMode(motor_Y_f1, OUTPUT);   //  определение вывода как ВЫХОД
pinMode(motor_Y_f2, OUTPUT);
pinMode(motor_Y_f3, OUTPUT);
pinMode(motor_Y_f4, OUTPUT);
digitalWrite(motor_Y_f1, HIGH); digitalWrite(motor_Y_f2, HIGH); digitalWrite(motor_Y_f3, HIGH); digitalWrite(motor_Y_f4, HIGH);// исходное состояние  - обмотки обесточены 
pinMode(motor_X_f1, OUTPUT);   //  определение вывода как ВЫХОД
pinMode(motor_X_f2, OUTPUT);
pinMode(motor_X_f3, OUTPUT);
pinMode(motor_X_f4, OUTPUT);
digitalWrite(motor_X_f1, LOW); digitalWrite(motor_X_f2, LOW); digitalWrite(motor_X_f3, LOW); digitalWrite(motor_X_f4, LOW);// исходное состояние  - обмотки обесточены 
}

void loop()
    {
     CheckSerial(); 
    }
/////////////////////////////////////////////////////////////
//////// функция постановки пера в точку с координатами 1 четверти для рабочего поля
////////////////////////////////////////////////////////////
void  Toschka (int x, int y)
{
  Otrezok((x-X),(y-Y));
  }   
/////////////////////////////////////////////////////////////
////// функция рисования отрезка длиной d под углом a
////////////////////////////////////////////////////////////
void Vektor(float d,int a)
{
  float x=d*cos(PI*a/180); float y=d*sin(PI*a/180);
   Otrezok(x,y);
  }
////////////////////////////////////////////////////////////////
////функция рисования отрезка по конечным координатам x и y
////////////////////////////////////////////////////////////////
void Otrezok(float x, float y)
{
  int nx;
  int ny=10;//принимаем как постоянную для задания скорости
  if (x!=0&&y!=0){nx=ny*2.35*abs(y)/abs(x);if (nx<3){nx=5;}}else {nx=50;}// вычисляем вторую постоянную для отрезка с учётом крайних недопустимых значений - 0 и бесконечность
  long tx=millis();long ty=millis();
  Y=Y+y;//текущий учёт положения пера относительно начала отсчёта
  y=4.7*y;//переводной множитель из миллиметров в число шагов двигателя
  X=X+x;//текущий учёт положения пера относительно начала отсчёта
  x=2*x;//переводной множитель из миллиметров в число шагов двигателя
  int j1=0;int k1;if (y>=0){k1=1;}else {k1=-1;}
  int j2=0;int k2;if (x>=0){k2=1;}else {k2=-1;}
  while ((j1<=(int)abs(y)-1)||(j2<=(int)abs(x)-1))
  {
  if(j1!=(int)abs(y)&&(millis()-ty>ny))//условие совершения шага
  {ty=millis();
  if(i<0){i=12;}if(i>12){i=0;}////условия зацикливания тактов по кругу
  digitalWrite(motor_Y_f1, tablY[i]);digitalWrite(motor_Y_f2, tablY[i+1]);digitalWrite(motor_Y_f3, tablY[i+2]);digitalWrite(motor_Y_f4, tablY[i+3]);
  i=i+4*k1;j1=j1+1;//условия перехода на следующий такт
  }
  if(j2!=(int)abs(x)&&(millis()-tx>nx))//условие совершения шага
  {tx=millis();
  if(i1<0){i1=12;}if(i1>12){i1=0;}//условия зацикливания тактов по кругу
  digitalWrite(motor_X_f1, tablX[i1]);digitalWrite(motor_X_f2, tablX[i1+1]);digitalWrite(motor_X_f3, tablX[i1+2]);digitalWrite(motor_X_f4, tablX[i1+3]);
  i1=i1+4*k2;j2=j2+1;//условия перехода на следующий такт
  } 
  }
  digitalWrite(motor_Y_f1, HIGH); digitalWrite(motor_Y_f2, HIGH); digitalWrite(motor_Y_f3, HIGH); digitalWrite(motor_Y_f4, HIGH);// исходное состояние  - обмотки обесточены
  digitalWrite(motor_X_f1, LOW); digitalWrite(motor_X_f2, LOW); digitalWrite(motor_X_f3, LOW); digitalWrite(motor_X_f4, LOW);// исходное состояние  - обмотки обесточены     
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////функция возврата пера в исходное положение на начало отсчёта
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void VozvratPera ()
{
  up_down_pen(false);
  Otrezok (-X,-Y);
  X=0;Y=0;

  }
  //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////функция поднимания-опускания пера (значения аргумента false и true  соответственно)/////
void  up_down_pen(boolean  k)
{
  while (a>87&&k==1)
  {servo1.write(a);a=a-1;delay(n);}if(k== true ){a=87;}
   while (a<a0&&k==0)
  {servo1.write(a);a=a+1;delay(n);}if (k==false){a=a0;delay(10*n);servo1.write(a0-5);}
  }
  /////////////////////////////////////////////////////////////////////////////////////////////////
  void CheckSerial()
{
//////////////////////////////////////////////////////////////////////////////
  while (Serial.available())//считываем строку данных пока они поступают
  {
    char inChar = (char)Serial.read();
    if (inChar == '\n')     //если окончание строки
    {
      MakeCmd();//обрабатываем её данной функцией
      break;
    }
    else inputString += inChar;// иначе удлиняем строку на один символ
  }
}
/////////////////////////////////////////////////////////////////////////////////

///////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////
void MakeCmd()
{
    int s=inputString.length();// присваиваем переменной у число символов в строке
    if (s<3||s>6)return;//если их меньше 3 или больше 6, выходим из функции
    String cmd=inputString;// передаём строку другой переменной
    inputString = "";//"обнуляем переменную"
/////////////////////////////////////////   
if (cmd=="PDWN"){up_down_pen(true);}//
if (cmd=="PUP"){up_down_pen(false);}//   
  int k=cmd.indexOf(',');
  if(k>0)//получены координаты точки
  {
    int x=cmd.substring(0,k).toInt();
    int y=cmd.substring(++k).toInt();
    x=constrain(x, 0, 75);
    y=constrain(y, 0, 35);
    Toschka (-x,y);SendMail("FIN");
  }
}

///////////////////////////////////////////////////////////////////////////////////////////////////////
void SendMail(String mail)                  // ОТПРАВКА СООБЩЕНИЙ
{
  Serial.println(mail);
}
///////////////////////////////////////////////////////////////////////////////////////////////////////


cron
Rambler\'s Top100 Mail.ru counter