Шаговый двигатель, сдвиг в начало координат

Soronorus

✩✩✩✩✩✩✩
6 Сен 2020
11
1
Доброго времени суток, пытаюсь изучить Arduino, с лампочками наигрался с кнопочками тоже
захотелось чего-то по сложнее но не тут то было

Идея он же алгоритм

Есть циркулярная пила, но когда она пилит на максимальном выдвинутом диске идут сколы,
если опустить её то все ок, но вручную постоянно подгонять под материал надоело, пилю я в основном доски толщиной 16, 32, 50.

Сделал механику которая выполняет данную задачу.
теперь хочу это автоматизировать, нажал на нужную кнопку и пила встала в одно из необходимых высот,
Из оборудования есть моторчик и направляющие от матричного принтера(LX-300), концевик по сути копка, еще три копки arduino nanо, Драйвер мотора L298N

Мотор EM323 EPSON, на направляющих через ременную передачу ездите голова к которой прикреплен рычаг поднимающей и опускающей пилу.

Концевик стоит в начале координат
первая проблема с которой столкнулся и не знаю как решить
как сделать чтобы при старте ардуинка смещала голову в начало координат, и останавливалась там. Научился двигать головой в цикле void, а вот как сделать одно действие и больше его не выполнять тут у меня пробел. помогите советом, ну или если кто готов помочь реализовать за денежку то в принципе готов оплатить, по итогу решения все чертежи и что использовал также готов предоставить сообществу.
 

Эдуард Анисимов

★★★★★★✩
23 Сен 2019
2,407
976
58
Марий-Эл
Научился двигать головой в цикле void
Странный цикл. Первый раз о таком слышу.

Если пользуетесь Arduio IDE. Есть функции setup() и loop().
В функции setup() после всех настроек портов и периферии включаете двигатель на поднятие пилы и в цикле while() ждёте когда концевой датчик сработает. Вываливаетесь из цикла while(). Останавливаете двигатель.
 

Soronorus

✩✩✩✩✩✩✩
6 Сен 2020
11
1
Еслиб примерчик какой а то я говорю двигателю сместится на 100 шагов и все, пока он этого не сделает программа не начто не реагирут
 

b707_2

★★✩✩✩✩✩
22 Июл 2020
182
51
Еслиб примерчик какой а то я говорю двигателю сместится на 100 шагов и все, пока он этого не сделает программа не начто не реагирут
Вы бы код свой показали. который не работает - может тогда и посоветуют что.
А пока дело идет к тому. что нужно все написать за вас - а это платная услуга.
 

Soronorus

✩✩✩✩✩✩✩
6 Сен 2020
11
1
управление мотором пилы:
#include <Stepper.h>

int remore = 1000;   // кнопка на 5 пине. 1000 шагов
int remore_1 = 2000; // кнопка на 6 пине. 2000 шагов
int remore_2 = 3000; // кнопка на 7 пине. 3000 шагов
// for your motor
const int stepsPerRevolution = 200;
// initialize the stepper library on pins 8 through 11:
Stepper myStepper(stepsPerRevolution, 8, 9, 10, 11);   // пины подлкючения мотора
int butt_count;
bool oldPress = 1;
bool Press = 0;

bool oldPress_1 = 1;
bool Press_1 = 0;

bool oldPress_2 = 1;
bool Press_2 = 0;

int butt = 12;    // ПИН КОНЦЕВИКА
void setup() {
  // set the speed at 60 rpm:
  myStepper.setSpeed(60);                       // СКОРОСТЬ МОТОРА
  // initialize the serial port:
  Serial.begin(9600);

  pinMode(5, INPUT);
  pinMode(6, INPUT);
  pinMode(7, INPUT);
  pinMode(10, INPUT);
}

void loop() {
  Press = digitalRead(5);
  Press_1 = digitalRead(6);
  Press_2 = digitalRead(7);
  butt_count = digitalRead(10);

  if (butt_count == LOW) {
    myStepper.step(-remore_2);
  } else {

  if (!Press) {
    if  (Press != oldPress) {
      myStepper.step(remore);
    }
  } else {
    oldPress = 1;
  }

  if (!Press_1) {
    if  (Press_1 != oldPress_1) {
      myStepper.step(remore_1);
    }
  } else {
    oldPress_1 = 1;
  }

  if (!Press_2) {
    if  (Press_2 != oldPress_2) {
      myStepper.step(remore_2);
    }
  } else {
    oldPress_2 = 1;
  }
  }
}
 

b707_2

★★✩✩✩✩✩
22 Июл 2020
182
51
теперь укажите, где те строчки. что нужно выполнить один раз и больше не выполнять
 

Soronorus

