Двигатель вращается только в одну сторону.
- Войдите на сайт для отправки комментариев
Ср, 23/01/2019 - 18:12
Нужно крутить двигатель по кнопкам или в одну сторону или в другую с изменением скорости. Сам очень плохо разбираюсь, посмотрел на просторах инета и сделал скетч под свой двигатель. Скорость регулируется, но работает только одна кнопка на 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 }
Ребят, может что не так написал, извиняйте, но помогите с прогой пож.
Временно закомментируйте всё, что связано с мотором и разберитесь с кнопками - светодиод подцепите или Serial.print() на срабатывание D6/D7.
С кнопками, физически все нормально, проверял перетыканием, работают. Если не трудно , какие строки закомментировать?
Если не трудно , какие строки закомментировать?
ну где у вас мотор крутится? - в строке 36 - вот ее и уберите
А вот строки 22, 25, 30 и 33 у вас какие-то странные. Кто вас учил такому синтаксису? К чему там скобки?
Для проверки программы замените эти строки выводом в Сериал соответвующих надписей, ну типа вместо Napr =1 - вставляете Serial.print("Napravlenie 1");
У Вас нажата кнопка 6. Строка 20 - считали её состояние. Проверили условие. Строка 22 - установили Napr = 1. Скетч продолжается! Считываем состояние кнопки 7. Она не нажата. Проверяем условие, попадаем в строку 33 и устанавливаем Napr = 0. А старое значение 1 потеряли и забыли. Вот оно и не крутится. Логику надо переписывать.
И, кстати, а кнопки, то как подключены? К 5В или к земле?
И, кстати, а кнопки, то как подключены? К 5В или к земле?
к 5 вольтам, земля через резистор 10к
Я честно скажу, нашел эту программу на просторах инета, тоже кто то пробовал, мне надо просто крутить двигатель или в одну сторону или в другую, и менять скорость для точности. Сам 1 раз в этом, может есть другой простой вариант, буду очень признателен.
У Вас 2 кнопки. Возможны 4 состояния. Вам нужно для каждого написать своё действие (как вариант ничего не делать). Сначала определили состояние обеих кнопок, потом принимаете решение:
Если нажаты обе, то ...
Если 6 нажата, а 7 не нажата, то ...
Если 6 не нажата, а 7 нажата, то ...
Если ничего не нажато, то ...
Как-то так.
1 кнопка нажата, двигатель крутится по часовой, не нажата стоит на месте,
2 кнопка нажата, двигатель крутится против часовой, на нажата, стоит на месте
Скорость регулируется во время нажатия 1й или 2й кнопки.
когда двигатель стоит, надо закрыть все ключи, что бы не повалось напряжение на мотор, греется очень.
Вот в принципе моя задача
прбуйте так
Если с минимальными изменениями, то поробуй так:
Но это все очень криво. Так, убедиться, что кнопки работают
прбуйте так
Во работает, огромное спасибо. А вот как снять напряжение с ключей.
Если с минимальными изменениями, то поробуй так:
У вашего варианта при нажатии любой кнопки двигатель начинает правильно но не останавливается, но спасибо что тоже ответили.
kalapanga молодец, четко нашел ошибку логики.
А вот остальные, кмк, зря бросились новичку готовый код писать - лучше было б, чтоб ТС сам поправил скетч по заветам kalapanga
Поискать другие библиотеки для шаговиков или попробовать так
Вариант тупейший и скорее всего неправильный, но...
Я бы посоветовал сменить драйвер на любой STEP/DIR (A4988, DRV8825...). Мотору будет легче, управление проще (не знаю, правда, ваш уровень) и снимать напругу с катушек можно через доп. вывод ENABLE. L298N будет вдувать в мотор всё, что сможет выдать блок питания. Это, прямо скажем, не лучший вариант для шаговика.
Спасибо. Этот вариант я сейчас посмотрю. На али.
kalapanga молодец, четко нашел ошибку логики.
А вот остальные, кмк, зря бросились новичку готовый код писать - лучше было б, чтоб ТС сам поправил скетч по заветам kalapanga
Я обязательно учту все что тут ответили и проверю свой код, да бы научится в дальнейшем. Я просто не писал что мне это надо очень срочно. Ну буду учится.