Нужна помощь

Serik_f
Offline
Зарегистрирован: 17.03.2016

Задача такая. Есть три вала, которые вращаются с одинаковой скоростью, примерно 1 об. за 4 с. Нужно разработать программу на базе Arduino, которая б следила за этими валами, и если хоть один из них остановился, то подала сигнал. Сигнал будет сниматься индукционными датчиками, лог 0 за 4 сек.  Можете мне помочь?

vvadim
Offline
Зарегистрирован: 23.05.2012

что за датчики, ссылка есть на них ?

Serik_f
Offline
Зарегистрирован: 17.03.2016
Onkel
Offline
Зарегистрирован: 22.02.2016

Serik_f пишет:

http://www.delexgroup.ru/catalog/datchiki/beskontakt_vykl/lm08/

такого типа.

они от 6 В. Мой мыл ydom cобaкa mail.ru  пишите, сделаем.

Serik_f
Offline
Зарегистрирован: 17.03.2016

Спасибо большое)

Олег М.
Олег М. аватар
Offline
Зарегистрирован: 22.11.2015

Serik_f пишет:
Задача такая. Есть три вала, которые вращаются с одинаковой скоростью, примерно 1 об. за 4 с. Нужно разработать программу на базе Arduino, которая б следила за этими валами, и если хоть один из них остановился, то подала сигнал. Сигнал будет сниматься индукционными датчиками, лог 0 за 4 сек.  Можете мне помочь?

Правильно ли я понял, что если метка прошла и вал остановился, сигнал об остановке появится только через 4 сек? Это не критично, ждать столько времени?

Serik_f
Offline
Зарегистрирован: 17.03.2016

Все правельно, не критично )

Tomasina
Tomasina аватар
Offline
Зарегистрирован: 09.03.2013

Если за 5 сек нет срабатываний от датчиков, мерзко орет пьезодинамик, мигает внешний аварийный индикатор и светодиод на плате. А шобы сразу заметили :)

#define SENSOR1        2     // пин для подключения индуктивного датчика
#define SENSOR2        3     // датчики подключать через резистор 470 Ом
#define SENSOR3        4
#define SENSOR4        5
#define ALARM_LAMP     8     // световая индикация аварии
#define BUZZER         9     // звуковая индикация аварии
#define CHECK_TIME     5000  // интервал проверки датчиков, мсек
#define BEEP_INTERVAL  500   // частота включения сирены, мсек
#define FLASH_INTERVAL 250   // частота включения аварийной лампы, мсек

/*
Питание платы и датчиков от одного блока питания на 12В 2А.
Пример подключения световой сигнализации (12 В лампы или светодиодной ленты):
pighixxx.com/PNG/158.png
Пример подключения пищалки: 
pighixxx.com/PNG/182.png
chipdip.ru/product/hpa24ax/
chipdip.ru/product0/9000208302/
*/

enum {OK, ALARM} Status;     // возможные состояния системы

void setup() 
{
  pinMode(SENSOR1, INPUT_PULLUP);
  pinMode(SENSOR2, INPUT_PULLUP);
  pinMode(SENSOR3, INPUT_PULLUP);
  pinMode(SENSOR4, INPUT_PULLUP);
  pinMode(ALARM_LAMP, OUTPUT);
  pinMode(BUZZER, OUTPUT);
  pinMode(LED_BUILTIN, OUTPUT);
}

void loop() 
{
  checkSensors();
  stateManager();
}


void checkSensors()
{
  static unsigned long timeout;
  static unsigned int shaftCount;          // локальная переменная-счетчик

  // исходим из того, что датчик выдает "0" в состоянии покоя и "1" при срабатывании
  // при вращении вала датчик должен выдать хотя бы один импульс "1" за 5 сек, иначе тревога
  if(!digitalRead(SENSOR1) 
  || !digitalRead(SENSOR2) 
  || !digitalRead(SENSOR3) 
  || !digitalRead(SENSOR4)) shaftCount++;  // записываем импульсы в счетчик

  if(millis() - timeout > CHECK_TIME)      // проверка счетчика раз в 5 сек
  {
    Status = shaftCount > 0 ? OK : ALARM;
    shaftCount = 0;                        // сбрасываем счетчик каждые 5 сек
    timeout = millis();
  }
}


void stateManager() 
{
  switch(Status)
  {
  case OK:
    {
      digitalWrite(ALARM_LAMP, LOW);
      digitalWrite(LED_BUILTIN, LOW);
      digitalWrite(BUZZER, LOW);
      break;
    }
  case ALARM:
    {
      siren();     // мигаем
      flash();     // кричим
      break;
    }
  default:
    {
      digitalWrite(ALARM_LAMP, HIGH);
      digitalWrite(LED_BUILTIN, HIGH);
      digitalWrite(BUZZER, LOW);
      break;
    }
  }
}


