В этой статье мы рассмотрим "умную" трость (посох) для слабовидящих (слепых) людей на основе платы Arduino, которая будет более функциональна чем обычная трость.
Наша умная трость будет включать в себя ультразвуковой датчик для определения расстояния до препятствия, фоторезистор для измерения условий освещенности и модуль удаленного управления, с помощью которого слабовидящий человек может удаленно определять местоположение этой трости. Обратная связь со слабовидящим человеком обеспечивается при помощи зуммера (Buzzer). Вместо зуммера можно также использовать какое-нибудь другое вибрационное устройство – на ваш выбор.
Необходимые компоненты
- Плата Arduino Nano (другой тип платы также подойдет) (купить на AliExpress).
- Ультразвуковой датчик HC-SR04 (купить на AliExpress).
- Фоторезистор (купить на AliExpress).
- Зуммер (купить на AliExpress) и светодиод (купить на AliExpress).
- Регулятор напряжения 7805 (купить на AliExpress).
- Радиочастотный передатчик и приемник на частоте 433 МГц (купить на AliExpress).
- Резисторы (купить на AliExpress).
- Конденсаторы (купить на AliExpress).
- Кнопка.
- Перфорированная плата.
- Набор для пайки.
- Батарейка на 9 В
Реклама: ООО "АЛИБАБА.КОМ (РУ)" ИНН: 7703380158
Работа схемы
Для проекта нашей умной трости необходимо две отдельные схемы. Главная схема будет монтироваться на трости для слабовидящего человека. А вторая схема представляет собой маленький радиочастотный передатчик, которая нужна для определения местоположения основной схемы. Главная часть схемы приведена на следующем рисунке:
На этой схеме плата Arduino Nano используется для управления всеми процессами. Вся схема запитывается от батарейки на 9 В и регулятора напряжения 7805, который обеспечивает стабильное напряжение +5V. Ультразвуковой датчик запитывается от 5V, а его контакты trigger и Echo подключены к контактам 2 и 3 платы Arduino. Фоторезистор и резистор 10 кОм образуют делитель напряжения, с выхода которого напряжение подается на аналоговый контакт A1 (для последующего АЦП) платы Arduino. Аналоговый контакт A0 платы Arduino используется для считывания сигнала с радиочастотного приемника. Зуммер подключен к контакту 12 платы Arduino.
Схема радиочастотного передатчика приведена на следующем рисунке.
Здесь мы использовали небольшой "лайфхак" чтобы наши радиочастотные части схемы заработали так, как это нам необходимо. В обычном режиме для работы радиочастотных модулей 433 МГц необходимы шифратор (кодер) и дешифратор (декодер), либо же два узла управления многосторонней связью (MCU). Но в нашем проекте приемной части необходимо лишь обнаруживать передает ли передатчик какие либо сигналы. Поэтому контакт данных (Data pin) нашего радиочастотного передатчика мы подключили к корпусу (земле).
Контакт данных (data pin) радиочастотного приемника через RC фильтр подается на плату Arduino как показано на схеме. Теперь при нажатии кнопки на схеме передатчика приемник будет часто подавать на вход аналогово-цифрового преобразователя (АЦП) на контакте A0 платы Arduino определенный уровень напряжения. Эти повторяющиеся уровни напряжения нельзя будет наблюдать на входе контакта A0 платы Arduino когда кнопка в передающей части не нажата. То есть мы в программе для Arduino должны будем проверять поступление этих повторяющихся значений на вход контакта A0 платы Arduino чтобы определить нажата кнопка в передающей части или нет. Таким образом слабовидящий человек сможет находить свою трость.
Мы спаяли этот проект на перфорированной плате чтобы соединения не контактировали с тростью. Внешний вид получившейся у нас конструкции представлен на рисунке ниже. Однако вы, при желании, можете использовать макетную плату.
Объяснение программы для Arduino
После того как вы соберете всю аппаратную часть проекта можно будет приступать к программированию платы Arduino. Полный код программы приведен в конце статьи, здесь же мы обсудим его наиболее важные фрагменты.
Сначала в функции void setup() мы инициализируем входные и выходные контакты платы Arduino. В нашем проекте контакты, к которым подключаются Buzzer и Trigger pin, будут выходными, а контакт, к которому подключается Echo pin, входным. Мы также инициализируем монитор последовательной связи (serial monitor) для целей отладки.
1 2 3 4 5 6 7 8 |
void setup() { Serial.begin(9600); pinMode(Buzz,OUTPUT); digitalWrite(Buzz,LOW); pinMode(trigger, OUTPUT); pinMode(echo, INPUT); } |
Внутри функции loop мы будем считывать данные от всех датчиков – от ультразвукового датчика для измерения расстояния до препятствия, от фоторезистора для измерения освещенности и от приемника радиочастотного сигнала чтобы проверять не нажата ли кнопка на передающей части. Все эти данные сохраняются в соответствующие переменные для их дальнейшего использования.
1 2 3 |
calculate_distance(trigger,echo); Signal = analogRead(Remote); Intens = analogRead(Light); |
Далее мы проверяем данные от радиочастотного приемника. Мы будем использовать переменную similar_count чтобы проверить сколько раз повторялись одни и те же значения от радиочастотного приемника. Поступление этих повторяющихся данных возможно только когда нажата кнопка на передающей части. Мы будем инициировать сигнал тревоги (то есть сигнал о том, что человек ищет трость) от радиочастотного приемника когда этот счетчик повторяющихся данных превысит значение 100.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
//проверяем нажата ли кнопка на передающей части int temp = analogRead(Remote); similar_count=0; while (Signal==temp) { Signal = analogRead(Remote); similar_count++; } //если кнопка нажата if (similar_count<100) { Serial.print(similar_count); Serial.println("Remote Pressed"); digitalWrite(Buzz,HIGH);delay(3000);digitalWrite(Buzz,LOW); } |
Также значение переменной similar_count можно будет проверять в окне монитора последовательной связи.
Далее мы будем проверять интенсивность света (освещенность) вокруг слабовидящего человека. Если с выхода фоторезистора мы получим значение менее 200 мы будем полагать что вокруг очень темно и мы с помощью зуммера сформируем специальный предупреждающий сигнал об этом длительностью 200 мс. Если значение с выхода фоторезистора более 800, то это будет означать, что вокруг очень светло – мы в этом случае сформируем предупреждающий сигнал другой тональности. Вы можете самостоятельно изменить границы срабатывания этих сигналов в программе.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
//если очень темно if (Intens<200) { Serial.print(Intens); Serial.println("Bright Light"); digitalWrite(Buzz,HIGH);delay(200);digitalWrite(Buzz,LOW);delay(200);digitalWrite(Buzz,HIGH);delay(200);digitalWrite(Buzz,LOW);delay(200); delay(500); } //если очень светло if (Intens>800) { Serial.print(Intens); Serial.println("Low Light"); digitalWrite(Buzz,HIGH);delay(500);digitalWrite(Buzz,LOW);delay(500);digitalWrite(Buzz,HIGH);delay(500);digitalWrite(Buzz,LOW);delay(500); } |
И затем, в самом конце, мы будем измерять расстояние до любого препятствия. Если расстояние до препятствия более 50 см, то никакого сигнала тревоги формироваться не будет. А если расстояние до препятствия менее 50 см, то будет выдаваться сигнал тревоги с помощью зуммера. Чем ближе будет становиться расстояние до препятствия, тем более часто будет звучать сигнал зуммера. Это достигается с помощью изменения задержки между сигналами зуммера пропорционально расстоянию до препятствия. Поскольку функция задержки delay () в Arduino не допускает использование переменной в качестве входного параметра мы для организации изменяющихся задержек будем использовать специальный цикл:
1 2 3 4 5 6 7 8 9 10 |
if (dist<50) { Serial.print(dist); Serial.println("Object Alert"); digitalWrite(Buzz,HIGH); for (int i=dist; i>0; i--) delay(10); digitalWrite(Buzz,LOW); for (int i=dist; i>0; i--) delay(10); } |
Более подробно об измерении расстояния с помощью платы Arduino и ультразвукового датчика можно прочитать в этой статье.
Программа может быть легко изменена под ваши параметры с помощью изменения значений соответствующих переменных.
Работа проекта
Наконец, настало время протестировать работу проекта. Удостоверьтесь в том, что все необходимые соединения в схеме сделаны, и программа успешно загружена в плату Arduino. После этого подайте питание на обе схемы с помощью батареек 9 В и после этого вы должны уже начать наблюдать результаты работы проекта. Пододвиньте препятствие к ультразвуковому датчику на расстояние менее 50 см – после этого вы должны услышать сигнал зуммера, частота звучания сигнала зуммера будет возрастать по мере дальнейшего сокращения расстояния между препятствием и ультразвуковым датчиком. Если рядом с устройством слишком темно или слишком светло, то также будет звучать предупреждающий сигнал зуммера. Если все нормально, то сигнал зуммера звучать не будет.
Когда вы будете нажимать кнопку на "пульте удаленного управления" тростью зуммер будет издавать продолжительный сигнал. Мы смонтировали наше устройство на небольшой трости для демонстрации работы проекта, вы можете использовать для этой цели более длинную трость.
Если ваш зуммер постоянно издает звуковой сигнал это значит что какая то из анализируемых тревог срабатывает ложно (то есть ее на самом деле нет, а она срабатывает). В этом случае вам необходимо посмотреть на данные, печатаемые в окне монитора последовательной связи, и на основе анализа этих данных определить в чем кроется ошибка при работе проекта.
Более подробно работа проекта показана на видео, приведенном в конце статьи.
Исходный код программы
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 82 83 84 85 86 87 88 |
/* * Program for Blind Man Stick * Code by B.Aswinth Raj * Dated: 03-11-2017 * Website: http://www.circuitdigest.com/ */ const int trigger = 3; //Trigger pin ультразвукового датчика const int echo = 2; //Echo pin ультразвукового датчика const int Buzz = 13; //к этому контакту подключен зуммер const int Remote = A0; // к этому контакту подключен выход радиочастотного приемника const int Light = A1; // к этому контакту подключен фоторезистор long time_taken; int dist; int Signal; int Intens; int similar_count; void setup() { Serial.begin(9600); pinMode(Buzz,OUTPUT); digitalWrite(Buzz,LOW); pinMode(trigger, OUTPUT); pinMode(echo, INPUT); } /*###функция для расчета расстояния###*/ void calculate_distance(int trigger, int echo) { digitalWrite(trigger, LOW); delayMicroseconds(2); digitalWrite(trigger, HIGH); delayMicroseconds(10); digitalWrite(trigger, LOW); time_taken = pulseIn(echo, HIGH); dist= time_taken*0.034/2; if (dist>300) dist=300; } void loop() { //бесконечный цикл calculate_distance(trigger,echo); Signal = analogRead(Remote); Intens = analogRead(Light); //проверяем нажата ли кнопка на передающей части int temp = analogRead(Remote); similar_count=0; while (Signal==temp) { Signal = analogRead(Remote); similar_count++; } //если кнопка нажата if (similar_count<100) { Serial.print(similar_count); Serial.println("Remote Pressed"); digitalWrite(Buzz,HIGH);delay(3000);digitalWrite(Buzz,LOW); } //если очень темно if (Intens<200) { Serial.print(Intens); Serial.println("Bright Light"); digitalWrite(Buzz,HIGH);delay(200);digitalWrite(Buzz,LOW);delay(200);digitalWrite(Buzz,HIGH);delay(200); digitalWrite(Buzz,LOW);delay(200); delay(500); } //если очень светло if (Intens>800) { Serial.print(Intens); Serial.println("Low Light"); digitalWrite(Buzz,HIGH);delay(500);digitalWrite(Buzz,LOW);delay(500);digitalWrite(Buzz,HIGH);delay(500); digitalWrite(Buzz,LOW);delay(500); } if (dist<50) { Serial.print(dist); Serial.println("Object Alert"); digitalWrite(Buzz,HIGH); for (int i=dist; i>0; i--) delay(10); digitalWrite(Buzz,LOW); for (int i=dist; i>0; i--) delay(10); } //Serial.print("dist="); //Serial.println(dist); //Serial.print("Similar_count="); //Serial.println(similar_count); //Serial.print("Intens="); //Serial.println(Intens); } |
Здравствуйте, к сожалению схема не заработала, броблемы с кодом , ошибка кажется в нем
Вся схема собрана но не работает, что делаеть? Помогите пожалуйста
Здравствуйте, что конкретно не работает, можете сказать? Какие ошибки выдаются при ее работе? Не работает передающая или приемная часть схемы?
Извините, можно спросить пожалуйста, не очень понятно с радиопередатчиком, почему в схеме 8 ножек , а мы покупали по необходимым компонентам а там 4
Наверное, вы имели ввиду приемник. У микросхемы на приемном модуле действительно 8 ножек, но на выход модуля выходит всего 4 ножки. Посмотрите внимательнее на схему - на ней несколько однотипных выводов объединяются в один вывод. И на представленных фото конструкции проекта посмотрите - у приемного модуля всего 4 ножки.
Здравствуйте, а можно ли ардуино нано поменять на Уго??
Добрый вечер. А Уго это что? Не совсем понял. Любой микроконтроллер подойдет, имеющий хотя бы один контакт с АЦП (аналоговый контакт).
Где можно купить все детали для трости?Есть такой магазин?А может можно купить собраный вариант? Прошу подсказать.Спасибо.
Все детали для этой трости можно купить на AliExpress, но идти они будут до вас 1-2 месяца. По другим магазинам, пока, к сожалению, не очень хорошо ориентируюсь. Чтобы собранный вариант такой трости где-нибудь продавался, пока тоже не встречал
А собранная трость есть? Можно купить?
К сожалению собранного варианта нет. Статья является переводом с иностранного сайта и поскольку она не пользуется популярностью на моем сайте, то этот проект я лично не собирал