✩✩✩✩✩✩✩
6 Сен 2020
11
1
перчитал понял что нужно в
setup сдвинуть от я тупой. соррян.
 

Soronorus

✩✩✩✩✩✩✩
6 Сен 2020
11
1
Всем спасибо все получилось
управление пилой:
#include <Stepper.h>

int remore = 1000;   // кнопка на 5 пине. 1000 шагов
int remore_1 = 2000; // кнопка на 6 пине. 2000 шагов
int remore_2 = 300; // кнопка на 7 пине. 3000 шагов
// for your motor
const int stepsPerRevolution = 200;
// initialize the stepper library on pins 8 through 11:
Stepper myStepper(stepsPerRevolution, 8, 9, 10, 11);   // пины подлкючения мотора
int butt_count;
bool oldPress = 1;
bool Press = 0;

bool oldPress_1 = 1;
bool Press_1 = 0;

bool oldPress_2 = 1;
bool Press_2 = 0;
bool bstop=0;

int butt = 12;    // ПИН КОНЧЕВИКА
void setup() {
  // set the speed at 60 rpm:
  myStepper.setSpeed(100);                       // СКОРОСТЬ МОТОРА
  // initialize the serial port:
  Serial.begin(9600);
  pinMode(5, INPUT_PULLUP);
  pinMode(6, INPUT_PULLUP);
  pinMode(7, INPUT_PULLUP);
  pinMode(12,INPUT_PULLUP);
  pinMode(8,OUTPUT);
  pinMode(9, OUTPUT);
  pinMode(10, OUTPUT);
  pinMode(11,OUTPUT);
 
while (1){
  myStepper.step(10);
  if (!digitalRead(12)) {
  bstop=1;
  break;
  }}
  }


void loop()
{
 
if (!digitalRead(5)) {
  if (bstop == 0){
    while(1){
      myStepper.step(10);
      if(!digitalRead(12)){
        bstop=1;
        break;}
      }
    }
  myStepper.step(-200);
  bstop=0;
  }
if (!digitalRead(6)) {
  if (bstop == 0){
    while(1){
      myStepper.step(10);
      if(!digitalRead(12)){
        bstop=1;
        break;}
      }
    }
  myStepper.step(-500);
  bstop=0;     
  }
if (!digitalRead(7)) {
  if (bstop == 0){
    while(1){
      myStepper.step(10);
      if(!digitalRead(12)){
        bstop=1;
        break;}
      }
    }
  myStepper.step(-800);
  bstop=0;     
  } 
 
 
 
  }
 
  • Лойс +1
Реакции: b707_2

Soronorus

✩✩✩✩✩✩✩
6 Сен 2020
11
1
правда возник вопрос можно ли ток удержаания на L298N командой с ардуики отключить, а то греется сильно
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,263
1,301
Москва
записать LOW по всем управляющим пинам, но тогда есть риск сдвинуть мотор с нуля. Если удерживать не надо с большой силой, то да. И если будет сдвиг, то надо будет заново двигать в 0.
Или придумывать вариант, когда выставлена нужная высота, как то зафиксировать ее и можно отключать мотор.
 

Soronorus

✩✩✩✩✩✩✩
6 Сен 2020
11
1
digitalWrite(8,LOW);
digitalWrite(9,LOW);
digitalWrite(10,LOW);
digitalWrite(11,LOW);

не помогло, все равно греется, пока смотрю в сторону реле hw-316
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,263
1,301
Москва
проверит можно так. задать двигателю положение, что бы он куда то доехал и встал. Попробовать повращать рукой ось, запомнить силу. Подать сигналы LOW, подвигать, понять изменилось ли усилие или нет. Если нет , значит не сработало. Если снизилось . то сработало, но тогда надо выяснять от чего греется. Ну и сравнить усилие вращения выключенного совсем двигателя и двигателя с LOW
На этом двигателе сработало абсолютно:
1599478937989.png

Еще наблюдения. Пока двигатель работает он не греется. Как только останавливается в удержании- начинает греться, при отключении питания - нагрев пропадает и двигатель охлаждается.

Может подключение немного другое ? Питание как подается ? Можно конечно поставит мосфет на питание, но это требует отдельного пина, что не всегда возможно
 

Soronorus

✩✩✩✩✩✩✩
6 Сен 2020
11
1
Я сделал с реле
у меня ход каретки тяжелый так что, мне нормально. просто нагрев на L298N и сам мотор до 80 градусов за 30-40 секунд,
но нужен как я понял шаговый двигатель с тормозом, но я не знаю пока на какой смотреть да и не дешевые они.
 

Soronorus

✩✩✩✩✩✩✩
6 Сен 2020
11
1
на L298N я подаю 12 вольт с компьютерного бп, кушает оно 4,35 ампера
 

