Датчик проходов на arduino

Датчик проходов на arduino

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

Датчик проходов представляет собой устройство состоящее из двух частей — приемника и источника излучения. Счет и запись данных осуществляется с помощью arduino nano. В качестве приемника используется модуль фоторезистора, выполненный на основе микросхемы LM393. Данные будут передаваться по аналоговому выходу модуля.

Фоторезистор должен находится в специальном затемненном корпусе, чтобы исключить возможность срабатывания счетчика от посторонних источников света. Источник излучения представляет собой простейший лазерный диод. В данном устройстве был использован лазер от простой лазерной указки.

Наличие лазера дает преимущество в расстоянии и стабильности по сравнению с инфракрасными светодиодами.Так же в данном устройстве имеется индикатор — 7 — сегментный 4 — разрядный индикатор под управлением драйвера TM1637. Для осуществления сброса используются 2 кнопки без фиксации. Сброс происходит только после ввода пароля.

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

Кнопка сброса и ввода пароля подключены через 10 кОм резистор. Arduino, модуль фоторезистора и индикатор питаются от 5 вольтовой линии, можно использовать вывод +5v от arduino. Сам arduino может питаться от внешнего блока питания (7-12 вольт) используя пин Vin, по usb или пин +5v.

Программа

Принцип работы программы прост. Лазер постоянно светит на фоторезистор. Программа каждый раз получает значение с фоторезистора 0-1023. Во время излучения лазера показание с фоторезистора не превышает 50, когда некий объект перекрывает луч лазера то его показание превышает пороговое значение в 50.

Когда значение превысит порог в 50 программа подождет 500 мили секунд (достаточное для того,чтобы человек прошел) затем снова опрашивает датчик и если значение снова менее 50 значит человек прошел иначе будет ждать пока человек не пройдет если вдруг он встал на месте.

Зажав кнопку в течении 3 секунд начать сброс программа перейдет в режим сброс пароля на индикаторе будет отображаться вводимый с кнопки ввод цифровое значение (повторное нажатие увеличивает значение кода на +1). Без особого труда можно ввести 2-х значный пароль сброса.

 В программе используется энергонезависимая память eeprom в которую записывается значение счетчика. Перед началом работы программа обращается к памяти извлекает и выводит на дисплей последнее сохраненное значение счетчика (самое большое). Чтобы увеличить ресурс данного устройства ограниченную в циклах записи память используем с максимальной эффективностью.

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

Устройство размещается внутри двух корпусов размерами 45x65x20мм. В готовых купленных корпусах были сделаны прорези для кнопок и индикатора, а также usb 

Внутри второго корпуса был расположен драйвер питания со стабилизаторами 5 и 3.3 вольт куда был интегрирован лазерный диод. Данный драйвер питает arduino по usb используя внешний источник питания 12 v

Фото готового устройства и тестирование

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

Список радиоэлементов

Скачать список элементов (PDF)

Прикрепленные файлы:

Источник: http://cxem.net/arduino/arduino181.php

Arduino. О датчиках. Часть 1. Движение, объем или присутствие?

Информация не является исключительной для применения с Arduino.

О датчиках движения и присутствия говорят всегда, когда речь заходит об автоматизации и охранных системах. А еще их называют датчиками объема.

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

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

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

Этого материала в Сети предостаточно. Моя цель — ясно показать разницу между ними. Итак…


Инфракрасный датчик движения (infrared motion sensor) является именно датчиком движения, не больше, не меньше. И хотя в Интернете их постоянно называют и датчиками объема и датчиками присутствия, поверьте, это не так.

Это типичные датчики регистрации движения и только так. Принцип их действия позволяет довольно грубо реагировать на движение любого объекта с тепловым контрастом. Датчик не будет срабатывать, если движение не будет достаточно значимым. Проход мимо него или взмах рукой в зоне действия датчика — это тот минимум, при котором будет зарегистрировано движение.

Если объект становится неподвижным, датчик его «теряет».

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

В этом случае нужен датчик, который будет как бы «чувствовать» объект, находящийся в зоне регистрации, например, ультразвуковой.


Ультразвуковой датчик присутствия (ultrasonic sensor) именно то, что нужно в туалете типа «сортир»… 🙂 Но на простой регистрации нахождения объекта в зоне действия он не ограничивается. При необходимости, можно определить не только присутствие объекта, но и расстояние до него. Аппарат в общем-то несложен, но если требуется контролировать зону с радиусом более 6 метров, становится не очень дешевым удовольствием.

Тем не менее, ультразвуковой датчик незаменим в условиях ограничения подконтрольного объема, например, стеклянными перегородками. Он исправно будет контролировать зону только в пределах стеклянных перегородок или перегородок другого типа. Пример — салон автомобиля. Собственно, во многих автоохранных системах именно ультразвуковые датчики и используются.

Объемный датчик присутствия был первым устройством обсуждаемого здесь типа, которое я в своей жизни увидел. Точнее, я увидел не датчик, а электронную схему устройства автоматического управления включением освещения в журнале «Радио» в уже далеких 80-х годах 20-го века.

Это есть настоящий «правильный» датчик присутствия, потому что именно присутствие объекта вносит возмущение в электромагнитное поле, которое и «прослушивается» датчиком… Нет, неверно. Пожалуй, прослушивает подконтрольную зону (буквально) ультразвуковой датчик.

Объемный же как бы «осязает» электромагнитный эфир в помещении, которое поставлено под его контроль.

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

Микроволновой датчик (microwave)…

движения или присутствия? По большому счету, это все-таки чистый датчик движения. Однако он может регистрировать очень незначительные двигательные процессы, например, мимику лица человека. А еще ему нипочем стекло и тонкие перегородки.

А еще у него радиус контролируемой зоны может быть до 360 градусов. Вот и информация к размышлению…

При всех своих уникальных способностях эти датчики имеют вполне приемлемую цену, хотя и несколько дороже инфракрасных.

Что касается Arduino, я без особого труда нашел для применения с ним датчики инфракрасные и ультразвуковые.

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

Источник: http://sf-smarts.blogspot.com/2013/11/arduino-1.html

