Перчатка для ориентирования в пространстве на 2х ультразвуковых датчиках HC-SR04 и ARDUINO

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

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


Haptic Glove

Основные компоненты для сборки :




Прототип перчатки для людей с ограниченными возможностями :

Tacit The Haptic Sonar Glove: Hardware

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

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


И так сама перчатка одевается через большой палец и дальше одним оборотом закрепляется на запястье , с помощью липучки . Таким образом перчатку легко одевать и снимать .

Tacit, The Sonar Glove (Internal Electronics)

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


Этот проект сможет повторить каждый желающий , дальше добавляю список компонентов для сборки , а так же схемы :

1. Arduino PRO mini http://ali.pub/2983qg   так же можно использовать НАНО http://ali.pub/2983uj  

2.  2 штуки Сервоприводы SG-90 (с переходными рычагами)  http://ali.pub/2983y1  

3. 2 штуки Ультразвуковые датчики SR-04  http://ali.pub/298442 

4. Провода для макетирования и пайки http://ali.pub/29849b  

5. аккумулятор http://ali.pub/2984hv  

6.Преобразователь с 3.7 на 5 в http://ali.pub/2984ld  

7. Зарядка для акб http://ali.pub/2984o3  



КОд : 

#include 
const int MaxSensors = 2;                     // Количество сенсоров .
const int ServoPins[MaxSensors] = {7, 8};     // Пины для подключения серво 
const int RangingPins[MaxSensors] = {3, 2};   // Пины для подключения датчиков SR
const int ReadingsPerSensor = 5;              //  Значение позиционировани.
const int TimePerDegree = 9;                  //
const int MinimumTurnDistance = 3;            // Защита от дребезга , минимальное значение для поворота на 1*

// Variables
Servo ServoList[MaxSensors];                         
int sensorReadings[MaxSensors][ReadingsPerSensor];   // Удержание показаний каждого датчика
int calculatedSenorReadings[MaxSensors];             // Определение расстояния для каждого датчика
int latestReading = 0;                               //Текущая позиция в массиве для последнего чтения.
int servoLocations[MaxSensors];                      //Позиционированние серво.
int SenorClose = 500;                                // Фиксация минимального растояния - отклик .)
int SensorFar = 14000;                               // Дальнее растояние . Отклик звуковых серсоров PING sensor. (Прохождение звуковой волны.)
int ServoClose[MaxSensors] = {0, 160};               // Угол поворота первой сервы.
int ServoFar[MaxSensors] = {70,110};                 // Угол поворота сервы - можно корректировать .

void setup() {

  //Serial.begin(115200);                   // Для отображения данных и настройки убрать // .
  //Serial.println("Begin...");

  // Initialize the servo location and move them through a full range of motion so we know they work.
  for (int i = 0; i < MaxSensors; i++){
     ServoList[i].attach(ServoPins[i]);
     delay(10);
     ServoList[i].write(ServoClose[i]);
     delay(500);
     ServoList[i].write(ServoFar[i]);
     delay(500);
     ServoList[i].detach();
   }
   delay(100);

}

