МЕЖДУНАРОДНЫЙ КЛУБ ВЛАДЕЛЬЦЕВ И ЛЮБИТЕЛЕЙ НИВА ЛЕГЕНДА, ТРЕВЕЛ, ШЕВРОЛЕ НИВА И ЛАДА   18+

 




 [ Сообщений: 59 ]  На страницу Пред.    След.
Автор Сообщение
 
Не в сети
 Заголовок сообщения: Re: Arduino - кто нибудь с ним работал?
Сообщение Добавлено: 13 янв 2017, 22:45  
Аватара пользователя
Профи
Профи

    2100
  •  12843
  •   1

  •  18 окт 2006, 21:12

  •  Карелия, Петрозаводск

Блог: Просмотр записи (0)
дак если потребление малое оставь штатный линейник, он в широком диапазоне работает.

_________________
Citroen C4 II '12 VTi+AL4
ШН '05 1.7-GT17, 1.6-16V TD05-16g (продал)
ШН '04 stock (продал)


Вернуться к началу
 Профиль Фотоальбом  
 
 
Не в сети
 Заголовок сообщения: Re: Arduino - кто нибудь с ним работал?
Сообщение Добавлено: 13 янв 2017, 23:01  
Резидент
Резидент

    285
  •  825

  •  23 авг 2012, 08:18

Блог: Просмотр записи (0)
Можно глянуть схемы БК, тот же Штат X1, он на 5-вольтовом МК построен. Вот: https://www.shtat.ru/printsipialnye-she ... entov-k-bk


Вернуться к началу
 Профиль  
 
 
Не в сети
 Заголовок сообщения: Re: Arduino - кто нибудь с ним работал?
Сообщение Добавлено: 14 янв 2017, 13:10  
Аватара пользователя
Старожил
Старожил

    797
Автор темы
  •  2419
  • 44
  •   3

  •  30 ноя 2006, 16:52

  •  Москва, САО РШН 2016г.в. 120 ткм

Блог: Просмотр записи (0)
@NP , вот за это спасибо! Как говорится готовое решение, проверенное временем.
Правда у них в схемах почему то нет дросселя и стабилитрона чтобы гасить "иглы" всплесков напряжения. Или LM7805 (КР142ЕН5А) 100% не пропускает через себя такие иглы?

Также посмотрел на тот же Шматрикс как там устроены внешние входы с делителем и антидребезговыми конденсаторами. Тоже удивило, что нет стабилитронов параллельно конденсаторам. Ведь по входам тоже "иглы" могут приходить. Или конденсатора достаточно?

_________________
"...правильнописание у меня хорошее, но почему-то хромает..."(с)


Вернуться к началу
 Профиль Фотоальбом  
 
 
Не в сети
 Заголовок сообщения: Re: Arduino - кто нибудь с ним работал?
Сообщение Добавлено: 14 янв 2017, 14:05  
Аватара пользователя
Профи
Профи

    2100
  •  12843
  •   1

  •  18 окт 2006, 21:12

  •  Карелия, Петрозаводск

Блог: Просмотр записи (0)
7805 это почти такой же принципиально линейник (LDO) как и встроенный 1117 или аналоги на ардуине (судя по даташиту на нано стоит UA78M05, но я сколько ардуин не встречал все были 1117), разве что у встроенного корпус меньше и smd, ток 500ма вместо 1000ма (у 1117 800ма), и собственное падение напряжения меньше.

_________________
Citroen C4 II '12 VTi+AL4
ШН '05 1.7-GT17, 1.6-16V TD05-16g (продал)
ШН '04 stock (продал)


Вернуться к началу
 Профиль Фотоальбом  
 
 
Не в сети
 Заголовок сообщения: Re: Arduino - кто нибудь с ним работал?
Сообщение Добавлено: 14 янв 2017, 17:14  
Аватара пользователя
Старожил
Старожил

    797
