Страница 1 из 1

прототип параллельной SCARA

Добавлено: 22 окт 2017, 16:05
artclonic
Продолжаю познавать различные киниматики. Вот вспомнил о такой вот, параллельной SCARA.
В принципе, как рассчитываются координаты в пересчете на углы, вроде все понятно. Подскажите поддерживают ли стандартные прошивки 3д принтеров типа Марлин, Реп -рап... данную кинематику. Хочу простейший прототип построить на МегаРампсе. Вроде, как просто SCARA поддерживают, а вот именно в такой кинематике... вопрос. Или пойти опять программным путем простого пересчета каждой координаты?

Re: прототип параллельной SCARA

Добавлено: 24 окт 2017, 12:46
artclonic
Добрый день, углубился в кинематику...
В положительной зоне Y вроде все понятно...
А вот если точка (X.Y) будет ниже плечей L2? углы на которые поворачиваются ШД1 и ШД 2 будут одинаковые, у точка (X.Y) может быть в двух местах...
Как учесть (расчетно) этот момент? Или когда Y будет в минусовой зоне, как заставить всю конструкцию переориентироваться "вниз" (расчетно)?

Re: прототип параллельной SCARA

Добавлено: 24 окт 2017, 14:08
Serg
А как механически перемещаться из положительной зоны в отрицательную и наоборот?
Например как изобразить вот такую траекторию:
X0 Y0
X100 Y0
X100 Y100
X0 Y100
X0 Y0

Re: прототип параллельной SCARA

Добавлено: 24 окт 2017, 16:52
artclonic
Вот я и спрашиваю.... Надо как то точку ниже плеч опустить... наверное

Re: прототип параллельной SCARA

Добавлено: 30 окт 2017, 10:44
artclonic
Длительное время разбирался с различными кинематиками... Понял, что освоить сложные пока не под силу, поэтому принял решение сделать манипулятор с двумя плечами на ардуино. Есть два пути (прошу подсказки по которому лучше пойти)
Управление каждым плечем ШД мотором
недостатки
Дискретность перемешения - шаг в 1,8 град на 300 мм плеча даст примерно - 9 мм, а мне надо два плеча по 350 мм где-то. (допустим передаточное отношение сделать 1 к 5 и микрошаг выставить 1/16), но что то подсказывает, что все равно в сумме на двух плечах 350 мм будет весомым.
Приемущества - ВСЕ ПО В НАЛИЧИЕ!!!

Управление двумя сервоприводами (даже модель сконструировал уже..)
вижу следующие недостатки - НЕ могу дискретность сервы выставить мене 1 градуса. (наверное можно както изменив саму библиотеку Servo.)Ощущаю некоторы люфт при вращении плеча, на шестерне вроде не заметно, а на окончании плеча, мм 6-8.
Соответсвенно самому придется писать скетч.. (но щаз даже градусы не могу дробными сделать)
Плюсы - простота конструкции - ВСЕ ОЧЕНЬ ПРОСТО!!

Re: прототип параллельной SCARA

Добавлено: 03 ноя 2017, 22:42
tegauss
вижу следующие недостатки - НЕ могу дискретность сервы выставить мене 1 градуса. (наверное можно както изменив саму библиотеку Servo.)
Это потому, что стандартная функция write() библиотеки Servo имеет такой вид:

Код: Выделить всё

void Servo::write(int value)
{
  if(value < MIN_PULSE_WIDTH)
  {  // treat values less than 544 as angles in degrees (valid values in microseconds are handled as microseconds)
    if(value < 0) value = 0;
    if(value > 180) value = 180;
    value = map(value, 0, 180, SERVO_MIN(),  SERVO_MAX());
  }
  this->writeMicroseconds(value);
}
Здесь функция map отображает диапазон 0-180 в диапазон SERVO_MIN()-SERVO_MAX() (обычно это диапазон 544-2400). Делает она это в целых числах, поэтому промежуточные значения теряются. А еще функция write() принимает в себя только целые числа. Именно из-за этих двух причин вы и не можете сделать градусы дробными :)

Если хотите это исправить, можете прямо в ваш скетч поместить обновленную функцию write2():

Код: Выделить всё

#include <Servo.h> 

Servo myservo;

#define MIN_PULSE_WIDTH       544     // the shortest pulse sent to a servo
#define MAX_PULSE_WIDTH      2400     // the longest pulse sent to a servo

void write2(float value)
{
    if(value < 0) value = 0.0f;
    if(value > 180) value = 180.0f;
    myservo.writeMicroseconds(value * (MAX_PULSE_WIDTH - MIN_PULSE_WIDTH) / 180.0f + MIN_PULSE_WIDTH);
}

void setup() 
{ 
  myservo.attach(9);
  write2(2.5f);
} 

void loop() {} 
Вызывать эту функцию нужно уже передавая ей float, а не int, т.е.:

Код: Выделить всё

write2(2.5f);
Библиотеку Servo при этом трогать не потребуется :)

Или же можно напрямую использовать функцию writeMicroseconds(), но это менее удобно.