Ультразвуковой человекомашинный интерфейс :)

unclesam
unclesam аватар
Offline
Зарегистрирован: 27.05.2012

Проект называется HALO (Haptic Assisted Locating of Obstacles) и состоит в создании обруча с ультразвуковыми дальномерами (в количестве 5 штук), которые подключаются к контроллеру Arduino Mega, который в зависимости от расстояния управляет пятью вибромоторчиками, закреплёнными на том же обруче. 
Интенсивность и частота вращения моторчиков напрямую зависит от расстояния до объекта.
Тем самым, человек с данным обручен на голове может ориентироваться в пространстве с закрытыми глазами :) ссылка на видео http://www.youtube.com/watch?feature=player_embedded&v=hfXs5rhwCfE

Страничка проекта http://www.instructables.com/id/Haptic-Feedback-device-for-the-Visually-Impaired/

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

Евгений74
Offline
Зарегистрирован: 08.05.2012

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

unclesam
unclesam аватар
Offline
Зарегистрирован: 27.05.2012

Евгений74... Можно по подробней што именно за плата Ардуино.... уз дальнометр, вибромотор, я в этом деле чайник((((((( 

Евгений74
Offline
Зарегистрирован: 08.05.2012

 robocraft.ru/blog/projects/396.html вот эта статья на робокрафте, там же инструкция по созданию на английском, там же все об УЗ датчиках. Вибромоторы есть в сотовых телефонах, производят вибрацию при звонке. Можно взять в любой мастерской по 100 руб.

nestandart
nestandart аватар
Offline
Зарегистрирован: 15.06.2011

>>Евгений74... Можно по подробней што именно за плата Ардуино.... уз дальнометр, вибромотор, я в этом деле чайник<<

Не рано ли "Чайнику" такие темы поднимать ?

У вас это праздный интерес ?

maksim
Offline
Зарегистрирован: 12.02.2012

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

maksim
Offline
Зарегистрирован: 12.02.2012

Принцип действия, исполнение и код давольно просты.

unclesam
unclesam аватар
Offline
Зарегистрирован: 27.05.2012

maksim расскажите в подробностях о том что необходимо для сборки даного устройства...... вот почтовый ящик batnikk9@gmail.com 

maksim
Offline
Зарегистрирован: 12.02.2012

Для проекта с одним дальномером нужно:

дуина

дальномер HC-SR04


 

вибратор


 

или такой вибратор

или вовсе самому сделать.


 

maksim
Offline
Зарегистрирован: 12.02.2012

Подключать так

Код

#define Trig_pin 10
#define Echo_pin 12
#define Vibro_pin 13

int dist_cm, vibro_delay = 0;
unsigned long micros_new, micros_old, millis_old = 0;

void setup(){
  pinMode(Vibro_pin, OUTPUT);
  pinMode(Trig_pin, OUTPUT);
}

void loop(){
  digitalWrite(Trig_pin, HIGH);
  delayMicroseconds(10);
  digitalWrite(Trig_pin, LOW);
  micros_new = micros() + 500;
  while(!digitalRead(Echo_pin) && micros() < micros_new){
  }
  micros_old = micros();
  micros_new = micros() + 30000;
  while(digitalRead(Echo_pin) && micros() < micros_new){
  }
  dist_cm = (micros() - micros_old)/29.0/2;  // Вычисляем дистанцию до припятствия
  vibro_delay = map(dist_cm, 100, 400, 3000, 50);// Чем ближе припятствие, тем меньше задержка. 
  vibro_delay = constrain(vibro_delay, 50, 3000);
  delay(50);
  if(millis()-millis_old > vibro_delay){    
    digitalWrite(Vibro_pin, HIGH);
    delay(200);
    digitalWrite(Vibro_pin, LOW);
    millis_old = millis();
  }
}

Импульсы на вибромотор длительностью 200 млс. Задержка между импульсами от 1/20 секунды до 3 секунд зависит от дистанции от 1 м до 4 м соответственно. Можно управлять и скоростью вибромотора (это еще проще), но как мне кажется в этом случае слишком мал диапазон вибраций, который сможет различать человек.

Евгений74
Offline
Зарегистрирован: 08.05.2012

 maksim А вроде ведь можно менять скорость моторов, и вибрация будет соответсвенно больше или меньше. Вот как то так:                digitalWrite(Vibro_pin, dist_cm*0,084); исходя из того, что максимальная скорость задается как 254 при дистанции 3000 см.. Или я ошибаюсь

maksim
Offline
Зарегистрирован: 12.02.2012

Да можно, я уже выше сообщение подредакрировал.  Тогда нужно подключиться к любому свободному ШИМ выводу например к 11 и тогда код примерно будет таким:

#define Trig_pin 10
#define Echo_pin 12
#define Vibro_pin 11

int dist_cm, vibro_delay = 0;
unsigned long micros_new, micros_old, millis_old = 0;

void setup(){
  pinMode(Vibro_pin, OUTPUT);
  pinMode(Trig_pin, OUTPUT);
}

void loop(){
  digitalWrite(Trig_pin, HIGH);
  delayMicroseconds(10);
  digitalWrite(Trig_pin, LOW);
  micros_new = micros() + 500;
  while(!digitalRead(Echo_pin) && micros() < micros_new){
  }
  micros_old = micros();
  micros_new = micros() + 30000;
  while(digitalRead(Echo_pin) && micros() < micros_new){
  }
  dist_cm = (micros() - micros_old)/29.0/2;  // Вычисляем дистанцию до припятствия
  vibro_delay = map(dist_cm, 100, 400, 255, 50);// Чем ближе припятствие, тем меньше задержка. 
  vibro_delay = constrain(vibro_delay, 50, 255);
  delay(50);
  analogWrite(Vibro_pin, vibro_delay);
}

 

maksim
Offline
Зарегистрирован: 12.02.2012

И еще, хоть вибромотор и мало кушает, но его желательно поднключать через транзистор, а тем более во втором случае при использовании ШИМа. 

unclesam
unclesam аватар
Offline
Зарегистрирован: 27.05.2012

А как теперь привезать пять дальнометров к одной ардуинки.... ?????? 

maksim
Offline
Зарегистрирован: 12.02.2012

Просто, функциями... а вот когда у вас эти 5 дальномеров и 5 вибраторов будут....?

#define Trig_pin_1 2
#define Echo_pin_1 4
#define Vibro_pin_1 3

#define Trig_pin_2 7
#define Echo_pin_2 8
#define Vibro_pin_2 5

#define Trig_pin_3 11
#define Echo_pin_3 12
#define Vibro_pin_3 6

#define Trig_pin_4 A0
#define Echo_pin_4 A1
#define Vibro_pin_4 9

#define Trig_pin_5 A2
#define Echo_pin_5 A3
#define Vibro_pin_5 10


void setup(){
  pinMode(Trig_pin_1, OUTPUT);
  pinMode(Trig_pin_2, OUTPUT);
  pinMode(Trig_pin_3, OUTPUT);
  pinMode(Trig_pin_4, OUTPUT);
  pinMode(Trig_pin_5, OUTPUT);
  pinMode(Vibro_pin_1, OUTPUT);
  pinMode(Vibro_pin_2, OUTPUT);
  pinMode(Vibro_pin_3, OUTPUT);
  pinMode(Vibro_pin_4, OUTPUT);
  pinMode(Vibro_pin_5, OUTPUT);
}

void loop(){
  Vibro(Trig_pin_1, Echo_pin_1, Vibro_pin_1);
  Vibro(Trig_pin_2, Echo_pin_2, Vibro_pin_2);
  Vibro(Trig_pin_3, Echo_pin_3, Vibro_pin_3);
  Vibro(Trig_pin_4, Echo_pin_4, Vibro_pin_4);
  Vibro(Trig_pin_5, Echo_pin_5, Vibro_pin_5);
}

void Vibro(int Trig_pin, int Echo_pin, int Vibro_pin){

  int dist_cm, vibro_delay = 0;
  unsigned long micros_new, micros_old, millis_old = 0;

  digitalWrite(Trig_pin, HIGH);
  delayMicroseconds(10);
  digitalWrite(Trig_pin, LOW);
  micros_new = micros() + 500;
  while(!digitalRead(Echo_pin) && micros() < micros_new){
  }
  micros_old = micros();
  micros_new = micros() + 30000;
  while(digitalRead(Echo_pin) && micros() < micros_new){
  }
  dist_cm = (micros() - micros_old)/29.0/2;  // Вычисляем дистанцию до припятствия

  vibro_delay = map(dist_cm, 100, 400, 255, 50);// Чем ближе припятствие, тем меньше задержка. 
  vibro_delay = constrain(vibro_delay, 50, 255);

  analogWrite(Vibro_pin, vibro_delay);
  delay(20);
}

 

 

maksim
Offline
Зарегистрирован: 12.02.2012

А вместо транзисторов можно будет использовать например ULN2003

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

 А я вообще не очень понимаю в чем вопрос-то? В стартовом посте дана ссылка где проект расписан настолько подробно, насколько возможно. И все запчасти, и пошаговая инструкция, и фото, и видео, и скетчи.

По поводу чего нужно высказать мысли точнее? 

Где искать слепых людей которым можно сделать подобный подарок? Ну наверное в обществе слепых.

Кстати я думаю можно сделать более упрощенную версию, и более близкую к применения в боевых условиях реальными слепыми. Не на голову скафанд лепить, а модифицировать привычную слепым тросточку. На конец поставить сенсор, а вибратор - в ручку или на запястье (что-бы не увеличивать вес трости). Тогда, по сравнению с обычной тростью у нее как-бы увеличится "область обзора". Появится возможность видеть не прикасаясь к предметам, на расстоянии нескольких десятков сантиметров.

 

Где еще можно применить подобную вещь? Насколько я знаю подобные подход пробовали применить для пилотов истребителей. Когда происходит перегруз от количества визуальной информации и нужно искать другие интуитивные каналы. Два подобных вибро (или вообще тупо слегка током били) - ставили на поясницу, и выводили на них крен самолета или скольжение.  В домашних условиях нечто подобное можно попытатся сделать для какого-нибудь хардкорного автосимулятора. Передавать "попой чую что счас колеса в срыв пойдут" ;) 

 

 

unclesam
unclesam аватар
Offline
Зарегистрирован: 27.05.2012

О с тростью классная идея))))) Огромное спасибо)))

 

maksim
Offline
Зарегистрирован: 12.02.2012

Да, только сейчас посмотрел ссылку, там же все подробно расписано... 

maksim
Offline
Зарегистрирован: 12.02.2012

Да, с тростью идея хорошая. Тогда нужен 1 дальномер и 1 вибромотор и можно все это дело в трость встроить или отдельным устройством собрать. И тогда для этого можно использовать не атмегу, а аттини.

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

26rus
26rus аватар
Offline
Зарегистрирован: 03.05.2011