Автор темы
  •  2419
  • 44
  •   3

  •  30 ноя 2006, 16:52

  •  Москва, САО РШН 2016г.в. 120 ткм

Блог: Просмотр записи (0)
если потребление малое оставь штатный линейник
Потребление на выход - импульс 0,5с на транзисторный ключ для подачи (просадки) сигнала "закрыть" на соответствующем канале блока "нормы". Ессно в масштабах тактовый частоты это единичные сигналы (несколько штук за поездку, а чаще всего один).

По стабилизатору: у меня реально стоит ams1117 t50e28hc, но я так понял что никаких фильтров на ардуине нет. Просто стремно, если из-за случайного всплеска этот подаренный девайс тупо сдохнет.

Добавлено спустя 13 минут 8 секунд:
Вот накидал код на скорую руку:
Код:
  boolean DPPA = 0;                             //Флаг педали газа: 0 - педаль не нажата, 1 - педаль нажата
  boolean DS = 0;                               //Флаг датчика скорости: 0 - скороть недостаточна, 1 - скорость в норме
  boolean LOCK = 0;                             //Флаг запертых дверей: 1 - двери заперты, 0 - незаперты
  volatile unsigned long TM = 0;                //Время предудущего прерывания датчика скорости
  volatile unsigned int HZ = 0;                 //Частота датчика скорости
 
  void setup() {                                //Вход педали газа на аналоговом входе 5
    pinMode(7, INPUT);                          //Вход концевика дверей: 1 - двери закрыты, 0 - открыты
    pinMode(13, OUTPUT);                        //Выходной сигнал на закрытие
    attachInterrupt(1, Speed, RISING);          //Прерывание по датчику скорости, пин 3
  }

  void loop() {                               
    while(LOCK) {                               //Пока двери заперты ничего не делать
      if(!digitalRead(7)) LOCK=0;               //Если двери открыты, то они не заперты
      delay(50);
    }                 
    if(digitalRead(7) && !LOCK) LOCK = Zakrdv();//Попытаться запереть двери, если они закрыты и не заперты
    delay(50);
  }

  int Zakrdv() {                               
    while(digitalRead(7)){                      // Пока двери закрыты мониторим датчики:
      if(analogRead(5) > 230) DPPA = 1;         // Проверка педали газа с установка флага (U*204.8)
      if(HZ > 25) DS = 1;                       // Проверка датчика скорости на 15 км/ч с установка флага (HZ = V*6/3.6)
      if(DPPA && DS){                           // Процесс запирание
        delay(500);                             // Задержка на полное защелкивание замков (если двери закрылись на ходу)
        if (!digitalRead(7)) {
          DPPA = 0;  DS = 0;                    // Сброс флагов и возврат 
          return 0;                             // при внезапном открытии
        }
        digitalWrite(13, 1);                    // Подать импульс 0,5 сек. на запирание
        delay(500);
        digitalWrite(13, 0);
        DPPA = 0;  DS = 0;                      // Сброс флагов
        delay(1000);                            // Подождать запирание дверей (из-за ступенчатой работы активаторов)     
        return 1;
      }
      delay(50);
    }
    DPPA = 0;  DS = 0;                          // Сброс флагов и возврат
    return 0;                                   // после неудачной попытки (двери открылись в процессе мониторинга датчиков)
  }

  void Speed() {                               
    HZ = 1000000/(micros() - TM);               //определение частоты датчика скорости
    TM = micros();
  }

П.С. Задержка в 50 мс в каждом цикле для имитирования уменьшения тактовой частоты до 20гц и меньшего потребления (как мне кажется) :smile_bigsmile:

_________________
"...правильнописание у меня хорошее, но почему-то хромает..."(с)


Вернуться к началу
 Профиль Фотоальбом  
 
 
Не в сети
 Заголовок сообщения: Re: Arduino - кто нибудь с ним работал?