Soronorus

✩✩✩✩✩✩✩
6 Сен 2020
11
1
мне страшно поэтому, поставил релюху она включается для того чтобы передвинуть и потом выкл, релюхой ессно управляет ардуинка
так как там опилки загорится ещё нафик не хочу пожара, а так кратковременное вкл не страшно, правда ещё теперь нужно понять как подпрограммы писать чтобы после поднятия каретки управлять валом станка.
 

Soronorus

✩✩✩✩✩✩✩
6 Сен 2020
11
1
Описание
сначала инициализация
вкл реле питания , каретка уезжает на 0, за это отвечает концевик на 12 пине
после этого выкл питания
в цикле опрос 3 кнопок
при нажатии любой сначала едим на но 0
потом куда сказано,так же управляем реле перед движением подаю питание после смещения выкл питания шаговика.

Финальный вид Программа управлении станком с пилой:
#include <Stepper.h>
// for your motor
const int stepsPerRevolution = 200;
// initialize the stepper library on pins 8 through 11:
Stepper myStepper(stepsPerRevolution, 8, 9, 10, 11);   // пины подключения мотора
bool bstop=0;
int butt = 12;    // ПИН КОНЦЕВИКА
void setup() {
  // set the speed at 200 rpm:
  myStepper.setSpeed(200);                       // СКОРОСТЬ МОТОРА
  // initialize the serial port:
  Serial.begin(9600);
  pinMode(5, INPUT_PULLUP);
  pinMode(6, INPUT_PULLUP);
  pinMode(7, INPUT_PULLUP);
  pinMode(12,INPUT_PULLUP);
  pinMode(8,OUTPUT);
  pinMode(9, OUTPUT);
  pinMode(10, OUTPUT);
  pinMode(11,OUTPUT);
  pinMode(4,OUTPUT); // rele comntrol
  pinMode(3,INPUT_PULLUP); // magnetic sensor
  pinMode(13,OUTPUT); // rele comntrol
  digitalWrite(4,HIGH); //start pos
  digitalWrite(13,LOW); // start pos

while (1){
  myStepper.step(10);
  if (!digitalRead(12)) {
  bstop=1;
  digitalWrite(4,LOW);
  break;
  }}
  }


void loop()
{

if (!digitalRead(5)) {
  if (bstop == 0){
    digitalWrite(4,HIGH);
    while(1){
      myStepper.step(10);
      if(!digitalRead(12)){
        bstop=1;
     
        break;}
      }
    }
  myStepper.step(-200);
  bstop=0;
  digitalWrite(4,LOW);

  }
if (!digitalRead(6)) {
  if (bstop == 0){
      digitalWrite(4,HIGH);
    while(1){
      myStepper.step(10);
      if(!digitalRead(12)){
        bstop=1;
     
        break;}
      }
    }
  myStepper.step(-500);
  bstop=0;  
  digitalWrite(4,LOW);

  }
if (!digitalRead(7)) {
  if (bstop == 0){
      digitalWrite(4,HIGH);
    while(1){
      myStepper.step(10);
      if(!digitalRead(12)){
        bstop=1;
        break;}
      }
    }
  myStepper.step(-800);
  bstop=0;
  digitalWrite(4,LOW);
   
  }



  }
 
Изменено:

AlexGyver

★★★★★★✩
Команда форума
30 Июл 2018
359
573
Пример с моей библой шаговика, в прицнипе логика применима везде
C++:
// пример с концевиком
#include "GyverStepper.h"
GStepper< STEPPER4WIRE> stepper(2048, 5, 3, 4, 2);
// мотор с драйвером ULN2003 подключается по порядку пинов, но крайние нужно поменять местами
// то есть у меня подключено D2-IN1, D3-IN2, D4-IN3, D5-IN4, но в программе поменял 5 и 2
void setup() {
  // наша задача - при запуске крутить мотор в сторону до нажатия на кнопку
  pinMode(12, INPUT_PULLUP);  // кнопка на D12 и GND
 
  stepper.setRunMode(KEEP_SPEED);
  stepper.setSpeedDeg(-10);   // медленно крутимся НАЗАД
  // пока кнопка не нажата
  while(digitalRead(12)) {   
    stepper.tick();
  }
  // вот тут кнопка нажата, сразу вырубаем мотор.
  // Текущее положение также сбрасывается в 0
  stepper.reset();
  // дальше например врубаем FOLLOW_POS
  stepper.setRunMode(FOLLOW_POS);
}
void loop() {
  // и качаемся в 20 шагах от кнопки и до 300
  static bool dir;
  if (!stepper.tick()) {
    dir = !dir;
    stepper.setTarget(dir ? 20 : 300);
  }
}