37 в 1. Hабор датчиков и индикаторов для Arduino

Сегодня на обзор будет набор сенсоров для Arduino. Обычно его называют 37 in 1 Sensors Kit for Arduino. У разных продавцов он бывает в виде кулечка с датчиками и плохонькой фотокопией инфолиста или набор подороже, в пластиковом боксе с ячейками под каждый датчик, нормально отпечатанным инфолистом и датчики собраны качественней чем в дешёвом наборе.

В моем случае набор в пластиковом боксе.Бокс из хорошего пластика, заусенцев от литья нет. Горизонтальные перемычки можно вынуть и получить отделения побольше.Датчики спаяны хорошо, следов флюса не наблюдается.Платы датчиков из стеклотекстолита. Все имеют штырьквые разъемы для подключения.

  • Датчик температуры KY-001
  • Вибровыключатель KY-002
  • Магнитный датчик KY-003
  • Кнопка KY-004
  • Датчик инфракрасного излучения KY-005
  • Пассивный зуммер KY-006
  • Лазерный модуль KY-008
  • Трехцветный светодиод KY-009
  • Датчик с оптическим прерывателем KY-010
  • Трехцветный светодиод KY-011
  • Активный зуммер KY-012
  • Датчик температуры KY-013
  • Датчик температуры и влажности KY-015
  • Трехцветный светодиод KY-016
  • Датчик наклона KY-017
  • Фоторезистор KY-018
  • Реле KY-019
  • Датчик наклона KY-020
  • Геркон KY-021
  • Инфракрасный датчик KY-022
  • Джойстик KY-023
  • Датчик магнитного поля KY-024
  • Датчик магнитного поля KY-025
  • Датчик пламени KY-026
  • Модуль световых эффектов «магическая чашка» KY-027
  • Датчик температуры KY-028
  • Двухцветный светодиод KY-029
  • Датчик удара KY-031
  • Датчик для избегания препятствий KY-032
  • Датчик магнитного поля KY-033
  • Семицветный светодиод KY-034
  • Магнитный датчик KY-035
  • Датчик металла KY-036
  • Датчик звука KY-037
  • Датчика звука KY-038
  • Датчик сердцебиения KY-039
  • Датчик угла поворота (энкодер) KY-040

Каждый использует датчики под свои нужды. Однако примеров использования, как и внятной документации в комплекте не идет, поэтому я напишу краткую информацию на каждый датчик и пример кода. Всю информацию нашел в сети. На ютубе по коду датчика можно найти пример его использования. У китайцев каждый датчик имеет свой код(более – менее общепринятый). Собран на цифровом сенсоре DS18B20, напряжение питания от 3.0 V до 5.5 V. Измеряемая температура -55 ° C до +125 ° C, по Фаренгейту — 67 ° F до 257 ° F. В диапазоне от -10 °C до +85 ° C точность измерения ± 0.5 ° C. Время измерения не более 750 миллисекунд. Каждый DS18B20 имеет уникальный номер, что позволяет подключить к одной шине большое количество датчиков

Подключение (слева направо)

GND +5V S = Signal, в примере подключаем к 10 выводу arduino#include OneWire ds(10); // датчик на 10 выводе void setup(void) { Serial.begin(9600); } void loop(void) { //For conversion of raw data to C int HighByte, LowByte, TReading, SignBit, Tc_100, Whole, Fract; byte i; byte present = 0; byte data[12]; byte addr[8]; // ищем устройства, подключенные к шине if ( !ds.search(addr)) { Serial.print(«No more addresses.
»); ds.reset_search(); return; } Serial.print(«R=»); for( i = 0; i < 8; i++) { Serial.print(addr[i], HEX); Serial.print(" "); } if ( OneWire::crc8( addr, 7) != addr[7]) { Serial.print(«CRC is not valid! »); return; } if ( addr[0] == 0x10) { Serial.print(«найдено DS18S20. »); } else if ( addr[0] == 0x28) { Serial.print(«Найдено DS18B20. »); } else { Serial.print(«Устройство не опознано: 0x»); Serial.println(addr[0],HEX); return; } ds.reset(); ds.select(addr); ds.write(0x44,1); // запрос данных delay(1000); // 750ms по документации время получения температуры present = ds.reset(); ds.select(addr); ds.write(0xBE); // читаем данные Serial.print(«P=»); Serial.print(present,HEX); Serial.print(" "); for ( i = 0; i < 9; i++) { // получаем 9 байт data[i] = ds.read(); Serial.print(data[i], HEX); Serial.print(" "); } Serial.print(" CRC="); Serial.print( OneWire::crc8( data, 8), HEX); Serial.println(); //преобразуем полученные данные в температуру LowByte = data[0]; HighByte = data[1]; TReading = (HighByte S пин “KY-012″ — активный звуковой модуль представляет собой печатную плату с 5-вольтовым звуковым излучателем (для включения звука нужно просто подать питание 5 В) Подключение к выводам S и -. На моем модуле перепутана полярность подключения На выходе – напряжение, пропорциональное температуре. На плате термистор и резистор делителя. сенсор NTC термистор измеряет: -55°C / +125°C точность: + / — 0.5°C

Подключение (слева направо)

GND +5В S#include int sensorPin = A5; // подключаем датчик на аналоговый вход double Thermistor(int RawADC) { double Temp; Temp = log(10000.0*((1024.0/RawADC-1))); Temp = 1 / (0.001129148 + (0.000234125 + (0.0000000876741 * Temp * Temp ))* Temp ); Temp = Temp — 273.15; // преобразуем Кельвин в Цельсий return Temp; } void setup() { Serial.begin(9600); } void loop() { int readVal=analogRead(sensorPin); double temp = Thermistor(readVal); Serial.println(temp); // выводим температуру delay(500); }Характеристики: напряжение питания, В: 3.3…5 выход: цифровой диапазон измерения влажности, % RH:  20-90 диапазон измерения температуры, ℃: 0…50 точность измерения влажности, % RH: + / – 5 точность измерения температуры, ℃: + / – 2 разрешающая способность при измерении влажности, % RH: 1 разрешающая способность при измерении температуры, ℃: 1 долгосрочная стабильность, % RH / год: < ± 1