void loop(){
  int i, j, oldLocation;
  unsigned long delayTime;

  // Loop through each range sensor
  for (i = 0; i < MaxSensors; i++){     // Get the current sensor's range.     sensorReadings[i][latestReading] = getDistance(i);     // Figure out an averaged/smoothed readings based on this and past data.     calculatedSenorReadings[i] = calculateNewDistace(i);     // Set the servo to the correct angle.     oldLocation = servoLocations[i];     servoLocations[i] = map(calculatedSenorReadings[i], 0, 100, ServoClose[i], ServoFar[i]);     if (latestReading >= ReadingsPerSensor-1){                          // Don't do anything until we have enough data to trend.
      if (abs(servoLocations[i]-oldLocation) >= MinimumTurnDistance){   // Only try to turn it if we have somewhere to go.
          ServoList[i].attach(ServoPins[i]);
          delay(10);
          ServoList[i].write(servoLocations[i]);
          delayTime = (TimePerDegree * (abs(servoLocations[i]-oldLocation))+20);      // Set a delay for the next reading so motor noise doesn't interfere with senor readings.
          if (abs(delayTime)>500){ // If it can't do it in this amount of time       // It's based on how far it has to turn to keep the delay to a minimum, response time at a maximum.
            delayTime=500;         // we'll get it next time. Keep it responsive.
          }
          delay(delayTime);
          ServoList[i].detach();
      } else {                                          // Otherwise if the reading hasn't changed enough write the old value to
          ServoList[i].attach(ServoPins[i]);            // the servo so that it will hold in place if it's applying pressure.
          delay(10);
          ServoList[i].write(oldLocation);
          delay(50);         
          ServoList[i].detach();   
          servoLocations[i]=oldLocation;
      }
    }
    delay(20); // Added to fix left sensor misbehavior reported by Rob.
  }

  latestReading++; // Increment the reading counter so we know where we're at.
  if (latestReading >= ReadingsPerSensor){  // Make sure we don't record more readings than we have space to hold.
    latestReading = ReadingsPerSensor-1;
    // Pop the oldest reading off the list.
    for (i = 0; i < MaxSensors; i++){
      for (j=0; j < ReadingsPerSensor-1; j++){         sensorReadings[i][j] = sensorReadings[i][j+1];       }     }   } } // function: calculateNewDistace(sensorNumber: Which sensor's data to process): Calculated distance in 0-100 range. // Apply some averaging and smoothing to the recorded distance readings // to take care of noisy data. int calculateNewDistace(int sensorNumber){   int output = SensorFar;                      // Default value is the furthest distance.   float weightingFactor = 0.5;                 // How fast the reading's importance tapers off in time. (1= no taper, 0 = divide by zero error.)   float flickerFactor = 30;                    // When the change is greater than this, ignore it unless its two in a row. (It's probably noise.)   if (latestReading >= ReadingsPerSensor-1) {  // Only do this if we have a full set of readings to sample.
    int total = 0;                             // Average them with a weighting.
    float currentWeight = 1;                   // New readings count more than older readings.
    float percentagePossible = 0;
    boolean flickered = false;
    for (int i=ReadingsPerSensor-1; i >=0 ;i--){   // Check for flicker (This reduces jitter with something right on the threshold.)
      flickered = false;
      if (i==ReadingsPerSensor-1){
        if ((abs(sensorReadings[sensorNumber][i])-abs(sensorReadings[sensorNumber][i-1]) > flickerFactor) &&
           (abs(sensorReadings[sensorNumber][i-1])-abs(sensorReadings[sensorNumber][i-2]) > flickerFactor)){
          flickered = true;
        }
      }
      if (flickered==false){
        total += (sensorReadings[sensorNumber][i] * currentWeight);
        percentagePossible += currentWeight;
        currentWeight *= weightingFactor;
      }
    }
    output = total / percentagePossible;
  }
  return output;
}
// function: getDistance
// Take a sensor number (not pin number) and returns an int in the 0-100 range
// 0 = closest, 100= furthest.  (It's a percentage of the distance that the software
//
// Note: Function is designed to be generic so that it can be swapped out for
//       different kinds of ranging sensors.
//       This version of the function is made for Parallax PING))) sensors
//       For more info see http://arduino.cc/en/Tutorial/Ping
//                     and http://www.parallax.com/tabid/768/ProductID/92/Default.aspx
int getDistance(int sensorNumber){
  long duration;   // How long it takes a sonic pulse to reflect back.
  int out;         // The value we send back from the function

  // Initialize the sensor and tell it to send out a ping.
  pinMode(RangingPins[sensorNumber], OUTPUT);
  digitalWrite(RangingPins[sensorNumber], LOW);
  delayMicroseconds(2);
  digitalWrite(RangingPins[sensorNumber], HIGH);
  delayMicroseconds(5);
  digitalWrite(RangingPins[sensorNumber], LOW);

  // Read the time in milliseconds until the value comes back.
  pinMode(RangingPins[sensorNumber], INPUT);
  duration = pulseIn(RangingPins[sensorNumber], HIGH);

  // Trim the data into minimums and maximums and map it to the 0-100 output range.
  duration = constrain(duration, SenorClose, SensorFar);
  out = map(duration,  SenorClose, SensorFar, 0, 100);
  return out;
}//
Подписывайся на Geek каналы :

