Текущая пандемия коронавируса Covid-19 внесла существенные изменения в жизнь людей по всему миру. Ношение масок и перчаток, соблюдение социальной дистанции и стерилизация/дезинфекция помещений – это минимальный набор обязательных мер для предотвращения распространения коронавируса. Но стерилизация/дезинфекция помещений, выполняемая человеком, несет риск для него поскольку он подвергается опасности заразиться вирусом во время этого процесса. Было бы более безопасно и целесообразно возложить задачи стерилизации/дезинфекции помещений на специализированных роботов. Поэтому в данной статье мы рассмотрим создание робота на основе платы Arduino, который мог бы производить автоматическую дезинфекцию помещений с помощью ультрафиолетовых лучей.
Также вы можете посмотреть похожие проекты на нашем сайте на основе платы Arduino: робот, объезжающий препятствия и самобалансирующийся робот.
Дисклеймер: этот проект сделан исключительно в образовательных целях, для понимания принципов работы роботов для стерилизации/дезинфекции помещений, и мы не даем никаких гарантий относительно того, что рассматриваемый в данном проекте робот сможет эффективно уничтожать коронавирус Covid-19
Каким образом ультрафиолетовые лучи могут убивать вирусы и болезнетворные микроорганизмы (патогены)
Основная цель рассматриваемого в данном проекте робота – это дезинфекции помещений с помощью бактерицидного ультрафиолетового облучения (лучей). Робот в нашем проекте будет содержать ультрафиолетовые светодиоды, которые будут ответственны за уничтожение вируса. Известно, что такие био-организмы как вирусы и бактерии могут быть дезактивированы при воздействии на них ультрафиолетовых лучей. Ультрафиолетовый свет разрушает генетический материал в болезнетворных микроорганизмах (патогенах) – DNA (deoxyribonucleic acid – дезоксирибонуклеиновая кислота) в бактериях и RNA (ribonucleic acid – рибонуклеиновая кислота) в вирусах, таким образом, предотвращая их размножение (воспроизводство).
Вирусы, подобные Covid-19, могут длительное время оставаться жизнеспособными на поверхностях, а ультрафиолетовый свет, как доказано, уничтожает рибонуклеиновую кислоту (RNA) в данных вирусах, значительно снижая тем самым шанс на их передачу (на другие поверхности). Более подробную информацию об этом процессе вы можете найти на соответствующих ресурсах в сети интернет – ее сейчас там ну очень много.
Принцип работы робота для автоматической дезинфекции помещений с помощью ультрафиолетовых лучей
Рассматриваемый в данном проекте робот будет полностью автоматическим и будет способен самостоятельно обнаруживать препятствия и избегать столкновения с ними. В настоящее время существует множество способов для обнаружения препятствий, одним из самых популярных из них является использование инфракрасных датчиков, но мы для данного проекта выбрали способ, основанный на использовании ультразвуковых датчиков, который имеет следующие преимущества по сравнению с использованием инфракрасных датчиков:
- большая дальность обнаружения препятствий;
- отсутствие влияния солнечной засветки на работу устройства.
Внешний вид ультразвуковых датчиков, используемых в нашем проекте, показан на следующем рисунке.
Ультразвуковой датчик для определения расстояний HC-SR04 имеет 4 контакта: VCC, Trigger, Echo и Ground. Он содержит в своем составе ультразвуковой передатчик и приемник. Принцип его работы достаточно прост. Сначала датчик излучает ультразвуковую волну, которая распространяется по воздуху, отражается от препятствия и принимается приемником в составе датчика. Для расчета расстояния до препятствия необходимо время распространения волны до препятствия умножить на скорость распространения звука в воздухе – это достаточно просто сделать с помощью любого современного микроконтроллера (в нашем случае для этой цели мы используем плату Arduino).
Более подробно об определении расстояний с помощью данного датчика и платы Arduino можно прочитать в следующей статье. Также вы можете посмотреть все проекты на нашем сайте, в которых был использован ультразвуковой датчик HC-SR04.
В роботе в данном проекте мы будем использовать три ультразвуковых датчика – для обнаружения препятствий слева, справа и впереди робота. Когда препятствие будет напротив одного из датчиков (на определенной дистанции), то робот будет поворачивать в противоположную сторону и, таким образом, избегать встречи с препятствием. К примеру, если препятствие обнаруживается напротив датчика, который установлен слева робота, то робот будет двигаться в правую сторону.
При подаче питания на робота ультрафиолетовые светодиоды в его составе будут автоматически включаться. Робот содержит 10 ультрафиолетовых светодиодов (по два на каждой стороне + два на днище), поэтому он обеспечивают стерилизацию/дезинфекцию в диапазоне 360° + пол помещения. Робот полностью автономен и безопасен, самостоятельно объезжает препятствия и может двигаться в любом направлении.
Необходимые компоненты
- Плата Arduino Pro Mini (купить на AliExpress).
- Ультразвуковой датчик HC-SR04 – 3 шт. (купить на AliExpress).
- Драйвер двигателя L293D (купить на AliExpress).
- Двигатели N20 на 5 В и монтажные кронштейны для них – 2 шт. (купить на AliExpress — смог найти только на 6 В, на 5 В почему то не удалось найти).
- Колеса для двигателей N20 – 2 шт.
- Ультрафиолетовые светодиоды (UV LEDs) – 8 шт. (купить на AliExpress).
- Регулятор напряжения 7805 (купить на AliExpress).
- Литий-ионная батарея 7.4V (купить на AliExpress).
- Резистор 330 Ом (купить на AliExpress).
- Точечная плата.
- Foam Board или MDF (если требуется).
- Ролик (опорное колесо).
Реклама: ООО «АЛИБАБА.КОМ (РУ)» ИНН: 7703380158
Внешний вид компонентов, необходимых для сборки робота, показан на следующем рисунке.
Схема проекта
Схема робота на Arduino для автоматической дезинфекции помещений с помощью ультрафиолетовых лучей представлена на следующем рисунке.
Три ультразвуковых датчика в схеме используются для обнаружения препятствий. Их контакты GND и VCC подключены к аналогичным контактам платы Arduino. Контакты trigger и echo датчиков подключены к ШИМ (PWM) контактам платы Arduino. Для управления двигателями мы используем одну из самых популярных микросхем драйвера двигателей — L293D, ее контакты enable подключены к 5V, также ее контакты питания подключены к 5V поскольку мы будем использовать электродвигатели, работающие от 5V.
Все ультрафиолетовые светодиоды в схеме мы соединили параллельно и подключили их к питающему напряжению с помощью токоограничивающего резистора 330 Ом. Все основные компоненты схемы (плата Arduino, ультразвуковые датчики, драйвер двигателя, двигатели) работают от напряжения 5 Вольт, поэтому для преобразования напряжения 7,4 В с выхода литий-ионной батареи в 5 В мы использовали регулятор напряжения 7805.
Сборка конструкции робота
Поскольку мы собираем передвигающегося в пространстве робота, то желательно, чтобы его электронная «начинка» занимала как можно меньше места. Поэтому чтобы минимизировать размеры конструкции мы использовали точечную плату, на которую и припаивали компоненты схемы. При сборке конструкции робота желательно использовать провода с контактами типа «мама» (female header pin) для подключения платы Arduino pro mini и электродвигателей. После сборки у нас получилась конструкция следующего вида:
Сборка корпуса робота
В корпусе робота мы должны разместить 3 ультразвуковых датчика и остальные электронные компоненты схемы. Мы решили изготовить корпуса робота самостоятельно, используя для этого подручные средства: лист пенопласта, лист пенопласта, картон и т.п. В качестве основы корпуса робота мы использовали лист пенопласта. Поэтому первым делом при сборке корпуса робота мы вырезали в лист пенопласта необходимые блоки и отверстия. Внешний вид получившегося у нас листа пенопласта показан на рисунке ниже. Самое большое отверстие в пенопласте будет использоваться для установки опорного колеса (ролика) робота, а в остальные два будут устанавливаться ультрафиолетовые светодиоды.
После просверливания всех необходимых отверстий в корпусе робота мы закрепили на нем электродвигатели N20 с помощью кронштейнов для них. В боковые стенки робота мы закрепили ультразвуковые датчики и ультрафиолетовые светодиоды. После этого мы сделали оставшиеся соединения в схеме и установили сбоку робота выключатель питания.
На заключительном этапе мы разместили внутри робота литий-ионную батарею. Более подробно процесс сборки корпуса робота показан на видео, приведенном в конце статьи.
Объяснение программы для Arduino
Полный код программы приведен в конце статьи, здесь же мы кратко рассмотрим его основные фрагменты.
Мы не будем использовать в коде программы каких то внешних библиотек поскольку взаимодействие с датчиком HC-SR04 не представляет особых трудностей, более подробно об измерении расстояний с помощью ультразвукового датчика HC-SR04 и платы Arduino вы можете прочитать в этой статье.
Поэтому в программе мы должны объявить (дать осмысленные имена) контакты платам Arduino, к которым подключены контакты Trigger Pin и Echo Pin ультразвукового датчика. В этом проекте у нас три Trigger Pin и Echo Pin. В обозначении этих контактов 1 будет обозначать левый датчик, 2 – передний датчик и 3 – правый датчик.
1 2 3 4 5 6 |
const int trigPin1 = 3; const int echoPin1 = 5; const int trigPin2 = 6; const int echoPin2 =9; const int trigPin3 = 10; const int echoPin3 = 11; |
Далее мы объявим в программе необходимые переменные – для хранения расстояния мы будем использовать переменные типа int, а для хранения длительности – переменные типа long.
1 2 3 4 5 6 |
long duration1; long duration2; long duration3; int distanceleft; int distancefront; int distanceright; |
В функции setup мы зададим режимы работы используемых контактов с помощью функции pinMode() – на ввод (input) или вывод (output) данных. Также мы инициализируем последовательную связь со скоростью 9600 бод для целей отладки.
1 2 3 4 5 6 7 |
pinMode(trigPin1, OUTPUT); pinMode(trigPin2, OUTPUT); pinMode(trigPin3, OUTPUT); pinMode(echoPin1, INPUT); pinMode(echoPin2, INPUT); pinMode(echoPin3, INPUT); Serial.begin(9600); |
Для контактов, с которых осуществляется управление двигателями, задается режим работы на вывод данных.
1 2 3 4 |
pinMode(4, OUTPUT); pinMode(7, OUTPUT); pinMode(8, OUTPUT); pinMode(12, OUTPUT); |
В основном цикле программы (loop) у нас есть три фрагмента кода для трех датчиков. Все эти фрагменты кода работают одинаково, но каждый работает со своим датчиком. В каждом из этих фрагментов мы определяем расстояние до препятствия от каждого датчика и сохраняем ее в переменной типа integer. Для определения расстояния до препятствия мы сначала убеждаемся что trigger pins свободны, для мы подаем на trigger pin датчика уровень LOW на 2 микросекунды. После этого для излучения датчиком ультразвуковой волны необходимо подать на trigger pin датчика уровень HIGH на 10 микросекунд. После этого датчик излучит в пространство ультразвуковую волну. Затем с помощью функции pulseIn() мы измеряем время распространения этой волны до препятствия и обратно. Измеренное время мы сохраняем в переменной “duration”. Функция pulseIn() имеет два параметра – первый это имя контакта echo pin, а в качестве второго параметра можно указать HIGH или LOW. HIGH будет указывать на то, что функция pulseIn() будет ждать до тех пор, пока состояние контакта не станет HIGH – в этот момент она начнет отсчет. А когда состояние контакта станет LOW – она закончит отсчет. Таким образом, в этом случае функция pulseIn() измерит длительность импульса (в микросекундах) с состоянием HIGH. Для расчета расстояния до препятствия мы будем умножать измеренную длительность на 0.034 (этот коэффициент рассчитан исходя из скорости звука в воздухе равную 340 м/с) и делить на 2 (поскольку волна распространялась до препятствия и обратно). Наконец, мы сохраняем рассчитанные расстояния до препятствия от каждого датчика в соответствующих переменных типа integer.
1 2 3 4 5 6 7 8 9 |
digitalWrite(trigPin1, LOW); delayMicroseconds(2); digitalWrite(trigPin1, HIGH); delayMicroseconds(10); digitalWrite(trigPin1, LOW); duration1 = pulseIn(echoPin1, HIGH); distanceleft = duration1 * 0.034 / 2; Serial.print("Distance1: "); Serial.println(distanceleft); |
После определения расстояния до препятствия от каждого датчика мы можем управлять движениями двигателей с помощью операторов if. В качестве минимального допустимого расстояния до препятствия мы выбрали расстояние 15 см (вы можете изменить это значение по своему желанию). К примеру, когда у нас препятствие будет слева робота (расстояние до него меньше или равно 15 см), а у двух других датчиков не будет вблизи их препятствия, мы будем давать команду на поворот робота вправо. Условие для проверки этого факта будет выглядеть следующим образом:
1 |
if ((distanceleft <= 15 && distancefront <= 15 && distanceright > 15) || (distanceleft <= 15 && distancefront > 15 && distanceright > 15)) |
Совокупность команд на поворот робота вправо будет выглядеть следующим образом:
1 2 3 4 |
digitalWrite(4, HIGH); digitalWrite(7, LOW); digitalWrite(8, HIGH); digitalWrite(12, LOW); |
Поворот робота влево будет определяться следующей совокупностью команд:
1 2 3 4 5 |
if ((distanceleft > 15 && distancefront <= 15 && distanceright <= 15) || (distanceleft > 15 && distancefront > 15 && distanceright <= 15) || (distanceleft > 15 && distancefront <= 15 && distanceright > 15) ) digitalWrite(4, LOW); digitalWrite(7, HIGH); digitalWrite(8, HIGH); digitalWrite(12, LOW); |
Фрагмент кода для движения робота прямо можно записать следующим образом:
1 2 3 4 5 6 7 |
if ((distanceleft <= 15 && distancefront > 15 && distanceright <= 15) || (distanceleft > 15 && distancefront > 15 && distanceright > 15)) { digitalWrite(4, HIGH); digitalWrite(7, LOW); digitalWrite(8, HIGH); digitalWrite(12, LOW); } |
Внешний вид робота в работе показан на следующем рисунке. Более подробно этот процесс вы можете посмотреть на видео, приведенном в конце статьи.
Исходный код программы (скетча)
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 |
// defining the pins const int trigPin1 = 3; const int echoPin1 = 5; const int trigPin2 = 6; const int echoPin2 = 9; const int trigPin3 = 10; const int echoPin3 = 11; // defining variables long duration1; long duration2; long duration3; int distanceleft; int distancefront; int distanceright; void setup() { pinMode(trigPin1, OUTPUT); pinMode(trigPin2, OUTPUT); pinMode(trigPin3, OUTPUT);// устанавливаем trigPin на вывод данных (Output) pinMode(echoPin1, INPUT); // устанавливаем echoPin на ввод данных (Input) pinMode(echoPin2, INPUT); pinMode(echoPin3, INPUT); Serial.begin(9600); // инициализируем последовательную связь со скоростью 9600 бод pinMode(4, OUTPUT); pinMode(7, OUTPUT); pinMode(8, OUTPUT); pinMode(12, OUTPUT); } void loop() { digitalWrite(trigPin1, LOW); delayMicroseconds(2); digitalWrite(trigPin1, HIGH); delayMicroseconds(10); digitalWrite(trigPin1, LOW); duration1 = pulseIn(echoPin1, HIGH); distanceleft = duration1 * 0.034 / 2; Serial.print("Distance1: "); Serial.println(distanceleft); digitalWrite(trigPin2, LOW); delayMicroseconds(2); digitalWrite(trigPin2, HIGH); delayMicroseconds(10); digitalWrite(trigPin2, LOW); duration2 = pulseIn(echoPin2, HIGH); distancefront = duration2 * 0.034 / 2; Serial.print("Distance2: "); Serial.println(distancefront); digitalWrite(trigPin3, LOW); delayMicroseconds(2); digitalWrite(trigPin3, HIGH); delayMicroseconds(10); digitalWrite(trigPin3, LOW); duration3 = pulseIn(echoPin3, HIGH); distanceright = duration3 * 0.034 / 2; Serial.print("Distance3: "); Serial.println(distanceright); if ((distanceleft <= 15 && distancefront > 15 && distanceright <= 15) || (distanceleft > 15 && distancefront > 15 && distanceright > 15)) { digitalWrite(4, HIGH); digitalWrite(7, LOW); digitalWrite(8, HIGH); digitalWrite(12, LOW); } if ((distanceleft <= 15 && distancefront <= 15 && distanceright > 15) || (distanceleft <= 15 && distancefront > 15 && distanceright > 15)) { digitalWrite(4, HIGH); digitalWrite(7, LOW); digitalWrite(8, LOW); digitalWrite(12, HIGH); } if ((distanceleft > 15 && distancefront <= 15 && distanceright <= 15) || (distanceleft > 15 && distancefront > 15 && distanceright <= 15) || (distanceleft > 15 && distancefront <= 15 && distanceright > 15) ) { digitalWrite(4, LOW); digitalWrite(7, HIGH); digitalWrite(8, HIGH); digitalWrite(12, LOW); } } |
3 ответа к “Робот на Arduino для автоматической дезинфекции помещений с помощью ультрафиолетовых лучей”
Да, возможно я ошибся с выбором нужных светодиодов на алиэкспрессе, спорить не буду. Но даже с другими светодиодами в работе схемы ничего существенного не изменится. Буду признателен если подскажете где купить правильные светодиоды для этого робота
Если я не ошибаюсь, бактерицидное действие оказывает только узкий диапазон 230-00 нм, на алике да и прсто в продаже такие не найти, а те что вы привели, просто красиво светят. Я тоже в свое время на них попался, в итоге проверяли и ничего они вирусам не делают увы
265nm led uvc На али есть, но маломощные и дорогие для применения в данном проекте. По соотношению цена\эффективность по бактерицидному действию уф лампы пока лишь приемлемы для домашнего использования.