подключение

левый пин S —> к выводу 10 ардуино Правый пин GND Средний пин +5

Для работы используется библиотека DHTLib, почитать о ней можно тут http://playground.arduino.cc/Main/DHTLib

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

Ограничительные резисторы установлены на плате.

Подключение: R – плюс 5 В (красный) G -плюс 5 В (зеленый) B – плюс 5 В (синий) GND – общий источника питания

KY-017 переключатель срабатывающий в зависимости от наклона

Ртутный. На плате присутствуют помимо датчика резистор и светодиод Работаем как с обычной кнопкой

Подключение (слева направо)

GND 5+ Выход S на плате светодиод, при замкнутых контактах горит красным фоторезистор (датчик освещенности), который применяется для измерения интенсивности света или определения его наличия/отсутствия. При отсутствии света сопротивление фоторезистора большое и доходит до 1 мОм, а при его освещении падает до нескольких Ом. между «S»  и +5 В впаян резистор 10 кОм, что вместе с самим фоторезистором образует делитель напряжения, который удобно подключить к аналоговому входу Arduino.

Подключение (слева направо)

+5в S – выход GND int sensorPin = A5; // вход для подкл фоторезистора int ledPin = 13; // светодиод int sensorValue = 0; // переменная для значения сенсора void setup() { pinMode(ledPin, OUTPUT); Serial.begin(9600); } void loop() { sensorValue = analogRead(sensorPin); digitalWrite(ledPin, HIGH); delay(sensorValue); digitalWrite(ledPin, LOW); delay(sensorValue); Serial.println(sensorValue, DEC); }Используется для коммутации нагрузки с большим напряжением или током. Например лампы

Коммутируемая нагрузка

Переменного тока 10А 250 В 10 А 125В Постоянного тока 10А 30В 10А 28В На плате распаян транзистор, защитный диод и светодиод, показывающий срабатывание реле.

Подключение (слева направо)

S управляющий сигнал с ардуино +5в — GND int relay = 10; // подключение реле void setup () { pinMode (relay, OUTPUT); } void loop () { digitalWrite (relay, HIGH); // включить реле delay (1000); digitalWrite (relay, LOW); // выключить реле delay (1000); }переключатель срабатывающий от наклона модуля, имеющий цифровой интерфейс.  При наклоне датчика в одну сторону контакты  “-”  и “S” замыкаются, при наклоне в другую размыкаются.  Модуль позволяет определять только 2 положения и не измеряет угол наклона. Между контактами “+5В”  и “S” впаян резистор 10 кОм. Контакт, срабатывающий при поднесении к нему магнита. Напаян подтягивающий резистор. Подключаем к контактам + и – питание, средний вывод – выход кнопки. Работаем как с обычной кнопкой. Модуль  предназначен для приема данных по инфракрасному каналу от пультов управления. На плате имеется светодиод с токоограничивающим резистором 1 кОм, которые включены между контактами +5 и “S”.
Технические характеристики: несущая частота: 38 кГц дистанция приема от обычного пульта: 18-20 м угол приема: 90 градусов напряжение питания постоянного тока: 2,7-5,5 В

Подключение (слева направо)

— GND +5V S выход приемника

Применение:

управление устройствами в доме через пульт по ИК каналу#include int RECV_PIN = 11; IRrecv irrecv(RECV_PIN); decode_results results; void setup() { Serial.begin(9600); irrecv.enableIRIn(); // начинаем прием } void loop() { if (irrecv.decode(&results)) { Serial.println(results.value, HEX); irrecv.

resume(); // принимаем следующее значение } }Двухосевой аналоговый джойстик с кнопкой
Подключение (слева направо) GND – общий провод +5V – “+5 В” питания VRx  – аналоговый выход потенциометра оси X VRy – аналоговый выход потенциометра оси Y SW – цифровой выход кнопки int JoyStick_X = A0; // x int JoyStick_Y = A1; // y int JoyStick_Z = 3; // кнопка void setup () { pinMode (JoyStick_X, INPUT); pinMode (JoyStick_Y, INPUT); pinMode (JoyStick_Z, INPUT_PULLUP); Serial.begin (9600); // 9600 bps } void loop () { int x, y, z; x = analogRead (JoyStick_X); y = analogRead (JoyStick_Y); z = digitalRead (JoyStick_Z); Serial.print (x, DEC); Serial.print («,»); Serial.print (y, DEC); Serial.print («,»); Serial.println (z, DEC); delay (100); }
Датчик имеет и цифровой и аналоговый выходы. На плате светодиод, который загорается при детектировании магнитного поля.

Подключение (слева направо)

AO аналоговый выход GND +5 DO цифровой выход красный светодиод на плате при замыкании загорается в отличие от модуля с простым герконом у этой платы 4 вывода, на борту есть компаратор и светодиод.

Подключение (слева направо)

AO аналоговый выход – можно подключать к аналоговому входу ардуино GND +5 DO – цифровой выход. датчик пламени реагирует на инфракрасное излучение и наиболее чувствителен к длинам волн от 760 нм до 1100 нм. Этот модуль имеет два выхода – цифровой и аналоговый. На плате имеется 2 светодиода – индикации питания и индикации выхода с компаратора. Построечным резистором можно изменять чувствительность датчика.
Подключение (слева направо) AO аналоговый вход GND 5V D0 цифровой выход int Led = 13 ;// светодиод int buttonpin = 10; // цифровой вход int analogin = A3; // аналоговый вход int val ;// float sensor; //значение датчика void setup () { pinMode (Led, OUTPUT) ; pinMode (buttonpin, INPUT) ; pinMode (analogin, INPUT) ; Serial.begin(9600); } void loop () { sensor = analogRead(analogin); Serial.println(sensor); // данные с датчика val = digitalRead (buttonpin) ; if (val == HIGH) // если сработал датчик { digitalWrite (Led, HIGH); } else { digitalWrite (Led, LOW); } delay(1000); } Подключение (слева направо) GND +5 S Светодиод Напряжение: G :2.3-2 .6 V; R :1.9-2 .2 V Ток 20мА На моей плате распаян резистор и зачем-то smd светодиод подключение через токоограничительные резисторы

