Программа для управления ШД
- Войдите на сайт для отправки комментариев
Втр, 17/11/2020 - 18:49
Подскажите, как правильно написать программу для управления ШД, чтобы он постоянно вращался при подаче питания на плату Ардуино и управлялся двумя кнопками, одна ускоряет, другая останавливает. Написал кодЮ двигатель вращается, ускоряется, но не останавливается.
int button1 = 8; int button2 = 9; int f1 = 0; int f2 = 1; int f3 = 2; int f4 = 3; i int buttonState = 0; void setup() { pinMode(button1, INPUT); pinMode(button2, INPUT); pinMode(f1, OUTPUT); pinMode(f2, OUTPUT); pinMode(f3, OUTPUT); pinMode(f4, OUTPUT); void loop() { if (digitalRead(button1) == HIGH) { digitalWrite(f4, LOW); digitalWrite(f1, HIGH); delay(100); digitalWrite(f1, LOW); digitalWrite(f2, HIGH); delay(100); digitalWrite(f2, LOW); digitalWrite(f3, HIGH); delay(100); digitalWrite(f3, LOW); digitalWrite(f4, HIGH); delay(100); if (digitalRead(button1) == LOW) { digitalWrite(f4, LOW); digitalWrite(f1, HIGH); delay(50); digitalWrite(f1, LOW); digitalWrite(f2, HIGH); delay(50); digitalWrite(f2, LOW); digitalWrite(f3, HIGH); delay(50); digitalWrite(f3, LOW); digitalWrite(f4, HIGH); delay(50); } else { digitalWrite(f1, LOW); digitalWrite(f2, LOW); digitalWrite(f3, LOW); digitalWrite(f4, LOW); } if (digitalRead(button2) == LOW) { digitalWrite(f1, LOW); digitalWrite(f2, LOW); digitalWrite(f3, LOW); digitalWrite(f4, LOW); } }
И что есть что? Имя button2 лично мне никак не сообщает о своей функциональности.
А button1 сообщает? Я писал про две кнопки, button1 ускоряет, button2 должна останавливать, но не работает.
А чего - именно так и подключено?
}
А чего - именно так и подключено?
Именно так и подключено, такая херня..
}
А чего - именно так и подключено?
Именно так и подключено, такая херня..
А если
if
(digitalRead(button1) == HIGH) то чего?
Именно так и подключено, такая херня..
второй закон термодинамики "Херня на входе = херня на выходе"
[/quote]
А если
if
(digitalRead(button1) == HIGH) то чего?
[/quote]
То ускоряется, как было задумано.
А если
if
(digitalRead(button1) == HIGH) то чего?
То ускоряется, как было задумано.
А если в это время
if
(digitalRead(button2) == LOW) то чего?
А если
if
(digitalRead(button1) == HIGH) то чего?
То ускоряется, как было задумано.
А если в это время
if
(digitalRead(button2) == LOW) то чего?
На самом деле наоборот, при digitalRead(button1) == HIGH двигатель крутится с нормальной скоростью, при (digitalRead(button1) == LOW ускоряется. Если при этом (digitalRead(button2) == LOW, то ничего не меняется.
На самом деле наоборот, при digitalRead(button1) == HIGH двигатель крутится с нормальной скоростью, при (digitalRead(button1) == LOW ускоряется. Если при этом (digitalRead(button2) == LOW, то ничего не меняется.
В таком случае вообще ничего не понятно.
Изложитке проблему по схеме:
1. Как должно работать (подробно, т.е. с описанием реакции на ВСЕ возможные комбинации и во всех возможных диапазонах скоростей и направлений вращения).
2. Как работает на самом деле.
3. Чем 2 отличается от 1.
Изложитке проблему по схеме:
1. Как должно работать (подробно, т.е. с описанием реакции на ВСЕ возможные комбинации и во всех возможных диапазонах скоростей и направлений вращения).
2. Как работает на самом деле.
3. Чем 2 отличается от 1.
Даже не знаю, что еще добавить к тому, что я написал в вопросе.
1. Двигатель должен постоянно вращаться при включении питания и управляться двумя кнопками, одна ускоряет (button1), другая останавливает (button2), так что предусмотрены только 3 комбинации: отжаты обе кнопки, нажата первая, нажата вторая. Комбинации при обеих нажатых исключена.
2. Двигатель вращается при подаче питания, ускоряется при нажатии первой кнопки, на вторую кнопку не реагирует.
3. Отличается тем, что первая кнопка ускоряет вращение двигателя, вторая его останавливает.
У тебя проблема в том, что реально сейчас в коде есть только два варианта - двигатель вращается быстро и двигатель вращается медленно. Варианта "двигатель остановлен" считай в скетче нет - хоть в коде он и прописан - программа попадает в это условие на какие-то тысячные доли секунды, а потом снова переходит либо к "быстро", либо к "медленно".
Надо переписывать. Используй флаги, Астрал.
Что такое флаги?
Что такое флаги?
Типа вот этого
Типа вот этого
Спасибо, поросенок! Теперь все понятно!
Что такое флаги?
Евгений малость того...слишком много. Флаг - это логическая переменная.
Что такое флаги?
https://www.google.com/search?q=%D0%BF%D0%B5%D1%80%D0%B5%D0%BC%D0%B5%D0%...
Спасибо, поросенок! Теперь все понятно!
Не за что! Обращайтесь ещё, если чё!
1. Как должно работать (подробно, т.е. с описанием реакции на ВСЕ возможные комбинации и во всех возможных диапазонах скоростей и направлений вращения).
Даже не знаю, что еще добавить к тому, что я написал в вопросе.
Я написал, что именно добавить. Сейчас - еще дополнительно выделил.
1. Двигатель должен постоянно вращаться при включении питания и управляться двумя кнопками, одна ускоряет (button1), другая останавливает (button2), так что предусмотрены только 3 комбинации: отжаты обе кнопки, нажата первая, нажата вторая. Комбинации при обеих нажатых исключена.
1. Физически можно нажать сразу на две кнопки? Значит, программа должна уметь обрабатывать эту ситуацию. Как - Вы не написали.
2. Вы всерьез уверены, что двигатель может увеличивать обороты до бесконечности? Или есть какой-то разумный предел? Как программа должна реагировать на достижение этого предела?
3. Что должно происходить, когда скорость уменьшена до 0, а кнопка уменьшения все еще нажата? Останавливать двигатель или запускать его в обратную сторону?
4. Почему из Вас все клещами приходится тащить? Ведь специально я Вас написал "и во всех возможных диапазонах скоростей и направлений вращения". Или для Вас русский язык - не родной?
Что такое флаги?
Вас в Гугле забанили?
Это - для начала: https://ru.wikipedia.org/wiki/%D0%A4%D0%BB%D0%B0%D0%B3_(%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D1%8F)
А из этого меню, очевидно: https://ru.wikipedia.org/wiki/%D0%A4%D0%BB%D0%B0%D0%B3_(%D0%BA%D0%BE%D0%BC%D0%BF%D1%8C%D1%8E%D1%82%D0%B5%D1%80%D0%BD%D0%B0%D1%8F_%D1%82%D0%B5%D1%85%D0%BD%D0%B8%D0%BA%D0%B0)
Зачем задавать на форуме вопросы, ответы на которые можно найти самостоятельно, причем, очень быстро?
Вы не умеете пользоваться поиском. Мне кажется, Ардуино - не для Вас. Займитесь лучше макраме или чем-нибудь подобным.
Я написал, что именно добавить.
1. Физически можно нажать сразу на две кнопки? Значит, программа должна уметь обрабатывать эту ситуацию. Как - Вы не написали.
2. Вы всерьез уверены, что двигатель может увеличивать обороты до бесконечности? Или есть какой-то разумный предел? Как программа должна реагировать на достижение этого предела?
3. Что должно происходить, когда скорость уменьшена до 0, а кнопка уменьшения все еще нажата? Останавливать двигатель или запускать его в обратную сторону?
4. Почему из Вас все клещами приходится тащить? Ведь специально я Вас написал "и во всех возможных диапазонах скоростей и направлений вращения". Или для Вас русский язык - не родной?
А я написал, что все уже изложил в вопросе и просто написал еще раз.
Физически можно нажать две кнопки, но я не буду.
Почему двигатель должен увеличивать обороты до бесконечности? Из программы видно, что скорость будет больше в 2 раза при нажатой кнопке.
При второй нажатой кнопке двигатель останавливается, при отпущенной вращается снова.
Это ж все было ясно из первого сообщения, может это для вас русский не родной?
А я написал, что все уже изложил в вопросе и просто написал еще раз.
Того, что Вы написали, недостаточно для написания программы. Чего именно не хватает, я тоже написал.
Физически можно нажать две кнопки, но я не буду.
Это никого не интересует. Интересует, как должна программа реагировать на такую возможность. Железо - позволяет, следовательно, должна быть предусмотрена и программная реакция.
Почему двигатель должен увеличивать обороты до бесконечности? Из программы видно, что скорость будет больше в 2 раза при нажатой кнопке.
Вы сами пишете, что программа работает не так, как надо. Следовательно, ничему из того, что написано в программе, доверять нельзя. Другими словами - из программы ничего не может быть видно.
Попутно замечу: раз Вы ссылаетесь на программу, а не на словесное описание, то тем самым признаете, что словесное описание неполно, т.к. не может быть понято без привлечения текста программы.
Вот и имеем: словесное описание неполно, а программа работает неправильно. По таким исходным данным создать правильно работающую программу принципиально невозможно.
При второй нажатой кнопке двигатель останавливается, при отпущенной вращается снова.
Поясните, что Вы подразумеваете под словом "останавливается": плавно останавливается, мгновенно, с какой скоростью.
Это ж все было ясно из первого сообщения, может это для вас русский не родной?
Отнюдь.
Это Вам кажется, что Вы полностью описали задачу. Я Вам задал вопросы, без прояснение которых невозможно создать правильно работающий код, но на которые не было ответов в приведенной Вами формулировке. Вы их проигнорировали. Почему?
Вы пришли на форум, т.к. испытываете дефицит общения?
Физически можно нажать две кнопки, но я не буду.
Это никого не интересует. Интересует, как должна программа реагировать на такую возможность. Железо - позволяет, следовательно, должна быть предусмотрена и программная реакция.
Допустим, нужно чтобы в этом случае была такая же реакция как при нажатии только второй кнопки.
Вы сами пишете, что программа работает не так, как надо. Следовательно, ничему из того, что написано в программе, доверять нельзя. Другими словами - из программы ничего не может быть видно.
Попутно замечу: раз Вы ссылаетесь на программу, а не на словесное описание, то тем самым признаете, что словесное описание неполно, т.к. не может быть понято без привлечения текста программы.
Вот и имеем: словесное описание неполно, а программа работает неправильно. По таким исходным данным создать правильно работающую программу принципиально невозможно.
Это уже словоблудие. Я ссылался на свое первое сообщение, где есть и словесное описание и программа.
Поясните, что Вы подразумеваете под словом "останавливается": плавно останавливается, мгновенно, с какой скоростью.
Мгновенно. Программа с ошибкой, но то что я хотел получить вроде видно, в случае нажатия второй кнопки на всех фазах ноль.
Это Вам кажется, что Вы полностью описали задачу. Я Вам задал вопросы, без прояснение которых невозможно создать правильно работающий код, но на которые не было ответов в приведенной Вами формулировке. Вы их проигнорировали. Почему?
Вы пришли на форум, т.к. испытываете дефицит общения?
Я на все вопросы ответил и не один раз, дефицит общения не испытываю, а у вас, похоже, основное общение проходит виртуально, так можно умничать безгранично.
Астрал, ответ на вопрос, почему ваша программа не работает - вы получили. В отличии от коллеги andriano я не считаю, что в вашем вопросе были какие-то неясности. По-моему все просто и понятно и вопрос, в общем-то, закрыт.
Непонятно, что вы еще хотите от форума? - Почитайте про флаги по ссылкам, что вам дали, попытайтесь исправить код, будут проблемы - приходите. Но делать это вам придется самому, писать код за вас никто не будет.
Есть другой путь, если не хотите ни во что вникать - тогда обращайтесь в платный раздел
Это уже словоблудие. Я ссылался на свое первое сообщение, где есть и словесное описание и программа.
Еще и я 5 копеек вам в огород закину, так вот - в первом посте написано не более 20% от требуемого перед поставленной задачей.
У вас проблема с логикой работы устройства из-за отсутствия соответствующего развития собственной логики (в данном направлении) - такую логику нужно развивать и данный пример именно таким и ценен. Если вы не понимаете, что вам написали выше, то с точки самообразования - читайте всю тему сверху донизу "до просветления". Если вам требуется устройство - welcome
ЗЫ. «Проблемы повышения мелкодисперсионности оксида двухатомного водорода механическим путем» решаются на других форумах, а вам требуется составить: 1)список событий 2) алгоритм реакции на каждое событие
В данном конкретном случае больше подходит: "Нестандартные методы лечения позвоночного сколиоза путем отправления ритуальных услуг"
Астрал, ответ на вопрос, почему ваша программа не работает - вы получили. В отличии от коллеги andriano я не считаю, что в вашем вопросе были какие-то неясности. По-моему все просто и понятно и вопрос, в общем-то, закрыт.
Непонятно, что вы еще хотите от форума? - Почитайте про флаги по ссылкам, что вам дали, попытайтесь исправить код, будут проблемы - приходите. Но делать это вам придется самому, писать код за вас никто не будет.
Есть другой путь, если не хотите ни во что вникать - тогда обращайтесь в платный раздел
Когда я узнал про флаги, я начал об этом читать, больше ничего не спрашивал, но один товарищ продолжал умничать, я отвечал. Я пока не хотел ничего от форума, писать за меня код не просил, так что не к чему эти поучения.
Когда я узнал про флаги, я начал об этом читать, больше ничего не спрашивал, но один товарищ продолжал умничать, я отвечал. Я пока не хотел ничего от форума, писать за меня код не просил, так что не к чему эти поучения.
если так обижаться на всех и особенно на конструктивную критику... - пересмотрите свое отношение. иначе Вам будет очень трудно.
Когда я узнал про флаги, я начал об этом читать, больше ничего не спрашивал, но один товарищ продолжал умничать, я отвечал. Я пока не хотел ничего от форума, писать за меня код не просил, так что не к чему эти поучения.
если так обижаться на всех и особенно на конструктивную критику... - пересмотрите свое отношение. иначе Вам будет очень трудно.
Я не видел здесь конструктивной критики и обиженным себя не чувствую, по опыту знаю, что на несколько умников будет один нормальный советчик.
Я не видел здесь конструктивной критики и обиженным себя не чувствую, по опыту знаю, что на несколько умников будет один нормальный советчик.
про флаги прочитали? Нет? - а что тогда тут отсвечиваете? идите читайте
Я не видел здесь конструктивной критики и обиженным себя не чувствую, по опыту знаю, что на несколько умников будет один нормальный советчик.
про флаги прочитали? Нет? - а что тогда тут отсвечиваете? идите читайте
Пишут, я отвечаю.
Я не видел здесь конструктивной критики...
ок, сколько состояний можно выделить у одной кнопки? А у двух? Напишите все, хотя бы для одной. (логическая загадка)
1. Двигатель должен постоянно вращаться при включении питания и управляться двумя кнопками, одна ускоряет (button1), другая останавливает (button2),
Ваш код делает явно не это, чтобы ускоряться и останавливаться нужна переменная (с требуемым шагом ) - а ее нет никакой. Требуется логика ограничений на эту переменную, но коли нету переменной нет и логики...
но начните с флагов. потом счетчик - а потом в кучу их скидывать.
Я читал про флаги, но они не для моего случая, мне не нужно запоминать состояние, мне нужно чтобы действие происходило при нажатой кнопке и прекращалось при отпускании. Я просто добавил второе условие:
if (digitalRead(button1) == HIGH&&digitalRead(button2) == HIGH)
и этого оказалось достаточно, работает так как мне нужно. Кто-писал что действие при нажатой второй кнопке выполняется один раз и прога возвращается к началу, вроде так просто, но я не заметил, а все дело было только в этом.
работает так как мне нужно.
я в этом не уверен, но возможно я просто не понимаю, как "вам нужно".
Если через некоторое время все же окажется, что ваше решение не работет - смотрите флаги. Флагами ваша задачка решается и очень просто, жалко что вы поленились в них разобраться.
работает так как мне нужно.
я в этом не уверен, но возможно я просто не понимаю, как "вам нужно".
Если через некоторое время все же окажется, что ваше решение не работет - смотрите флаги. Флагами ваша задачка решается и очень просто, жалко что вы поленились в них разобраться.
Пишу в очередной раз что мне нужно: при подаче питания двигатель вращается, при нажатии первой кнопки вращается с удвоенной скоростью, при отпускании вращается как до нажатия, при нажатии второй кнопки двигатель останавливается, при отпускании вращается как до нажатия. Мне не надо запоминать состояние кнопок, зачем флаги?
Пишу в очередной раз что мне нужно: при подаче питания двигатель вращается, при нажатии первой кнопки вращается с удвоенной скоростью, при отпускании вращается как до нажатия, при нажатии второй кнопки двигатель останавливается, при отпускании вращается как до нажатия.
ну отлично. Теперь смотрим на строчку, что вы считаете решением:
if (digitalRead(button1) == HIGH&&digitalRead(button2) == HIGH)
она работает только тогда, когда нажаты обе кнопки сразу. Как это связано с описанной логикой работы - непонятно.
при подаче питания двигатель вращается, при нажатии первой кнопки вращается с удвоенной скоростью, при отпускании вращается как до нажатия, при нажатии второй кнопки двигатель останавливается, при отпускании вращается как до нажатия.
ок, это несколько проще и флаги действительно не нужны, но вы нарушили логику о которой вам все тут пишут - если у вас зависимость алгоритма от 2 кнопок, то программа должна исполнить в цикле только один режим, а не их смесь или комбинацию.
в настоящий момент смотрим на кнопку 1 - что то делаем, смотрим на кнопку - 2 что-то делаем, смотрим на кнопки вместе - делаем третье... этого не должно быть, но если вас все устраивает...
теперь вариант 2. В начале цикла проверяем кнопки (1 раз за цикл) и ставим флаг с несколькими уровнями и в зависимости от уровня исполняется за один проход только-то , что требуется, а не все подряд...
в настоящий момент смотрим на кнопку 1 - что то делаем, смотрим на кнопку - 2 что-то делаем, смотрим на кнопки вместе - делаем третье... этого не должно быть, но если вас все устраивает...
почему не должно быть? Если такое решение просто считается дурным тоном, то меня это не напрягает, если приведет к проблемам, то каким?
теперь вариант 2. В начале цикла проверяем кнопки (1 раз за цикл) и ставим флаг с несколькими уровнями и в зависимости от уровня исполняется за один проход только-то , что требуется, а не все подряд...
А почему нельзя просто использовать циклы без флагов?
ну отлично. Теперь смотрим на строчку, что вы считаете решением:
if (digitalRead(button1) == HIGH&&digitalRead(button2) == HIGH)
она работает только тогда, когда нажаты обе кнопки сразу. Как это связано с описанной логикой работы - непонятно.
Я писал выше, что нажатие кнопки - это состояние LOW, т.е. когда отжаты обе кнопки двигатель вращается медленно, при нажатой первой быстро, при второй стоит (вращается обратно).
А почему нельзя просто использовать циклы без флагов?
А как Вы собираетесь запоминать логические состояния без переменных-флагов?
Я писал выше, что нажатие кнопки - это состояние LOW, т.е. когда отжаты обе кнопки двигатель вращается медленно, при нажатой первой быстро, при второй стоит (вращается обратно).
ОК.
Тогла вы своим решением отработали только одно состояние из трех - "вращается медленно". Насколько я помню, оно у вас и так работало.
А остальные два режима как управляете?
А почему нельзя просто использовать циклы без флагов?
А как Вы собираетесь запоминать логические состояния без переменных-флагов?
ТС выше писал (пост 35), что ему действительно можно без флагов контролировать состояния, вот только у него пересечение режимов сейчас, вместо одно срабатывают несколько одновременно - глазом не заметно, он и думает, что "как надо работает"
А почему нельзя просто использовать циклы без флагов?
в вашем алгоритме - можно, но он сейчас не правильно описан.
Я писал выше, что нажатие кнопки - это состояние LOW, т.е. когда отжаты обе кнопки двигатель вращается медленно, при нажатой первой быстро, при второй стоит (вращается обратно).
ОК.
Тогла вы своим решением отработали только одно состояние из трех - "вращается медленно". Насколько я помню, оно у вас и так работало.
А остальные два режима как управляете?
Я включил и проверил все три режима, они РАБОТАЮТ)))
Я писал выше, что нажатие кнопки - это состояние LOW, т.е. когда отжаты обе кнопки двигатель вращается медленно, при нажатой первой быстро, при второй стоит (вращается обратно).
ОК.
Тогла вы своим решением отработали только одно состояние из трех - "вращается медленно". Насколько я помню, оно у вас и так работало.
А остальные два режима как управляете?
Я включил и проверил все три режима, они РАБОТАЮТ)))
а имеем на самом деле 4-ре состояния,
1. Обе кнопки отжаты
2. Обе кнопки нажаты
3. Нажата кнопка 1
4. Нажата кнопка 2
а имеем на самом деле 4-ре состояния,
1. Обе кнопки отжаты
2. Обе кнопки нажаты
3. Нажата только кнопка 1
4. Нажата только кнопка 2
немного поправил :) может так понятнее будет :)
А почему нельзя просто использовать циклы без флагов?
А как Вы собираетесь запоминать логические состояния без переменных-флагов?
Ну не надо мне запоминать логические состояния, писал же неоднократно какой нужен алгоритм работы, почему нельзя просто использовать цикл? while(digitalRead(button1)){}
да используйте вы что хотите. Не хотите учиться - не надо.
а имеем на самом деле 4-ре состояния,
1. Обе кнопки отжаты
2. Обе кнопки нажаты
3. Нажата только кнопка 1
4. Нажата только кнопка 2
немного поправил :) может так понятнее будет :)
Просто надо добавить четвертое состояние
if (digitalRead(button1) == LOW&&digitalRead(button2) == LOW)
Просто надо добавить четвертое состояние
if (digitalRead(button1) == LOW&&digitalRead(button2) == LOW)
если смотреть на первый пост, то не просто добавить четвертое состояние... а правильно перечислить все состояния. если вам не нужны флаги, значит делайте код который однозначно понимает состояние кнопок (обеих кнопок) - надеюсь так понятнее :)