Ответить
  • grmaster Senior Member
    офлайн
    grmaster Senior Member

    1330

    10 лет на сайте
    пользователь #176893

    Профиль
    Написать сообщение

    1330
    # 9 мая 2019 14:59
    Protez1999:

    Если вам нужно отрубать питание и кнопка не фиксируемая то вам придется ее поменять на фиксируемую. А так только в режим похожий на сон вы сможете вогнать.

    кнопка не фиксируемая. просто если объеденить два скетча, то какой из них будет запускаться при подключении питания? и что за режим"сон"?

  • Protez1999 Senior MemberАвтор темы
    офлайн
    Protez1999 Senior Member Автор темы

    9317

    11 лет на сайте
    пользователь #113845

    Профиль
    Написать сообщение

    9317
    # 9 мая 2019 15:09

    Найдите в интернете пример ардуино кнопка. Попробуйте помигать диодом, там все будет написано. Когда разберетесь, найдите пример ардуино шаговый двигатель. Двигатель заменит вам диодик. За пару часов сами все поймете. Если два объединить то ничего не будет. Они одинаковые и не в 1 из них не идет чтения кнопки.

    Если вы входите в первую 1000 комментаторов то все с вами ясно.
  • grmaster Senior Member
    офлайн
    grmaster Senior Member

    1330

    10 лет на сайте
    пользователь #176893

    Профиль
    Написать сообщение

    1330
    # 9 мая 2019 15:20 Редактировалось grmaster, 1 раз.

    Protez1999, я может неправильно обрисовал задачи. у меня есть скетч 1. который вращает двигатель с определенной скоростью. скетч 2 с меньшей скоростью. может и не объеденить. мне нужно с кнопок запускать эти скетчи и останавливать. можно ли это реализовать с моими нефиксируемыми кнопками?
    p.s если в скетче нет чтения кнопки, то я попросил помощи как сделать чтобы все это было -- прописать кнопку или как то еще...

  • Protez1999 Senior MemberАвтор темы
    офлайн
    Protez1999 Senior Member Автор темы

    9317

    11 лет на сайте
    пользователь #113845

    Профиль
    Написать сообщение

    9317
    # 9 мая 2019 15:31

    С этими кнопками можно сделать все кроме включения/выключения питания.

    Если вы входите в первую 1000 комментаторов то все с вами ясно.
  • grmaster Senior Member
    офлайн
    grmaster Senior Member

    1330

    10 лет на сайте
    пользователь #176893

    Профиль
    Написать сообщение

    1330
    # 9 мая 2019 15:36 Редактировалось grmaster, 1 раз.
    Protez1999:

    С этими кнопками можно сделать все кроме включения/выключения питания.

    спасибо за помощь! другой бы там начал словоблудие разводить на несколько постов и т.д. а тут пояснил, что в ардуино я ноль, помощь нужна как для тупых -- и тут на тебе конкретный и подробный ответ!

  • SIO Паяльник & Отвертка TEAM
    офлайн
    SIO Паяльник & Отвертка TEAM

    3634

    13 лет на сайте
    пользователь #68847

    Профиль
    Написать сообщение

    3634
    # 9 мая 2019 21:36 Редактировалось SIO, 3 раз(а).

    grmaster, Примерно так надо

    int IN1 = 5;
    int IN2 = 4;
    int IN3 = 3;
    int IN4 = 2;

    int runpin = ; //проставить пины куда подключены кнопки
    int mode1pin = ;
    int mode2pin = ;

    boolean running = false;

    int time_del = 16385;

    void setup() {
    pinMode(IN1, OUTPUT);
    pinMode(IN2, OUTPUT);
    pinMode(IN3, OUTPUT);
    pinMode(IN4, OUTPUT);

    pinMode(LEDpin, OUTPUT);
    pinMode(runPin, INPUT);
    digitalWrite(runPin, HIGH); // включаем подтягивающий резистор

    pinMode(mode1Pin, INPUT);
    digitalWrite(mode1Pin, HIGH);

    pinMode(mode2Pin, INPUT);
    digitalWrite(mode2Pin, HIGH);

    }

    void loop() {

    if (digitalRead(runPin) == LOW) // выключатель нажат, т.к. подтягивающий резистор будет давайть HIGH на входе, если не замкнут напрямую на землю
    {
    running = !running; // меняем значение булевой переменной
    digitalWrite(LEDpin, running) // включаем или выключаем светодиод.
    delay(100); // ждем 0.1сек
    }

    if (digitalRead(mode1Pin) == LOW)
    {
    time_del = 11715;
    }

    if (digitalRead(mode2Pin) == LOW)
    {
    time_del = 16385;
    }

    if (running)
    {
    digitalWrite(IN1, HIGH);
    digitalWrite(IN2, LOW);
    digitalWrite(IN3, LOW);
    digitalWrite(IN4, LOW);
    delayMicroseconds(time_del);

    digitalWrite(IN1, LOW);
    digitalWrite(IN2, HIGH);
    digitalWrite(IN3, LOW);
    digitalWrite(IN4, LOW);
    delayMicroseconds(time_del);

    digitalWrite(IN1, LOW);
    digitalWrite(IN2, LOW);
    digitalWrite(IN3, HIGH);
    digitalWrite(IN4, LOW);
    delayMicroseconds(time_del);

    digitalWrite(IN1, LOW);
    digitalWrite(IN2, LOW);
    digitalWrite(IN3, LOW);
    digitalWrite(IN4, HIGH);
    delayMicroseconds(time_del);
    }
    }

    На ардуино не программирую, могут быть ошибки.
    На питание надо тумблер, программно питание от платы не отключить.

    Паяльник & Отвертка TEAM, MikroPascal for AVR http://forum.onliner.by/viewtopic.php?t=637523
  • Compiller Senior Member
    офлайн
    Compiller Senior Member

    6693

    16 лет на сайте
    пользователь #10514

    Профиль
    Написать сообщение

    6693
    # 9 мая 2019 22:18
    Protez1999:

    Найдите в интернете пример ардуино кнопка. Попробуйте помигать диодом, там все будет написано. Когда разберетесь, найдите пример ардуино шаговый двигатель. Двигатель заменит вам диодик. За пару часов сами все поймете. Если два объединить то ничего не будет. Они одинаковые и не в 1 из них не идет чтения кнопки.

    Keye Studio
    https://wiki.keyestudio.com/Main_Page
    примеров много, но сайт на английском

    IT сантехник-ассенизатор
  • art100 Клуб Самоделкиных
    офлайн
    art100 Клуб Самоделкиных

    2289

    8 лет на сайте
    пользователь #397580

    Профиль
    Написать сообщение

    2289
    # 15 мая 2019 16:49 Редактировалось art100, 2 раз(а).
    DVK:

    RepoMan, кто-кто, я конечно. Не думаю, что с моим бюджетом проекта в $20-30 кто-то возьмётся писать.

    да ладно
    я на ардуинах наверно писал все что можно и все равно вчера 118 рублей потратил на заводское китайское
    60 рублев 1 день код накидать а еще 7 суток по 24 часа отлаживать
    более вменяемый код это месяц на оборудовании отлаживать
    меньше 200 рублей я даже смотреть в сторону не буду
    не нравиться?
    вперед на заводские китайские полуфабрикаты

    Добавлено спустя 3 минуты 34 секунды

    Protez1999:

    С этими кнопками можно сделать все кроме включения/выключения питания.

    писюк вырубать 1 сек ?
    китайское реле тебе в помощ
    24 дня посилка + 30% таможенный сбор
    меньше 10 рублей китайских посылок не помню

    Круиз-контроль 88 км/ч
  • Protez1999 Senior MemberАвтор темы
    офлайн
    Protez1999 Senior Member Автор темы

    9317

    11 лет на сайте
    пользователь #113845

    Профиль
    Написать сообщение

    9317
    # 15 мая 2019 17:22 Редактировалось Protez1999, 5 раз(а).
    Protez1999:

    С этими кнопками можно сделать все кроме включения/выключения питания.

    писюк вырубать 1 сек ?
    китайское реле тебе в помощ
    24 дня посилка + 30% таможенный сбор
    меньше 10 рублей китайских посылок не помню

    Мне ничего не надо вырубать.
    Вопрос про кнопки а не китайское реле! :insane:

    Если вы входите в первую 1000 комментаторов то все с вами ясно.
  • zverjuga Senior Member
    офлайн
    zverjuga Senior Member

    4909

    8 лет на сайте
    пользователь #346019

    Профиль
    Написать сообщение

    4909
    # 15 мая 2019 22:35

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

    проклятые законы физики!
  • SIO Паяльник & Отвертка TEAM
    офлайн
    SIO Паяльник & Отвертка TEAM

    3634

    13 лет на сайте
    пользователь #68847

    Профиль
    Написать сообщение

    3634
    # 15 мая 2019 22:50

    zverjuga, Прерывание оно как бы останавливает основной цикл в любой момент, делает свое дело и продолжает основной цикл, задержки типа delay программные и работают в основном цикле и мк может во время delay уходить в прерывание, если прерывание не запрещено в это время.

    Паяльник & Отвертка TEAM, MikroPascal for AVR http://forum.onliner.by/viewtopic.php?t=637523
  • zverjuga Senior Member
    офлайн
    zverjuga Senior Member

    4909

    8 лет на сайте
    пользователь #346019

    Профиль
    Написать сообщение

    4909
    # 15 мая 2019 23:00 Редактировалось zverjuga, 7 раз(а).

    SIO, насколько я помню, исходный код функции delay() - это бесконечный цикл, длительность которого считается в зависимости от задержки. то есть это код типа

    код выделить все

    for ( ; ; ) {
    // какая то там проверка
    if (условие) {
    break;
    }
    }

    в функции прерывания можно точно также написать подобный цикл и пока он не отпустит, функция прерывания не освободится и будет пожирать все ресурсы процессора, и основной цикл никогда не получит управления. поэтому я и говорю, что не понятно, почему delay() не работает внутри прерывания.

    и при чем тут delay() для правильной работы millis()?

    дополнено

    посмотрел исходный код функции micros()

    void delay(unsigned long ms)
    {
    uint32_t start = micros();

    while (ms > 0) {
    yield();
    while ( ms > 0 && (micros() - start) >= 1000) {
    ms--;
    start += 1000;
    }
    }
    }

    получается ровно наоборот. не micros() использует delay(), а delay() использует micros(). но по исходному коду, если micros() не работает, то delay() должен намертво завешать функцию прерывания, так как он никогда не закончится.

    исходный код micros такой

    unsigned long micros() {
    unsigned long m;
    uint8_t oldSREG = SREG, t;

    cli();
    m = timer0_overflow_count;
    #if defined(TCNT0)
    t = TCNT0;
    #elif defined(TCNT0L)
    t = TCNT0L;
    #else
    #error TIMER 0 not defined
    #endif

    #ifdef TIFR0
    if ((TIFR0 & _BV(TOV0)) && (t < 255))
    m++;
    #else
    if ((TIFR & _BV(TOV0)) && (t < 255))
    m++;
    #endif

    SREG = oldSREG;

    return ((m << 8 ) + t) * (64 / clockCyclesPerMicrosecond());
    }

    по всей видимости, в ней используется прерывание таймера, которое выключено.
    совсем не понятно, зачем micros() выключает прерывания? по идее, получается что если вызвать micros() два раза подряд даже в основном loop(), то значения вернутся одни и те же.

    проклятые законы физики!
  • SIO Паяльник & Отвертка TEAM
    офлайн
    SIO Паяльник & Отвертка TEAM

    3634

    13 лет на сайте
    пользователь #68847

    Профиль
    Написать сообщение

    3634
    # 15 мая 2019 23:55

    zverjuga, а зачем вам вообще эти функции?

    Паяльник & Отвертка TEAM, MikroPascal for AVR http://forum.onliner.by/viewtopic.php?t=637523
  • zverjuga Senior Member
    офлайн
    zverjuga Senior Member

    4909

    8 лет на сайте
    пользователь #346019

    Профиль
    Написать сообщение

    4909
    # 16 мая 2019 00:27 Редактировалось zverjuga, 3 раз(а).

    SIO, я хотел сделать следующую логику

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

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

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

    отсюда и возник вопрос, зачем micros() выключает прерывания? в чем смысл?

    задачу я конечно решил, переписав код под другую логику, но осадочек остался.

    проклятые законы физики!
  • TotCambIKoka Member
    офлайн
    TotCambIKoka Member

    488

    6 лет на сайте
    пользователь #825562

    Профиль
    Написать сообщение

    488
    # 16 мая 2019 10:33

    zverjuga, у нано 2 прерывания 2 и 3 пин

    Кстити, если я не ошибаюсь, вместо обычного делэй можно использовать delayMicroseconds(), но

    В данной версии Ардуино(какой?) максимальная пауза воспроизводимая корректно — 16383.

    [Паяльник & Отвертка TEAM] Кулыбин ищет хлам для творчества. Все замотаю синей изолентой
  • SIO Паяльник & Отвертка TEAM
    офлайн
    SIO Паяльник & Отвертка TEAM

    3634

    13 лет на сайте
    пользователь #68847

    Профиль
    Написать сообщение

    3634
    # 16 мая 2019 11:24

    zverjuga, по сути нужно одно прерывание по таймеру, в котором будет переменная считающая короткий промежуток времени,как только она насчитала нужное время, то выставляем флаг (битовая переменная) и начинаем считать по новой, в это время в основном цикле создаем условие, если флаг, то опрос кнопки и сброс флага. Либо даже новый счетчик делаем для отсчета например 2 сек. Если кнопка нажата и выставлен флаг, то прибавляем сетчик кнопки и обнуляем флаг, если кнопку отпустили раньше чем ее счетчик насчитал 2сек, то делаем одно, если насчитал 2сек и более, то другое.
    Прерывание по таймеру нам нужно только для отсчета точного времени, будь то 1мс или 100мс, мы счетчиком насчитаем столько, сколько нам нужно, только для каждого события свой флаг и своя переменная счетчика, чтоб не влияли друг на друго. Как то так.

    Паяльник & Отвертка TEAM, MikroPascal for AVR http://forum.onliner.by/viewtopic.php?t=637523
  • zverjuga Senior Member
    офлайн
    zverjuga Senior Member

    4909

    8 лет на сайте
    пользователь #346019

    Профиль
    Написать сообщение

    4909
    # 16 мая 2019 15:34 Редактировалось zverjuga, 1 раз.
    TotCambIKoka:

    zverjuga, у нано 2 прерывания 2 и 3 пин

    3-ий пин тоже был занят. я через него передатчик запилил, чем сделал глупость. походу нужно переделывать плату расширения и освободить 3-ий пин

    Добавлено спустя 2 минуты 2 секунды

    SIO, у меня таймер стоял а 0.3 секунды и этот вариант мне не нравился тем, что есть лаг между нажатием кнопки и реакции. идеальное решение - повесить кнопку на прерывание на пин 3. буду переделывать плату расширения, где все это разрулю.

    проклятые законы физики!
  • SIO Паяльник & Отвертка TEAM
    офлайн
    SIO Паяльник & Отвертка TEAM

    3634

    13 лет на сайте
    пользователь #68847

    Профиль
    Написать сообщение

    3634
    # 16 мая 2019 18:38

    zverjuga, а в ардуино не используется прерывание по изменению состояния на ноге? 328 мега это вроде всеми ногами делает

    Паяльник & Отвертка TEAM, MikroPascal for AVR http://forum.onliner.by/viewtopic.php?t=637523
  • zverjuga Senior Member
    офлайн
    zverjuga Senior Member

    4909

    8 лет на сайте
    пользователь #346019

    Профиль
    Написать сообщение

    4909
    # 16 мая 2019 18:45

    SIO,
    использует. но, как я писал выше, мне было лень искать, как подцепиться к прерываниям пинов, отличных от 2 и 3. а стандартный attachInterrupt в ардуино-нано работает только с двумя пинами, которые были занятые.

    проклятые законы физики!
  • TotCambIKoka Member
    офлайн
    TotCambIKoka Member

    488

    6 лет на сайте
    пользователь #825562

    Профиль
    Написать сообщение

    488
    # 17 мая 2019 14:01

    SIO, Это только Leonardo, там вроде другой бутлоадер и сама версия меги.

    [Паяльник & Отвертка TEAM] Кулыбин ищет хлам для творчества. Все замотаю синей изолентой