Возможно ли реализовать ?
- Войдите на сайт для отправки комментариев
Нужна помощь, есть моторчик с встроенным переменным резистором, он подключен, данные с переменного резистора я получил, а вот код не могу написать)),сразу скажу я профан полный в программировании, я хочу что бы при 1 нажатии на кнопку моторчик принимал одну позицию при втором нажатии вторую позицию при третьем третью и на четвертом нажатии возвращался в 1 положение, я уже пробовал switch case, if else видимо я вообще не в том направлении мыслю. Народ помогите плиз а то я уже себе голову сломал, сейчас когда моторчик не в правом положении, он доходит до правого и выключается, и при втором нажатии, он вместо того что бы начать крутится в обратную сторону, крутится в туже, и только когда нажата кнопка
И ещё вопрос: можно ли задать переменную не просто целое число а например промежуток чисел между 400-450 ?
#define level 2 int enl = 6; // enable int key1 = 12; // номер порта первой кнопки int motorleft = 2; // номер первого порта для сигнала управления двигателем (влево) int motorright = 4; // номер второго порта для сигнала управления двигателем (вправо) int val_min = 450; // объявление переменной. Уровень крайнего левого положения заслонки int val_max = 900; // объявление переменной. Уровень крайнего правого положения заслонки int val_centr = 650; // объявление переменной. Уровень среднего положения заслонки void setup() { pinMode (enl, OUTPUT); // enable pinMode (key1, INPUT); // порт первой кнопки настроить на вход pinMode (motorleft, OUTPUT); // порт сигнала управления двигателем (влево), настроить на выход pinMode (motorright, OUTPUT); // порт сигнала управления двигателем (влево), настроить на выход digitalWrite(motorleft,0); // Выключить первый порт управления двигателем digitalWrite(motorright,0); // Выключить второй порт управления двигателем } void loop() // основная часть программы { if (digitalRead (key1) == 1) // если нажата кнопка if (level < 450) { digitalWrite(enl,1); digitalWrite(motorright,1); // включить двигатель в левом направлении движения while (analogRead(level)>=val_max) // выполнять, пока заслонка не примет нужное положение {} digitalWrite(motorright,0); // Выключить двигатель digitalWrite(enl,0); } else if (level > 900) { digitalWrite(enl,1); digitalWrite(motorleft,1); // включить двигатель в левом направлении движения while (analogRead(level)<val_min) // выполнять, пока заслонка не примет нужное положение {} digitalWrite(motorleft,0); // Выключить двигатель digitalWrite(enl,0); } }
Интересный моторчик. Если это моторчик от проигрывателя типа магнитофон или плеер, то хочу разочаровать - переменный резистор там нужен для регулировки встроеннго ШИМ регулятора скорости. То есть когда ты вращаешь этот переменник ты управляешь шимом. И скорее всего из-за этого у тебя проблемы. Но тут и я могу ошибаться, но советую всеже присмотреться, есть ли там какое либо подобие платы с SMD деталюшками.
Я ерунду ляпнул, это не моторчик а сервопривод, внутри двигатель постоянного тока с червячной передачей и ползунковый резистор обратной связи. двигатель питается от 2-ой цепи с помощью драйвера двигателя КР1128КТ4. И у меня сто процентов беда с кодом )
Я пока не очень понял, как ты им управляешь, но вижу несколько странных моментов в строке 23, ты проверяешь, что значение меньше чем минимум 450, а в строке 32, ты проверяешь, что значение больше чем 900, а если значение посередине, то ничего не надо делать?
Еще со скобками, странная история, в 22 строке if (digitalRead (key1) == 1), а дальше не открывается скобка, ты используй правило отступов, в зависимости от уровня вложенности, будет виднее, что ты делаешь, внутри чего.
Так я глюканул, в последнем посте, там скобка необязательна, но все равно форматирование, сильно добавляет читаемости
Согласен, не очень понятно, как именно должно происходить управление, и в твоем, коде ты даже не пытаешь считать количество нажатий, а я так понял, ты их хочешь считать? Ты напиши какие положения заслонки должны быть для каких случаев, я так понимаю, от них все зависит.
Я этот скреч писал, чтобы хотя бы реализовать- при первом нажатии мотор едет вправо до у пора, после второго влево до упора, ну ща пока в магазин ходил, подумал, а если при начале работы программы мотор будет автоматически двигатся в крайнее левое положение например, и после этого уже начинать отсчет типо 1 нажатие val_2position второе нажатие val_3position, третье val_right, четвертое обратно возвращаться в val_left, может кто нибудь скинуть пример? как количество нажатий кнопок считать ? и как реализовать чтобы после 4 нажатия программа опять начала заново отсчитывать ? и самый главный вопрос можно ли объявить переменную не целое число, а промежуток чисел например val_left что бы был промежутком от 450-500
Cамый главный вопрос можно ли объявить переменную не целое число, а промежуток чисел например val_left что бы был промежутком от 450-500
нужено просто использовать двойную проверку типа
ничего не понял что у тебя происходит с переменной level ? она обявлена как номер аналогового порта, но дальше конструкция непонятная if (level < 450) т.е присвоено значение 2 а ты спрашиваеш не меньше ли оно 450, нужно содать переменную например levelres и в неё опрашивать твой порт т.е. levelres=analogRead(level);
а далеше опрос так if (levelres < 450)
вот сдесь
сейчас попробую всё слепить в кучу
ну как то так , может всё таки с кодом будет проще, счётчик кнопки я ввёл но ничего сним не делал так как не совсем понял задачу
icms, спасибо большое, да на самом деле сначало все было как ты написал, просто я уже столько раз код переписывал изпользуя разные операторы, что совсем запутался, ну сейчас попробую исходить из того что ты написал, ещё раз спасибо
icms уже написал, но я тут все равно повешу, упрощенный код, для случая, подсчета нажатий в цикле без самого управления двигателем
Приветствую.
Давай попробуем немного иначе если я правильно понял конструкцию порт enl(6) включает двигатель, port motorleft(3) и motorright(4) заведуют направлением вращения предлогаю добавить 3 светодиода, чтобы не гадать какой режим выбран, и еще одну кнопку для перебора режимов в обратную сторону ( не обязательно)
Тут на форуме появилась удобная кнопочка для вставки исходного кода (красные скобочки с подписью code). Если ею пользоваться, то форматирование будет так как сейчас (я просто помодерировал немного и подправил Ваше сообщение).
Probelzaelo, icms, Modular спасибо вам большое за помощь
Но у меня так ничего и не получилось)) но Probelzelo) сейчас ответил на остававшиеся у меня вопросы на которые не успели ответить остальные, просто сегодня мне попался шаговый двигатель от печки Приоры http://auto-geo.ru/shop/product_info.php?cPath=38&products_id=42697 и с помощью когда Modulara я реализовал все что мне было нужно буквально за 5 минут )) сейчас я жду ЖК дисплей через который я буду выводить информацию так что я думаю это только начало ))
про Enable: я использую драйвер двигателя L293d Точне КР1128КТ4, в дата-шите написано что это: Управление третьим состоянием 1 и 2 каналов, во всех примерах что я видел на него подавался, и я так понимал что это активирует чип, но сегодня когда я подключил шаговый двигатель от Приоры я забыл вписать туда enable, и только потом заметил что он и без него работает, и вообще я филолог, у меня тут мир полных открытий )) кстати я обязательно доделаю и с тем редуктором, русские не сдаются)) а сейчас хочу порадоваться тому что сделал и что работает ))
Вот кстати код, написан на основе кода который написал Modular, может ошибки есть какие ?)
ЖК дисплей это просто ужас как хорошо, но с ним вопросов возникнет примерно столько же как с двигателем. ;))
Судя по описанию мелкосхемы там только силовые ключи. Поэтому чтобы заставить ШД вращаться видимо придется что то делать и с другими входами, а именно заняться подачей на них управляющих шаговых импульсов, на вскидку обнаружилась библиотека для управления ШД - steper. Для ее освоения весьма полезно будет ознакомиться с сайтами http://wiring.org.co/reference/libraries/Stepper/Stepper.html и http://rln.nnov.ru/index.php?pid=55 там описано как пользовать библиотеку для обработки ШД. Вероятно для управления ШД вам придется задействовать аж 4 порта контроллера. А сигналы Е1 и Е2 просто подключить к +5.