DTG printer / принтер планшетный

vadim72

✩✩✩✩✩✩✩
1 Авг 2021
5
0
прототип dtg. планшетного принтера . собрал стенд . добавил две кнопки на ось Y и limit .
Нужна помощь !!!!!!!!! В написании кода с optical rotary encoder 600 pr и stepper motor nema17. для передачи сигнала от optical rotary encoder на шаговый двигатель с учетом регулирования шагов на оборот для синхронизации
плюс 2 кнопки и limit . на 2 кнопки и limit код готов как по шагам так и по таймеру все работает отлично плюс настройка скорости и.т.д
Файлы кода рабочего optical rotary encoder который нормально считывает там 2 файла протестированные в архиве
Код кнопок. с двигателем в архиве .
Фото платы с pins тоже в архиве буду дорабатывать этот проект . присоединяйтесь помогайте у кого есть опыт работы с такими. скетчами .
файлы 3D для макета делал в компас 3д . будет нужно выложу .
архив
https://drive.google.com/file/d/1NsmiM0fVfdqTGd241dSoD79UE2L0bafd/view?usp=sharing

Ссылка на видео там чуть подробнее кое как оьбяснил
через час загрузится видео

для начала мне нужен совет направления . какой код для энкодера применить. . в каком направлении двигаться .
выложу еще видио как nema17. крутит энкодер с разной скоростью с точьностью считывания на оборот с двумя скетчами которые в архиве
может кто подбросит еще скечи и я их протестирую .
 

Вложения

vadim72

✩✩✩✩✩✩✩
1 Авг 2021
5
0
теперь nema 8 крутит rotary optical encoder 600 pw на скорости 16000 мм мин наверное как у принтера движок крутит
пробовал 2 кода ниже будут и видио к ним ка энкодер справляется на ура с ними .
подскажите как далее прикрутить шаговый мотор к этому коду en . step. dir , с регулировкой числа шагов в самом скетчи .


C++:
volatile long temp, counter = 0; //This variable will increase or decrease depending on the rotation of encoder
    
void setup() {
  Serial.begin (9600);

  pinMode(6, INPUT_PULLUP); // internal pullup input pin 2
 
  pinMode(3, INPUT_PULLUP); // internalเป็น pullup input pin 3
   //Setting up interrupt
  //A rising pulse from encodenren activated ai0(). AttachInterrupt 0 is DigitalPin nr 2 on moust Arduino.
  attachInterrupt(0, ai0, RISING);
  
  //B rising pulse from encodenren activated ai1(). AttachInterrupt 1 is DigitalPin nr 3 on moust Arduino.
  attachInterrupt(1, ai1, RISING);
  }
  
  void loop() {
  // Send the value of counter
  if( counter != temp ){
  Serial.println (counter);
  temp = counter;
  }
  }
  
  void ai0() {
  // ai0 is activated if DigitalPin nr 2 is going from LOW to HIGH
  // Check pin 3 to determine the direction
  if(digitalRead(3)==LOW) {
  counter++;
  }else{
  counter--;
  }
  }
  
  void ai1() {
  // ai0 is activated if DigitalPin nr 3 is going from LOW to HIGH
  // Check with pin 2 to determine the direction
  if(digitalRead(6)==LOW) {
  counter--;
  }else{
  counter++;
  }
  }
и второй код из видео . тоже отлично справляется


C++:
/* Encoder Library - TwoKnobs Example
 * http://www.pjrc.com/teensy/td_libs_Encoder.html
 *
 * This example code is in the public domain.
 */

#include <Encoder.h>

// Change these pin numbers to the pins connected to your encoder.
//   Best Performance: both pins have interrupt capability
//   Good Performance: only the first pin has interrupt capability
//   Low Performance:  neither pin has interrupt capability
Encoder knobLeft(3, 6);
//   avoid using pins with LEDs attached

void setup() {
  Serial.begin(9600);
  Serial.println("TwoKnobs Encoder Test:");
}

long positionLeft  = -999;
long positionRight = -999;

void loop() {
  long newLeft, newRight;
  newLeft = knobLeft.read();
  if (newLeft != positionLeft || newRight != positionRight) {
    Serial.print("Left = ");
    Serial.print(newLeft);
    Serial.print(", Right = ");
    Serial.print(newRight);
    Serial.println();
    positionLeft = newLeft;
    positionRight = newRight;
  }
  // if a character is sent from the serial monitor,
  // reset both back to zero.
  if (Serial.available()) {
    Serial.read();
    Serial.println("Reset both knobs to zero");
    knobLeft.write(0);
  }
}
какой мне выбрать что бы прикрутиь шаговый двигатель .
может свои скетчи с энкодером подкинете я их проверю .

