Перчатка для ориентирования в пространстве на 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д принтере . 


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

Радиоуправляемый танк на Arduino Робот танк т100 шасси для сборки машины танка на ардуино arduino

Радиоуправляемый танк на Arduino Робот танк т100 шасси для сборки машины танка на ардуино arduino

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

1 100грн.

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

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

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

140грн.

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