Коэффициент шестерня

Arduinchlk
Arduinchlk аватар
Offline
Зарегистрирован: 15.03.2021

ищу исполнителя сроки ограничены

управление столом планшетного принтера

драйвер 6600

ардуино нано

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

с возможностью регулировки коэффицента шестерни до десятых

koeficient pulses = 0.0;

 

код управление шаговым двигателем при помощи роторного энкодера

реализовать в коде Коэффициент шестерни

STEPS_PR_ENCODER_PULSE  1

01 #define ENCODER_PULSE_PIN 2 
02 #define ENCODER_DIR_PIN   3 
03 #define DRIVER_STEP_PIN   4 
04 #define DRIVER_DIR_PIN    7 
05 #define DRIVER_EN_PIN     8 
06   
07 #define STEPS_PR_ENCODER_PULSE  1 
08 #define DRIVER_PULSE_PERIOD_US  1 
09   
10 enum Driver_pulse_state_enum {PULSE_IDLE, PULSE_HIGH, PULSE_LOW}; 
11   
12   
13   
14 uint8_t dir = LOW; 
15 uint16_t pulse_buffer = 0; 
16 unsigned long time_now = 0; 
17 uint16_t driver_pulse_hold_time_us = DRIVER_PULSE_PERIOD_US/2; 
18 uint8_t driver_pulse_state = PULSE_IDLE; 
19   
20   
21   
22   
23   
24 void setup() { 
25   
26   pinMode(ENCODER_PULSE_PIN, INPUT); 
27   pinMode(ENCODER_DIR_PIN, INPUT); 
28   pinMode(DRIVER_STEP_PIN, OUTPUT); 
29   pinMode(DRIVER_DIR_PIN, OUTPUT); 
30   pinMode(DRIVER_EN_PIN, OUTPUT); 
31      
32   attachInterrupt(digitalPinToInterrupt(ENCODER_PULSE_PIN), encoderISR, RISING); 
33   
34   digitalWrite(DRIVER_EN_PIN, HIGH); 
35   
36   
37   
38   
39   
40 void loop() { 
41   
42   
43   if((pulse_buffer) && (driver_pulse_state == PULSE_IDLE)){ 
44     driver_pulse_state = PULSE_HIGH; 
45     digitalWrite(DRIVER_DIR_PIN, digitalRead(ENCODER_DIR_PIN)); 
46     digitalWrite(DRIVER_STEP_PIN, HIGH); 
47     time_now = micros(); 
48   
49   
50   if((micros() - time_now > driver_pulse_hold_time_us) && (driver_pulse_state == PULSE_LOW)){ 
51     driver_pulse_state = PULSE_HIGH; 
52     digitalWrite(DRIVER_STEP_PIN, HIGH); 
53     time_now = micros(); 
54   
55   
56   if((micros() - time_now > driver_pulse_hold_time_us) && (driver_pulse_state == PULSE_HIGH)){ 
57     digitalWrite(DRIVER_STEP_PIN, LOW); 
58     time_now = micros(); 
59        
60     pulse_buffer -= 1; 
61     if(pulse_buffer < 0){ 
62       pulse_buffer = 0; 
63     
64        
65     if(pulse_buffer){ 
66       driver_pulse_state = PULSE_LOW; 
67     
68     else
69       driver_pulse_state = PULSE_IDLE; 
70     
71   
72   
73   
74     
75
76   
77 void encoderISR(){ 
78   pulse_buffer += STEPS_PR_ENCODER_PULSE; 
79 }

 

Бармалей
Бармалей аватар
Offline
Зарегистрирован: 23.09.2019

Бюджет?

sadman41
Offline
Зарегистрирован: 19.10.2016

ШД не может шагнуть на 0.3 или 0.1.

Пишите, чего реально хотите получить.

PS. Бормолей, откуда у тебя время и тут и на гувере (а то и еще в ряде мест) болтаться?

Бармалей
Бармалей аватар
Offline
Зарегистрирован: 23.09.2019

Я в отпуске.

PS. А почему у тебя не может шагнуть на 0,1? На твоём драйвере микрошага нет?

vvadim
Offline
Зарегистрирован: 23.05.2012

Бармалей пишет:

Я в отпуске.

PS. А почему у тебя не может шагнуть на 0,1? На твоём драйвере микрошага нет?

а что, есть микрошаг 1/10 ?

Бармалей
Бармалей аватар
Offline
Зарегистрирован: 23.09.2019

Конечно нет. Но кто не даёт взять несколько мелких и суммировать? Допустим, 3 шага по 1/32 дадут 1/10. Ошибка в три тысячных  шага, мизерная. 

 

sadman41
Offline
Зарегистрирован: 19.10.2016

Бармалей пишет:

Я в отпуске.

PS. А почему у тебя не может шагнуть на 0,1? На твоём драйвере микрошага нет?


Перечитай первопост. 0.1 шага требуется сделать программно. Микрошаг только идиот не сумеет выставить на драйвере.

Arduinchlk
Arduinchlk аватар
Offline
Зарегистрирован: 15.03.2021

Бармалей пишет:

Бюджет?

предложите цену.

задача проста есть роторный енкодер принтера Canon

и шаговый двигатель 6600

необходимо считывать вращение энкодера и вращать шаговик с ускорениями естественно чтобы не было пропуска шагов посредством ардуино нано

а также необходимо добавить возможность редактирования коэффицента шестерни, то есть разные валы будут возможно в будущем.

ранее использовали библиотеку AccelStepper но у нее есть ограничения я так понимаю и иногда она самопроизвольно крутит двигатель может сможете код подредактировать но лучше чистый код без библиотек

 

b707
Offline
Зарегистрирован: 26.05.2017

задачка и правда вроде простая, но для отладки желательно иметь в руках тот самый "роторный енкодер принтера Canon"

Arduinchlk
Arduinchlk аватар
Offline
Зарегистрирован: 15.03.2021

b707 пишет:

задачка и правда вроде простая, но для отладки желательно иметь в руках тот самый "роторный енкодер принтера Canon"

Для отладки будет достаточно думаю обычного энкодера из набора ардуино. остальное коэффицентами добьем

Главное чтобы он умел читать скорость энкодера. большинство энтузиастов со своим кодом.

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

b707
Offline
Зарегистрирован: 26.05.2017

Arduinchlk пишет:

времени на разбор чужого кода нет.

понятно, тогда я пас

Arduinchlk
Arduinchlk аватар
Offline
Зарегистрирован: 15.03.2021

b707 пишет:

Arduinchlk пишет:

времени на разбор чужого кода нет.

понятно, тогда я пас

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

что вы предложите?

vvadim
Offline
Зарегистрирован: 23.05.2012

Arduinchlk пишет:

ранее использовали библиотеку AccelStepper но у нее есть ограничения я так понимаю и иногда она самопроизвольно крутит двигатель может сможете код подредактировать но лучше чистый код без библиотек

 

 

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

 

Бармалей
Бармалей аватар
Offline
Зарегистрирован: 23.09.2019

sadman41 пишет:
Бармалей пишет:

Я в отпуске.

PS. А почему у тебя не может шагнуть на 0,1? На твоём драйвере микрошага нет?

Перечитай первопост. 0.1 шага требуется сделать программно. Микрошаг только идиот не сумеет выставить на драйвере.

Что то ты нагородил...

Arduinchlk
Arduinchlk аватар
Offline
Зарегистрирован: 15.03.2021

vvadim пишет:

Arduinchlk пишет:

ранее использовали библиотеку AccelStepper но у нее есть ограничения я так понимаю и иногда она самопроизвольно крутит двигатель может сможете код подредактировать но лучше чистый код без библиотек

 

 

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

 

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

вот пример 2 кода в одном я encoder_pos (stepper.moveTo((long) round() установил вручную и моторчик бодро отработал шаги, но когда с енкодера идет сигнал та же позиция отрабатывает с тормозами.

01#include <Arduino.h>
02#include <AccelStepper.h>
03 
04#define encoder_pin_A 2
05#define encoder_pin_B 3
06int encoder_pin_A_last = LOW;
07int encoder_pos = 0;
08int n = LOW;
09 
10#define stepper_pin_step 13
11#define stepper_pin_dir  14 //useless
12// Enc have 24 steps per revolution
13// The motor have 800 steps per revolution
14// Want: 1 encoder rev = 1 stepper rev
15// 800 / 24 = 33.3333333333...
16float steps_per_pulse = 1.2;
17 
18AccelStepper stepper(AccelStepper::DRIVER, stepper_pin_step, stepper_pin_dir);
19 
20void setup(){
21  stepper.setMaxSpeed(25000);
22  stepper.setAcceleration(25000);
23 
24  pinMode(encoder_pin_A, INPUT_PULLUP);
25  pinMode(encoder_pin_B, INPUT_PULLUP);
26 
27}
28 
29void loop(){
30 
31 // read encoder
32  n = digitalRead(encoder_pin_A);
33 
34  if ((encoder_pin_A_last == LOW) && (n == HIGH)) {
35    if (digitalRead(encoder_pin_B) == LOW) {
36      encoder_pos--;
37    } else {
38      encoder_pos++;
39    }
40 
41    // set stepper to the new calculated position
42stepper.moveTo((long) round(500*steps_per_pulse));
43 
44      }
45 
46      encoder_pin_A_last = n;
47 
48      stepper.runToPosition();
49}

с сигналом с энкодера

01#include <Arduino.h>
02#include <AccelStepper.h>
03 
04#define encoder_pin_A 2
05#define encoder_pin_B 3
06int encoder_pin_A_last = LOW;
07int encoder_pos = 0;
08int n = LOW;
09 
10#define stepper_pin_step 13
11#define stepper_pin_dir  14 //useless
12// Enc have 24 steps per revolution
13// The motor have 800 steps per revolution
14// Want: 1 encoder rev = 1 stepper rev
15// 800 / 24 = 33.3333333333...
16float steps_per_pulse = 1.2;
17 
18AccelStepper stepper(AccelStepper::DRIVER, stepper_pin_step, stepper_pin_dir);
19 
20void setup(){
21  stepper.setMaxSpeed(25000);
22  stepper.setAcceleration(25000);
23 
24  pinMode(encoder_pin_A, INPUT_PULLUP);
25  pinMode(encoder_pin_B, INPUT_PULLUP);
26 
27}
28 
29void loop(){
30 
31 // read encoder
32  n = digitalRead(encoder_pin_A);
33 
34  if ((encoder_pin_A_last == LOW) && (n == HIGH)) {
35    if (digitalRead(encoder_pin_B) == LOW) {
36      encoder_pos--;
37    } else {
38      encoder_pos++;
39    }
40 
41    // set stepper to the new calculated position
42stepper.moveTo((long) round(encoder_pos*steps_per_pulse));
43 
44      }
45 
46      encoder_pin_A_last = n;
47 
48      stepper.runToPosition();
49}

 

Arduinchlk
Arduinchlk аватар
Offline
Зарегистрирован: 15.03.2021

Arduinchlk пишет:

vvadim пишет:

Arduinchlk пишет:

ранее использовали библиотеку AccelStepper но у нее есть ограничения я так понимаю и иногда она самопроизвольно крутит двигатель может сможете код подредактировать но лучше чистый код без библиотек

 

 

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

 

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

вот пример 2 кода в одном я encoder_pos (stepper.moveTo((long) round() установил вручную и моторчик бодро отработал шаги, но когда с енкодера идет сигнал та же позиция отрабатывает с тормозами.

01#include <Arduino.h>
02#include <AccelStepper.h>
03 
04#define encoder_pin_A 2
05#define encoder_pin_B 3
06int encoder_pin_A_last = LOW;
07int encoder_pos = 0;
08int n = LOW;
09 
10#define stepper_pin_step 13
11#define stepper_pin_dir  14 //useless
12// Enc have 24 steps per revolution
13// The motor have 800 steps per revolution
14// Want: 1 encoder rev = 1 stepper rev
15// 800 / 24 = 33.3333333333...
16float steps_per_pulse = 1.2;
17 
18AccelStepper stepper(AccelStepper::DRIVER, stepper_pin_step, stepper_pin_dir);
19 
20void setup(){
21  stepper.setMaxSpeed(25000);
22  stepper.setAcceleration(25000);
23 
24  pinMode(encoder_pin_A, INPUT_PULLUP);
25  pinMode(encoder_pin_B, INPUT_PULLUP);
26 
27}
28 
29void loop(){
30 
31 // read encoder
32  n = digitalRead(encoder_pin_A);
33 
34  if ((encoder_pin_A_last == LOW) && (n == HIGH)) {
35    if (digitalRead(encoder_pin_B) == LOW) {
36      encoder_pos--;
37    } else {
38      encoder_pos++;
39    }
40 
41    // set stepper to the new calculated position
42stepper.moveTo((long) round(500*steps_per_pulse));
43 
44      }
45 
46      encoder_pin_A_last = n;
47 
48      stepper.runToPosition();
49}

с сигналом с энкодера

01#include <Arduino.h>
02#include <AccelStepper.h>
03 
04#define encoder_pin_A 2
05#define encoder_pin_B 3
06int encoder_pin_A_last = LOW;
07int encoder_pos = 0;
08int n = LOW;
09 
10#define stepper_pin_step 13
11#define stepper_pin_dir  14 //useless
12// Enc have 24 steps per revolution
13// The motor have 800 steps per revolution
14// Want: 1 encoder rev = 1 stepper rev
15// 800 / 24 = 33.3333333333...
16float steps_per_pulse = 1.2;
17 
18AccelStepper stepper(AccelStepper::DRIVER, stepper_pin_step, stepper_pin_dir);
19 
20void setup(){
21  stepper.setMaxSpeed(25000);
22  stepper.setAcceleration(25000);
23 
24  pinMode(encoder_pin_A, INPUT_PULLUP);
25  pinMode(encoder_pin_B, INPUT_PULLUP);
26 
27}
28 
29void loop(){
30 
31 // read encoder
32  n = digitalRead(encoder_pin_A);
33 
34  if ((encoder_pin_A_last == LOW) && (n == HIGH)) {
35    if (digitalRead(encoder_pin_B) == LOW) {
36      encoder_pos--;
37    } else {
38      encoder_pos++;
39    }
40 
41    // set stepper to the new calculated position
42stepper.moveTo((long) round(encoder_pos*steps_per_pulse));
43 
44      }
45 
46      encoder_pin_A_last = n;
47 
48      stepper.runToPosition();
49}

 

теперь человек с постсоветов решает просто добавить скорости и ускорения тем самым добивается нужного движения но количество импульсов зашкаливает в ардуино и иногда он их выдавал так что шаговик крутил до секунд 10-20 с максимальной скоростью. казалось что произвольно так как не было найдено какойто зависимости цикличности

Бармалей
Бармалей аватар
Offline
Зарегистрирован: 23.09.2019

У вас там ошибка в программе

Arduinchlk
Arduinchlk аватар
Offline
Зарегистрирован: 15.03.2021

Бармалей пишет:

У вас там ошибка в программе

      stepper.runToPosition();
 

??

поменять на 

      stepper.run();
 

 

Arduinchlk
Arduinchlk аватар
Offline
Зарегистрирован: 15.03.2021

назовите цену давайте отработаем с этой библиотекой и кодом.