шаговый двигатель через библиотеку Onebutton
- Войдите на сайт для отправки комментариев
Уважаемые Форумчане! Хочется уже написать спасите, помогите. Опишу ситуацию и прошу вашей помощи. В программировании я ничего не понимаю, точней никогда не занимался. Решил сыну ко дню рождения сделать автопарковку со шлагбаумом и лифтом. Наткнулся на удивительный мир Ардуино. Стал изучать собирать и вошел в тупик с написанием скетча. Сервопривод через кнопку с горем попалам сделал. А вот отладить шаговый двигатель не получается. Ознакомился с библиотекой Onebutton принцип ее работы с кнопкой то что мне нужно, но объеденить ее и работу двигателя не получается. Помогите собрать рабочий скетч с сервоприводом через кнопку, шаговым двигателем через две кнопки одна на подъем один клик = один этаж, двойной клик с первого на третий этаж. А вторая кнопка тоже самое но работа на спуск.
ничего не понимаю, точней никогда не занимался
вошел в тупик с написанием скетча
Закажите написание скетча в коммерческом разделе форума, если не хотите изучать программирование самостоятельно.
Изучать интересно, нюанс в другом что успеть к дню рождения. Сколько стоит хотя бы примерно можете сказать?
Алкота местная и за 200 сделает. Токо неизвестно когда. А так - 1000-1500, думаю.
Алкота местная и за 200 сделает.
А вот щас прям обидно было. ¦(
Алкота местная и за 200 сделает.
А вот щас прям обидно было. ¦(
Ты же по $80 берешь вроде?
А вот щас прям обидно было. ¦(
Дида, мы с тобой не алката ни грамма, а сознательные граждане, т.к. ни не пьём, а принимаем дезинфецирующее срецтво ат вируса, шоб он сдох. Так что до нас это не относится :-)
А вот щас прям обидно было. ¦(
Дида, мы с тобой не алката ни грамма, а сознательные граждане, т.к. ни не пьём, а принимаем дезинфецирующее срецтво ат вируса, шоб он сдох. Так что до нас это не относится :-)
и алкоголики водку не пьют, они винцо, по глоточку
А вот щас прям обидно было. ¦(
Дида, мы с тобой не алката ни грамма, а сознательные граждане, т.к. ни не пьём, а принимаем дезинфецирующее срецтво ат вируса, шоб он сдох. Так что до нас это не относится :-)
и алкоголики водку не пьют, они винцо, по глоточку
нормальные пацаны водку не пьют, а кушают....
#include <CustomStepper.h> CustomStepper stepper (8, 9, 10, 11); // Указываем пины, к которым подключен драйвер шагового двигателя int example = 1; #include "OneButton.h" OneButton button1(5, true); OneButton button2(6, true); // setup code here, to run once: void setup() { stepper.setRPM(12); // Устанавливаем кол-во оборотов в минуту stepper.setSPR(4075.7728395); Serial.begin(9600); while (!Serial) { ; } Serial.println("Starting TwoButtons..."); button1.attachClick(click1); button1.attachDoubleClick(doubleclick1); button2.attachClick(click2); button2.attachDoubleClick(doubleclick2); } void loop() { button1.tick(); button2.tick(); delay(10); } void click1() { Serial.println("Button 1 click."); if (stepper.isDone() and example == 1) // Когда предыдущая команда выполнена (см. ниже), метод stepper.isDone() возвращает true { stepper.setDirection(CW); // Устанавливает направление вращения. Может принимать 3 значения: CW - по часовой, CCW - против часовой, STOP stepper.rotate(3); // Устанавливает вращение на заданное кол-во оборотов }} // click1 // This function will be called when the button1 was pressed 2 times in a short timeframe. void doubleclick1() { Serial.println("Button 1 doubleclick."); if (stepper.isDone() and example == 1) { stepper.setDirection(CW); stepper.rotate(7); // Поворачивает вал на заданное кол-во градусов. Можно указывать десятичную точность (например 90.5), но не принимаются отрицательные значения }} // doubleclick1 void click2() { Serial.println("Button 2 click."); if (stepper.isDone() and example == 1) // Когда предыдущая команда выполнена (см. ниже), метод stepper.isDone() возвращает true { stepper.setDirection(CCW); // Устанавливает направление вращения. Может принимать 3 значения: CW - по часовой, CCW - против часовой, STOP stepper.rotate(3); // Устанавливает вращение на заданное кол-во оборотов }} // click2 void doubleclick2() { Serial.println("Button 2 doubleclick."); if (stepper.isDone() and example == 1) { stepper.setDirection(CW); stepper.rotate(7); // Поворачивает вал на заданное кол-во градусов. Можно указывать десятичную точность (например 90.5), но не принимаются отрицательные значения } // doubleclick2 stepper.run(); } // EndПока время позволяет еще, пробую писать код. Нашел библиотеку кастом степер. по отдельности все работает в попытке соединить их, ошибок не выдает (код выше) однако и вал не крутит кнопка срабатывает на клик 1 и дабл клик в порте прописывается, а на драйвере ULN2003 горит 2 диода А и B а двигатель не вращает. помогите исправить код. Ощущение что нет обращения к библиотеке кастомстепер.
что за бред написан в строчках 42. 52 и так далее?
Может стоит синтаксис языка подучить?
и что вы этим хотите сказать? что не расставлены скобки и точка с запятой?
и что вы этим хотите сказать? что не расставлены скобки и точка с запятой?
что эта строка абсолютно не имеет смысла - она ничего полезного не делает.
И уж точно она не делает того, что планировали вы... точнее не вы, а автор кода
подскажите команду которая будет выполнять функцию вращения на определенное кол-во оборотов и останавливаться.
подскажите команду которая будет выполнять функцию вращения на определенное кол-во оборотов и останавливаться.
да вам не команда нужна, у вся логика кода перекорежена. Судя по всему, вы этот код где-то копировали и половину растеряли. То. что у вас написано в функциях click() и тп - просто бессмысленный набор операторов.
вот код автора.
я подумал что значения экземл 2 и 3 не нужны так этот цикл мне не нужен.
я подумал что значения экземл 2 и 3 не нужны так этот цикл мне не нужен.
причем тут экземл 2 и 3 ? Вы в первом коде условный оператор "if" потеряли - а теперь делаете вид. что все так и было?
Это просто показывает. что ваши знания не нулевые. а отрицательные....
не делаю вид, прошу прощения, я сначала для вас исправил чтоб написать как было у атора а потом решил что прще вставить скетч автора. прошу прощения за казус.
нормальные пацаны водку не пьют, а кушают....
А мы с дедом "принимаем срецтво".
что за бред написан в строчках 42. 52 и так далее?
Может стоит синтаксис языка подучить?
Простите, может глаз замылился ... в чём там проблема?
Простите, может глаз замылился ... в чём там проблема?
уже ни в чем, ТС подчистил :)
изначально не было If и скобок
Простите, может глаз замылился ... в чём там проблема?
уже ни в чем, ТС подчистил :)
а что не так то? вы указали на ошибку я исправил но работать так и не стало. Я думал в этом и заключается обсуждение на форуме в поисках ошибок и исправления. А также помощь в написании. А тут выходит так что люди не заинтересованы. Спасибо. Подскажите как закрыть тему. Поищу помощь в другом месте. А как придет время, если не успею сам, закажу.
у меня есть рабочий скетч для ШД, с библиотекой AccelStepper
ввод команд через монитор. но можете переделать под свои кнопки
Под каждой командой задаете нужное количество шагов, это опытным путем подбирается.
у меня есть рабочий скетч для ШД, с библиотекой AccelStepper
ввод команд через монитор. но можете переделать под свои кнопки
Под каждой командой задаете нужное количество шагов, это опытным путем подбирается.
буду признателен если позволите взглянуть.
// Пример для проверки работы загрузчика шаров. // ШД с редуктором и драйвером DRV8834, библиотека AccelStepper. // Расчет шагов: шаг=18°, после редуктора 1:63 шаг=0,2857°. 1260 шагов на круг. 160°=560 шагов, 46°=161 шаг, 114°=399 шагов, 170°=595 шагов. // Параметр в команде "moveTo" задает количество шагов относительно НУЛЕВОГО ПОЛОЖЕНИЯ. // Нулевое положение ШД в общем виде - это положение при включении, если не задано по другому, например, по датчику Холла. // Если сигнал ENBL не используется, то вход Enable драйвера необходимо установить в LOW аппаратно. // При Vmot=5V, уровень Vref установить =0,08. String inString = ""; // строковая переменная для ввода значений через монитор порта int y; // переменная для числовых значений long angle; // переменная для хранения количества шагов для поворота, + по ЧС int pos; // переменная для отображения текущего количества пройденных шагов byte z; // переменная для запуска процесса установки нулевого положения ШД по датчику Холла при включении byte sens; // переменная для статуса датчика Холла #define STEP 6 // выход для сигнала STEP #define DIR 4 // выход для сигнала DIR #define HALL 10 // вход датчика Холла #define LED 13 // выход индикатора float MAXSPEED = 200.0; // значение максимальной скорости ШД в шагах в сек. float SPEED = 200.0; // значение скорости движения ШД в шагах в сек. float ACCELERATION = 160.0; // значение ускорения в шагах в сек. за сек. #include <AccelStepper.h> // подключаем библиотеку AccelStepper TurretStepper (AccelStepper::DRIVER, STEP, DIR); // объявляем объект с именем TurretStepper void setup() { Serial.begin(9600); TurretStepper.setMaxSpeed(MAXSPEED); // задаем максимальную скорость ШД TurretStepper.setSpeed(SPEED); // задаем скорость движения ШД TurretStepper.setAcceleration(ACCELERATION ); // задаем ускорение ШД TurretStepper.enableOutputs(); // включаем выходы драйвера z = 0; // инициируем процедуру установки нулевого положения ШД по датчику Холла при включении TurretStepper.moveTo(-595); // задаем количество шагов для поворота при установке нулевого положения ШД pinMode(LED, OUTPUT); // определяем порт индикатора как выход } void loop() { TurretStepper.enableOutputs(); // включаем выходы драйвера EnterValue(); // функция для ввода числового значения режима работы if (z == 0) // при включении запускаем установку нулевого положения ШД по датчику Холла, { SetZeroPositionH(); // для чего вызываем соответствующую функцию } if (y == 1) // поворот из точки 3 (конечной) в точку 1 (начальную, нулевую) { angle = 0; // количество шагов задается относительно установленной нулевой точки TurretStepper.moveTo(angle); } if (y == 2) // поворот из точки 1 (начальной, нулевой) в точку 2 (проверка наличия шара), угол поворота 46°=161 шагу { angle = 161; // количество шагов задается относительно установленной нулевой точки TurretStepper.moveTo(angle); } if (y == 3) // поворот из точки 2 в точку 3 (шар подан), угол поворота от нулевой точки 160°=560 шагам { angle = 560; // количество шагов задается относительно установленной нулевой точки TurretStepper.moveTo(angle); } if (y == 4) // проверка количества шагов на полный круг { angle = 1260; // При maxspeed 60, speed 60, acceleration 50, время полного круга 40 сек. TurretStepper.moveTo(angle); } if (TurretStepper.distanceToGo() != 0) // пока ШД не прошел указанные шаги, т.е. дистанция до указанного числа шагов не равна 0 { TurretStepper.run(); // двигаемся в заданном направлении на указанное число шагов pos = TurretStepper.currentPosition(); // сохраняем текущее положение ШД в шагах в переменную Serial.print ("Position= "); Serial.println (pos); } else // а когда ШД прошел указанные шаги, т.е. дистанция до указанного числа шагов = 0 { TurretStepper.disableOutputs(); // декативируем пины управления драйвером для остановки ШД pos = TurretStepper.currentPosition(); // сохраняем текущее положение ШД в шагах в переменную Serial.print ("Position= "); Serial.println (pos); } if (pos == 0) digitalWrite(LED, HIGH); // в нулевом положении ШД включаем индикатор if (pos != 0) digitalWrite(LED, LOW); // во всех остальнх положениях ШД выключаем индикатор // ниже скобка loop } void EnterValue() // функция перевода вводимых в монитор серийного порта строковых значений чисел в целые числа (int) { while (Serial.available() > 0) { int inChar = Serial.read(); if (isDigit(inChar)) { inString += (char)inChar; } if (inChar == '\n') { Serial.print("Value:"); y = inString.toInt(); Serial.println(y); inString = ""; } } } void SetZeroPositionH() // функция автоматической установки нулевого положения ШД { sens = digitalRead(HALL); // снимаем показания с датчика Холла if (sens == LOW) // если датчик сработал, то устанавливаем текущую позицию как нулевую { digitalWrite(LED, HIGH); // включаем индикатор z = 1; // сбрасываем значение переменной TurretStepper.disableOutputs(); // отключаем входы драйвера для остановки ШД TurretStepper.setCurrentPosition(0); // устанавливаем текущую позицию как нулевую Serial.print ("Position= "); Serial.println (TurretStepper.currentPosition()); TurretStepper.setMaxSpeed(MAXSPEED); // задаем максимальную скорость ШД в шагах в сек. TurretStepper.setSpeed(SPEED); // задаем скорость ШД в шагах в сек. TurretStepper.setAcceleration(ACCELERATION); // задаем ускорение ШД в шагах в сек. за сек. } else if (sens == HIGH) // если датчик не сработал, то вращаем ШД в заданных пределах { digitalWrite(LED, LOW); // выключаем индикатор TurretStepper.run(); // двигаемся в заданном направлении на указанное в команде moveTo в разделе setup число шагов } }Под другой драйвер другой пример есть.
Вы какой используете?
Под другой драйвер другой пример есть.
Вы какой используете?
ULN2003
Вот для ULN
// Пример для проверки работы ШД поворота башни. // ШД 28BYJ-48 с подключением через ULN2003 // У ШД в режиме HALFSTEP 360°=4076 шагов, 1шаг=0,088°, 1359 шагов соответствуют 120°. // У ШД в режиме FULL4WIRE 360°=2038 шагов, 1шаг=0,176°, 120°=679 шагов // Управление вводом чисел из диапазона передаваемого пультом: 1-124 против ЧС и 126-250 по ЧС // Автоматический поиск и установка нулевой позиции по сигналу от датчика Холла. String inString = ""; // string to hold input #define HALFSTEP 8 // определяем интерфейс подключения ШД #define motorPin1 10 // IN1 на ULN2003 #define motorPin2 9 // IN2 на ULN2003 #define motorPin3 8 // IN3 на ULN2003 #define motorPin4 7 // IN4 на ULN2003 #define LED 13 // выход на светодиод #define HALL 2 // вход датчика Холла byte sens; #include <AccelStepper.h> // подключаем библиотеку //AccelStepper TurretStepper (HALFSTEP, motorPin1, motorPin3, //motorPin2, motorPin4); // объявляем объект с именем TurretStepper AccelStepper TurretStepper (AccelStepper::FULL4WIRE, motorPin1, motorPin3, motorPin2, motorPin4); // объявляем объект с именем TurretStepper int y; int pos; long angle; byte z; void setup() { Serial.begin(9600); TurretStepper.setMaxSpeed(1000.0); // задаем максимальную скорость ШД в шагах в сек. TurretStepper.setSpeed(1000.0); // задаем скорость движения ШД в шагах в сек. TurretStepper.setAcceleration(600.0); // задаем ускорение ШД в шагах в сек. за сек. z = 0; // инициируем процедуру установки нулевого положения ШД по датчику Холла при включении TurretStepper.moveTo(679); // задаем диапазон движения в шагах для автоматической установки нулевой позиции: ±120° pinMode(LED, OUTPUT); // определяем порт индикатора как выход } void loop() { EnterValue(); // функция для ввода числового значения режима работы if (z == 0) // Автоматическая установка нулевой позиции по сигналу датчика Холла { SetZeroPositionH (); // вызов функции автоматической установки нулевого положения ШД } if (y >= 126 && y <= 250) // поворот на правый борт: против ЧС для кормовой башни и по ЧС для носовой башни { angle = map(y, 126, 250, -1, -679); // перевод вводимых значений в диапазон шагов ШД, TurretStepper.enableOutputs(); // включаем выходы драйвера TurretStepper.moveTo(angle); } if (y >= 1 && y <= 124) // поворот на левый борт: по ЧС для кормовой башни и против ЧС для носовой башни { angle = map(y, 1, 124, 679, 1); // перевод вводимых значений в диапазон шагов ШД, TurretStepper.enableOutputs(); // включаем выходы драйвера TurretStepper.moveTo(angle); } if (TurretStepper.distanceToGo() != 0) // пока ШД не прошел указанные шаги, т.е. дистанция до указанного числа шагов не равна 0 { TurretStepper.run(); // двигаемся в заданном направлении на указанное число шагов pos = TurretStepper.currentPosition(); // сохраняем текущее положение ШД в шагах в переменную //Serial.print ("Position= "); //Serial.println (pos); } else // а когда ШД прошел указанные шаги, т.е. дистанция до указанного числа шагов = 0 { TurretStepper.disableOutputs(); // декативируем пины управления драйвером для остановки ШД pos = TurretStepper.currentPosition(); // сохраняем текущее положение ШД в шагах в переменную //Serial.print ("Position= "); //Serial.println (pos); } if (pos == 0) digitalWrite(LED, HIGH); // в нулевом положении ШД включаем индикатор if (pos != 0) digitalWrite(LED, LOW); // во всех остальнх положениях ШД выключаем индикатор // ниже скобка loop } void EnterValue() // функция перевода вводимых в монитор серийного порта строковых значений чисел в целые числа (int) { while (Serial.available() > 0) { int inChar = Serial.read(); if (isDigit(inChar)) { inString += (char)inChar; } if (inChar == '\n') { Serial.print("Value:"); y = inString.toInt(); Serial.println(y); inString = ""; } } } void SetZeroPositionH() // функция автоматической установки нулевого положения ШД { sens = digitalRead(HALL); // снимаем показания с датчика Холла if (sens == LOW) // если датчик сработал, то устанавливаем текущую позицию как нулевую { digitalWrite(LED, HIGH); z = 1; TurretStepper.disableOutputs(); //TurretStepper.stop(); TurretStepper.setCurrentPosition(0); //Serial.print ("Position= "); //Serial.println (TurretStepper.currentPosition()); TurretStepper.setMaxSpeed(1000.0); // задаем максимальную скорость ШД в шагах в сек. TurretStepper.setSpeed(1000.0); // задаем скорость ШД в шагах в сек. TurretStepper.setAcceleration(500.0); // задаем ускорение ШД в шагах в сек. за сек. } else if (sens == HIGH) // если датчик не сработал, то вращаем ШД в заданных пределах { digitalWrite(LED, LOW); if (TurretStepper.distanceToGo() == 0) TurretStepper.moveTo(-TurretStepper.currentPosition()); TurretStepper.run(); } }