Сообщение Добавлено: 14 янв 2017, 18:08  
Аватара пользователя
Старожил
Старожил

    310
  •  1420
  • 52
  •   26

  •  10 янв 2009, 17:55

  •  Карелия

Блог: Просмотр записи (0)
вряд ли тактовая частота рулится с помощью delay. скорее защита от "дребезга контактов".
просто во время выполнения delay процессор считает так ты, но никуда их не выводит)

_________________
...И с приветом !
И спасибо всем тем,
кто мигал
дальним светом...
Изображение


Вернуться к началу
 Профиль Фотоальбом  
 
 
Не в сети
 Заголовок сообщения: Re: Arduino - кто нибудь с ним работал?
Сообщение Добавлено: 17 янв 2017, 06:43  
Аватара пользователя
Резидент
Резидент

    35
  •  176
  •   1

  •  22 мар 2012, 10:13

  •  Томск

Блог: Просмотр записи (0)
В loop() цикл ожидания лучше не ставить - такой подход работает только для совсем простых задач.
Лучше при каждом вызове loop() оценивать состояние и выполнять нужные действия, примерно так:

Код:
void loop() {
    if(!digitalRead(7)) LOCK=0;
    delay(50);

    if(digitalRead(7) && !LOCK) {
        LOCK = Zakrdv();//Попытаться запереть двери, если они закрыты и не заперты
        delay(50);
    }
}


Второй IF даёт ту же логику - пока LOCK, ничего не делать.
Не утверждаю что это рабочий код, скорее иллюстрация - при таком подходе будет проще развивать программу.

_________________
GLC 2012, прошивка от Glu, двухрядники и соболиные тормоза от мвн


Вернуться к началу
 Профиль Фотоальбом  
 
 
Не в сети
 Заголовок сообщения: Re: Arduino - кто нибудь с ним работал?
Сообщение Добавлено: 17 янв 2017, 11:42  
Аватара пользователя
Старожил
Старожил

    797
Автор темы
  •  2419
  • 44
  •   3

  •  30 ноя 2006, 16:52

  •  Москва, САО РШН 2016г.в. 120 ткм

Блог: Просмотр записи (0)
@adruzh , ага, я уже тоже начитался))) И даже осознал, что функцию delay() в бесконечных циклах использовать нежелательно, чтобы не пропустить нужные события. Надо делать все непрерывно, но делать защиту от дребезга.

Пока у меня получается так:
Код:
  boolean DPPA = 0, dppa_tmp = 0;                         //Флаги педали газа: 0 - педаль не нажата, 1 - педаль нажата
  boolean DS = 0, ds_tmp = 0;                             //Флаги датчика скорости: 0 - скорость недостаточна, 1 - скорость в норме
  boolean ESW = 0, esw_tmp = 0;                           //Флаги состояние коцевика дверей: 1 - двери закрыты, 0 - открыты
  boolean LOCK = 0;                                       //Флаг запертых дверей: 1 - двери заперты, 0 - незаперты
  boolean bnc_esw = 0;                                    //Флаг дребезга дверей: 1 - дребезг, 0 - дребезга нет
  volatile unsigned long TM = 0;                          //Время предудущего прерывания датчика скорости
  volatile unsigned int HZ = 0;                           //Частота датчика скорости
  unsigned long time_esw = 0, time_dppa = 0, time_ds = 0, time_zakr = 0; //Засечки времени
 
  void setup() {                                          //Вход педали газа на аналоговом входе 5
    pinMode(7, INPUT);                                    //Вход концевика дверей: 1 - двери закрыты, 0 - открыты
    pinMode(13, OUTPUT);                                  //Выходной сигнал на закрытие
    attachInterrupt(1, Speed, RISING);                    //Прерывание по датчику скорости, пин 3
  }
/***Мониторит концевик в реальном времени***/
  void loop() {
    Bounce_ESW(digitalRead(7));                           //Считываем концевик и проверяем на дребезг           
    if(!ESW) LOCK = DPPA = DS = 0;                        //Если двери открыты, то они не заперты, флаги сброшены         
    if(ESW && !LOCK) LOCK = Zakrdv();                     //Если двери закрыты и не заперты, попытаться запереть
  }
