Двигатель вращается только в одну сторону.

kidanov
Offline
Зарегистрирован: 11.02.2017

Нужно крутить двигатель по кнопкам или в одну сторону или в другую с изменением скорости. Сам очень плохо разбираюсь, посмотрел на просторах инета и сделал скетч под свой двигатель. Скорость регулируется, но работает только одна кнопка на 7м входе, на 6м не видит. И еще не знаю как снять напряжение с ключей во время простоя, очень греется когда стоить. 

Вот что набрасал, не мое, просто поправил под свой движек. Основная плата UNO, драйвер L298N.

/* Управление шаговым двигателем, подключенного к контроллеру на базе микросхемы L298*/
#include <Stepper.h> // Подключаем библиотеку управления шаговыми двигателями
const int StepsForRotation = 24; // 24 шага на оборот - 7.5 градуса на один шаг
Stepper stepmotor (StepsForRotation, 8, 9, 10, 11); // Инициализируем шаговый двигатель 24 шага на оборот, управление обмотками через 8, 9, 10, 11 цифровые выходы
const int buttonPin6 = 6; //номер входа, подключенный к кнопке
const int buttonSin7 = 7; //номер входа, подключенный к кнопке
int buttonState = 0; //переменная для хранения состояния кнопки

void setup()
{
  pinMode(buttonPin6 , INPUT); //обозначаем пин 6 входом
  pinMode(buttonSin7 , INPUT); //обозначаем пин 7 входом
}
void loop(){
  static int Napr = 0; // переменная направления вращения двигателя варианты значений 1 / 0 / -1
  int sensorValue = analogRead(A0); // на А0 переменныый резистор им регулируем скорость вращения
  float Scor = sensorValue * (1023 / 1023.0); // определяем скорость вращения шагового двигателя
  stepmotor.setSpeed (Scor) ; // устанавливаем скорость вращения
  
buttonState = digitalRead(buttonPin6); // считываем показания на кнопке пин 6
  if (buttonState == HIGH) {
    (Napr = 1); // если кнопка нажата сделать шаговому двигателю 1 шаг
  }
  else {
    (Napr = 0);
  } // если кнопка не нажата двигатель сделает 0 шагов
  
buttonState = digitalRead(buttonSin7); // считываем показания на кнопке пин 7
  if (buttonState == HIGH) {
    (Napr = -1); // если кнопка нажата сделать шаговому двигателю -1 шаг
  }
  else {
    (Napr = 0);
  } // если кнопка не нажата двигатель сделает 0 шагов
  
  stepmotor.step(Napr) ; // Дивагеть должен сделать кол-во шагов согласно переменной Napr 
}

 

 

kidanov
Offline
Зарегистрирован: 11.02.2017

Ребят, может что не так написал, извиняйте, но помогите с прогой пож.

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

Временно закомментируйте всё, что связано с мотором и разберитесь с кнопками - светодиод подцепите или Serial.print() на срабатывание D6/D7.

kidanov
Offline
Зарегистрирован: 11.02.2017

С кнопками, физически все нормально, проверял перетыканием, работают. Если не трудно , какие строки закомментировать?

b707
Offline
Зарегистрирован: 26.05.2017

kidanov пишет:

 Если не трудно , какие строки закомментировать?

ну где у вас мотор крутится? - в строке 36 - вот ее и уберите

А вот строки 22, 25, 30 и 33 у вас какие-то странные. Кто вас учил такому синтаксису? К чему там скобки?
Для проверки программы замените эти строки выводом в Сериал соответвующих надписей, ну типа вместо Napr =1 - вставляете Serial.print("Napravlenie 1");

kalapanga
Offline
Зарегистрирован: 23.10.2016

У Вас нажата кнопка 6. Строка 20 - считали её состояние. Проверили условие. Строка 22 - установили Napr = 1. Скетч продолжается! Считываем состояние кнопки 7. Она не нажата. Проверяем условие, попадаем в строку 33 и устанавливаем Napr = 0. А старое значение 1 потеряли и забыли. Вот оно и не крутится. Логику надо переписывать.

asam
asam аватар
Offline
Зарегистрирован: 12.12.2018

И, кстати, а кнопки, то как подключены? К 5В или к земле?

kidanov
Offline
Зарегистрирован: 11.02.2017

asam пишет:

И, кстати, а кнопки, то как подключены? К 5В или к земле?

к 5 вольтам, земля через резистор 10к

kidanov
Offline
Зарегистрирован: 11.02.2017

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

kidanov
Offline
Зарегистрирован: 11.02.2017

kalapanga
Offline
Зарегистрирован: 23.10.2016

У Вас 2 кнопки. Возможны 4 состояния. Вам нужно для каждого написать своё действие (как вариант ничего не делать). Сначала определили состояние обеих кнопок, потом принимаете решение:

Если нажаты обе, то ...

Если 6 нажата, а 7 не нажата, то ...

Если 6 не нажата, а 7 нажата, то ...

Если ничего не нажато, то ...

Как-то так.

kidanov
Offline
Зарегистрирован: 11.02.2017

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

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

Скорость регулируется во время нажатия 1й или 2й кнопки.

когда двигатель стоит, надо закрыть все ключи, что бы не повалось напряжение на мотор, греется очень.

Вот в принципе моя задача

gfx125
Offline
Зарегистрирован: 27.05.2017

прбуйте так

