Обработка разных сигналов.

Jek
Offline
Зарегистрирован: 05.01.2014

Подскажите пожалуйста решение следующей задачи...

Есть датчик, в зависимости от модели, при сработке с него приходит или сигнал "земля" или "+12В". Этот сигнал надо отслеживать на одном пине ардуины. Установка типа сигнала датчика производится один раз при установке устройства на объект, т. е. можно допустим джампер переставить или залить новый скетч.

Как эту задачу решить программным или железным способом?

leshak
Offline
Зарегистрирован: 29.09.2011

Для начала вам нужно согласовать +12 и +5. Иначе выпалите пин.

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

Програмно:

boolean state=digitalRead(PIN_NO); // для "прямого датчика"
boolean state=!digitalRead(PIN_NO); // для "инвертированного"

 

leshak
Offline
Зарегистрирован: 29.09.2011

Если вы датчик "ловите" по прерыванию, через attachInterrupt(interrupt, function, mode) | Аппаратная платформа Arduino

То mode выставляете в RISING для прямого, и в FALLING для инвертированного.

leshak
Offline
Зарегистрирован: 29.09.2011

Вообщем я бы сделал как-то так:

#define JMP_PIN 8//  джампер определяющий тип датчика. Если D8 замкнут на землю "датчик инвертирован", если нет то "прямой"

volatile boolean detected=false; // флаг указывающий сработал ли датчик
void setup(){
  Serial.begin(57600);
  digitalWrite(JMP_PIN,HIGH);// включили подтяжку на джампере
  
  delay(10); // чуток подождем, возможно и без этой строки будет работать
  bool jmpState=digitalRead(JMP_PIN);
  
  byte aMode;
  if(jmpState){
     Serial.println("Ready DIRECT");
     aMode=RISING;
  } else {
     Serial.println("Ready INVERT");
      aMode=FALLING;
  }
  
  attachInterrupt(0,handler,aMode); // на D2 у нас висит датчик

}

void loop(){
  if(detected){
    Serial.print(millis()); // вывели время
    Serial.println(":   DETECTED");
    detected=false; // сбросили флаг, опять слушаем дачик
  }
}


void handler(){
    if(detected)return; // пока не обработали прошлую "сработку", все остальное игнорим
    detected=true;// выставили флаг "сработка".
}

На D8 висит джампер (коротит ногу на землю когда "надет"), на D2 датчик.

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

P.S. Но не забудте, что +12V на пин подавать нельзя.

Jek
Offline
Зарегистрирован: 05.01.2014

Благодарю за ответы.

Уточню немножко....

Изначально схему я собрал исходя из того, что датчик или постоянно подает +12 или 0. Т. е. через резистивный делитель подал на пин этот сигнал. А оказалось, что датчик дает или +12 или "землю". В итоге +12 я могу отследить, а вот "землю" нет. 

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

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

Jek пишет:

Изначально схему я собрал исходя из того, что датчик или постоянно подает +12 или 0. Т. е. через резистивный делитель подал на пин этот сигнал. А оказалось, что датчик дает или +12 или "землю". В итоге +12 я могу

А какая разница в вашем понимании между нулём и землёй? :)

Вообще, если уровня всего два, то если там не 12 вольт, значит там ноль.  Но уровня может быть и три, правда сомневаюсь, что ваш датчик переключается в высокоимпендансное состояние... но если это вдруг так, то выход тоже есть.

Jek
Offline
Зарегистрирован: 05.01.2014

dimax пишет:

А какая разница в вашем понимании между нулём и землёй? :)

Вообще, если уровня всего два, то если там не 12 вольт, значит там ноль.  Но уровня может быть и три, правда сомневаюсь, что ваш датчик переключается в высокоимпендансное состояние... но если это вдруг так, то выход тоже есть.

Ноль был написан именно цифрой, т. е. нет напряжения.

А датчик выдает или +12В или "землю", т. е. когда нет сработки выход датчика висит в воздухе и в том и в другом случае.

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

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

Jek, если второе состояние -висит в воздухе, то это никак не земля, это можно приравнять к Z состоянию. Что-то прояснилось. Итого имеем два вида датчиков, с двумя состояниями. У одного +12 и 0, у второго +12 и Z. Объясните, зачем нужно детектировать Z состояние?  Вам же нужно снять одно из двух  возможных состояний, следовательно если там не 12 то там либо ноль либо Z.