➤ VK - https://vk.com/denis_geek

➤ VK - https://vk.com/club_arduino

➤ VK - https://vk.com/chinagreat

➤ VK - https://vk.com/solar_pover

➤ VK - https://vk.com/my_vedroid

➤ VK - https://vk.com/3dprintsumy

➤ Youtube - http://www.youtube.com/c/Danterayne



★ Моя партнёрка с Aliexpress ★

http://ali.pub/1j9ks1 

★ Получай 10.5% скидку с любой покупки на Aliexpress! ★

http://ali.pub/1lx67o

★ Полезное браузерное приложение для кэшбэка  ★

  • Перчатка для ориентирования в пространстве на 2х ультразвуковых датчиках HC-SR04 и ARDUINO

Похожие статьи

Станок для раскраски яиц на пасху

Станок для раскраски яиц на пасху

В предверии пасхи родилась идея сделать станок для раскраски яиц. Так же, конструкция позволяет раскрашивать и другие круглые объекты размером от 4 до 9 сантиметров.

Для изготовления робота я использовал 3d принтер и arduino для управления движениями.

 Подключение OLED I2C дисплея с размером экрана 0,96″ и разрешением 128*64 точек к плате Arduino UNO.

Подключение OLED I2C дисплея с размером экрана 0,96″ и разрешением 128*64 точек к плате Arduino UNO.

Сегодня мы рассмотрим подключение OLED I2C дисплея с размером экрана 0,96″ и разрешением 128*64 точек к плате Arduino UNO.

Сборка дешевого 3д принтера из фанеры Grabber i3 Часть 2 механика

Сборка дешевого 3д принтера из фанеры Grabber i3 Часть 2 механика

В этом видео я покажу как собрать и установить элементы для 3д принтера Graber i3 из фанеры - механика ! 

Часы плоттер на ардуино или arduino-робот рисует маркером текущее время в режиме реального времени

Часы плоттер на ардуино или arduino-робот рисует маркером текущее время в режиме реального времени

Arduino-робот Plotclock рисует рисует последовательность цифр, отображающей текущее время  в 24-часовом формате .Собрать такого робота часовщика можно самому

на базе ардуино , 3х сервоприводов и конечно нужны будут детали напечатанные на 3д принтере . 


Электроника с китая полезные платы и модули устройства которые я использую

Электроника с китая полезные платы и модули устройства которые я использую

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

Рекомендуемые товары

Шасси для сборки  - Робот танк т100 шасси для сборки машины танка на ардуино arduino

Шасси для сборки - Робот танк т100 шасси для сборки машины танка на ардуино arduino

Механическая платформа для сборки робота , моторы 2 штуки 12 в 350 оборотов  в комплекте(Цвет с..

900грн.

Arduino UNO R3 Atmega328  ATmega328P smd AVR Ардуино Уно Р3 с кабелем для подключения USB

Arduino UNO R3 Atmega328 ATmega328P smd AVR Ардуино Уно Р3 с кабелем для подключения USB

На этой платформе стоит точно такой же процессор как и на классической версии, отличие формфактор(ти..

140грн.

Плата четырёх-ядерный мини ПК с Wi-Fi

Плата четырёх-ядерный мини ПК с Wi-Fi

Orange Pi Lite — одноплатный микрокомпьютер с четырёх-ядерным процессором ARM Cortex-A7 H3 . Эт..

600грн.

Wi-Fi модуль NodeMCU V3 ESP8266 (CH340)

Wi-Fi модуль NodeMCU V3 ESP8266 (CH340)

NodeMCU представляет собой плату разработчика на базе чипа ESP8266 (версия ESP12..

130грн.

Теги: HC-SR04, Перчатка для ориентирования в пространстве, на 2х ультразвуковых датчиках, HC-SR04, ARDUINO, сделай сам, denis_geek, clubarduino, club_arduino, diy servo, projects, проекты, ардуино, сделай сам, 2018 arduino