Mega+shild 1.4 проблема с концевиками
- Войдите на сайт для отправки комментариев
Чт, 24/02/2022 - 15:52
Добрый день форумчане. К Mega 2560 подключены двигатели (оси x,y,z) и концевики через shild 1.4. Всё работает, но как только каретка садится на концевик с него уже не съезжает. Прошу помощи в этом вопросе.
http://arduino.ru/forum/obshchii/vstavka-programmnogo-koda-v-temukommentarii
Ну и "за компанию":
http://arduino.ru/forum/pesochnitsa-razdel-dlya-novichkov/pesochnitsa-novichok-prochti
Добрый день форумчане. К Mega 2560 подключены двигатели (оси x,y,z) и концевики через shild 1.4. Всё работает, но как только каретка садится на концевик с него уже не съезжает. Прошу помощи в этом вопросе.
#define Y_EN A2 #define Y_STP A6 #define Y_DIR A7 #define X_EN 38 #define X_STP A0 #define X_DIR A1 #define Z_EN A8 #define Z_STP 46 #define Z_DIR 48 #define SLEEP 250 //#define X_MIN_PIN 3 #define X_MAX_PIN 2 //#define Y_MIN_PIN 14 //#define Y_MAX_PIN 15 //#define Z_MIN_PIN 18 //#define Z_MAX_PIN 19 int y=0; int x=0; int z=0; void setup() { pinMode(Y_EN, OUTPUT); pinMode(Y_STP, OUTPUT); pinMode(Y_DIR, OUTPUT); digitalWrite(Y_EN, LOW); digitalWrite(Y_DIR, LOW); pinMode(X_EN, OUTPUT); pinMode(X_STP, OUTPUT); pinMode(X_DIR, OUTPUT); digitalWrite(X_EN, LOW); digitalWrite(X_DIR, LOW); pinMode(Z_EN, OUTPUT); pinMode(Z_STP, OUTPUT); pinMode(Z_DIR, OUTPUT); digitalWrite(Z_EN, LOW); digitalWrite(Z_DIR, LOW); Serial.begin(9600); pinMode(X_MAX_PIN, INPUT_PULLUP); } void move_y(int p) { for (int i=0; i <= p; i++) { digitalWrite(Y_STP, HIGH); delayMicroseconds(SLEEP); digitalWrite(Y_STP, LOW); delayMicroseconds(SLEEP); } } void move_x(int p) { for (int i=0; i <= p; i++) { if(digitalRead(X_MAX_PIN) == LOW) { digitalWrite(X_EN, HIGH); } digitalWrite(X_STP, HIGH); delayMicroseconds(SLEEP); digitalWrite(X_STP, LOW); delayMicroseconds(SLEEP); } } void move_z(int p) { for (int i=0; i <= p; i++) { digitalWrite(Z_STP, HIGH); delayMicroseconds(SLEEP); digitalWrite(Z_STP, LOW); delayMicroseconds(SLEEP); } } void loop() { if (Serial.available() > 0) { switch (Serial.read()) { case 'y': y=Serial.parseInt(); if(y>0) { digitalWrite(Y_DIR, LOW); } else { digitalWrite(Y_DIR, HIGH); y=-y; } move_y(y); break; case 'x': x=Serial.parseInt(); if(x>0) { digitalWrite(X_DIR, LOW); } else { digitalWrite(X_DIR, HIGH); x=-x; } move_x(x); break; case 'z': z=Serial.parseInt(); if(z>0) { digitalWrite(Z_DIR, LOW); } else { digitalWrite(Z_DIR, HIGH); z=-z; } move_z(z); break; case 's': delay(Serial.parseInt()); break; default:; } } }Что значит "не съезжает"? Может просто физически застревает и мощи не хватает сдёрнуть? Объясняйтесь толком.
может как-то так?
void move_x(int p) { for (int i = 0; i <= p; i++) { // для прямого направления if (digitalRead(X_MAX_PIN) == LOW || x > 0 ) { digitalWrite(X_EN, HIGH); digitalWrite(X_STP, HIGH); delayMicroseconds(SLEEP); digitalWrite(X_STP, LOW); delayMicroseconds(SLEEP); } // для обратного направления if (digitalRead(X_MIN_PIN) == LOW || x < 0 ) { // здесь должен быть код движения в обратном // направлении пока не наедет на концевик digitalWrite(X_EN, HIGH); digitalWrite(X_STP, HIGH); delayMicroseconds(SLEEP); digitalWrite(X_STP, LOW); delayMicroseconds(SLEEP); } } } void setup() { } void loop() { }надо еще сделать процедуру обработки ошибок и при наезде на концевик выводить мерный остаток с кодом ошибки по оси
А если надо откалибровать нулевую точку. Налетели на концевой -> скорость в 2 раза меньше -> съезжаем с концевого -> скорость в 10 раза меньше начальной -> наезжаем снова на концевой. Так можно получить точность нуля в 2-3 импульса.
Постараюсь объяснить и не тупить сильно. Программа по управлению 3мя осями. Пока мучаю только ось x.
Подключаю мегу к пк и перепрошиваю, далее даю питаниена шилд. Так вот каретка стоит (условно) по середине оси x, далее захожу вот сюда ->
набираю x1000 каретка перемещается вправо на 1000 шагов, соответственно пишу x-1000 каретка перемещается влево на место. Концевик находится в левой стороне. Мне необходимо чтобы каретка доходила до концевика в не зависимо на каком расстоянии она находится от концевика, просто задаю максимальное значение например x-50000, концевик срабатывает и двигатель прекращает работать. Это получилось вот такой код
void move_x(int p) { for (int i=0; i <= p; i++) { if(digitalRead(X_MAX_PIN) == LOW) { digitalWrite(X_EN, HIGH); } digitalWrite(X_STP, HIGH); delayMicroseconds(SLEEP); digitalWrite(X_STP, LOW); delayMicroseconds(SLEEP); } }Но после того как концевик сработал какие бы я команды не писал двигатель не едет (ни в лево хотя я понимаю там ось заканчивается, ни в право). На данный момент делаю так, с помощью этого кода еду до концевика он срабатывает двигатель останавливается. Перепрошиваю мегу вот на такой код (предыдущий комментирую)->
void move_x(int p) { for (int i=0; i <= p; i++) { // if(digitalRead(X_MAX_PIN) == LOW) // { // digitalWrite(X_EN, HIGH); // } if(digitalRead(X_MAX_PIN) == LOW) { digitalWrite(X_EN, LOW); digitalWrite(X_DIR, LOW); } digitalWrite(X_STP, HIGH); delayMicroseconds(SLEEP); digitalWrite(X_STP, LOW); delayMicroseconds(SLEEP); } }пишу x1000 или x-1000 и каретка сходит с концевика и двигается в право т.к digitalWrite(X_DIR, LOW);.
Вот вопрос, а можно без перепрошивания меги каждый раз, чтобы каретка доезжала до концевика, концевик срабатывал и следующей функцией каретка съезжала с концевика в направлении от концевика?
Всем спасибо проблему решил)