Коэффициент шестерня
- Войдите на сайт для отправки комментариев
Пнд, 31/05/2021 - 17:09
ищу исполнителя сроки ограничены
управление столом планшетного принтера
драйвер 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 |
} |
Бюджет?
ШД не может шагнуть на 0.3 или 0.1.
Пишите, чего реально хотите получить.
PS. Бормолей, откуда у тебя время и тут и на гувере (а то и еще в ряде мест) болтаться?
Я в отпуске.
PS. А почему у тебя не может шагнуть на 0,1? На твоём драйвере микрошага нет?
Я в отпуске.
PS. А почему у тебя не может шагнуть на 0,1? На твоём драйвере микрошага нет?
а что, есть микрошаг 1/10 ?
Конечно нет. Но кто не даёт взять несколько мелких и суммировать? Допустим, 3 шага по 1/32 дадут 1/10. Ошибка в три тысячных шага, мизерная.
Я в отпуске.
PS. А почему у тебя не может шагнуть на 0,1? На твоём драйвере микрошага нет?
Перечитай первопост. 0.1 шага требуется сделать программно. Микрошаг только идиот не сумеет выставить на драйвере.
Бюджет?
предложите цену.
задача проста есть роторный енкодер принтера Canon
и шаговый двигатель 6600
необходимо считывать вращение энкодера и вращать шаговик с ускорениями естественно чтобы не было пропуска шагов посредством ардуино нано
а также необходимо добавить возможность редактирования коэффицента шестерни, то есть разные валы будут возможно в будущем.
ранее использовали библиотеку AccelStepper но у нее есть ограничения я так понимаю и иногда она самопроизвольно крутит двигатель может сможете код подредактировать но лучше чистый код без библиотек
задачка и правда вроде простая, но для отладки желательно иметь в руках тот самый "роторный енкодер принтера Canon"
задачка и правда вроде простая, но для отладки желательно иметь в руках тот самый "роторный енкодер принтера Canon"
Для отладки будет достаточно думаю обычного энкодера из набора ардуино. остальное коэффицентами добьем
Главное чтобы он умел читать скорость энкодера. большинство энтузиастов со своим кодом.
просто много есть примеров кода но они не рассчитаны на разное заполнение печати. то есть картинка может размазываться в наименьшей области заполнения при печати. важно отработать ускорение. считывать количество импульсов с энкодера. а математика Accelstepper начинает гнать так как не умеет работать с большими скоростями и начинает отправлять запоздалые импульсы на шаговик с частотой 3.571 килогерц почему-то видимо это какой-то максимум. времени на разбор чужого кода нет.
времени на разбор чужого кода нет.
понятно, тогда я пас
времени на разбор чужого кода нет.
понятно, тогда я пас
мне самостоятельно тяжеловато будет. если согласитесь поработать назовите цену. может пару советов дадите и этим решится. есть коды с ускорением просто я не уверен что они будут корректно работать и смогу найти проблему самостоятельно.
что вы предложите?
ранее использовали библиотеку AccelStepper но у нее есть ограничения я так понимаю и иногда она самопроизвольно крутит двигатель может сможете код подредактировать но лучше чистый код без библиотек
какие такие там для вас ограничения))))
да и с самопроизвольным кручением повеселили)))
Я в отпуске.
PS. А почему у тебя не может шагнуть на 0,1? На твоём драйвере микрошага нет?
Что то ты нагородил...
ранее использовали библиотеку 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
06
int
encoder_pin_A_last = LOW;
07
int
encoder_pos = 0;
08
int
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...
16
float
steps_per_pulse = 1.2;
17
18
AccelStepper stepper(AccelStepper::DRIVER, stepper_pin_step, stepper_pin_dir);
19
20
void
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
29
void
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
42
stepper.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
06
int
encoder_pin_A_last = LOW;
07
int
encoder_pos = 0;
08
int
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...
16
float
steps_per_pulse = 1.2;
17
18
AccelStepper stepper(AccelStepper::DRIVER, stepper_pin_step, stepper_pin_dir);
19
20
void
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
29
void
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
42
stepper.moveTo((
long
) round(encoder_pos*steps_per_pulse));
43
44
}
45
46
encoder_pin_A_last = n;
47
48
stepper.runToPosition();
49
}
ранее использовали библиотеку 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
06
int
encoder_pin_A_last = LOW;
07
int
encoder_pos = 0;
08
int
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...
16
float
steps_per_pulse = 1.2;
17
18
AccelStepper stepper(AccelStepper::DRIVER, stepper_pin_step, stepper_pin_dir);
19
20
void
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
29
void
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
42
stepper.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
06
int
encoder_pin_A_last = LOW;
07
int
encoder_pos = 0;
08
int
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...
16
float
steps_per_pulse = 1.2;
17
18
AccelStepper stepper(AccelStepper::DRIVER, stepper_pin_step, stepper_pin_dir);
19
20
void
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
29
void
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
42
stepper.moveTo((
long
) round(encoder_pos*steps_per_pulse));
43
44
}
45
46
encoder_pin_A_last = n;
47
48
stepper.runToPosition();
49
}
теперь человек с постсоветов решает просто добавить скорости и ускорения тем самым добивается нужного движения но количество импульсов зашкаливает в ардуино и иногда он их выдавал так что шаговик крутил до секунд 10-20 с максимальной скоростью. казалось что произвольно так как не было найдено какойто зависимости цикличности
У вас там ошибка в программе
У вас там ошибка в программе
stepper.runToPosition();
??
поменять на
stepper.run();
назовите цену давайте отработаем с этой библиотекой и кодом.