Технический форум по робототехнике.
linvinus » 15 июл 2013, 16:37
А как ты узнаёшь в каком положении находится укладчик в момент начала программы?
И по программе у тебя получается ты сначала мотаешь все витки потом двигаешь укладчик.
X - это количество витков в одном слое.
NRot/X = количество слоёв
Должно быть что то типа такого.
- Код: Выделить всё • Развернуть
int16_t Xtmp;
int16_t Xstep=2;//сдвигаем укладчик на диаметр провода после каждого оборота
void laying()
{
if(Xtmp>0){
if( Xtmp<X)
Xtmp++;
else
Xtmp=-1;//меняем направление
}else{
if( (-1*Xtmp)<X)
Xtmp--;
else
Xtmp=1;//меняем направление
}
stepper1.moveTo( (Xtmp>0 ? Xstep : -1*Xstep ) );
stepper1.runToPosition();
stepper1.setCurrentPosition(0);
}
..........
NRot_tmp = 0;
Xtmp=1;
while(NRot_tmp < NRot)
{
forward();//один виток
laying();//двигаем укладчик.
NRot_tmp++;
}
............
ilalexey » 15 июл 2013, 20:51
в моём случае X - это "диаметр провода", другими словами 1 небольшой сдвиг после 1 витка.
Вопрос в том, как найти, быть ему положительным или отрицательным.
..не совсем понял выражение в скобках: stepper1.moveTo( (Xtmp>0 ? Xstep : -1*Xstep ) );
Добавлено спустя 1 час 15 минут 30 секунд:в симуляции мотор1 делает шаг, потом стоит дёргается.
Добавлено спустя 45 минут 50 секунд:пока так(вроде) вышло:
- Код: Выделить всё • Развернуть
#include <AccelStepper.h>
// Define some steppers and the pins the will use
AccelStepper stepper1; // Defaults to AccelStepper::FULL4WIRE (4 pins) on 2, 3, 4, 5
AccelStepper stepper2(AccelStepper::FULL4WIRE, 6, 7, 8, 9);
AccelStepper stepper3(AccelStepper::FULL4WIRE, 10, 11, 12, 13);
byte NRot = 9; //value of rotation
int NRot_tmp = 0;
bool lay_dir = true;
int lay_tmp = 0;
int lay_min = 0;
int lay_max = 3;
int X = 10;
char inc_b; // incoming serial data;
//char buff[]= "0000000000";
void forward()
{
stepper2.moveTo(40);
stepper2.runToPosition();
stepper2.setCurrentPosition(0);
stepper3.moveTo(20);
stepper3.runToPosition();
stepper3.setCurrentPosition(0);
stepper2.moveTo(-40);
stepper2.runToPosition();
stepper2.setCurrentPosition(0);
stepper3.moveTo(-20);
stepper3.runToPosition();
stepper3.setCurrentPosition(0);
}
void backward()
{
stepper2.moveTo(-40);
stepper2.runToPosition();
stepper2.setCurrentPosition(0);
stepper3.moveTo(-20);
stepper3.runToPosition();
stepper3.setCurrentPosition(0);
stepper2.moveTo(40);
stepper2.runToPosition();
stepper2.setCurrentPosition(0);
stepper3.moveTo(20);
stepper3.runToPosition();
stepper3.setCurrentPosition(0);
}
void laying()
{
stepper1.moveTo(X);
stepper1.runToPosition();
stepper1.setCurrentPosition(0);
}
void laying_b()
{
stepper1.runToNewPosition(-X);
stepper1.setCurrentPosition(0);
//stepper1.moveTo(-X);
//stepper1.runToPosition();
//stepper1.setCurrentPosition(0);
}
void laying_home()
{
stepper1.disableOutputs();
stepper2.disableOutputs();
stepper3.disableOutputs();
}
void setup()
{
Serial.begin(9600);
Serial.println("Enter 'f' or 'b' for dir then value for number of rotation");
stepper1.setMaxSpeed(600.0);
stepper1.setAcceleration(400.0);
stepper2.setMaxSpeed(1000.0);
stepper2.setAcceleration(600.0);
stepper3.setMaxSpeed(1000.0);
stepper3.setAcceleration(600.0);
}
void loop()
{
//int t=0;
if (Serial.available())
{
delay(10);
inc_b = Serial.read();
if (inc_b == 'f') //forward
{
NRot_tmp = 0;
while(NRot_tmp < NRot)
{
forward();
if (lay_dir == true && lay_tmp < lay_max)
{
X = X*1;
lay_dir = true;
lay_tmp++;
}
else
{
lay_dir = false;
}
if (lay_dir == false && lay_tmp == lay_max || lay_tmp == lay_min)
{
X = X*-1;
lay_dir = false;
lay_tmp--;
}
else
{
lay_dir = true;
}
laying();
NRot_tmp++;
}
//NRot = 0;
Serial.flush();
}
else if (inc_b == 'b') //backward
{
NRot_tmp = 0;
while(NRot_tmp < NRot)
{
backward();
if (lay_dir == true && lay_tmp < lay_max)
{
X = X*1;
lay_dir = true;
lay_tmp++;
}
else
{
lay_dir = false;
}
if (lay_dir == false && lay_tmp == lay_max || lay_tmp == lay_min)
{
X = X*-1;
lay_dir = false;
lay_tmp--;
}
else
{
lay_dir = true;
}
laying();
NRot_tmp++;
}
Serial.flush();
}
else if (inc_b == 'l') //laying
{
laying();
Serial.flush();
}
else if (inc_b == 'q') //exit
{
laying_home();
Serial.flush();
}
}
}
Добавлено спустя 1 час 39 минут 22 секунды:... что-то не то
ilalexey » 17 июл 2013, 14:32
сообщения не правятся
Добавлено спустя 10 минут 48 секунд:вот так работает:
- Код: Выделить всё • Развернуть
если (lay_dir похож на true и lay_tmp меньше lay_max или lay_dir похож на true и lay_tmp похож на lay_min или lay_dir похож на false и lay_tmp похож lay_min)
- Вложения
-

-
proteus.zip
- симуляция и код
- (31.03 КиБ) Скачиваний: 0
ilalexey » 19 июл 2013, 18:39
продолжил наращивать фишки
- Вложения
-

-
step_lcd.zip
- (41.68 КиБ) Скачиваний: 0
Tomasina » 01 фев 2016, 11:46
Подскажите, как в этой библиотеке выводить данные на дисплей, не прерывая работу ШД?
Дисплей (на базе ТМ1637) или OLED (на базе SSD1306), нужно отображать пройденное кареткой расстояние, а это хотя бы 1-2 раза в секунду нужно обновлять дисплей, и в это время движок замирает (по звуку слышно), а мне нужно строго равномерное движение.
Можно ли сделать отображение данных "в фоне"? Вроде на видео в CNC на Arduino таких проблем нету. Как реализовать такое?
Возможно просто не понимаю, как она работает.
ilalexey » 01 фев 2016, 12:50
На лету так сразу и не скажу даже. С меня программер неважный(собственно почему и задаю тут вопросы).
Первое, что в голову пришло, это всунуть строчку вывода в нужное место.
Как вариант - отдельную платку для этого.
ilalexey » 25 фев 2017, 00:01
Немного фоток самой конструкции:
- Вложения
-

-

-
