Шаговый двигатель с концевыми выключателями
У меня есть код ниже, который является моей попыткой управлять направлением шагового двигателя, который перемещает каретку вправо и влево. Кроме того, на каждом конце пути есть ограничения, которые при активации останавливают движение в соответствующем направлении. Моя проблема в том, что двигатель отлично работает в левом и правом направлениях, но я могу заставить работать только один из концевых выключателей. Буду признателен за любые предложения.
int PUL = 7; //определить импульсный вывод
int DIR = 6; //определить направление вывода
int ENA = 5; //определить пин включения
int RGT = 3;
int LFT = 2;
int potPin = A5;
int count = 0;
int interval = 1000;
int val = 0;
int Spd = 500;
#define Limit01 8 // Контакт 2 подключен к выходу концевого выключателя
#define Limit02 9 // Контакт 3 подключен к выходу концевого выключателя
void setup() {
pinMode (PUL, OUTPUT);
pinMode (DIR, OUTPUT);
pinMode (ENA, OUTPUT);
Serial.begin(9600);
}
void loop() {
if (digitalRead(LFT) == LOW) { // Если джойстик перемещен влево
if (digitalRead(Limit01) == HIGH) {} // проверяем, активирован ли концевой выключатель
else { // если концевой выключатель не активирован, вращаем двигатель по часовой стрелке
digitalWrite(DIR, LOW);
digitalWrite(ENA, HIGH);
digitalWrite(PUL, HIGH);
delayMicroseconds(500);
digitalWrite(PUL, LOW);
delayMicroseconds(500);
}
}
if (digitalRead(RGT) == LOW) { // Если джойстик перемещен вправо
if (digitalRead(Limit02) == HIGH) {} // проверяем, активирован ли концевой выключатель
else { // если концевой выключатель не активирован, вращаем двигатель против часовой стрелки
digitalWrite(DIR, HIGH);
digitalWrite(ENA, HIGH);
digitalWrite(PUL, HIGH);
delayMicroseconds(500);
digitalWrite(PUL, LOW);
delayMicroseconds(500);
}
}
}
@Dennis Brandt, 👍2
Обсуждение2 ответа
Из вашего вопроса я понял, что вам нужен только один концевой выключатель для управления шаговым двигателем в обоих направлениях. Вот код, который может вам пригодиться в этом случае:
int dirpin_T1 = 2;
int dirH_T1 = 3;
int steppin_T1 = 4;
int limit = 10; // ПРЕДПОЛАГАЕМ, ЧТО КОНЦЕВОЙ ВЫКЛЮЧАТЕЛЬ РАЗМЕЩЕН В ПРАВОМ УГЛУ
void setup() {
pinMode(limit,INPUT);
pinMode(dirpin_T1, OUTPUT);
pinMode(dirH_T1, OUTPUT);
pinMode(steppin_T1, OUTPUT);
}
void loop() { //ШАГОВЫЙ ДВИЖЕНИЕ СЛЕВА НАПРАВО
digitalWrite(dirpin_T1, LOW );
digitalWrite(dirH_T1, LOW);
do
{
digitalWrite(steppin_T1, LOW); // Это изменение с LOW на HIGH создает
digitalWrite(steppin_T1, HIGH); // "Нарастающий фронт", чтобы easydriver знал, когда делать шаг.
delayMicroseconds(50);
}(digitalRead(limit)==HIGH); //ПРИ НАЖАТИИ КОНЦЕВОГО ВЫКЛЮЧАТЕЛЯ ДВИГАТЕЛЬ ОСТАНАВЛИВАЕТСЯ
delay(500);
//ПРИЧИНЕ НИЗКОГО КОНЦЕВОГО ВЫКЛЮЧАТЕЛЯ ИЗМЕНИТЕ НАПРАВЛЕНИЕ ВРАЩЕНИЯ ДВИГАТЕЛЯ
if(digitalRead(limit)==LOW)
{
digitalWrite(dirpin_T1, LOW ); //ИЗМЕНЕНИЕ НАПРАВЛЕНИЯ ВРАЩЕНИЯ ДВИГАТЕЛЯ (С НИЗКОГО НА ВЫСОКИЙ)
digitalWrite(dirH_T1, HIGH);
for(int i=0; i<36000;i++)
{ //попробуйте изменить значение i, так как оно зависит от того, на сколько оборотов вы хотите, чтобы ваш двигатель сделал шаг вперед
digitalWrite(steppin_T1, LOW); // Это изменение с LOW на HIGH создает
digitalWrite(steppin_T1, HIGH); // "Нарастающий фронт", чтобы easydriver знал, когда делать шаг.
delayMicroseconds(50);
}
}
}
Простая логика заключается в том, чтобы вращать двигатель в одном направлении до тех пор, пока концевой выключатель не станет ВЫСОКИМ. И вращать его в другом направлении, когда он станет НИЗКИМ, т. е. уже нажатым. Поправьте меня, если я ошибаюсь, и попробуйте изменить код в соответствии с этой логикой. Однако вам нужно изменить свой код в зависимости от того, какой тип драйвера вы используете. Сейчас я использую драйвер TB6560. Вы можете использовать цикл if вместо цикла do while, чтобы было проще понять.
это концевой выключатель, @Sonali_B
это пустой цикл, который остановит двигатель, когда digitalRead(S01)==HIGH, в противном случае двигатель продолжит вращаться, @Sonali_B
Более ранний комментарий отсутствовал, поэтому это привело к небольшой путанице, как и выше. Комментарии — это строки в программе, которые используются для информирования вас или других о том, как работает программа. Они игнорируются компилятором и не экспортируются в процессор, поэтому они не занимают места во флэш-памяти микроконтроллера. Единственная цель комментариев — помочь вам понять (или запомнить) или информировать других о том, как работает ваша программа., @Sonali_B
Использование в то время как (условие) { код для выполнения } убедившись, что сам код «короткий», чтобы не выйти за пределы условия
Если вы используете конструкцию while вместо do / while, вы сначала проверяете условие перед выполнением кода. пока (не на пределе) переместить степпер на один шаг Также активное состояние концевого выключателя должно быть заземлено, а не +V. Вопрос безопасности. Если вы случайно заземлите сигнал, он будет действителен, если же путь сигнала уже заземлен, то случайное подключение к нему +V не будет обнаружено.
- Arduino uno + cnc Shield v3 + драйвер шагового двигателя A4988 + AccelStepper?
- Запустить два степпера одновременно
- Как контролировать скорость шагового двигателя 28BYJ-48 без использования библиотеки?
- Обратная связь по положению для шагового двигателя
- Библиотека AccelStepper: Как перейти на позицию, не замедляясь?
- Питание Arduino напрямую от драйвера двигателя (DRV8825) или внешнего источника питания?
- Можно ли использовать шаговый двигатель?
- Проблема со чтением данных с энкодера с помощью arduino
Вы не инициализировали входы. Похоже, что у переключателя есть pull-down, поэтому нет внутреннего pull-up, но в любом случае инициализируйте их в начале. Затем... Вы уверены, что переключатель работает? Вы пробовали использовать скетч для считывания состояния переключателей, чтобы проверить, работают ли они?, @frarugi87
Можете ли вы предоставить схему подключения выключателей? Вы измерили напряжение на входах концевого выключателя при открытом и закрытом положении выключателя?, @linhartr22