Подключение (слева направо)

GND 330 Ohm —> S пин 330 Ohm —> средний пин Работаем как с обычным светодиодом (управление по двум выводам для красного и зеленого) Работает очень просто – при ударах(сотрясении) замыкается контакт.
Подключение (слева направо) +5 Средний – выход — земля Между +5 и выходом впаян резистор Работаем как с кнопкой. На модуле установлен инфракрасный передатчик и приемник. Эффективная дистанция срабатывания 2 ~ 40cm, рабочее напряжение 3.3V-5V. Есть подстроечные резисторы, позволяют выставить дистанцию. При срабатывании на плате загорается светодиод. Модуль имеет маркировку IR-08H Выход – логический Угол обнаружения : 35 °

Подключение (слева направо)

EN Второй пин +5 Третий сигнал Четвертый- земля Используем аналогично кнопки Этот модуль имеет два выхода – цифровой и аналоговый. На плате имеется 2 светодиода – индикации питания и индикации выхода с компаратора. Построечным резистором можно изменять чувствительность датчика
Подключение (слева направо) AO аналоговій вход GND 5V D0 цифровой выход int Led = 13 ;// светодиод int buttonpin = 10; // цифровой вход int analogin = A3; // аналоговый вход int val ;// float sensor; //значение датчика void setup () { pinMode (Led, OUTPUT) ; pinMode (buttonpin, INPUT) ; pinMode (analogin, INPUT) ; Serial.begin(9600); } void loop () { sensor = analogRead(analogin); Serial.println(sensor); // данные с датчика val = digitalRead (buttonpin) ; if (val == HIGH) // если сработал датчик { digitalWrite (Led, HIGH); } else { digitalWrite (Led, LOW); } delay(1000); } При приближении препятствия срабатывает датчик, на выходе 1 и загорается светодиод на плате
Подключение (слева направо) пин — = GND средний пин OUT +5v На плате напаян токоограничительный резистор. Работаем как с обычным светодиодом На выходе аналоговый сигнал, пропорциональный напряженности магнитного поля
Подключение (слева направо) пин — = GND средний пин +5 V пин S –выходной сигнал, в примере подключаем Arduino пин A5 int sensorPin = A5; // подключаем датчик к 5 аналоговому входу int ledPin = 13; // светодиод int sensorValue = 0; // данные с датчика void setup () { pinMode (ledPin, OUTPUT); Serial.begin (9600); } void loop () { sensorValue = analogRead (sensorPin); digitalWrite (ledPin, HIGH); delay (100); digitalWrite (ledPin, LOW); delay (100); Serial.println (sensorValue, DEC);//выводим данные с датчика } сенсорный модуль имеет металлический контакт для определения касания человека. На плате два светодиода – питание и срабатывание датчика

Подключение (слева направо)

AO GND +5V

DO

int sensorPin = A5; // подключаем датчик к 5 аналоговому входу int ledPin = 13; // светодиод int sensorValue = 0; // данные с датчика void setup () { pinMode (ledPin, OUTPUT); Serial.begin (9600); } void loop () { sensorValue = analogRead (sensorPin); digitalWrite (ledPin, HIGH); delay (100); digitalWrite (ledPin, LOW); delay (100); Serial.println (sensorValue, DEC);//выводим данные с датчика }Плата с большим микрофоном, имеет 2 выхода: цифровой и аналоговый AO, аналоговый выход – сигнал напрямую с микрофона DO, цифровой выход – при превышении порога срабатывания на выходе 1. Чувствительность срабатывания регулируется подстроечным Резистором На плате два светодиода – один при подаче питания, второй при срабатывании цифрового выхода

Подключение (слева направо)

AO GND +5V DO

Работа с цифровым выходом

int Led = 13 ;// светодиод int buttonpin = 10; // цифровой выход микрофона void setup () { pinMode (Led, OUTPUT) ; pinMode (buttonpin, INPUT) ; } void loop () { val = digitalRead(buttonpin);// читаем цифровой выход if (val == HIGH) // Если сработал цифровой выход { digitalWrite (Led, HIGH); } else { digitalWrite (Led, LOW); } } Работа с аналоговым выходом int sensorPin = A0; // подключаем аналоговый выход int ledPin = 13; // подключаем светодиод int sensorValue = 0; // амплитуда звука void setup () { pinMode (ledPin, OUTPUT); Serial.begin (9600); } void loop () { sensorValue = analogRead (sensorPin);// читаем с аналогового выхода Serial.println (sensorValue, DEC);// выводим амплитуду сигнала digitalWrite (ledPin, HIGH); delay (100); digitalWrite (ledPin, LOW); delay (100); }Плата с маленьким микрофоном, имеет 2 выхода: цифровой и аналоговый AO, аналоговый выход – сигнал напрямую с микрофона DO, цифровой выход – при превышении порога срабатывания на выходе 1. Чувствительность срабатывания регулируется подстроечным Резистором На плате два светодиода – один при подаче питания, второй при срабатывании цифрового выхода

Подключение (слева направо)

