Инфракрасный барьер - представляет из себя датчик, который состоит из инфракрасного источника света и инфракрасного приемника. При появлении на пути луча препятствия устройство генерирует сигнал, который можно обработать в соответствии с ситуацией.
Такой барьер можно применить, например, для подсчета чего - либо; для предупреждения о появлении какого - либо предмета в контролируемой области.
Устройство я разрабатывал на базе arduino nano v3. Мне понадобились
- Arduino nano v3
- Модуль реле
- Фотодиод
- Фототранзистор
- Обычные светодиоды и резисторы
- Понижающий преобразователь для работы схемы от 24 вольт
Я использовал промышленные светодиод и транзистор, защищенные от влаги и пыли. Но можно использовать и обычные, например, из chipdip.ru
Макет устройства
Итак, сердцем устройства является Arduino nano v3(его китайский клон). К нему подключены IR светодиод(в красном корпусе), IR фототранзистор в желтом, пара индикаторных светодиодов и модуль реле. Логику работы вы сможете посмотреть в видеоролике.
Далее прилагаю проект в easyeda.com, в котором данное устройство представлено в виде конечной печатной платы:
Инфракрасный барьер в easyeda.com
Изначально я предполагал, что для питания схемы от 24 вольт мне будет достаточно более мощного стабилизатора напряжения на 5 вольт. Я заменил родной AMS1117-5.0 на более мощный L78M05ABDT-TR.
Эта замена была напрасной, и в процессе работы этот стабилизатор тоже сильно грелся. Поэтому для работы схемы добавил понижающий преобразователь на входе питания.
Вот несколько фотографий устройства
Скетч для устройства
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 |
int count; // количество замеров для обнаружения отсутствия сигналов. int threshold;// порог срабатывания int informCount; //глобальная переменная для счетчика замеров. int val; void setup() { // put your setup code here, to run once: // TCCR1B = TCCR1B & 0b11111000 | 0x01; Serial.begin(9600); // Задаем скорость обмена com-порта 9600 pinMode(10, OUTPUT);//infrared transistor pinMode(A5, INPUT);//signal pinMode(9, OUTPUT);//infrared diode pinMode(8, OUTPUT);//relay pinMode(3, OUTPUT);//power diode pinMode(4, OUTPUT);//signal diode count = 600; threshold = 920; informCount = 0; digitalWrite(3, HIGH); digitalWrite(10,HIGH); } void loop() { informCount++; digitalWrite(9,HIGH); //delayMicroseconds(20); val = analogRead(A5); digitalWrite(9,LOW); delay(5); if (informCount==50) { Serial.print("Signal = "); Serial.print(val); Serial.print("\n"); informCount = 0; } if (val<threshold) //есть сигнал { digitalWrite(8,HIGH); digitalWrite(4, HIGH); } else //сигнал пропадает { for (int i=0;i<count;i++) // делаем дополнительные замеры { informCount++; digitalWrite(9,HIGH); //delayMicroseconds(100); val = analogRead(A5); digitalWrite(9,LOW); delay(5); if (informCount==50) { Serial.print("Signal = "); Serial.print(val); Serial.print("\n"); informCount = 0; } if (val<threshold) //сигнал появился { digitalWrite(8,HIGH); digitalWrite(4, HIGH); break; } } if (val>=threshold) //нет сигнала { digitalWrite(8,LOW); digitalWrite(4, LOW); //delay(10);//ждем 7 секунд } } } |