Специальные цены   новые товары
+ Ответить в теме
Показано с 1 по 36 из 36

Управление приводом

Тема раздела Самодельная электроника, компьютерные программы в категории Общие вопросы; Доброго времени суток. Имеется привод (см. вложение), необходима схема управления приводом с трёх кнопок, желательно на avr. Принцип работы следующий: ...

  1. #1

    Регистрация
    10.08.2012
    Адрес
    Дзержинск, Нижегородская о
    Возраст
    30
    Сообщений
    192

    Управление приводом

    Доброго времени суток. Имеется привод (см. вложение), необходима схема управления приводом с трёх кнопок, желательно на avr. Принцип работы следующий:

    1 кнопка - ведёт привод в крайнее верхнее положение (открыть);

    2 кнопка - ведёт привод в крайнее нижнее положение (закрыть);

    3 кнопка - в открытом положении плавно закрывает привод, пока нажата кнопка;

    Подскажите пожалуйста в какую сторону смотреть, может есть уже готовые похожие решения.

    Заранее спасибо!
    Миниатюры Миниатюры Нажмите на изображение для увеличения
Название: a56e4ed8-ff55-4f13-90c8-372a2f63234e.jpg‎
Просмотров: 104
Размер:	42.7 Кб
ID:	1489856  

  2.  
  3. #2

    Регистрация
    12.02.2011
    Адрес
    Москва
    Возраст
    49
    Сообщений
    788
    На ардуино можно легко сделать. Нужен только мост для моторчика. Его на шим повесить, а переменный резистор на один из аналоговых портов. Скетч на пол-странички получится.

  4. #3

    Регистрация
    27.07.2010
    Адрес
    Украина,чернигов
    Возраст
    47
    Сообщений
    417
    а может с сервы сделать проще

  5. #4

    Регистрация
    12.02.2011
    Адрес
    Москва
    Возраст
    49
    Сообщений
    788
    Конечно проще. Ну тут-то недосерва. Без электроники. То и посоветовал. А так ещё и динамику этого редуктора лови и калмана вкрячивай. Весело, но не продуктивно. Проще а может с сервы сделать проще

  6.  
  7. #5

    Регистрация
    27.07.2010
    Адрес
    Украина,чернигов
    Возраст
    47
    Сообщений
    417
    Могу посоветовать интересный драйвер l298n . на ютубе есть много обзоров на него

  8. #6

    Регистрация
    12.02.2011
    Адрес
    Москва
    Возраст
    49
    Сообщений
    788
    Цитата Сообщение от leons Посмотреть сообщение
    Могу посоветовать интересный драйвер l298n
    Ну правильно. Хоть этот мостик на шим ардуинки и чуять резистором. Мы хоть помогли ТСу?

    И кстати, в сотый раз. http://bobblick.com/techref/projects...e/hbridge.html

    4 транзистора 5 резисторов. От китайской машинки подобное оторвал. А то целую микросхему!
    Последний раз редактировалось Dinotron; 19.05.2019 в 23:45.

  9. #7

    Регистрация
    10.08.2012
    Адрес
    Дзержинск, Нижегородская о
    Возраст
    30
    Сообщений
    192
    Все спасибо за помощь, пока сижу и разбираюсь.
    Изначально конечно хотел вытряхнуть потроха из сервомашинки, и подключить все это дело через сервотестер... Но мне кажется нелогично несколько раз кодировать и разкодировать сигнал...
    Сейчас смотрю в сторону проекта OpenServo но пока не разобрался в нем...

  10.  
  11. #8

    Регистрация
    12.02.2011
    Адрес
    Москва
    Возраст
    49
    Сообщений
    788
    Ещё в тему. Попался мне под руку редуктор от китайской игрушки.Нажмите на изображение для увеличения