AO GND +5V DOсостоит из инфракрасного светодиода  (LED) и фототранзистора, с помощью которых можно измерять пульс в пальце. Монитор сердечного ритма работает следующим образом: палец должен быть расположен между IR светодиодом и фототранзистором, который получает поток инфракрасного излучения. Когда в пальце пульсирует кровь — сопротивление фототранзистора меняется. При измерениях пульса необходимо чтобы фототранзистор был защищен от попадания прямого солнечного или искусственного света для исключения нежелательных помех.
Подключение (слева направо) S подключаем к аналоговому входу ардуино +5в GND int sensorPin = 0; double alpha = 0.75; int period = 100; double change = 0.0; double minval = 0.0; void setup () { Serial.begin (9600); } void loop () { static double oldValue = 0; static double oldChange = 0; int rawValue = analogRead (sensorPin); double value = alpha * oldValue + (1 — alpha) * rawValue; Serial.print (rawValue); Serial.print («,»); Serial.println (value); oldValue = value; delay (period);Енкодер выдает при вращении двоичный код на двух выходах. По этому коду можно определить направление вращения. на полный оборот в моем случае приходится 24 импульса. Помимо этого нажатие на ручку – срабатывание кнопки.

Подключение (слева направо)

“CLK” – энкодер контакт “A” “DT”  – энкодер контакт “B” “SW” – кнопка “+”  – питание “+5 В” “GND” — общий

Товар предоставлен для написания обзора магазином. Обзор опубликован в соответствии с п.18 Правил сайта.

Источник: https://mysku.ru/blog/china-stores/37299.html

Урок 33. Обучаем Arduino робота ездить по линии

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

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

Нам понадобится:

Для реализации проекта нам необходимо установить библиотеку:

О том как устанавливать библиотеки, Вы можете ознакомиться на странице Wiki — Установка библиотек в Arduino IDE.

Видео:

Схема подключения:

Моторчики подключаются к клеммам M1 (левый мотор) и M2 (правый мотор) расположенным на Motor Sield. Аналоговые датчики линии подключаются к любым аналоговым входам Arduino Uno, в нашем примере используются входы A5 (для правого датчика), A4 (для центрального датчика) и A3 (для левого датчика).

Вывод TRIG ультразвукового датчика расстояния подключается к любому выводу Arduino Uno, в нашем случае вывод D2. Вывод ECHO, при использовании библиотеки iarduino_HC_SR04_int, может подключаться только к тем выводам Arduino Uno, которые используют внешние прерывания, в нашем случае это вывод D3. Все датчики запитаны от напряжения 5 В.

Напряжение питания на Arduino Unoподаётся через Motor Shield (клеммник Vin), для чего нужно установить перемычку, рядом с клеммником, в позицию «Общ. Пит.».

Входы Motor Shield H1 (направление 1 мотора), E1 (ШИМ 1 мотора), E2 (ШИМ 2 мотора), H2 (направление 2 мотора), по умолчанию, подключены к выводам D7, D6, D5 и D4 соответственно, но их можно поменять, сняв перемычку и соединив вывод Motor Shield с нужным выводом Arduino Uno.

Алгоритм работы:

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

Скорость движения задаётся в константе valSpeed, от 1 до 255. Крутизна поворотов задаётся в константе valTurning, от 1 до 255. Время продолжения движения, при неопределённом состоянии, задаётся в константе tmrDelay, в микросекундах. Направление движения моторов указывается логическими значениями элементов массива arrRoute (0 элемент — правый мотор, 1 элемент — левый мотор), по умолчанию все элементы равны «1». Если вы перепутали полярность при подключении мотора, то измените значение соответствующего элемента этого массива на «0».

Калибровка для светлых, слабоконтрастных или цветных линий:

Машинка настроена на движение по темной линии, но она может ездить по светлым, слабоконтрастным или цветным линиям.

Для этого её нужно откалибровать, указав значения для констант valSensor1 (показание датчика находящегося на линии) и valSensor0 (показание датчика находящегося вне линии).

Для чего, в коде setup скетча, предусмотрен вывод показаний центрального датчика в монитор последовательного порта.

  • Поместите машинку так, чтобы центральный датчик находился над линией.
  • Подключите Arduino Uno по USB кабелю.
  • Откройте монитор последовательного порта. В мониторе высветится показание датчика на линии.
  • Поместите машинку так, чтобы центральный датчик находился вне линии.
  • Нажмите кнопку reset на Motor Shield. В мониторе высветится показание датчика вне линии.
  • Укажите первое значение константе valSensor1, а второе значение константе valSensor0 и повторно загрузите скетч.

Код программы:

// БИБЛИОТЕКИ:
#include // подключаем библиотеку для работы с датчиком
// НОМЕРА ВЫВОДОВ:
const uint8_t pinSensorL = A3; // Вывод к которому подключен датчик находящийся слева (по направлению движения)
const uint8_t pinSensorC = A4; // Вывод к которому подключен датчик находящийся по центру (по направлению движения)
const uint8_t pinSensorR = A5; // Вывод к которому подключен датчик находящийся справа (по направлению движения)
const uint8_t pinSens_TRIG = 2; // Вывод к которому подключен датчик расстояния HC_SR04 (вывод обозначенный на датчике как TRIG)
const uint8_t pinSens_ECHO = 3; // Вывод к которому подключен датчик расстояния HC_SR04 (вывод обозначенный на датчике как ECHO)
const uint8_t pinShield_LH = 7; // Вывод направления к которому подключен левый мотор (по направлению движения)
const uint8_t pinShield_LE = 6; // Вывод ШИМ к которому подключен левый мотор (по направлению движения)
const uint8_t pinShield_RE = 5; // Вывод ШИМ к которому подключен левый мотор (по направлению движения)
const uint8_t pinShield_RH = 4; // Вывод направления к которому подключен левый мотор (по направлению движения)
// ОБЪЕКТЫ:
iarduino_HC_SR04_int hcsr(pinSens_TRIG, pinSens_ECHO); // Объект hcsr для работы с библиотекой iarduino_HC_SR04 (вывод TRIG, вывод ECHO)
// УСТАНАВЛИВАЕМЫЕ ЗНАЧЕНИЯ:
const uint16_t valSensor1 = 930; // Показание датчика находящегося на линии (указывается для конкретной трассы)
const uint16_t valSensor0 = 730; // Показание датчика находящегося вне линии (указывается для конкретной трассы)
const uint8_t valSpeed = 255; // Максимальная скорость (число от 1 до 255)
const uint32_t tmrDelay = 2000; // Время в течении которого требуется остановиться (если в течении этого времени состояние остаётся неопределённым (линия не обнаружена), то требуется остановиться)
const uint8_t valTurning = 10; // Крутизна поворотов (скорость реакции) (число от 1 до 255)
const uint8_t valDistance = 20; // Минимально допустимое расстояние до объекта в сантиметрах (если расстояние будет меньше, то требуется остановитьтся)
const bool arrRoute[2] = {1,1}; // Направление движения для каждого мотора (зависит от полярности, нулевой элемент — правый мотор, первый элемент — левый мотор)
// РАССЧИТЫВАЕМЫЕ ЗНАЧЕНИЯ: uint8_t arrSpeed[2]; // Рассчитываемая скорость для каждого мотора (число от 1 до valSpeed, нулевой элемент — правый мотор, первый элемент — левый мотор) uint16_t valSensorM; // Рассчитываемое среднее значение датчика (значение между цветом линии и цветом вне линии) uint8_t valSensor; // Биты рассчитываемых логических уровней всех датчиков (0bxxxxxLCR) bool flgLine; // Флаг указывающий на то, что используется светлая линия (0 — тёмная линия, 1 — светлая линия) int8_t flgTurning; // Флаг наличия и направления поворота (0 — не поворачиваем, -1 — поворачиваем налево, +1 — поворачиваем направо) bool flgPWM; // Флаг указывающий на то, что требуется изменить ШИМ моторов (0 — тёмная линия, 1 — светлая линия) bool flgStop; // Флаг указывающий на необходимость остановиться (0 — без остановки, 1 — требуется остановиться) bool flgDistance; // Флаг обнаружения препятствия (0 — не обнаружено, 1 — обнаружено) uint32_t tmrMillis; // Время совершения последней операции (в миллисекундах)
void setup(){
// Узнаём цвет линии используемой на трассе, если он светлый, то устанавливаем флаг lineColor тёмный flgLine = (valSensor0>valSensor1); // Если условие (valSensor0>valSensor1) выполняется значит линия светлая и флаг flgLine установится в 1, иначе он сбросится в 0
// Вычисляем среднее значение между показаниями датчиков на линии и все линии if(flgLine){valSensorM=valSensor1+(valSensor0-valSensor1)/2;} // Если на трассе используется светлая линия else {valSensorM=valSensor0+(valSensor1-valSensor0)/2;} // Если на трассе используется тёмная линия
// Устанавливаем значение скорости обоих моторов arrSpeed[1]=valSpeed; // Максимальная скорость на левом моторе arrSpeed[0]=valSpeed; // Максимальная скорость на правом моторе
// Устанавливаем флаг ШИМ, сбрасываем флаг наличия поворота, флаг остановки и флаг обнаружения припятствий flgPWM=1; flgTurning=0; flgStop=0; flgDistance=0;
// Устанавливаем режим работы выводов и направление обоих моторов pinMode (pinSensorL, INPUT ); // Конфигурируем вывод pinSensorL как вход (для получения данных от левого датчика линии) pinMode (pinSensorC, INPUT ); // Конфигурируем вывод pinSensorC как вход (для получения данных от центрального датчика линии) pinMode (pinSensorR, INPUT ); // Конфигурируем вывод pinSensorR как вход (для получения данных от правого датчика линии) pinMode (pinShield_LH, OUTPUT ); // Конфигурируем вывод pinShield_LH как выход (для управления направлением движения левого мотора) pinMode (pinShield_LE, OUTPUT ); // Конфигурируем вывод pinShield_LE как выход (для управления скоростью вращения левого мотора, при помощи ШИМ) pinMode (pinShield_RE, OUTPUT ); // Конфигурируем вывод pinShield_RE как выход (для управления скоростью вращения правого мотора, при помощи ШИМ) pinMode (pinShield_RH, OUTPUT ); // Конфигурируем вывод pinShield_RH как выход (для управления направлением движения правого мотора) digitalWrite(pinShield_LH, arrRoute[1]); // Устанавливаем на выходе pinShield_LH уровень arrRoute[1] (направление движения левого мотора) digitalWrite(pinShield_RH, arrRoute[0]); // Устанавливаем на выходе pinShield_RH уровень arrRoute[0] (направление движения правого мотора)
// Выводим показания центрального датчика линии Serial.begin(9600); while(!Serial){} // Инициируем передачу данных по последовательному порту (на скорости 9600 бит/сек) Serial.println(analogRead(pinSensorC)); // Выводим показания центрального датчика линии (для указания значений константам valSensor0 и valSensor1)
// Устанавливаем задержку и обновляем время совершения последней операции delay(2000); tmrMillis = millis();
}
void loop(){
// Читаем показания датчиков и преобразуем их в логические уровни // (1 — датчик на линии, 0 — датчик вне линии) valSensor = 0; // сбрасываем все биты переменной valSensor valSensor |= ((analogRead(pinSensorL)>valSensorM)^flgLine)

Источник: https://lesson.iarduino.ru/page/urok-33-obuchaem-arduino-robota-ezdit-po-linii

Использование датчика холла с arduino

В этой статье мы рассмотрим, как использовать модуль датчик холла совместно с Arduino. Датчик холла — это датчик, который меняет свой выходной потенциал (напряжение) в зависимости от присутствии или отсутствии магнитного поля.

Это означает, что выходной сигнал датчика Холла является функцией плотности магнитного поля вокруг него.

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

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

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

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

По виду они обычно выглядят как плата с 3 контактами: один контакт сигнал и другие 2 для питания датчика. Это существенно упрощает подключение модуля к любому микроконтроллеру или исполнительной схеме.

В сегодняшнем материале Elwo.ru покажет, как работает датчик холла, подключив его вместе со светодиодом к Arduino блоку. Arduino будет запрограммирован таким образом, что, когда магнит приближается к датчику холла — светодиод включается, а когда магнит удаляется — он гаснет.

Схема принципиальная

Схема для этого проекта проста, так как все, что нам нужно сделать, это подключить 3 контакта датчика холла и светодиод к платформе Arduino. Соедините компоненты, как показано на схеме.

Датчик Холла — Ардуино

  • VCC — 5V
  • GND — GND
  • SIG — D2

LED можно подсоединить сразу в Arduino с положительной ногой в pin 13 Arduino и другой ногой в земляной штырь без резистора, потому что arduino имеет внутренний резистор прикрепленный к pin 13.

Требуемые компоненты для схемы

Для построения этого проекта требуются следующие компоненты.

  • Датчик холла
  • Arduino Uno
  • LED
  • Магнит
  • Провода

Теперь можем перейти к коду для этого проекта.

Код прошивки МК

Код для этого проекта очень прост, так как все, что нужно сделать это проверить, ощущается ли магнитное поле, и если да — включается ли от него светодиод.

В функции настройки void мы объявляем pinmode для контактов Arduino, к которому подключены светодиод и датчик Холла.

Далее идет функция void loop, задача здесь как если бы надо было использовать кнопку для управления светодиодом с Arduino между ними. Читаем выход датчика холла и храним в переменной с именем state.

Полный код для этого проекта показан далее:

Скопируйте код и загрузите его на плату Arduino. Вы должны увидеть переключение светодиода, когда магнит поднесен близко к датчику, показанному на фото.

   Схемы на микроконтроллерах

Источник: http://elwo.ru/publ/skhemy_na_mikrokontrollerakh/ispolzovanie_datchika_kholla_s_arduino/9-1-0-1088

Датчик движения своими руками на Arduino | Каталог самоделок

Вспомним, что основа данного проекта Arduino. Он выполняет ряд важнейших функций: считывает данные с ИК-датчика, обрабатывает сигналы, реагирует на движения, а USB оповещает компьютер о необходимости отправить сообщение. В этой статье рассмотрим два вопроса:

  1. Подключение  PIR-датчика к Arduino;
  2. Как настроить взаимосвязь между датчиком и автоматической отправкой e-mail.

Необходимо для проекта:

  • Arduino UNO (выбрать можно на Aliexpress).
  • PIR-датчик .
  • Бредбоард.
  • Связка проводов.

Все перечисленные элементы для сборки можно увидеть на фотографиях:

В первую очередь нужен ПК с подключением к интернету. Мы  использовали Raspberry Pi.

Подключаем PIR-датчик к набору Arduino:

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

Работа со скетчем

При возникновении движения Arduino при помощи  USB Serial должен послать электронное сообщение. Конечно же, если при любом возникшем движении отправлять  e-mail, то почтовый ящик будет переполнен. Поэтому мы исправили это таким образом, если между двумя сигналами короткий промежуток времени, будет отправляться письмо с таким текстом:

int pirPin = 7;
int minSecsBetweenEmails = 60; // 1 min
long lastSend = -minSecsBetweenEmails * 1000;
void setup()
{
pinMode(pirPin, INPUT);
Serial.begin(9600);
}
void loop()
{
long now = millis();
if (digitalRead(pirPin) == HIGH)
{
if (now > (lastSend + minSecsBetweenEmails * 1000))
{
Serial.println(«MOVEMENT»); lastSend = now;
}
else
{
Serial.println(«Too soon»); }
}
delay(500);
}

«MinSecsBetweenEmails» — эта переменная может переключаться на другие значения, которые будут удобны пользователю. К примеру, можно установить интервал, который равен одной минуте – это будет означать, что следующий  e-mail будет отправлен только через 60 секунд.

«LastSend» поможет отследить время, в которое было отправлено последнее сообщение. Инициализация данной переменной происходит с отрицательным числом, которое равно миллисекундам, что указаны в «MinSecsBetweenEmails». В итоге, мы получаем гарантию того, что после запуска скетча в Arduino сразу же запустится PIR-датчик.

За счет чего мы можем высчитать миллисекунды, сравнить их число со временем последнего срабатывания датчика? Все благодаря встроенной функции под названием Millis. В том случае, если обнаружено движение, но прошло  мало времени с последнего активизации датчика будет отправлено письма с текстом «Too soon».

Эту функцию сначала надо проверить. Для этого открывается Serial Monitor. Далее рассмотрим, как он выглядит:

После того, как вы убеждены в исправной работе, можно записывать программу на Python, его используют для обрабатывания сигналов от платформы.

Как установить PySerial и Python:

Операционная система Linux имеет автоматически установленный Python. Система Windows не обладает такой характеристикой, поэтому программу необходимо установить самостоятельно. PySerial исполняет роль библиотеки, она поможет поддерживать связываться с Arduino.

Установка Python:

Python 3 нередко вызывает затруднения при работе с PySerial, особенно если вы используете Windows. Чтобы этого избежать, можно вместо третьей версии скачать Python 2.

Завершив установку программы в меню «Пуск» можно обнаружить особую группу. Когда мы перейдем к процессу установки библиотеки, нам понадобится сотрудничество с Python, применив командную строку. Поэтому лучше сразу добавить к PATH нужный каталог. Далее можно увидеть вспомогательную фотографию:

Для добавления каталога нам потребуется: открыть панель управления, в ней найти раздел «System Properties». Потом нажимаем клавишу, которая называется «Переменная среда» (Environment Variabes), перед нами всплывет окно. В его нижней части должен находиться «Path», который нужно выбрать.

Теперь кликнем на «Edit» — Изменение и завершаем процесс нажатием «значения переменной». Нельзя удалять текст, который получили, к нему следует дописать такую надпись — «;C:Python27». Не забываем после каждой папки, что указана в тексте ставить «;». Теперь проверяем правильно ли осуществлен ввод «Path». Для этого в командную строку вводим слово «python».

Если ошибок не возникло, то на экране появится следующая картинка:

Установить  PySerial:

Независимо от используемой операционной системы, скачиваем .tar.gz установочный пакет для PySerial 2.6 с . Этот сайт может помочь это сделать — https://pypi.python.org/pypi/pyserial. Получаем файл с именем pyserial-2.6.tar.gz. Если используется Windows, то будет нужна распаковка файлов в выбранную папку.

Это не стандартный файл формата ZIP, придется сделать дополнительные действия – скачать 7-zip (это можно сделать здесь — http://www.7-zip.org/). Для системы Linux необходимо воспользоваться терминальной сессией, в ней дать команду «CD», указать название той папки, в которую скачали  pyserial-2.6.tar.gz.

Чтобы выполнить распаковку нужно ввести:

$ tar -xzf pyserial-2.6.tar.gz

После этого потребуется выполнить команду:

sudo python setup.py install

Python

Потребуется создать отдельную программу для работы с Python. Нужно скопировать код в файл с таким именем — «movement.py». В Linux можно использовать «нано» редактор, а для системы  Windows необходимо создать файл, используя редактор Python «IDLE ». Он доступен в меню «Пуск».

import time
import serial
import smtplib
TO = 'putyour@email.here'
GMAIL_USER = 'putyour@email.here'
GMAIL_PASS = 'putyourpasswordhere'
SUBJECT = 'Intrusion!!'
TEXT = 'Your PIR sensor detected movement'
ser = serial.Serial('COM4', 9600)
def send_email():
print(«Sending Email»)
smtpserver = smtplib.SMTP(«smtp.gmail.com»,587)
smtpserver.ehlo() smtpserver.starttls()
smtpserver.ehlo smtpserver.login(GMAIL_USER, GMAIL_PASS)
header = 'To:' + TO + '
' + 'From: ' + GMAIL_USER
header = header + '
' + 'Subject:' + SUBJECT + '
'
print header
msg = header + '
' + TEXT + '

'
smtpserver.sendmail(GMAIL_USER, TO, msg)
smtpserver.close()
while True:
message = ser.readline()
print(message)
if message[0] == 'M' :
send_email()
time.sleep(0.5)

Это показано на следующей картинке:

После изменений, программа запуститься при помощи командной строки:

python movement.py

Итак, установка завершена.

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

Прикрепленные файлы: Скетчи и коды.  

Источник: https://volt-index.ru/electronika-dlya-nachinayushih/datchik-dvizheniya-svoimi-rukami-na-arduino.html

Робот-машинка на Arduino. Датчики положения колёс

Этой статьёй я начинаю цикл о том, как своими руками собрать и запрограммировать машинку-робота на Arduino. Статьи будут достаточно простые – так как инженерам-электронщикам вряд ли нужно искать такую информацию в интернетах, а вот начинающим радиолюбителям будет проще читать более «разжеванную» информацию.

И начну я не совсем стандартно – с подключения оптических датчиков положения колёс.

Ещё их называют энкодерами. Или щелевыми оптронами. Или фотоинтеррапторами. Прям «Парк Юрского периода». Ну, по-русски это – оптический прерыватель… В общем, в разных магазинах кто как хочет – так и обзывает.

Почему именно с них? Потому, что информация о скорости вращения колёс и пути, пройденном каждым из колёс робота за отрезок времени является ключевой для управления машинкой.

К примеру, моторчики, которые шли в комплекте к купленному мной на Дилэкстриме шасси, оказались разной мощности – и вращаются с разной скоростью. И если я даже захочу, чтобы машинка ехала просто прямо – у меня не получится просто подключить параллельно оба мотора к одному источнику питания.

И даже если бы моторы оказались одинаковыми – всё равно нужны датчики положения колёс. Например, одно колесо встречает большее сопротивление – и начинает крутиться медленнее. Или робот упёрся в препятствие. Или робот поворачивает: одно колесо тормозим, второе вращаем – и для того, чтобы знать, на какой угол он повернул – нужно знать, сколько раз или на сколько градусов повернулось колесо…

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

С одной стороны в нём находится инфракрасный светодиод, который постоянно излучает невидимое ИК-излучение в щель. С другой стороны щели находится фототранзистор. ИК-излучение попадает на него, и он открывается – то есть, проводит через себя электрический ток. Если же в щель внести что-то непрозрачное – то фототранзистор закрывается, и ток через него не идёт.

«+» светодиода подключается к питанию через резистор, который ограничивает силу тока через него.

Катод светдиода соединяется с «землей», туда же – эмиттер фототранзистора.

Коллектор фототранзистора является «выходом» датчика. Но для того, чтобы напряжение на нём менялось в зависимости от наличия/отсутствия преграды в щели оптрона, коллектор соединяется с положительной шиной питания через «подтягивающий» резистор – чаще всего 10 кОм. А можно использовать «подтягивающие» резисторы, встроенные в порт микроконтроллеров AVR.

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

На шасси есть специальные отверстия под эти датчики, а на валах колёс – специальные диски с прорезями. При вращении колеса диск попадает в прорезь то непрозрачной частью, то прорезью. И соответственно, на выходе датчика будет чередоваться то +5 В, то 0 В.

Подключаем выходы датчиков к цифровым входам Arduino, и через небольшие промежутки времени проверяем эти входы. Если напряжение поменялось с высокого логического уровня на низкий, или наоборот – увеличиваем показания счётчика. Если счётчик отсчитал 40 раз (20 прорезей х 2 края у каждой прорези) – смотрим время, затраченное время на полный оборот, и высчитываем скорость вращения.

Сама программа вот:

float speedLeft, speedRight;
int counterLeft, counterRight;
boolean stateRight, stateLeft;
unsigned long timeLeft, timeRight;

void setup(){
pinMode (10,INPUT);
pinMode (11,INPUT);
digitalWrite(10,HIGH);
digitalWrite(11,HIGH);
Serial.begin(9600);
timeLeft=micros();
timeRight=timeLeft;
}

void loop(){
if(digitalRead(11) != stateLeft){
stateLeft = !stateLeft;
++counterLeft;
}
if(digitalRead(10) != stateRight){
stateRight = !stateRight;
++counterRight;
}
if(counterLeft==39){
counterLeft=0;
timeLeft=micros()-timeLeft;
speedLeft=(1000000.0/timeLeft);
timeLeft=micros();
Serial.

print(«left motor speed = «);
Serial.print(speedLeft);
Serial.println(» RPS»);
}
if(counterRight==39){
counterRight=0;
timeRight=micros()-timeRight;
speedRight=(1000000.0/timeRight);
timeRight=micros();
Serial.print(» right motor speed = «);
Serial.print(speedRight);
Serial.

println(» RPS»);
}
delay(1);
}

А здесь – видео о подключении датчика положения колес:

А на следующем видео я подробно объясняю как работает приведенный выше скетч для Arduino. Он простой, конечно — но для самых начинающих может быть интересно.

Источник: http://lazyelectronics.com/index.php/ru/item/11-lazycarbot1

Ссылка на основную публикацию