Управление мотором DC через драйвер L293D

ВорОН
Offline
Зарегистрирован: 20.11.2019

Какого характера проблема...на базе Уно соединены кнопка тактовая и мотор постоянного питания через драйвер l293d, при нажатии кнопки мотор начинает вращаться в одну сторону беспрерывно до нажатия кнопки ещё раз, подскажите, как сделать так, чтобы он вращался определенное время, а затем переходил в режим ожидания?

asam
asam аватар
Онлайн
Зарегистрирован: 12.12.2018

ВорОН пишет:
как сделать так, чтобы он вращался определенное время, а затем переходил в режим ожидания?

 

Путем изменения скетча управляющего двигателем. В момент нажатия кнопки и запуска двигателя запоминаем текущее время, а потом проверяем не истек ли интервал. Если истек - выключаем

ВорОН
Offline
Зарегистрирован: 20.11.2019

asam пишет:

ВорОН пишет:
как сделать так, чтобы он вращался определенное время, а затем переходил в режим ожидания?

 

Путем изменения скетча управляющего двигателем. В момент нажатия кнопки и запуска двигателя запоминаем текущее время, а потом проверяем не истек ли интервал. Если истек - выключаем


Т.е. через millis решать проблему? Я пробовал через delay, но после него просто часть скетча игнорируется, а именно
digitalWrite(mp1, LOW);
digitalWrite(mp2,LOW);

ВорОН
Offline
Зарегистрирован: 20.11.2019

Скетч такой набросал, на дребезжание пока забил
int i=0;
int mp1=3;
int mp2=4;
int BUTTON=5;

ВорОН
Offline
Зарегистрирован: 20.11.2019

void setup(){
pinMode(mp1, OUTPUT);
pinMode(mp2,OUTPUT);
pinMode(BUTTON,INPUT);

ВорОН
Offline
Зарегистрирован: 20.11.2019

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);
}

ВорОН
Offline
Зарегистрирован: 20.11.2019

else
{
if(i==2)
{
digitalWrite(mp1,HIGH);
digitalWrite(mp2,LOW);
delay(200);
digitalWrite(mp1,LOW);
digitalWrite(mp2,LOW);
i=0;
}
}

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Ты мня прости, канеш, но альтернативно мыслящим тут редко помогают. 

ВорОН
Offline
Зарегистрирован: 20.11.2019

Тут вопрос не в плане мышления, а в опыте программирования

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

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

http://arduino.ru/forum/obshchii/pesochnitsa-dlya-vsekh-novichkov#comment-406075

да еще и зачем-то разбил его на несколько сообщений. 

ВорОН
Offline
Зарегистрирован: 20.11.2019

Спасибо за ссылку, информативно, но к сожалению кнопки вставить код я не наблюдаю, возможно из-за мобильной версии форума

ВорОН
Offline
Зарегистрирован: 20.11.2019
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;
}
}
}

 

nevkon
Offline
Зарегистрирован: 20.01.2015

Двигатель в каждую сторону должен вращаться 200мс (0.2с)? Он хоть дернуться успевает? Какое питание поступает на ардуину и двигатель?

ВорОН
Offline
Зарегистрирован: 20.11.2019

Дёргаться успевает, на ардуинка поступает 4,61в, время условное, потом менять конкретно под задачу буду, основная проблема в том, что при установки времени, к примеру 2000мс он не устанавливается через 2 секунды, а крутится дальше, хотя в коде прописано отключить напряжение на 3 и 4 пине

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

DetSimen пишет:

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

http://arduino.ru/forum/obshchii/pesochnitsa-dlya-vsekh-novichkov#comment-406075

да еще и зачем-то разбил его на несколько сообщений. 

чел для нас старался, пытался повысить читабельность кода, не оценили )))

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

anatoli_nik
Онлайн
Зарегистрирован: 17.01.2019

Цитата:
и мотор постоянного питания

Ржу ни магу.

Т.е. если питание снять мотор развалится.

//**************************************************************

П.С. так попробуй

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;
}
}
}

 

ВорОН
Offline
Зарегистрирован: 20.11.2019
Посмотрел Ваши материалы, немного скетч поправил, все хорошо, почти работает, т.е. после нажатия кнопки мотор крутится по часовой стрелке 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;
}
}


 

nevkon
Offline
Зарегистрирован: 20.01.2015

29 строка возможно логическая ошибка - скобок не хватает. И 18 тоже.

Перед 42 строкой добавить то что в 34 строке.

22 строку перенести в секцию setup. Или лучше убрать совсем, а в ините этой переменной поставить 1 вместо 0.