leshak
Offline
Зарегистрирован: 29.09.2011

> У одного +12 и 0, у второго +12 и Z. 

А я понял как +12 и Z, у второго +0 и Z. 

Jek
Offline
Зарегистрирован: 05.01.2014

...

inspiritus
Offline
Зарегистрирован: 17.12.2012

Есть такая радиодеталь, стабилитрон называется :) это по поводу 12в.

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

Jek
Offline
Зарегистрирован: 05.01.2014

Блин... запутали совсем....

В общем, одна модель датчика дает плюс аккумулятора авто при сработке и Z обычное состояние, другой минус аккумулятора авто и Z обычное состояние.

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

Jek, ясно. Условно можно считать, что у вас  задано 3 состояния. +12, Z, 0.  Задание усложняется тем, что нужно делить входное напряжение до 5 вольт. Как только мы его уменьшим Z сразу же превратится в 0, но я  подумаю как можно обойти, интересно даже..

leshak
Offline
Зарегистрирован: 29.09.2011

Значит все сводится нужно различать Z-состояние и НЕ-Z-состояние.

Мне, правда смутно, видится это как-то так.

Соденияем два цифровых пина резистором на 10K. Скажем D5 и D6

дальше как-то так:

setup(){
  pinMode(D5,OUTPUT);
  pinMode(D6,INPUT);
  ......
}

void loop(){
   if(!isZState()){
     Serial.println("NO-Z detected");
   }
   delay(500);
}

bool isZState(){
  digitalWrite(D5,HIGH);
  if(digitalRead(D6)!=HIGH)return false;
  
  digitalWrite(D5,LOW);
  if(digitalRead(D6)!=LOW)return false;

  return true;
}

Вообщем если состояние D6 меняется синхронно с D5, значит к нему подведено Z-состояние (или он вообще никуда не подключен). А если D5 меняется, а D6 - стоит на месте - значит на него подается что-то "снаружи".

Вот правда, не могу согласование с помощью делителя, тут будет явно "не в дугу". А как согласовать, что-бы не нарушить "логику" - что-то не соображу. Ну или номиналы делителя должны быть существенно меньше резистора соединяющего D5,D6. Что-бы в любом случае "пересилить его". Но если сделать их слишком малыми, то грется будут. Хотя если датчик кратковременно срабатывает - то и пофиг.

Вообщем главная "прелесть", в том что не нужно ничего настраивать переключать. Работать, по идее должно с обоими типами датчиков.

Jek
Offline
Зарегистрирован: 05.01.2014

Может так и выйдет, но датчиков четыре и пинов свободных нет....

И есть одно важное условие: модель датчика, т. е. какой сигнал идет с него, задается один раз при установке устройства на авто.

leshak
Offline
Зарегистрирован: 29.09.2011

Или, возможно даже одним пином обойтись.

Но подключаем как-то так:

D6 --> R220  ---|--->  Делитель с большими номиналми резисторов
                  ---|---> Конденсатор->GND

         

И работаем по такой логике:

1. Включаем D6 на выход. И даем на него HIGH (заряжаем конденсатор)
2. Переключаем D6 на вход (прекращаем зарядку)
3. Делаем небольшую паузу (подбираем ее в зависимости от номинала кондера и делителя)
4.Делаем замер на D6, если на нем LOW (конденсатор разрядился) - значит у нас от датчика пришло GND. Дальше можно не идти.
5. Включаем D6 на выход и даем на него LOW (разряжаем конденсатор).
6. Переключаем на ход.
7. Делаем паузу.
8. Читаем D6, если там HIGH (конденсатор сам зарядился) - значит от датчика пришло +12v. Дальше можон не идти.
9. Если добрались сюда - значит на датчике Z состояние.

    

Jek
Offline
Зарегистрирован: 05.01.2014

Я пока вижу только такое решение, но оно слишком громоздко....

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

Jek
Offline
Зарегистрирован: 05.01.2014

leshak пишет:

Или, возможно даже одним пином обойтись.

Идея хорошая и я думаю работоспособная, но получится слишком малая частота опроса датчиков.

leshak
Offline
Зарегистрирован: 29.09.2011

Jek пишет:

leshak пишет:

Или, возможно даже одним пином обойтись.

Идея хорошая и я думаю работоспособная, но получится слишком малая частота опроса датчиков.