Название: DSC00002.jpg
Просмотров: 12
Размер:	24.9 Кб
ID:	1491092 Согласитесь, похож на серву. Ну и стал я в эту сторону экспериментировать. В том числе подключением к оному потрохов из сервомашинки. Что сказать - работает, только перед тем как займёт нужную позицию раз пять туда-сюда промотыляется. Инерционность дикая. Учитывайте это в своём проекте.

  12. #9

    Регистрация
    10.08.2012
    Адрес
    Дзержинск, Нижегородская о
    Возраст
    30
    Сообщений
    192
    Решил кстати узнать, сколько будет стоить разработка данного устройства, создал тему на форуме радиокот, все описал.... и маленько обомлел!!!
    За разработку ПО просят 2000р.
    За разработку схемы 5000р.!!!


    Это реальные цены? или я чего-то не понимаю...

  13. #10

    Регистрация
    12.02.2011
    Адрес
    Москва
    Возраст
    49
    Сообщений
    788
    Ну если фабричная реализация, со всеми отлаживаниями прошивок, многослойными заказными платами, то возможно. А так я могу вам прям тут скетч для ардуины навалять из пары строк. Но за результат не ручаюсь.

  14. #11

    Регистрация
    10.08.2012
    Адрес
    Дзержинск, Нижегородская о
    Возраст
    30
    Сообщений
    192
    В том то и дело что не фабричная сборка. Сборка на макетке, и без отладки...

  15. #12

    Регистрация
    27.07.2010
    Адрес
    Украина,чернигов
    Возраст
    47
    Сообщений
    417


    тоже набросал ,для так поигратса ,написано на базе VarSpeedServo эта библиотека должна быть в IDE

  16. #13

    Регистрация
    13.05.2009
    Адрес
    Москва
    Возраст
    61
    Сообщений
    360
    Решение очень простое. Нужно взять электронику от мощной рулевой машинки и встроить в редуктор. Если диапазон работы вашего редуктора с резистором обратной связи будет не в "рамках", то необходимо будет добавить резисторы (методом подбора) с двух сторон вашего встроенного резистора.

  17. #14

    Регистрация
    27.07.2010
    Адрес
    Украина,чернигов
    Возраст
    47
    Сообщений
    417
    Цитата Сообщение от egor-mav Посмотреть сообщение
    Решил кстати узнать, сколько будет стоить разработка данного устройства, создал тему на форуме радиокот
    интересно что там написали, иногда страшно что-то спрашивать у этих сумошедших программистов

  18. #15

    Регистрация
    10.08.2012
    Адрес
    Дзержинск, Нижегородская о
    Возраст
    30
    Сообщений
    192
    Мда... Думал микроконтроллеры проще освоить... Скачал Atmel Studio 7.0, смотрел уроки... Но пока только примерно понял как ШИМ генерировать на attiny2313...


    #define F_CPU 8000000UL
    #include <avr/io.h>
    #include <util/delay.h>


    int main(void)
    {
    DDRB = 0xff; // все выводы порта B сконфигурировать как выходы
    DDRD = 0x00; // все выводы порта D сконфигурировать как входы

    PORTD = 0xff; // установить "1" на всех выводах порта D,

    // включаем подтягивающие резисторы

    while (1)
    {
    if (!(PIND & (1<<PIND1))) // проверить "0" на линии 1 порта D
    {
    TCCR1A = (1<<COM1B1) | (1<<WGM10);
    TCCR1B = (1<<WGM12) | (1<<CS10);
    OCR1B = 240;
    DDRB |= (1<<PB4);
    }
    else
    {
    TCCR1A = (1<<COM1B1) | (1<<WGM10);
    TCCR1B = (1<<WGM12) | (1<<CS10);
    OCR1B = 10;
    DDRB |= (1<<PB4);
    }
    }
    }


    Но вот с подключением резистора и написание кода под него вообще не поддается.
    Кто готов помочь?

  19. #16

    Регистрация
    12.02.2011
    Адрес
    Москва
    Возраст
    49
    Сообщений
    788
    Цитата Сообщение от egor-mav Посмотреть сообщение
    Но вот с подключением резистора и написание кода под него вообще не поддается. Кто готов помочь?
    Мда. Так правильней. http://extremeelectronics.co.in/avr-...crocontroller/ Ну там с азов надо начинать, да и у 2313 нету ADC. Можно, но надо заморочиться. Может всё-таки так проще

    https://doc.arduino.ua/ru/prog/AnalogWrite Под ваш привод точно пойдёт. Пару строк дописать
    P. S. Из нужного вам вооружения на борту 2313 только компаратор. Может только сравнивать 2 напряжения и говорить выше или ниже. Либо ваяйте каким-нибудь ШИМом на резистор пилу и теми же таймерами мерить время, или транзистор с конденсатором и.. тоже.
    Последний раз редактировалось Dinotron; 02.06.2019 в 00:35.

  20. #17

    Регистрация
    09.08.2003
    Адрес
    Москва
    Возраст
    55
    Сообщений
    10,252
    Любая задача должна начинаться с техзадания. Оно как-бы было озвучено в первом пункте:
    Цитата Сообщение от egor-mav Посмотреть сообщение
    Имеется привод (см. вложение), необходима схема управления приводом с трёх кнопок, желательно на avr. Принцип работы следующий...
    Там было три кнопки, сейчас в схеме откуда-то появился переменный резистор. Еще в ТЗ не отображено, как должен вести себя мотор-редуктор при не нажатых кнопках - просто обесточиваться или удерживать текущее положение. Если первый вариант, то никакого контроллера там не нужно, можно оттолкнуться от этой схемы: BAIT BOAT для рыбалки В вашем случае нарисованный на схеме регулятор не нужен, все подключается прямо к источнику питания. Концевики шунтируются управляющими кнопками крест-накрест, третья кнопка для медленного хода должна подключаться параллельно одной их первых двух, но последовательно со своим балластным резистором.

  21. #18

    Регистрация
    12.02.2011
    Адрес
    Москва
    Возраст
    49
    Сообщений
    788
    Цитата Сообщение от V_Alex Посмотреть сообщение
    Любая задача должна начинаться с техзадания.
    Полностью согласен. Видимо тем и отличаются любители, что любят переобуваться по нескольку раз.


    Цитата Сообщение от V_Alex Посмотреть сообщение
    Концевики шунтируются управляющими кнопками крест-накрест, третья кнопка для медленного хода должна подключаться параллельно одной их первых двух, но последовательно со своим балластным резистором.
    И никаких процессоров нафинг !

  22. #19

    Регистрация
    27.07.2010
    Адрес
    Украина,чернигов
    Возраст
    47
    Сообщений
    417
    Цитата Сообщение от V_Alex Посмотреть сообщение
    сейчас в схеме откуда-то появился переменный резистор
    а как кнопка и резистор вчесте работать должны , я пробовал у них тупо конфликт , я так понял нужно две переменные к кнопке и к переменнику

  23. #20

    Регистрация
    09.08.2003
    Адрес
    Москва
    Возраст
    55
    Сообщений
    10,252
    Щас практически на каждом китайском сервотестере стоит переменник и батарея кнопок. В общем случае там организован цикл с частотой 50 Гц. Первыми опрашиваются кнопки и от них серва либо уходит в заданное крайнее положение, либо начинает елозить из края в край. Опрос канала АЦП на время нажатия кнопки должен блокироваться. Когда кнопки отпущены, доходит очередь до переменника. Для резвого и вменяемого распределения ресурсов такие вещи лучше писать на ассемблере. Для задачи автора темы достаточно чего-то совсем мелкого, типа тини13а.

  24. #21

    Регистрация
    19.03.2008
    Адрес
    Московкая обл.
    Возраст
    54
    Сообщений
    2,111
    Записей в дневнике
    1
    Цитата Сообщение от egor-mav Посмотреть сообщение
    Управление приводом
    Егор вот посмотри здесь ,правда там для сервы ,но может что то интересное для себя найдете там с права оглавление,есть и написанные программы под Пик контролер.
    https://alex-exe.ru/radio/robotics/servo-pic/

  25. #22

    Регистрация
    10.08.2012
    Адрес
    Дзержинск, Нижегородская о
    Возраст
    30
    Сообщений
    192
    Всем спасибо за советы, особенно Вам Дмитрий. Про Ардуино даже и не думал... Попробую на нем сделать.
    Согласен, на концевиках проще всего, но моторчик в данном редукторе имеет хорошую инерцию, и после пары применений на схеме с концевиками, я этот редуктор скорей всего выкину.
    Резистор вроде в ТЗ присутствовал всегда, см. вложение.
    И не надо говорить, что я переобуваюсь... Хотя да, скорей всего я буду переобуваться, т.к. сам до конца не знаю что в итоге хочу получить, и я не только про привод...
    Сам руковожу проектным отделом, самого бесят заказчики, которые дают невнятное ТЗ, а потом переобуваются в самый последний момент.

  26. #23

    Регистрация
    09.08.2003
    Адрес
    Москва
    Возраст
    55
    Сообщений
    10,252
    Цитата Сообщение от egor-mav Посмотреть сообщение
    Согласен, на концевиках проще всего, но моторчик в данном редукторе имеет хорошую инерцию, и после пары применений на схеме с концевиками, я этот редуктор скорей всего выкину.
    Погуглите фразу "кулачок механизм".

  27. #24

    Регистрация
    10.08.2012
    Адрес
    Дзержинск, Нижегородская о
    Возраст
    30
    Сообщений
    192
    Все, стоп. Забыли про концевики и кулачковые механизмы... Это не наш метод, и не интересно... Пока электриком работал на них насмотрелся.
    Буду делать на Ардуино. Сижу изучаю...

  28. #25

    Регистрация
    27.07.2010
    Адрес
    Украина,чернигов
    Возраст
    47
    Сообщений
    417
    Цитата Сообщение от egor-mav Посмотреть сообщение
    Все, стоп. Забыли про концевики и кулачковые механизмы... Это не наш метод, и не интересно... Пока электриком работал на них насмотрелся.
    Буду делать на Ардуино. Сижу изучаю...
    Вы только не исчезайте , всётаки будет интересен результат

  29. #26

    Регистрация
    12.02.2011
    Адрес
    Москва
    Возраст
    49
    Сообщений
    788
    Цитата Сообщение от egor-mav Посмотреть сообщение
    Буду делать на Ардуино. Сижу изучаю...
    Хотите вместе поизвращаемся. Та китайская мандула с фото всё ещё в работе. И да. Больше чем ардуинку я к ней, видимо, не подключу.
    P. S. У меня случай тяжелее. Она вот к чему прикручена.Нажмите на изображение для увеличения