В 37 строке скобка не закрыта - а оно компилится вообще?

ВорОН
Offline
Зарегистрирован: 20.11.2019

Спасибо за замечания, вернусь домой-проверю на работоспособность

ВорОН
Offline
Зарегистрирован: 20.11.2019

По поводу ошибок в скобках-опечатки, на компьютере интернета нет, вручную с тлф набирал, вот и накосячил в скобках

ВорОН
Offline
Зарегистрирован: 20.11.2019

Увы и ах, но все также работает два раза, на 3е нажатие не реагирует

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

Начните с простого: сделайте так, чтобы мотор крутился в одну сторону заданное количество времени. Без кнопок.

ВорОН
Offline
Зарегистрирован: 20.11.2019

смотрите какая идея: по нажатию на кнопку и отпускании ее мотор начинает вращаться в одну сторону 2 секунды, затем он переходит в режим ожидания, при повторном нажатии кнопки он вращается в другую сторону 2 секунды, и далее все с начала. вот два нажатия кнопки все хорошо, но после этого складывается ощущение, что скетч "застревает" где-то в конце, где-то в районе 42-43 строки.

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

Идея мне понятна. Вы хотите результата самостоятельно добиться или просто чтобы кто-то всё Вам разжевал и в рот положил?

ВорОН
Offline
Зарегистрирован: 20.11.2019

по поводу крутящегося в одну сторону мотора-это уже пройденный этап, я же не сходу этот скетч написал

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

Т.е. не хотите ничего добиваться.

Ну что же, тут не ясли - ложку с кашей в рот никто насильно запихивать не будет.

ВорОН
Offline
Зарегистрирован: 20.11.2019

Я же говорю-с того и начинал, мотор крутился в одну сторону и кнопки не было

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

ну дак, теперь в другую покрути

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

ВорОН пишет:

Я же говорю-с того и начинал, мотор крутился в одну сторону и кнопки не было

Ну, я вижу, что скетч есть: http://arduino.ru/forum/programmirovanie/upravlenie-motorom-dc-cherez-draiver-l293d#comment-494315

Схемы нет, поэтому что в реальности происходит при mp1 =>LOW и mp2 => LOW никому неизвестно.

 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

начинать надо всё же с определения функций работы мотора, то-есть от может находиться в трёх состояниях:
1. Остановлен
2. Вращение вала по часовой
3. Вращение вала против часовой

 

anatoli_nik
Онлайн
Зарегистрирован: 17.01.2019

Вот рабочий вариант

#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;
}
}

 

ВорОН
Offline
Зарегистрирован: 20.11.2019

Благодарю, буду разбираться

nevkon
Offline
Зарегистрирован: 20.01.2015

Так не интересно.

Все пункты что написал исправил?

Где исправленный скетч который не заработал? По логике косяков прямых больше не заметил в том скетче. Основное было только в том что при каждом нажатии менялась переменная на прямое движение. И она же не менялась при обратном движении.

ВорОН
Offline
Зарегистрирован: 20.11.2019
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;
    }
  }

 

nevkon
Offline
Зарегистрирован: 20.01.2015

Чего вы хотели добиться в 18 строке (butt_flag==1)? Вообще в условие есть вхождение учитывая следующее условие и начальное значение переменной? Ну конечно если при подаче питания кнопка не зажата?

Кстати какой уровень зажатой кнопки?

В остальном не вижу причин скетчу не работать.

ВорОН
Offline
Зарегистрирован: 20.11.2019

Не совсем понял по поводу зажатой кнопки, по поводу 18 строчки проверю дома

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

Пока неизвестно как присоеденены управляющие входы драйвера - все может работать как заблагорассудится бозону Хиггса.

ВорОН
Offline
Зарегистрирован: 20.11.2019

1й вход 5в, 2вход-3йпин, 3 вход-первый контакт мотора, 4 и 5 вход земля, 6 вход-второй контакт мотора, 7 вход-4пин, 8 вход-5в

ВорОН
Offline
Зарегистрирован: 20.11.2019

nevkon пишет:

Чего вы хотели добиться в 18 строке (butt_flag==1)? Вообще в условие есть вхождение учитывая следующее условие и начальное значение переменной? Ну конечно если при подаче питания кнопка не зажата?

Кстати какой уровень зажатой кнопки?

В остальном не вижу причин скетчу не работать.

Огромное Вам спасибо, все дело было в 18 строке, если бы не Ваши замечания и помощь-ничего бы у меня не вышло, теперь все работает как задумано