Ну тут уже зависит от того какие номиналы подберете. Кондер-то можно и не очень емкий поставить. Подогнать время его заряда/разряда до уровня милли или даже микросекунд.

leshak
Offline
Зарегистрирован: 29.09.2011

Jek пишет:

Может так и выйдет, но датчиков четыре и пинов свободных нет....

Ну вместо выходного пина, можно какой-то генератор сигналов железный сделать (гуглим "555 генератор импульсов")

Потом берем компаратор, для каждого датчика... на один вход заводим сигнал с генератора, на другой с резистора. Ну и входе компаратора коротим между собой резистором (как было с схеме с двумя пинами).

В результате, на выходе компаратора будем иметь четкую HIGH, когда датчик в Z-состоянии, и "пульсации", когда датчик к 12v или 0v выдал.

Jek
Offline
Зарегистрирован: 05.01.2014

leshak пишет:

Ну вместо выходного пина, можно какой-то генератор сигналов железный сделать (гуглим "555 генератор импульсов")

 

Опторазвяка с двумя джамперами по-любому меньше выйдет....

А размер имеет первостепенное значение.

leshak
Offline
Зарегистрирован: 29.09.2011

Ну и еще вариант.

Берем два делителя. Один делит датчик. Второй делит 5v с дуины. Соединяем центры делителей. Делить "дуины" имеет номиналы резисторов существенно больше чем делитель датчиков.

Ну а дальше мерем что у нас получилось с помощью analogRead

Если там

~512- значит датчик в Z состоянии
~0 - датчик включился к нулю
~1024 - датчик включился к 12V

 

 

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

Так, товарищи, вот и моё решение подоспело. Если в чём стормозил сильно не ругайте, уже голова совсем устала думать :)

Пин нужен один, но аналоговый. Полная шкала 15 вольт, можно заодно напряжение измерять. И так, разбираем схему. Даём на вход Z (то есть ничего). Вольтдобавочная цепочка поддаёт  напруги на вход, и имеем измеренное напряжение +5 вольт. Даём на вход +12 вольт, наша вольтдобавка тут  никак не влияет, и имеем измеренное +12 вольт. Даём на вход 0 вольт - то есть ядрёный нуль, он подкорачивает нашу вольтдобавку, и имеем измеренное 0 вольт. Получаем  итоговые 3 состояния :)

 

Jek
Offline
Зарегистрирован: 05.01.2014

Схема интересная.

У меня сейчас сделано также, только без подпитки и вместо 20к - 33к стоит, ну и вход цифровой. Т.е. мне в схему нужно добавить схему подпитки и к аналоговому пину переключить.

Завтра попробую смоделировать, по результатам отпишусь.

leshak
Offline
Зарегистрирован: 29.09.2011

2Dimax:

Ну тоже вариант. Похож на идею из #21, только вместо двух резисторов, диод и резистор.

Но согласен.Ваш вариант как-то "безопастней выглядит". И номиналы можно подбирать "более наплевательски" чем в моем варианте.

 

Jek
Offline
Зарегистрирован: 05.01.2014

Да и ещё надо токи посчитать... В датчиках ведь транзисторы какие-то стоят.

leshak
Offline
Зарегистрирован: 29.09.2011

В #21 я нечто подобное имел ввиду

 

Jek пишет:

Да и ещё надо токи посчитать... В датчиках ведь транзисторы какие-то стоят.

Да что там считать? По крайней мере в варианте dimax.

Самый большой ток, возможно при входе с датчика 12.

I=U/R, R=20K+10K

I=12/30000=0,0004A=0,4mA что "большим током" назвать трудно. Светодиод поджечь не хватит.

P.S. Но все эти согласования "на делителях", они "стремные". Если случай нижний резистор перегорит, оторвется - получите 12V на входе дуины :(

leshak
Offline
Зарегистрирован: 29.09.2011

>В #21 я нечто подобное имел ввиду

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

После чего получится схема в точности та же самая которую предложил Dimax :)

Jek
Offline
Зарегистрирован: 05.01.2014

dimax пишет:

Так, товарищи, вот и моё решение подоспело. Если в чём стормозил сильно не ругайте, уже голова совсем устала думать :)

Большое спасибо, всё работает.

Параметры получились следующие:

при Z - 1.46 В, при 0 - 0 (4.3 мА), при 12 - 4.15 В (0.4 мА)