алекс . я начну прикручивать шаговик . помогай . буду пробовать писать . с кнопками и концевиком у меня получилось но тут сложнее тики шаговику передать .
 

Вложения

  • 57.3 KB Просмотры: 1

vadim72

✩✩✩✩✩✩✩
1 Авг 2021
5
0
Вписал все в один код .
все работает но код на мотор работает не так
он с каждого 3 тика энкодера должен делать один шаг а он работает так на + или - энкодера попал сигнал туда и. крутит движок при этом все кнопки и концевик остаются рабосими
мне нужно поправить код в этом месте
с 126 по 166 строку
там я делал и по таймеру и по шагам результат не меняется

код дак я думаю должен работать так упрощеннй вариант
если энкодер +1 тик
то
digitalWrite(DIR_PIN , LOW);
for (делаем 1 шаг мотор ) {

если энкодер -1 тик
то
digitalWrite(DIR_PIN , HIGH);
for (делаем 1 шаг мотор ) {

Алекс . где ты. ????
//КОД КОГДА ЭНКОДЕР ВРАЩАЕТСЯ PIN6 И PIN3 И ПОДАЕТ СИГНАЛ НА ШАГОВЫЙ МОТОР

LIMIT ENCODER:
//Эта переменная будет увеличиваться или уменьшаться в зависимости от вращения энкодера.
volatile long temp, counter = 0;

//Пины управления шаговиком
#define STEP_PIN         2
#define DIR_PIN          5
#define ENABLE_PIN       8

//Пин кнопки
#define start_button1 7
#define start_button2 4
#define limitPin 9

//Пин энкодера
#define encA 6
#define encB 3

//Здесь можно настроить время поворота и паузы
#define move_forward_time 5    //время прямого хода в мсек
#define move_back_time 5       //время обратного хода в мсек
#define pause_time 10          //время паузы в мсек
#define frequency 600              //Время между импульсами в мксек. 1000 мксек = 1 мсек = 0.001 сек.
                                   //Частота следования импульсов 1/0.001 = 1 кГц,
                                   //Не рекомендуется устанавливать время меньше 100 мсек,
                                  // т.к. частота будет 10 кГц

//Таймер для millis()
uint32_t timer = 0;


//Логический флаг для рабочего режима
bool flag = 1;

void setup() {
  Serial.begin (9600);
  pinMode(6, INPUT_PULLUP);              // внутренний входной контакт подтягивания 6 
  pinMode(3, INPUT_PULLUP);              // внутренний входной контакт подтягивания 3
  attachInterrupt(0, ai0, RISING);
  attachInterrupt(1, ai1, RISING);

  pinMode(start_button1, INPUT_PULLUP);  //Подтягиваем кнопку к питанию
  pinMode(start_button2, INPUT_PULLUP);  //Подтягиваем кнопку к питанию
  pinMode(limitPin, INPUT_PULLUP);

  pinMode(STEP_PIN   , OUTPUT);           //Настраиваем пины управления
  pinMode(DIR_PIN    , OUTPUT);
  pinMode(ENABLE_PIN , OUTPUT);

  digitalWrite(ENABLE_PIN , HIGH);        //Выключаем мотор, чтобы не грелся


}

  void loop () {

  if( counter != temp ){
  Serial.println (counter);
  temp = counter;
  }

//КОД КОГДА  КНОПКА PIN7 НАЖАТА  И ПОДАЕТ СИГНАЛ НА ШАГОВЫЙ МОТОР

  if (!digitalRead(start_button1)) {       //Если нажали на кнопку
    digitalWrite(ENABLE_PIN , LOW);       //Включаем мотор
    flag = 1;                             //Активируем флаг рабочего режима
    timer = millis();                     //Запускаем таймер
  }

  if (flag) {                                 //Если флаг активирован
    digitalWrite(DIR_PIN    , HIGH);         //Задаем направление вращения


    for (int i = 0; i < 16; i++) {          //Выполняем нужное число шагов 200*16 = 3200 шагов оборот
      digitalWrite(STEP_PIN    , HIGH);
      delayMicroseconds(frequency);
      digitalWrite(STEP_PIN    , LOW);
    } while (millis() - timer < move_forward_time);
    flag = 0;                                 //Гасим флаг
    digitalWrite(ENABLE_PIN , HIGH);        //Выключаем движок, чтобы не грелся
  }

//КОД КОГДА  КНОПКА PIN4 НАЖАТА  И ПОДАЕТ СИГНАЛ НА ШАГОВЫЙ МОТОР

  if (!digitalRead(start_button2)) {       //Если нажали на кнопку
    digitalWrite(ENABLE_PIN , LOW);       //Включаем мотор
    flag = 1;                             //Активируем флаг рабочего режима
    timer = millis();                     //Запускаем таймер
  }

  if (flag) {                                 //Если флаг активирован
    digitalWrite(DIR_PIN    , LOW);         //Задаем направление вращения


    for (int i = 0; i < 16; i++) {          //Выполняем нужное число шагов 200*16 = 3200 шагов оборот
      digitalWrite(STEP_PIN    , HIGH);
      delayMicroseconds(frequency);
      digitalWrite(STEP_PIN    , LOW);
    } while (millis() - timer < move_forward_time);
    flag = 0;                                 //Гасим флаг
    digitalWrite(ENABLE_PIN , HIGH);        //Выключаем движок, чтобы не грелся
    }

//КОД КОГДА LIMIT PIN9 ВКЛЮЧЕН  И ПОДАЕТ СИГНАЛ НА ШАГОВЫЙ МОТОР

      if (!digitalRead(limitPin)) {           //Если нажали на кнопку     
        flag = 1;                              //Активируем флаг рабочего режима
        if (flag) {                           //Если флаг активирован
        digitalWrite(ENABLE_PIN , HIGH);        //Выключаем движок, чтобы не грелся
        digitalWrite(DIR_PIN    , LOW);
        for (int i = 0; i < 100; i++) {          //Выполняем нужное число шагов
      
        digitalWrite(ENABLE_PIN , LOW);      //Выключаем движок, чтобы не грелся; 
        digitalWrite(STEP_PIN    , HIGH);
        delayMicroseconds(frequency);
        digitalWrite(STEP_PIN    , LOW);
        }
        flag = 0;                                 //Гасим флаг
        digitalWrite(ENABLE_PIN , HIGH);        //Выключаем движок, чтобы не грелся
    
      }         
  
    }
  
//КОД КОГДА ЭНКОДЕР ВРАЩАЕТСЯ PIN6 И PIN3   И ПОДАЕТ СИГНАЛ НА ШАГОВЫЙ МОТОР 
    
  if(digitalRead(6)==LOW) {
  flag = 1;                                      //Активируем флаг рабочего режима
  timer = millis();                                //Запускаем таймер

    if (flag) {                                     //Если флаг активирован
        digitalWrite(DIR_PIN    , LOW);
        for (int i = 0; i < 5; i++) {                 //Выполняем нужное число шагов
      
        digitalWrite(ENABLE_PIN , LOW);                //Включаем мотор;
        digitalWrite(STEP_PIN    , HIGH);
        delayMicroseconds(frequency);
        digitalWrite(STEP_PIN    , LOW);
        }  while (millis() - timer < move_back_time);   //ВРЕМЯ ВЫПОЛНЕНИЯ КОДА
        flag = 0;                                        //Гасим флаг
        digitalWrite(ENABLE_PIN , HIGH);                //Выключаем движок, чтобы не грелсяелся

    }

    }
   if(digitalRead(3)==LOW) {
  flag = 1;                                                //Активируем флаг рабочего режима
  timer = millis();                                       //Запускаем таймер

    if (flag) {                                          //Если флаг активирован
        digitalWrite(DIR_PIN    , HIGH);
        for (int i = 0; i < 5; i++) {                   //Выполняем нужное число шагов
      
        digitalWrite(ENABLE_PIN , LOW);                //Включаем мотор
        delayMicroseconds(frequency);
        digitalWrite(STEP_PIN    , HIGH);
        delayMicroseconds(frequency);
        digitalWrite(STEP_PIN    , LOW);
        }  while (millis() - timer < move_back_time);   //ВРЕМЯ ВЫПОЛНЕНИЯ КОДА
        flag = 0;                                        //Гасим флаг
        digitalWrite(ENABLE_PIN , HIGH);                 //Выключаем движок, чтобы не грелсяелся

    }
  }

  }

//КОД КОГДА ЭНКОДЕР ВРАЩАЕТСЯ PIN6 И PIN3   И ПОДАЕТ СИГНАЛ НА МОНИТОР

  void ai0() {
  if(digitalRead(3)==LOW) {
  counter++;
  }else{
  counter--; 
  }
  }


  void ai1() {
  if(digitalRead(6)==LOW) {
  counter++;
  }else{
  counter--; 
  }
  }
 
Изменено:

vadim72

✩✩✩✩✩✩✩
1 Авг 2021
5
0
в целом я на пути
все прикрутил все работает но пока есть две проблемы
1
двигатель всегда под нагрузкой в попытке сделать ему
digitalWrite(ENABLE_PIN , HIGH);
то перестает работать . я думаю порешаю .
2.
скорость почти стабильна до 4000 мм мин
хочется больше так как я не знаю с какой скоростью крутит двигатель принтера энкодер .
редко бывает срыв энкодера на тики при 4000 и выше и только в одну сторону

а так все идет вперед
вот скрин монитора работы энкодера с шаговиком при 4000 мм мин
видио и код будет поз же

Снимок экрана (27).png
 
Изменено:

vadim72

✩✩✩✩✩✩✩
1 Авг 2021
5
0
сделал новые тесты и выложил новое видео


рабочий код но еще допиливать буду .
еще две ставить кнопки. и мотор на ось Z
врлде нормально работает код но я на самом деле еще не знаю как он должен быть поэтому хочется идеально чтобы потом не возращаться к нему
интересует только этот цикл
//КОД КОГДА ЭНКОДЕР ВРАЩАЕТСЯ PIN6 И PIN3 И ПОДАЕТ СИГНАЛ НА ШАГОВЫЙ МОТОР



DTG PRINTER AXIS Y , btn , limit:
//Эта переменная будет увеличиваться или уменьшаться в зависимости от вращения энкодера.
volatile long temp, motor_position, counter;

//Пины управления шаговиком
#define STEP_PIN         2
#define DIR_PIN          5
#define ENABLE_PIN       8

//Пин кнопки
#define start_button1 7
#define start_button2 4
#define limitPin 9

//Пин энкодера
#define encoder_a 6
#define encoder_b 3

//Здесь можно настроить время поворота и паузы
#define move_forward_time 5   //setting.  .. время прямого хода в мсек
#define move_back_time 5     //setting.  .. время обратного хода в мсек
#define pause_time 60         //setting.  .. время паузы в мсек
#define frequency 600              //setting.  .. Время между импульсами в мксек. 1000 мксек = 1 мсек = 0.001 сек.
                                   //Частота следования импульсов 1/0.001 = 1 кГц,
                                   //Не рекомендуется устанавливать время меньше 100 мсек,
                                  // т.к. частота будет 10 кГц

//Таймер для millis()
uint16_t timer = 0;


//Логический флаг для рабочего режима
bool flag = 1;

void setup() {
  Serial.begin (230400);                  //setting.  ..
  pinMode(6, INPUT_PULLUP);              // внутренний входной контакт подтягивания 6   
  pinMode(3, INPUT_PULLUP);              // внутренний входной контакт подтягивания 3
  attachInterrupt(0, ai0, RISING);
  attachInterrupt(1, ai1, RISING);
 
  pinMode(start_button1, INPUT_PULLUP);  //Подтягиваем кнопку к питанию
  pinMode(start_button2, INPUT_PULLUP);  //Подтягиваем кнопку к питанию
  pinMode(limitPin, INPUT_PULLUP);

  pinMode(STEP_PIN   , OUTPUT);           //Настраиваем пины управления
  pinMode(DIR_PIN    , OUTPUT);
  pinMode(ENABLE_PIN , OUTPUT);

  digitalWrite(ENABLE_PIN , HIGH);        //Выключаем мотор, чтобы не грелся
  digitalWrite(encoder_a, HIGH);
  digitalWrite(encoder_b, HIGH);
 

}

  void loop () {
 
  if( counter != temp ){
  Serial.println (counter);
  temp = counter;
  }

//КОД КОГДА  КНОПКА PIN7 НАЖАТА  И ПОДАЕТ СИГНАЛ НА ШАГОВЫЙ МОТОР

  if (!digitalRead(start_button1)) {       //Если нажали на кнопку
    digitalWrite(ENABLE_PIN , LOW);       //Включаем мотор
    flag = 1;                             //Активируем флаг рабочего режима
    timer = millis();                     //Запускаем таймер
  }

  if (flag) {                                 //Если флаг активирован
    digitalWrite(DIR_PIN    , HIGH);         //Задаем направление вращения


    for (int i = 0; i < 8; i++) {          //setting.  .. Выполняем нужное число шагов
      digitalWrite(STEP_PIN    , HIGH);
      delayMicroseconds(frequency);
      digitalWrite(STEP_PIN    , LOW);
    } while (millis() - timer < move_forward_time);
    flag = 0;                                 //Гасим флаг
    digitalWrite(ENABLE_PIN , HIGH);          //Выключаем движок, чтобы не грелся
  }

//КОД КОГДА  КНОПКА PIN4 НАЖАТА  И ПОДАЕТ СИГНАЛ НА ШАГОВЫЙ МОТОР
 
  if (!digitalRead(start_button2)) {       //Если нажали на кнопку
    digitalWrite(ENABLE_PIN , LOW);       //Включаем мотор
    flag = 1;                             //Активируем флаг рабочего режима
    timer = millis();                     //Запускаем таймер
  }

  if (flag) {                                 //Если флаг активирован
    digitalWrite(DIR_PIN    , LOW);         //Задаем направление вращения


    for (int i = 0; i < 8; i++) {          //setting.  ..  Выполняем нужное число шагов
      digitalWrite(STEP_PIN    , HIGH);
      delayMicroseconds(frequency);
      digitalWrite(STEP_PIN    , LOW);
    } while (millis() - timer < move_forward_time);
    flag = 0;                                 //Гасим флаг
    digitalWrite(ENABLE_PIN , HIGH);        //Выключаем движок, чтобы не грелся
    }

//КОД КОГДА LIMIT PIN9 ВКЛЮЧЕН  И ПОДАЕТ СИГНАЛ НА ШАГОВЫЙ МОТОР
 
      if (!digitalRead(limitPin)) {           //Если нажали на кнопку 
        digitalWrite(DIR_PIN    , LOW);
        for (int i = 0; i < 100; i++) {          //setting.  .. Выполняем нужное число шагов 
        
        digitalWrite(ENABLE_PIN , LOW);      //Выключаем движок, чтобы не грелся;   
        digitalWrite(STEP_PIN    , HIGH);
        delayMicroseconds(frequency);
        digitalWrite(STEP_PIN    , LOW);                                 //Гасим флаг
        digitalWrite(ENABLE_PIN , HIGH);        //Выключаем движок, чтобы не грелся
      
      }           
    
    }
    
//КОД КОГДА ЭНКОДЕР ВРАЩАЕТСЯ PIN6 И PIN3   И ПОДАЕТ СИГНАЛ НА ШАГОВЫЙ МОТОР   
      
  if (counter > 0)  {
    digitalWrite(DIR_PIN    , HIGH);
        digitalWrite(ENABLE_PIN , LOW);
    digitalWrite(STEP_PIN    , HIGH);
    digitalWrite(STEP_PIN    , LOW);
    _delay_us(500);                               //setting.  .. управляем количество шагов мотора 
    motor_position++;
    counter = 0;
    digitalWrite(ENABLE_PIN , HIGH);
    }
  else if (counter < 0)  {
    digitalWrite(DIR_PIN    , LOW);
        digitalWrite(ENABLE_PIN , LOW);
    digitalWrite(STEP_PIN    , HIGH);
    digitalWrite(STEP_PIN    , LOW);
    _delay_us(500);                                   //setting.  ..управляем количество шагов мотора
    motor_position--;
    counter = 0;
    digitalWrite(ENABLE_PIN , HIGH);
    }
 
  }
 
//КОД КОГДА ЭНКОДЕР ВРАЩАЕТСЯ PIN6 И PIN3   И ПОДАЕТ СИГНАЛ НА МОНИТОР

 
 
 
  void ai0()  {
    if (digitalRead(6) == digitalRead(3))
    {
        counter--;
    }
    else
    {
        counter++;
    }
  }

  void ai1()  {
    if (digitalRead(6) != digitalRead(3))
    {
        counter--;
    }
    else
    {
        counter++;
    }
  }