void siren()
{
  static unsigned long beepTime;
  if(millis() - beepTime > BEEP_INTERVAL)
  {
    digitalWrite(BUZZER, !digitalRead(BUZZER));
    beepTime = millis();
  }
}

void flash()
{
  static unsigned long flashTime;
  if(millis() - flashTime > FLASH_INTERVAL)
  {
    digitalWrite(ALARM_LAMP, !digitalRead(ALARM_LAMP));
    digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN));
    flashTime = millis();
  }
}

Стоимость оцени сам и скинь на карту Сбербанка или мобильный.

Serik_f
Offline
Зарегистрирован: 17.03.2016

Спасибо большое!!) Дайте свои реквизиты))

 

Tomasina
Tomasina аватар
Offline
Зарегистрирован: 09.03.2013

Небольшие правки алгоритма

/*
Есть три вала, которые вращаются с одинаковой скоростью, примерно 1 об. за 4 с. 
 Нужно разработать программу на базе Arduino, которая б следила за этими валами, и если хоть один из них остановился, 
 то подала сигнал. Сигнал будет сниматься индукционными датчиками, лог 0 за 4 сек.
 */


#define SENSOR1        2     // пин для подключения индуктивного датчика
#define SENSOR2        3     // датчики подключать к пину через резистор 470 Ом
#define SENSOR3        4
#define ALARM_LAMP     8     // световая индикация аварии
#define BUZZER         9     // звуковая индикация аварии
#define CHECK_TIME     5000  // интервал проверки датчиков, мсек
#define BEEP_INTERVAL  500   // частота включения сирены, мсек
#define FLASH_INTERVAL 250   // частота включения аварийной лампы, мсек

/*
Питание платы и датчиков от одного блока питания на 12В 2А.
 Пример подключения световой сигнализации (12 В лампы или светодиодной ленты):
 pighixxx.com/PNG/158.png
 Пример подключения пищалки: 
 pighixxx.com/PNG/182.png
 chipdip.ru/product/hpa24ax/
 chipdip.ru/product0/9000208302/
 */

enum {
  OK, ALARM} 
Status;     // возможные состояния системы

void setup() 
{
  pinMode(SENSOR1, INPUT_PULLUP);
  pinMode(SENSOR2, INPUT_PULLUP);
  pinMode(SENSOR3, INPUT_PULLUP);
  pinMode(ALARM_LAMP, OUTPUT);
  pinMode(BUZZER, OUTPUT);
  pinMode(LED_BUILTIN, OUTPUT);
}

void loop() 
{
  checkSensors();
  stateManager();
}


void checkSensors()
{
  static unsigned long timeout;
  static unsigned int count1;            // счетчик импульсов вала 1
  static unsigned int count2; 
  static unsigned int count3; 

  // исходим из того, что датчик выдает "0" в состоянии покоя и "1" при срабатывании
  // при вращении вала датчик должен выдать хотя бы один импульс "1" за 5 сек, иначе тревога
  count1 = !digitalRead(SENSOR1);        // записываем импульсы в счетчик каждого вала
  count2 = !digitalRead(SENSOR2);
  count3 = !digitalRead(SENSOR3);

  if(millis() - timeout > CHECK_TIME)    // проверка счетчика раз в 5 сек
  {
    if(count1 == 0 || count2 == 0 || count3 == 0) Status = ALARM;
    else Status = OK;
    count1 = 0;                          // сбрасываем счетчики каждые 5 сек
    count2 = 0;
    count3 = 0;
    timeout = millis();
  }
}


void stateManager() 
{
  switch(Status)
  {
  case OK:
    {
      digitalWrite(ALARM_LAMP, LOW);
      digitalWrite(LED_BUILTIN, LOW);
      digitalWrite(BUZZER, LOW);
      break;
    }
  case ALARM:
    {
      siren();
      flash();
      break;
    }
  default:
    {
      digitalWrite(ALARM_LAMP, HIGH);
      digitalWrite(LED_BUILTIN, HIGH);
      digitalWrite(BUZZER, LOW);
      break;
    }
  }
}


void siren()
{
  static unsigned long beepTime;
  if(millis() - beepTime > BEEP_INTERVAL)
  {
    digitalWrite(BUZZER, !digitalRead(BUZZER));
    beepTime = millis();
  }
}

void flash()
{
  static unsigned long flashTime;
  if(millis() - flashTime > FLASH_INTERVAL)
  {
    digitalWrite(ALARM_LAMP, !digitalRead(ALARM_LAMP));
    digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN));
    flashTime = millis();
  }
}

 

Serik_f
Offline
Зарегистрирован: 17.03.2016

Огромное Спасибо, я только начал тестировать))