Название: 20190406_183300.jpg
Просмотров: 30
Размер:	36.4 Кб
ID:	1493961 Сразу не бейте. Каждый сходит с ума по-своему. Там ещё и ROS распределённый а ардуинка нодой. Надо было его на помойку отпереть. Теперь жалко.
    Последний раз редактировалось Dinotron; 05.06.2019 в 02:03.

  30. #27

    Регистрация
    10.08.2012
    Адрес
    Дзержинск, Нижегородская о
    Возраст
    30
    Сообщений
    192
    Что это? С одной стороны напоминает человеческий скелет... С другой - концептуальную вешалку

  31. #28

    Регистрация
    12.02.2011
    Адрес
    Москва
    Возраст
    49
    Сообщений
    788
    И то и другое верно. И вопрос хороший. Это нечто упрощённо подделывающее человеческую анатомию, из всякого мусора, но с компьютерами в башке и в заднице. Оно пластмассовое и гнётся. Ну бред короче, но забористый оказался.

  32. #29

    Регистрация
    10.08.2012
    Адрес
    Дзержинск, Нижегородская о
    Возраст
    30
    Сообщений
    192
    И снова обращаюсь к Вам за помощью, нужно проверить код... Двигаюсь конечно потихоньку, времени мало свободного, но все же двигаюсь...


    Итак, решил начать с малого. Так сказать без всяких кнопок и прочего. Оставляю только мотор и потенциометр (так сказать код открытия):


    int motorPin = 10; // мотор подключен к цифровому выводу 10
    int analogPin = A0; // потенциометр подключен к аналоговому выходу А0
    int val = 0; // переменная для хранения считанного значения с потенциометра




    void setup() {

    pinMode(motorPin, OUTPUT); // переключение вывода в режим "выход"

    }


    void loop() { // этот цикл выполняется бесконечное количество раз

    val = analogRead(analogPin); // записываем в переменную показания с потенциометра

    if (val<700) {
    analogWrite(motorPin, 255); // если переменная меньше 700 включаем ШИМ на полную
    }
    if (val>700&&val<1000) {
    analogWrite(motorPin, 150); // если переменная меньше от 700 до 1000 убавляем ШИМ на некоторое значение
    }
    if (val>1000) {
    analogWrite(motorPin, 0); // если переменная меньше больше 1000 отрубаем ШИМ
    }
    }
    Я в правильном направлении двигаюсь?

  33. #30

    Регистрация
    12.02.2011
    Адрес
    Москва
    Возраст
    49
    Сообщений
    788
    /В правильном.
    Только учтите

    /

    {Analogread() Щупает от 0 до 1023,
    А AnalogWrite() может вписать только до 255.}
    /Constrain между ними поставьте. https://doc.arduino.ua/ru/prog/Constrain
    И только если это по кругу как пони.
    Ну для начала.
    что я делаю/

  34. #31

    Регистрация
    10.08.2012
    Адрес
    Дзержинск, Нижегородская о
    Возраст
    30
    Сообщений
    192
    И снова здравствуйте, и снова нужна ваша помощь.
    к предыдущему скетчу пытаюсь добавить кнопку:
    int motorPin = 10; // мотор подключен к цифровому выводу 10
    int analogPin = A0; // потенциометр подключен к аналоговому выходу А0
    int buttom1Pin = 22; // кнопка подключен к входу 22
    int val = 0; // переменная для хранения считанного значения с потенциометра
    int openn = 0; // переменная для хранения считанного значения с потенциометра



    void setup() {

    pinMode(motorPin, OUTPUT); // переключение вывода в режим "выход"

    }


    void loop() { // этот цикл выполняется бесконечное количество раз

    val = analogRead(analogPin); // записываем в переменную показания с потенциометра
    if (digitalRead(buttom1Pin) == HIGH) {
    do {
    if (val<500) {
    analogWrite(motorPin, 255); // если переменная меньше 700 включаем ШИМ на полную
    }
    if (val>500&&val<1000) {
    analogWrite(motorPin, 150); // если переменная меньше от 700 до 1000 убавляем ШИМ на некоторое значение
    }
    if (val>1000) {
    analogWrite(motorPin, 0); // если переменная меньше больше 1000 отрубаем ШИМ
    }
    }while (val>1000);
    }
    }
    Но, при симуляции в протеусе происходит следующее:
    1) начальные параметры, кнопка не нажата, переменник в нуле, мотор не крутится;
    2) при нажатии кнопки начинает вращатся мотор с максимальной скоростью;
    3) начинаю "крутить" переменник, скорость мотора изменяется согласно алгоритма скетча;
    4) при достижении переменника 100%, мотор останавливается.
    Вроде все хорошо, но......
    Если я правильно понимаю свой скетч, то после всех этих действий, изменении положения резистора и повторного нажатия кнопки цикл (do-while) должен запустится заново, и мотор снова должен вращатся по алгоритму, но этого почему-то не происходит....
    В чем проблема?

  35. #32

    Регистрация
    10.08.2012
    Адрес
    Дзержинск, Нижегородская о
    Возраст
    30
    Сообщений
    192
    Не знаю, смотрит кто нибудь эту тему или нет...
    Переделал предыдущий скетч теперь все работает.

    int motorPin1 = 10; // мотор подключен к цифровому выводу 10
    int motorPin2 = 11; // мотор подключен к цифровому выводу 11 (реверс)
    int analogPin = A0; // потенциометр подключен к аналоговому выходу А0
    int buttom1Pin = 22; // АЦЦ
    int buttom2Pin = 23; // кнопка подключен к входу 22
    int val = 0; // переменная для хранения считанного значения с потенциометра
    int openn = 0; // переменная фиг знает для чего



    void setup() {

    pinMode(motorPin1, OUTPUT); // переключение вывода в режим "выход"
    pinMode(motorPin2, OUTPUT); // переключение вывода в режим "выход"

    }


    void loop() { // этот цикл выполняется бесконечное количество раз
    val = analogRead(analogPin);
    if (digitalRead(buttom2Pin)==HIGH && val<500 && openn == 0) {
    openn = 1;
    }
    if (digitalRead(buttom2Pin)==HIGH && val>500 && openn == 0) {
    openn = 2;
    }


    if (openn == 1) {
    if (val < 250) {
    analogWrite(motorPin1, 255); // если переменная меньше 700 включаем ШИМ на полную
    }
    if (val>250 && val < 1000) {
    analogWrite(motorPin1, 150); // если переменная меньше от 700 до 1000 убавляем ШИМ на некоторое значение
    }
    if (val > 1000) {
    analogWrite(motorPin1, 0); // если переменная меньше больше 1000 отрубаем ШИМ
    openn = 0;
    }
    }

    if (openn == 2) {
    if (val > 500) {
    analogWrite(motorPin2, 255); // если переменная меньше 700 включаем ШИМ на полную
    }
    if (val > 100 && val < 500) {
    analogWrite(motorPin2, 150); // если переменная меньше от 700 до 1000 убавляем ШИМ на некоторое значение
    }
    if (val < 100) {
    analogWrite(motorPin2, 0); // если переменная меньше больше 1000 отрубаем ШИМ
    openn = 0;
    }
    }
    }
    Но теперь появились другие проблемы и новые исходные данные. Но это уже совсем другая история

  36. #33

    Регистрация
    10.08.2012
    Адрес
    Дзержинск, Нижегородская о
    Возраст
    30
    Сообщений
    192
    Продолжаю тему сам с собой
    В качестве контроллера выбрал Arduino Mega 2560 R3 (продавали в моем городе, не хотелось долго ждать с Али).
    В качестве драйвера двигателя взята плата L298, спасибо за совет leons.
    драйвер пока не пришел с алика, так что пока все тестирую в протеусе.

    Схема которую собрал в протеусе (во вложении).
    Далее код который написал:


    // ----------------------------------------------------------------управления приводом
    int motorPin1 = 24; // мотор подключен к цифровому выводу 10
    int motorPin2 = 25; // мотор подключен к цифровому выводу 11 (реверс)
    int motorPin3 = 10; // мотор подключен к цифровому выводу 10 (PWM)
    int analogPin = A0; // потенциометр подключен к аналоговому выходу А0
    int buttom1Pin = 22; // АЦЦ
    int buttom2Pin = 23; // кнопка подключен к входу 23
    int val = 0; // переменная для хранения считанного значения с потенциометра
    int openn = 0; // переменная для хранения открытия по кнопке
    int opennacc = 0; // переменная для хранения открытия по АСС

    int led1 = 51;
    int led2 = 52;
    int led3 = 53;

    unsigned long currentTime;
    unsigned long loopTime;

    //------------------------------------------------------------------------------------------------------


    void setup() {
    // ----------------------------------------------------------------управления приводом
    pinMode(motorPin1, OUTPUT); // переключение вывода в режим "выход"
    pinMode(motorPin2, OUTPUT); // переключение вывода в режим "выход"
    pinMode(motorPin3, OUTPUT); // переключение вывода в режим "выход"
    pinMode(led1, OUTPUT);
    pinMode(led2, OUTPUT);
    pinMode(led3, OUTPUT);

    currentTime = millis(); // считываем время, прошедшее с момента запуска программы
    loopTime = currentTime;

    //------------------------------------------------------------------------------------------------------

    }


    void loop() { // этот цикл выполняется бесконечное количество раз
    // ----------------------------------------------------------------управления приводом
    val = analogRead(analogPin);
    currentTime = millis();

    if (digitalRead(buttom1Pin) == HIGH && opennacc == 0 && currentTime >= (loopTime + 10000)) {
    opennacc = 1;
    loopTime = currentTime;
    }

    if (digitalRead(buttom1Pin) == LOW && currentTime >= (loopTime + 10000)) {
    opennacc = 0;
    loopTime = currentTime;
    }


    if (digitalRead(buttom2Pin) == HIGH && val < 500 && openn == 0 && opennacc == 2) {
    openn = 1;
    }

    if (digitalRead(buttom2Pin) == HIGH && val > 500 && openn == 0 && opennacc == 2) {
    openn = 2;
    }



    if (opennacc == 1) { // открытия привода по АСС
    if (val < 700) {
    digitalWrite(motorPin2, LOW);
    digitalWrite(motorPin1, HIGH);
    analogWrite(motorPin3, 255); // если переменная меньше 250 включаем ШИМ на полную
    }
    if (val >= 700 && val <= 1000) {
    digitalWrite(motorPin2, LOW);
    digitalWrite(motorPin1, HIGH);
    analogWrite(motorPin3, 150); // если переменная меньше от 250 до 1000 убавляем ШИМ на некоторое значение
    }
    if (val > 1000) {
    digitalWrite(motorPin2, LOW);
    digitalWrite(motorPin1, LOW);
    analogWrite(motorPin3, 0); // если переменная меньше больше 1000 отрубаем ШИМ
    opennacc = 2; // открыт по АСС
    }
    }


    if (opennacc == 0) { // Закрытие привода по АСС

    if (val > 300) {
    digitalWrite(motorPin1, LOW);
    digitalWrite(motorPin2, HIGH);
    analogWrite(motorPin3, 255); // если переменная меньше 500 включаем ШИМ на полную
    }
    if (val >= 20 && val <= 300) {
    digitalWrite(motorPin1, LOW);
    digitalWrite(motorPin2, HIGH);
    analogWrite(motorPin3, 150); // если переменная от 100 до 500 убавляем ШИМ на некоторое значение
    }
    if (val < 20) {
    digitalWrite(motorPin1, LOW);
    digitalWrite(motorPin2, LOW);
    analogWrite(motorPin3, 0); // если переменная меньше больше 100 отрубаем ШИМ
    opennacc = 0;
    }
    }


    if (openn == 1 && opennacc == 2) { //Открытие привода по кнопке
    if (val < 700) {
    digitalWrite(motorPin1, HIGH);
    analogWrite(motorPin3, 255); // если переменная меньше 250 включаем ШИМ на полную
    }
    if (val >= 700 && val <= 1000) {
    digitalWrite(motorPin1, HIGH);
    analogWrite(motorPin3, 150); // если переменная меньше от 250 до 1000 убавляем ШИМ на некоторое значение
    }
    if (val > 1000) {
    digitalWrite(motorPin1, LOW);
    analogWrite(motorPin3, 0); // если переменная меньше больше 1000 отрубаем ШИМ
    openn = 0;
    }
    }

    if (openn == 2) { // Закрытие привода по кнопке
    if (val > 300) {
    digitalWrite(motorPin2, HIGH);
    analogWrite(motorPin3, 255); // если переменная больше 500 включаем ШИМ на полную
    }
    if (val >= 20 && val <= 300) {
    digitalWrite(motorPin2, HIGH);
    analogWrite(motorPin3, 150); // если переменная от 100 до 500 убавляем ШИМ на некоторое значение
    }
    if (val < 20) {
    digitalWrite(motorPin2, LOW);
    analogWrite(motorPin3, 0); // если переменная меньше меньше 100 отрубаем ШИМ
    openn = 0;
    }
    }


    //-------------------------индикация переменной opennacc временно
    if (opennacc == 0){
    digitalWrite(led1, HIGH);
    }else {digitalWrite(led1, LOW);
    }

    if (opennacc == 1){
    digitalWrite(led2, HIGH);
    }else {digitalWrite(led2, LOW);
    }

    if (opennacc == 2){
    digitalWrite(led3, HIGH);
    }else {digitalWrite(led3, LOW);
    }
    }
    //------------------------------------------------------------------------------------------------------
    Вроде все работает... Если не сложно, оцените пожалуйста, может чего лишнего понаписал...
    Миниатюры Миниатюры Нажмите на изображение для увеличения
Название: Снимок.jpg‎
Просмотров: 12
Размер:	62.6 Кб
ID:	1500743  

  37. #34

    Регистрация
    09.07.2017
    Адрес
    Сургут
    Возраст
    43
    Сообщений
    450
    Цитата Сообщение от egor-mav Посмотреть сообщение
    Если не сложно, оцените пожалуйста, может чего лишнего понаписал...
    Номера пинов принято указывать дефайнами, нет смысла хранить их в переменных.
    Код:
    #define MOTOR_PIN1 24; // мотор подключен к цифровому выводу 10
    #define MOTOR_PIN2 25; // мотор подключен к цифровому выводу 11 (реверс)
    ...
    соответственно в коде написать
    Код:
    ...
    pinMode(MOTOR_PIN1, OUTPUT); // переключение вывода в режим "выход"
    ...
    я не большой специалист, но кажется такое:
    Код:
      if (opennacc == 1) { // открытия привода по АСС
        if (val < 700) {
          digitalWrite(motorPin2, LOW);
          digitalWrite(motorPin1, HIGH);
          analogWrite(motorPin3, 255); // если переменная меньше 250 включаем ШИМ на полную
        }
        if (val >= 700 && val <= 1000) {
          digitalWrite(motorPin2, LOW);
          digitalWrite(motorPin1, HIGH);
          analogWrite(motorPin3, 150); // если переменная меньше от 250 до 1000 убавляем ШИМ на некоторое значение
        }
        if (val > 1000) {
          digitalWrite(motorPin2, LOW);
          digitalWrite(motorPin1, LOW);
          analogWrite(motorPin3, 0); // если переменная меньше больше 1000 отрубаем ШИМ
          opennacc = 2; // открыт по АСС
        }
      }
    можно упростить до такого:
    Код:
      if (opennacc == 1) { // открытия привода по АСС
        digitalWrite(MOTOR_PIN1 HIGH);
        digitalWrite(MOTOR_PIN2, LOW);
        if (val < 700) analogWrite(MOTOR_PIN3, 255);                  // если переменная меньше 250 включаем ШИМ на полную
        if (val >= 700 && val <= 1000) analogWrite(MOTOR_PIN3, 150);  // если переменная меньше от 250 до 1000 убавляем ШИМ на некоторое значение
        if (val > 1000) {
          analogWrite(MOTOR_PIN3, 0);                                 // если переменная меньше больше 1000 отрубаем ШИМ
          digitalWrite(MOTOR_PIN1, LOW);
          opennacc = 2; // открыт по АСС
        }
      }
    еще вам нужно будет бороться с дребезгом контактов, которого в протеусе нет, а в железе будет.

    Обычно для обработки кнопок пишут отдельную функцию типа getBTN(), которая фильтрует дребезг и возвращает их состояние, а основная программа уже вызывает эту функцию и действует согласно её ответа. На истину не претендую, просто мысли

  38. #35

    Регистрация
    10.08.2012
    Адрес
    Дзержинск, Нижегородская о
    Возраст
    30
    Сообщений
    192
    ОГО! Спасибо большое за советы! Можно поподробнее насчет функции getBTN()?

  39. #36

    Регистрация
    09.07.2017
    Адрес
    Сургут
    Возраст
    43
    Сообщений
    450
    Цитата Сообщение от egor-mav Посмотреть сообщение
    Можно поподробнее насчет функции getBTN()?
    схематично как-то так:
    Код:
    void setup() {
      // начальные настройки
    }
    
    void loop() {
      // основной код
      switch (getBTN()) {
        case 0:
          // действия еcли ничего не нажато
          break;
        case 1:
          // действия еcли нажата кнопка 1
          break;
        case 2:
          // действия еcли нажата кнопка 2
          break;
      }
    }
    
    byte getBTN() {
      byte btn_state;
      // опрос кнопок и фильтрация дребезга
      return btn_state;
    }
    так можно отследить не только момент нажатия, но и удержание в нажатом состоянии и отпускание, если оно конечно нужно.

    А для борьбы с дребезгом самое простое делать два опроса кнопки с небольшой задержкой, сравнивать результаты и фискировать нажатие только при их совпадении. Примеров в интернетах вагон https://arduinomaster.ru/datchiki-ar...taktov-knopki/

+ Ответить в теме

Похожие темы

  1. Продам Стальные привода,чашки, кости HSP 1/8
    от Harec89 в разделе Барахолка. Автомодели - комплектующие
    Ответов: 12
    Последнее сообщение: 12.11.2019, 00:30
  2. Продам Привод и хексы на саваж 4.6
    от nik1972 в разделе Барахолка. Автомодели - комплектующие
    Ответов: 51
    Последнее сообщение: 02.11.2019, 12:20
  3. Продам Комплект приводов с хексами на 17 на Savage.
    от Trofimoff в разделе Барахолка. Автомодели - комплектующие
    Ответов: 2
    Последнее сообщение: 01.06.2019, 00:40
  4. большие ретракты
    от IgorNN в разделе Большие модели
    Ответов: 4
    Последнее сообщение: 06.03.2019, 10:28
  5. Помогите подобрать приводы для стенда
    от Fencer в разделе Бортовая электроника
    Ответов: 12
    Последнее сообщение: 02.07.2018, 19:41

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения