Работа с шилдом l298n

Max1mqaaaaa
Offline
Зарегистрирован: 30.11.2013

Доброго времени суток. У меня возникла такая проблема. Подцепил к ардуине мотор шилд l298n, хочу настроить его так:

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

#define BUTTON 11
#define BUTTON2 10
#define LED 12
#define d1 2
#define m1 3
#define d2 4
#define m2 5
int motorspeed=200;
int stopmotor=0;


void setup()
{
    pinMode(LED, OUTPUT);
    pinMode(BUTTON,INPUT_PULLUP);
    pinMode(BUTTON2,INPUT_PULLUP);
    pinMode(d1, OUTPUT);
    pinMode(d2, OUTPUT);
}

void loop()
{
    if(digitalRead(BUTTON)==LOW){
          if(digitalRead(BUTTON2)==LOW){
              digitalWrite(LED,LOW);
              analogWrite(m1, 0);       // скорость вращения
              analogWrite(m2, 0);
          }else{
              digitalWrite(LED,HIGH);
              digitalWrite(d1, 0);  // направление
              digitalWrite(d2, 0);
              analogWrite(m1, 200);       // скорость вращения
              analogWrite(m2, 200);   
          }
            
      }else{
          if(digitalRead(BUTTON2)==LOW){  
              digitalWrite(LED,HIGH);
              digitalWrite(d1, 1);  // направление
              digitalWrite(d2, 1);
              analogWrite(m1, 200);       // скорость вращения
              analogWrite(m2, 200);   
          }else{
              digitalWrite(LED,LOW);
              analogWrite(m1, 0);       // скорость вращения
             analogWrite(m2, 0);     
          }
      }
}

 

Mastino
Offline
Зарегистрирован: 03.12.2011

кнопки как подключены?

Max1mqaaaaa
Offline
Зарегистрирован: 30.11.2013

к ардуинке обычно подключены напрямую)

Max1mqaaaaa
Offline
Зарегистрирован: 30.11.2013

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

Zizilk
Offline
Зарегистрирован: 30.05.2013

Попробуй нарисовать блок схему того что ты написал в псевдо коде и выложи на проверку. Это может решить проблему почему глюк происходит второй

А первый .. выложи схему как именно подключены кнопки

vvadim
Offline
Зарегистрирован: 23.05.2012

...и как моторы подключил

Max1mqaaaaa
Offline
Зарегистрирован: 30.11.2013

Вот вроде простая блок-схема. 

Кнопки без резисторов подключал. Объясняли на мастер-классе так)

 

Zizilk
Offline
Зарегистрирован: 30.05.2013

А нужно с резисторами, они там не просто так да и схема подключения кнопок не особо правильная, там в итоге может что угодно быть. Высший пилотаж что они у тебя ни на змелю не заведены ни на 5В. Что с чем дуина сравнивать будет то?

По блок схеме похоже на твой скетч но оба выглядят странно хоть и всё верно.

#define BUTTON 11
#define BUTTON2 10
#define LED 13
#define d1 2
#define m1 3
#define d2 4
#define m2 5
int buttonTowardsPressed=0;
int buttonBackwardsPressed=0;
int currentSpeed=0;
int currentDirection=0;

 
void setup()
{
    pinMode(LED, OUTPUT);
    pinMode(BUTTON,INPUT);
    pinMode(BUTTON2,INPUT);
    pinMode(d1, OUTPUT);
    pinMode(d2, OUTPUT);
}
//Мозг программы определяем как обрабатываем кнопки в принципе можно задать действие на любую комбинацию
void control()
{
	if((buttonTowardsPressed==1)&&(buttonBackwardsPressed==0)){
		digitalWrite(LED,HIGH);
		currentSpeed=200;
		currentDirection=0;
		
	}
	else if((buttonTowardsPressed==0)&&(buttonBackwardsPressed==1)){
		digitalWrite(LED,HIGH);
		currentSpeed=200;
		currentDirection=1;
	}
	else{
		currentSpeed=0;
	}
}
//Вынесем логику управления моторами
void motors()
{
	digitalWrite(d1, currentDirection);
	digitalWrite(d2, currentDirection);
	analogWrite(m1, currentSpeed);
	analogWrite(m2, currentSpeed);
}
 
void loop()
{
    //проверяем состояние кнопок
	if(digitalRead(BUTTON)==HIGH){
		buttonTowardsPressed=1;
	}
	if(digitalRead(BUTTON2)==HIGH){
		buttonBackwardsPressed=1;
	}
	
	control();
	motors();
}

 

Max1mqaaaaa
Offline
Зарегистрирован: 30.11.2013

Спасибо, завтра попробую, отпишусь:)

Zizilk
Offline
Зарегистрирован: 30.05.2013

но про подключение кнопок лучше http://arduino.ru/forum/programmirovanie/rabota-s-knopkami-v-pomoshch-no... тут смотри, там грантированно работает, как работает у тебя не понятно

Max1mqaaaaa
Offline
Зарегистрирован: 30.11.2013

хорошо, подключу так как написано

maksim
Offline
Зарегистрирован: 12.02.2012

Zizilk пишет:

как работает у тебя не понятно

Если не понятно вам, то это не значит что должно быть не понятно всем.

Zizilk пишет:

А нужно с резисторами, они там не просто так да и схема подключения кнопок не особо правильная, там в итоге может что угодно быть. Высший пилотаж что они у тебя ни на змелю не заведены ни на 5В. Что с чем дуина сравнивать будет то?

Не нужно никаких резисторов. Не вводите человека в заблуждение. Код внимательно посмотрите из первого сообщения:

    pinMode(BUTTON,INPUT_PULLUP);
    pinMode(BUTTON2,INPUT_PULLUP);

Ссылаетесь на тему про кнопки, но при этом сами ее и не читали.

Кнопки подключены верно.

А проблема в том что вы использовали не совсем корректную схему подключения драйвера.

Вот решение вашей проблемы:

http://arduino.ru/forum/apparatnye-voprosy/vopros-po-upravleniyu-dvigatelei-s-pomoshchyu-l298n-shimom

Zizilk
Offline
Зарегистрирован: 30.05.2013

maksim пишет:

Если я правильно понимаю то так при таком объявлении будем использовать подтягивающие резисторы на самой микрухе... но опять таки из того что я читал говорилось, что это не особо надёжно и лучше явно задать их явно иначе действительно может начать происходить что угодно...

L298N насколько знаю это не целиком шилд или модуль а единственный драйвер микросхемка, которая может быть внутри разных шилдов или модулей... авто не уточнил какой у него именно шилд или модуль...

Max1mqaaaaa
Offline
Зарегистрирован: 30.11.2013

у меня такая вот штука)

Zizilk
Offline
Зарегистрирован: 30.05.2013

Кстати

Pins Configured as INPUT_PULLUP

The Atmega chip on the Arduino has internal pull-up resistors (resistors that connect to power internally) that you can access. If you prefer to use these instead of external pull-down resistors, you can use the INPUT_PULLUP argument in pinMode(). This effectively inverts the behavior, where HIGH means the sensor is off, and LOW means the sensor is on. See the Input Pullup Serial tutorial for an example of this in use.

maksim
Offline
Зарегистрирован: 12.02.2012

Max1mqaaaaa пишет:
у меня такая вот штука)

И? Вы тему прочитали по ссылке из #11 сообщения?

maksim
Offline
Зарегистрирован: 12.02.2012

Zizilk пишет:

Если я правильно понимаю то так при таком объявлении будем использовать подтягивающие резисторы на самой микрухе... но опять таки из того что я читал говорилось, что это не особо надёжно и лучше явно задать их явно иначе действительно может начать происходить что угодно...

Надо было читать дальше, так как то что говорилось - это было субъективное мнение автора той темы и не более того. Резистор нужно ставить в том случае если рядом находится источник сильных электомагнитных помех, но в этом случае и 10 кОм может оказаться мало. Опять таки это все частные случаи, в общих случаях нужно использовать аппартные возможности МК так как именно для этого они и предусмотренны.

Zizilk
Offline
Зарегистрирован: 30.05.2013

Я не знаю, но 298-ой драйвер ставят для более или менее солидной нагрузки в частности электромоторов. Насколько они сойдут за сильные электромагнитные помехи...

maksim
Offline
Зарегистрирован: 12.02.2012

Тут все зависит от того какой длины провода от кнопок к дуине и на каком расстоянии эти провода расположены от моторов. Естественно если взять полуметровые провода и обмотамть вокруг двигателей...

maksim
Offline
Зарегистрирован: 12.02.2012

Так что и вам рекомндую пользоваться внутренней подтяжкой и только когда она не тянет переходить на внешнюю.

Zizilk
Offline
Зарегистрирован: 30.05.2013

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

maksim
Offline
Зарегистрирован: 12.02.2012

Дребезг отдельная тема. С дребезгом можно тоже бороться как программно так и аппаратно. Что бы избавиться от дребезга нужно не резистор ставить, а конденсатор. Программное решение проблемы дребезга в прерывании тоже уже обсуждалось на форуме.

Max1mqaaaaa
Offline
Зарегистрирован: 30.11.2013

Да, прочитал. Как я понял, мне нужно подключить ENA и ENB и по нажатию кнопки дописать:

digitalWrite(IN1, 1); digitalWrite(IN2,0); analogWrite(ENA, speed); digitalWrite(IN3, 1); digitalWrite(IN4, 0); analogWrite(ENB, speed);- при движении в одну сторону. А в другую просто поменять 0 на 1? или не?)

maksim
Offline
Зарегистрирован: 12.02.2012

Если вы хотите простого алгоритма управления, то да нужно задействовать еще и enable'ы. Если же вы поняли как работать с 4-х проводным подключением, то можно пользоваться и им.

Max1mqaaaaa
Offline
Зарегистрирован: 30.11.2013

ну чем проще, тем лучше) завтра попробую, надеюсь все получится

Max1mqaaaaa
Offline
Зарегистрирован: 30.11.2013

Спасибо, все заработало)