/*Управление шаговым двигателем, подключенного к контроллеру на базе микросхемы L298*/
#include <Stepper.h> // Подключаем библиотеку управления шаговыми двигателями
const int StepsForRotation = 24; // 24 шага на оборот - 7.5 градуса на один шаг
Stepper stepmotor (StepsForRotation, 8, 9, 10, 11); // Инициализируем шаговый двигатель 24 шага на оборот, управление обмотками через 8, 9, 10, 11 цифровые выходы
int buttonPin6 = 6; //номер входа, подключенный к кнопке
int buttonSin7 = 7; //номер входа, подключенный к кнопке
int buttonState = 0; //переменная для хранения состояния кнопки

void setup()
{
  pinMode(6, INPUT); //обозначаем пин 6 входом
  pinMode(7, INPUT); //обозначаем пин 7 входом
}
void loop() {
  int Napr = 0; // переменная направления вращения двигателя варианты значений 1 / 0 / -1
  int sensorValue = analogRead(A0); // на А0 переменныый резистор им регулируем скорость вращения
  float Scor = sensorValue * (1023 / 1023.0); // определяем скорость вращения шагового двигателя
  stepmotor.setSpeed (Scor) ; // устанавливаем скорость вращения

  if (digitalRead(6) == HIGH) {
    buttonState = 1;
  }
  else
  {
    if (digitalRead(7) == HIGH)
    {
      buttonState = 2;
    }
    else
    {
      buttonState = 0;
    }
  }

  if (buttonState == 1) Napr = 1; // если кнопка нажата сделать шаговому двигателю 1 шаг
  if (buttonState == 2) Napr = -1; // если кнопка нажата сделать шаговому двигателю -1 шаг
  if (buttonState == 0) Napr = 0; // если кнопка не нажата двигатель сделает 0 шагов

  stepmotor.step(Napr) ; // Дивагеть должен сделать кол-во шагов согласно переменной Napr
}

 

asam
asam аватар
Offline
Зарегистрирован: 12.12.2018

Если с минимальными изменениями, то поробуй так:

/* Управление шаговым двигателем, подключенного к контроллеру на базе микросхемы L298*/
#include <Stepper.h> // Подключаем библиотеку управления шаговыми двигателями
const int StepsForRotation = 24; // 24 шага на оборот - 7.5 градуса на один шаг
Stepper stepmotor (StepsForRotation, 8, 9, 10, 11); // Инициализируем шаговый двигатель 24 шага на оборот, управление обмотками через 8, 9, 10, 11 цифровые выходы
const int buttonPin6 = 6; //номер входа, подключенный к кнопке
const int buttonSin7 = 7; //номер входа, подключенный к кнопке
int buttonState = 0; //переменная для хранения состояния кнопки

void setup()
{
  pinMode(buttonPin6 , INPUT); //обозначаем пин 6 входом
  pinMode(buttonSin7 , INPUT); //обозначаем пин 7 входом
}
void loop() {
  static int Napr = 0; // переменная направления вращения двигателя варианты значений 1 / 0 / -1
  int sensorValue = analogRead(A0); // на А0 переменныый резистор им регулируем скорость вращения
  float Scor = sensorValue * (1023 / 1023.0); // определяем скорость вращения шагового двигателя
  stepmotor.setSpeed (Scor) ; // устанавливаем скорость вращения

  buttonState = digitalRead(buttonPin6); // считываем показания на кнопке пин 6
  if (buttonState == HIGH) {
    Napr++; // если кнопка нажата сделать шаговому двигателю 1 шаг
  }
  buttonState = digitalRead(buttonSin7); // считываем показания на кнопке пин 7
  if (buttonState == HIGH) {
    Napr--; // если кнопка нажата сделать шаговому двигателю -1 шаг
  }
  stepmotor.step(Napr) ; // Дивагеть должен сделать кол-во шагов согласно переменной Napr
}

 

Но это все очень криво. Так, убедиться, что кнопки работают

kidanov
Offline
Зарегистрирован: 11.02.2017

gfx125 пишет:

прбуйте так

Во работает, огромное спасибо. А вот как снять напряжение с ключей.

kidanov
Offline
Зарегистрирован: 11.02.2017

asam пишет:

Если с минимальными изменениями, то поробуй так:

Но это все очень криво. Так, убедиться, что кнопки работают

У вашего варианта при нажатии любой кнопки двигатель начинает правильно но не останавливается, но спасибо что тоже ответили.

b707
Offline
Зарегистрирован: 26.05.2017

kalapanga молодец, четко нашел ошибку логики.

А вот остальные, кмк, зря бросились новичку готовый код писать - лучше было б, чтоб ТС сам поправил скетч по заветам kalapanga

 

gfx125
Offline
Зарегистрирован: 27.05.2017

kidanov пишет:
А вот как снять напряжение с ключей.

Поискать другие библиотеки для шаговиков или попробовать так

if (buttonState == 0){
   for ( int i=8; i<12; i++ ) {
digitalWrite(i, LOW);
}
  }

Вариант тупейший и скорее всего неправильный, но...

 

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

Я бы посоветовал сменить драйвер на любой STEP/DIR (A4988, DRV8825...). Мотору будет легче, управление проще (не знаю, правда, ваш уровень) и снимать напругу с катушек можно через доп. вывод ENABLE. L298N будет вдувать в мотор всё, что сможет выдать блок питания. Это, прямо скажем, не лучший вариант для шаговика.

kidanov
Offline
Зарегистрирован: 11.02.2017

Спасибо. Этот вариант я сейчас посмотрю. На али. 

kidanov
Offline
Зарегистрирован: 11.02.2017

b707 пишет:

kalapanga молодец, четко нашел ошибку логики.

А вот остальные, кмк, зря бросились новичку готовый код писать - лучше было б, чтоб ТС сам поправил скетч по заветам kalapanga

 

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