Управление мотором DC через драйвер L293D
- Войдите на сайт для отправки комментариев
Ср, 20/11/2019 - 01:51
Какого характера проблема...на базе Уно соединены кнопка тактовая и мотор постоянного питания через драйвер l293d, при нажатии кнопки мотор начинает вращаться в одну сторону беспрерывно до нажатия кнопки ещё раз, подскажите, как сделать так, чтобы он вращался определенное время, а затем переходил в режим ожидания?
Путем изменения скетча управляющего двигателем. В момент нажатия кнопки и запуска двигателя запоминаем текущее время, а потом проверяем не истек ли интервал. Если истек - выключаем
Путем изменения скетча управляющего двигателем. В момент нажатия кнопки и запуска двигателя запоминаем текущее время, а потом проверяем не истек ли интервал. Если истек - выключаем
Т.е. через millis решать проблему? Я пробовал через delay, но после него просто часть скетча игнорируется, а именно
digitalWrite(mp1, LOW);
digitalWrite(mp2,LOW);
Скетч такой набросал, на дребезжание пока забил
int i=0;
int mp1=3;
int mp2=4;
int BUTTON=5;
void setup(){
pinMode(mp1, OUTPUT);
pinMode(mp2,OUTPUT);
pinMode(BUTTON,INPUT);
void loop(){
if(digitalRead(BUTTON)==HIGH)
{i+=1;
}
if (i==1)
{
digitalWrite(mp1, LOW);
digitalWrite(mp2, HIGH);
delay(200);
digitalWrite(mp1,LOW);
digitalWrite(mp2,LOW);
}
else
{
if(i==2)
{
digitalWrite(mp1,HIGH);
digitalWrite(mp2,LOW);
delay(200);
digitalWrite(mp1,LOW);
digitalWrite(mp2,LOW);
i=0;
}
}
Ты мня прости, канеш, но альтернативно мыслящим тут редко помогают.
Тут вопрос не в плане мышления, а в опыте программирования
тут вопрос в том, что ты даже не удосужился прочитать как правильно вставить код
http://arduino.ru/forum/obshchii/pesochnitsa-dlya-vsekh-novichkov#comment-406075
да еще и зачем-то разбил его на несколько сообщений.
Спасибо за ссылку, информативно, но к сожалению кнопки вставить код я не наблюдаю, возможно из-за мобильной версии форума
int i=0; int mp1=3; int mp2=4; int BUTTON=5; void setup() { pinMode(mp1,OUTPUT); pinMode(mp2,OUTPUT); pinMode(BUTTON, INPUT); } void loop() { if(digitalRead(BUTTON)==HIGH) { i+=1; } if(i==1) { digitalWrite(mp1,LOW); digitalWrite(mp2,HIGH); delay(200); digitalWrite(mp1,LOW); digitalWrite(mp2,LOW); } else { if(i==2) { digitalWrite(mp1,HIGH); digitalWrite(mp2,LOW); delay(200); digitalWrite(mp1,LOW); digitalWrite(mp2,LOW); i=0; } } }Двигатель в каждую сторону должен вращаться 200мс (0.2с)? Он хоть дернуться успевает? Какое питание поступает на ардуину и двигатель?
Дёргаться успевает, на ардуинка поступает 4,61в, время условное, потом менять конкретно под задачу буду, основная проблема в том, что при установки времени, к примеру 2000мс он не устанавливается через 2 секунды, а крутится дальше, хотя в коде прописано отключить напряжение на 3 и 4 пине
тут вопрос в том, что ты даже не удосужился прочитать как правильно вставить код
http://arduino.ru/forum/obshchii/pesochnitsa-dlya-vsekh-novichkov#comment-406075
да еще и зачем-то разбил его на несколько сообщений.
чел для нас старался, пытался повысить читабельность кода, не оценили )))
делал для внучки радиоуправление тележкой, код тут, там в комментариях написано, что управлять тележкой (мотором) с временными отрезками менее 10 мсек бессмысленно )))
Ржу ни магу.
Т.е. если питание снять мотор развалится.
//**************************************************************
П.С. так попробуй
int i=0; int mp1=3; int mp2=4; int BUTTON=5; void setup() { pinMode(mp1,OUTPUT); pinMode(mp2,OUTPUT); pinMode(BUTTON, INPUT_PULLUP); } void loop() { static bool buttonPressed=0; if((!digitalRead(BUTTON))&&(!buttonPressed))//предполагается что кнопка притягивает к минусу { i+=1; buttonPressed=HIGH; delay(50); } else if(digitalRead(BUTTON)){ buttonPressed=LOW; delay(50); } if(i==1) { digitalWrite(mp1,LOW); digitalWrite(mp2,HIGH); delay(200); digitalWrite(mp1,LOW); digitalWrite(mp2,LOW); } else { if(i==2) { digitalWrite(mp1,HIGH); digitalWrite(mp2,LOW); delay(200); digitalWrite(mp1,LOW); digitalWrite(mp2,LOW); i=0; } } }Посмотрел Ваши материалы, немного скетч поправил, все хорошо, почти работает, т.е. после нажатия кнопки мотор крутится по часовой стрелке 2 секунды, после второго нажатия крутится против часовой стрелки 2 секунды, но почему-то в начало скетча не возвращается, т.е. на 3 и далее нажатие не реагирует, подскажите пожалуйста, как исправить? boolean mp1_flag=0; boolean mp2_flag=0; boolean butt_flag=0; boolean butt=0; int i=0; int mp1=3; int mp2=4; void setup() { pinMode(mp1,OUTPUT); pinMODE(mp2,OUTPUT); pinMode(5,INPUT); } void loop() { butt=digitalRead(5); if(butt==1&&butt_flag==0) { butt_flag=1; i+=1; mp1_flag=!mp1_flag; delay(50); } if((butt==0)&&(butt_flag==1)) { butt_flag=0; } if(mp1_flag==1&&i==1) { digitalWrite(mp1,HIGH); delay(2000); digitalWrite(mp1,LOW); mp1_flag=!mp1_flag; mp2_flag=!mp2_flag; } if((i==2)&&(mp2_flag==1) { digitalWrite(mp2,HIGH); delay(2000); digitalWrite(mp2,LOW); mp2_flag=!mp2_flag; i=0; } }29 строка возможно логическая ошибка - скобок не хватает. И 18 тоже.
Перед 42 строкой добавить то что в 34 строке.
22 строку перенести в секцию setup. Или лучше убрать совсем, а в ините этой переменной поставить 1 вместо 0.
В 37 строке скобка не закрыта - а оно компилится вообще?
Спасибо за замечания, вернусь домой-проверю на работоспособность
По поводу ошибок в скобках-опечатки, на компьютере интернета нет, вручную с тлф набирал, вот и накосячил в скобках
Увы и ах, но все также работает два раза, на 3е нажатие не реагирует
Начните с простого: сделайте так, чтобы мотор крутился в одну сторону заданное количество времени. Без кнопок.
смотрите какая идея: по нажатию на кнопку и отпускании ее мотор начинает вращаться в одну сторону 2 секунды, затем он переходит в режим ожидания, при повторном нажатии кнопки он вращается в другую сторону 2 секунды, и далее все с начала. вот два нажатия кнопки все хорошо, но после этого складывается ощущение, что скетч "застревает" где-то в конце, где-то в районе 42-43 строки.
Идея мне понятна. Вы хотите результата самостоятельно добиться или просто чтобы кто-то всё Вам разжевал и в рот положил?
по поводу крутящегося в одну сторону мотора-это уже пройденный этап, я же не сходу этот скетч написал
Т.е. не хотите ничего добиваться.
Ну что же, тут не ясли - ложку с кашей в рот никто насильно запихивать не будет.
Я же говорю-с того и начинал, мотор крутился в одну сторону и кнопки не было
ну дак, теперь в другую покрути
Я же говорю-с того и начинал, мотор крутился в одну сторону и кнопки не было
Ну, я вижу, что скетч есть: http://arduino.ru/forum/programmirovanie/upravlenie-motorom-dc-cherez-draiver-l293d#comment-494315
Схемы нет, поэтому что в реальности происходит при mp1 =>LOW и mp2 => LOW никому неизвестно.
начинать надо всё же с определения функций работы мотора, то-есть от может находиться в трёх состояниях:
1. Остановлен
2. Вращение вала по часовой
3. Вращение вала против часовой
Вот рабочий вариант
#define left false #define right true boolean direction=left; boolean run = false; int mp1=3; int mp2=4; int BUTTON=5; void setup() { pinMode(mp1,OUTPUT); pinMode(mp2,OUTPUT); pinMode(BUTTON, INPUT_PULLUP); } void loop() { static boolean buttonPressed=0; if((!digitalRead(BUTTON))&&(!buttonPressed))//предполагается что кнопка притягивает к минусу { buttonPressed=HIGH; delay(50); } else if(digitalRead(BUTTON)&&buttonPressed){ buttonPressed=LOW; run = true; delay(50); } if(run==true){ if(direction==left) { digitalWrite(mp1,HIGH); delay(2000); digitalWrite(mp1,LOW); direction=right; } else { digitalWrite(mp2,HIGH); delay(2000); digitalWrite(mp2,LOW); direction=left; } run=false; } }Благодарю, буду разбираться
Так не интересно.
Все пункты что написал исправил?
Где исправленный скетч который не заработал? По логике косяков прямых больше не заметил в том скетче. Основное было только в том что при каждом нажатии менялась переменная на прямое движение. И она же не менялась при обратном движении.
boolean mp1_flag=0; boolean mp2_flag=0; boolean butt_flag=0; boolean butt=0; int i=0; int mp1=3; int mp2=4; void setup() { pinMode(mp1,OUTPUT); pinMode(mp2,OUTPUT); pinMode(5,INPUT); mp1_flag=!mp1_flag; } void loop() { butt=digitalRead(5); if((butt==1)&&(butt_flag==1)) { butt_flag=1; i+=1; delay(50); } if((butt==0)&&(butt_flag==1)) { butt_flag=0; } if((i==1)&&(mp1_flag==1)) { digitalWrite(mp1,HIGH); delay(2000); digitalWrite(mp1,LOW); mp1_flag=!mp1_flag; mp2_flag=!mp2_flag; } if((i==2)&&(mp2_flag==1)) { digitalWrite(mp2,HIGH); delay(2000); digitalWrite(mp2,LOW); mp1_flag=!mp1_flag; mp2_flag=!mp2_flag; i=0; } }Чего вы хотели добиться в 18 строке (butt_flag==1)? Вообще в условие есть вхождение учитывая следующее условие и начальное значение переменной? Ну конечно если при подаче питания кнопка не зажата?
Кстати какой уровень зажатой кнопки?
В остальном не вижу причин скетчу не работать.
Не совсем понял по поводу зажатой кнопки, по поводу 18 строчки проверю дома
Пока неизвестно как присоеденены управляющие входы драйвера - все может работать как заблагорассудится бозону Хиггса.
1й вход 5в, 2вход-3йпин, 3 вход-первый контакт мотора, 4 и 5 вход земля, 6 вход-второй контакт мотора, 7 вход-4пин, 8 вход-5в
Чего вы хотели добиться в 18 строке (butt_flag==1)? Вообще в условие есть вхождение учитывая следующее условие и начальное значение переменной? Ну конечно если при подаче питания кнопка не зажата?
Кстати какой уровень зажатой кнопки?
В остальном не вижу причин скетчу не работать.
Огромное Вам спасибо, все дело было в 18 строке, если бы не Ваши замечания и помощь-ничего бы у меня не вышло, теперь все работает как задумано