/***Пытается запереть двери при благоприятных условиях***/
  boolean Zakrdv() {                               
    Bounce_DPPA(analogRead(5) > 230);                     //Проверка педали газа с установка флага (U*204.8)
    Bounce_DS(HZ > 15*6/3.6);                             //Проверка датчика скорости на 15 км/ч с установка флага (HZ = V*6/3.6)
    if(DPPA && DS){                                       //Процесс запирание если флаги выставлены
      time_zakr = millis();                               //Поставить засечку времени.
      while(ESW && millis()-time_zakr < 1000){            //Секундная задержка на полное защелкивание замков (если двери закрылись на ходу)
        Bounce_ESW(digitalRead(7));                       //Продолжаем мониторить концевик
        if(!ESW) DPPA = DS = 0;                           //Резет, если двери открылись внезапкно
        return 0; 
      }
      digitalWrite(13, 1);                                //Подать импульс 0,5 сек. на запирание
      delay(500);
      digitalWrite(13, 0);
      DPPA = 0;  DS = 0;                                  //Сброс флагов
      delay(2000);                                        //Подождать запирание дверей (из-за ступенчатой работы активаторов)     
      return 1;
    }
    return 0;
  }
/***Мониторит скорость в реальном времени***/
  void Speed() {                               
    HZ = 1000000/(micros() - TM);                         //Определение частоты датчика скорости
    TM = micros();
  }
/***Проверка дребезга двери двухстороняя***/
  void Bounce_ESW(boolean tmp) {                          //Проверка дребезга концевика в течении 1/4 сек
    if (esw_tmp != tmp){                                  //Если прошла инвертация, то
      bnc_esw = 1;                                        //поднять флаг дребезга,
      esw_tmp = tmp;                                      //запомнить текущее состояние (временный флаг),
      time_esw = millis();                                //поставить засечку времени.
    }
    else
      if (bnc_esw && millis()-time_esw > 250){            //Если прошло больше четверти секунды без инвертаций, то
        bnc_esw = 0;                                      //сбросить флаг дребезга,
        ESW = esw_tmp = tmp;                              //записать значение флага концевика (основное и временное).
      }
  }
/***Проверка дребезга педали газана на стабильный положительный отклик***/
  void Bounce_DPPA (boolean tmp) {                        //Проверка педали газа в течении 1/4 сек.
    if(!tmp){                                             //При отрицательном отклике,                                       
      dppa_tmp = 0;                                       //обнулить временный флаг,
      return;                                             //и выйти.
    }
    if (tmp > dppa_tmp){                                  //Если прошел положительный фронт,
      dppa_tmp = 1;                                       //поднять временный флаг,
      time_dppa = millis();                               //поставить засечку времени.
    }
    else                                                  //Если идут непрерывные положительные отклики,
      if (millis()-time_dppa > 250) DPPA = 1;             //и, если прошло больше четверти секунды, поднять основной флаг.
  }
/***Проверка дребезга датчика скорости на стабильный положительный отклик***/   
  void Bounce_DS (boolean tmp) {                          //Проверка стабильности ДС в течении 1/2 сек.
    if(!tmp){                                             //При отрицательном отклике,
      ds_tmp = 0;                                         //обнулить временный флаг,
      return;                                             //и выйти.
    }
    if (tmp > ds_tmp){                                    //Если прошел положительный фронт,
      ds_tmp = 1;                                         //поднять временный флаг,
      time_ds = millis();                                 //поставить засечку времени.
    }
    else                                                  //Если идут непрерывные положительные отклики,
      if (millis()-time_ds > 500) DS = 1;                 //и, если прошло больше пол секунды, поднять основной флаг.
  }

Получилось конечно длинновато, зато читаемо.
Классами и объектно-ориентированным программированием пользоваться так и не научился. Да и не нужно оно имхо тут. В этом коде только две функции (проверка педали газа и проверка ДС) которые проверяют по одному и тому же алгоритму.

В принципе, логика весьма проста получилась, не смотря на длину.

В loop() непрерывно ведется мониторинг концевика и вызывается функция закрытия.
В функции закрытия непрерывно ведется мониторинг датчиков. И при положительном исходе дает импульс закрытия. И только при импульсе закрытия есть задержи delay() которые останавливают программу на время механических действий.

Самый "мутные" функции - это функция проверки дребезга на концевике, и функции проверки датчиков.

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

С отслеживанием обоих датчиков (датчик педали газа и датчик скорости) я поступил немного иначе. Флаг датчика выставляется только если в течении определенного времени были только положительные сигналы без дребезга. Если произошел дребезг (хотя бы единичный), то флаг не выставляется. Т.е. если вдруг датчик неисправный и/или "шумит", то он не учитывается, и команды на закрытия давать не будет. Этот алгоритм решил применить больше для перестраховки, чем как логически верный. Пусть лучше двери перестанут автоматически запираться, чем останется вероятность ложного закрытия по неверным сигналам.

_________________
"...правильнописание у меня хорошее, но почему-то хромает..."(с)


Вернуться к началу
 Профиль Фотоальбом  
 
 
Не в сети
 Заголовок сообщения: Re: Arduino - кто нибудь с ним работал?
Сообщение Добавлено: 18 янв 2017, 10:15  
Новичок
Новичок

    5
  •  30
  • 39

  •  29 авг 2013, 09:18

Блог: Просмотр записи (0)
добавлю от себя немного, сократить код, где-то в треть, можно использовав достаточно распространенную библиотеку - http://playground.arduino.cc/Code/Bounce, в ней уже все есть по анализу и подавлению дребезга. Соответственно этот код, не нужный для логики уберется за пределы видимости. И пользоваться там вроде как все просто.
И немного такой момент по логике не понятен - допустим с привода закрытия двери (любой, не важно) слетела тяга, в программе постоянно флаг того, что дверь открыта (концевик то говорит что дверь открыта), при этом с хорошим интервалом в 2.5 секунды программа будет пытаться закрыть дверь "дрюкая" мотор. Если все верно я понял, то предлагаю ввести число попыток на закрывание и после определенной прекращать это действо.


Вернуться к началу
 Профиль  
 
 
Не в сети
 Заголовок сообщения: Re: Arduino - кто нибудь с ним работал?
Сообщение Добавлено: 18 янв 2017, 13:03  
Аватара пользователя
Старожил
Старожил

    797
Автор темы
  •  2419
  • 44
  •   3

  •  30 ноя 2006, 16:52

  •  Москва, САО РШН 2016г.в. 120 ткм

Блог: Просмотр записи (0)
Алексей Козлов писал(а):
И немного такой момент по логике не понятен - допустим с привода закрытия двери (любой, не важно) слетела тяга, в программе постоянно флаг того, что дверь открыта (концевик то говорит что дверь открыта)
Пока любая дверь открыта (не важно физически или со слетевшей тягой), т.е. пока на концевике минус (утрировано горит салонный свет) функция закрытия не вызывается. Функция закрытия вызывается только если двери "закрыты" и они "не заперты".
"Запертость" подразумевает программный флаг, а не физический. Т.е. если закрыли двери, замки дернулись, а они реально не заперлись (из-за неисправности актуаторов или другой причите), то программа всеравно считает, что двери "заперлись" по своему флагу LOCK и больше замки дергать не будет, до того времени, пока двери не откроются и снова закроются.

_________________
"...правильнописание у меня хорошее, но почему-то хромает..."(с)


Вернуться к началу
 Профиль Фотоальбом  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 59 ]  На страницу Пред.    След.

 

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3


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

Перейти: