Сенсор дистанції SHARP - датчик перешкод

Використання датчиків різної дії для побудови детекторів перешкод, сонарів, вимірювання товщини та відстані до обєктів. Ультравукові, оптичні, фотоелектричні датчики відстані
Відповісти
Аватар користувача
Arduino
Site Admin
Повідомлень: 98
З нами з: 16 травня 2017 18:18

Сенсор дистанції SHARP - датчик перешкод

Повідомлення Arduino » 29 травня 2017 13:22

Сенсор дистанції SHARP правильніше назвати детектором відстані. Як підключати та отримати дані? Ці дані - є відстань. Сенсор вміє визначати конкретне значення дистанції з непоганою точністю (до 1-3 мм)
distanse-sharp.jpg
У цьому прикладі ми тестуємо датчики Sharp (датчиків відстані), побачимо особливості, з'єднання і практичне застосування цих датчиків, аналізуємо відмінності між датчиками GP2Y0A21, GP2Y0A02, GP2Y0A710 серед інших. Вимірювання і калібрування робимо для читання у "см".
SHARP датчик являє собою оптичний датчик, здатний вимірювати відстань між собою і об'єктом за допомогою інфрачервоного передавача і приймача з використанням тріангуляції виміру відстані. Метод тріангуляції для вимірювання одного з кутів, утворених трикутником емітерного об'єкта-приймач, приймач тапозиційно-чутливий детектор.

Датчик ====================== параметр відстані
GP2Y0A21 --------------------------- 10-80 cm
GP2Y0A02 --------------------------- 20 -150 cm
GP2Y0A710 ------------------------- 100 - 550 cm

Вихідний сигнал датчика не є лінійним.
distanse-sharp2.jpg
Зверніть увагу, що для малих відстаней, показання датчика може бути помилково прийняте за велику відстань. Тому бажано, щоб гарантувати, що об'єкт не занадто близько до датчика для того, щоб уникнути неправильного прочитання. Хороший варіант для розміщення датчика - позаду краю або положення спочатку кривої графіка що ви хочете виміряти (див малюнок). Наприклад, якщо наш датчик GP2Y0A21, то механічно обмежують 10см зону в якій датчик поводиться нестабільно.
distanse-sharp3.jpg
Підключення датчика між Sahrp і Arduino

SENSOR SHARP ============= ARDUINO
Vout ------------------------------ A0
GND ------------------------------ GND
Vcc ------------------------------ 5V
До з'єднання може бути підключений електролітичний конденсатор 10 мкФ або більше між Vcc і GND, але як можна ближче до датчика, це для того, щоб усунути джерела шуму що генерується датчиком.

SHARP датчик підключається до аналоговий вихід з Arduino, так само, як би ми працювали з потенціометром.
distanse-sharp4.jpg
Слід зазначити що рівень шумів (хибних показів) є дуже великим.
Для уникнення цього використовуються цифрові фільтри, як на прикладі нижче:

Код: Виділити все

void setup() {
  // // Серйозні зв'язку зі швидкістю 9600 бод
  Serial.begin(9600);
}


void loop() {
  // Ми читаємо середній аналоговий вхід 0 
  int ADC_SHARP=ADC0_promedio(20);
 
  Serial.println(ADC_SHARP);
  delay(10);
}

int ADC0_promedio(int n)
{
  long suma=0;
  for(int i=0;i<n;i++)
  {
    suma=suma+analogRead(A0);
  }  
  return(suma/n);
}
у фільтрі використовується 20 значень для ітерації, але кожен вимір зсуває точність шкали часу. Тому ци не вигідно для швидких процесів виміру

Виявлення перешкод: датчик наближення

SHARP датчик найбільш часто використовується для виявлення перешкод Він працює таким так само, як датчик близькості . Але нас цікавить не просто знати, якщо є будь-який об'єкт перед нами, але конкретну відстань до нього. У цьому випадку ми повинні спочатку визначити відстань, на яку ми хочемо вважати, що об'єкт знаходиться поруч. У цьому прикладі ми будемо працювати в якості порога 30 см, але ви можете взяти будь-яку іншу відстань.
Наступним кроком буде використання лінійку і місцезнаходження об'єкта в передній частині датчика точно на 30 см, відстань вимірюється від датчика об'єктива. За допомогою першого прикладу вище ми вивчили читання відповідних даних відстані АЦПА: У нашому випадку значення 195 (30 см) дивитись графік чутливості.

Скет нижче показує приклад використання Sahrp в якості детектора перешкод або безконтактного датчика

Код: Виділити все

void setup() {
  // зв'язку зі швидкістю 9600 бод
  Serial.begin(9600);
  pinMode(13, OUTPUT);
}


void loop() {
  // Ми читаємо середній аналоговий вхід 0:
  int ADC_SHARP=ADC0_promedio(20);
  if(ADC_SHARP>195)
  {
    digitalWrite(13, HIGH);
    Serial.print("об'єкт Виявлено:");
  }
  else
  {
    digitalWrite(13, LOW);
    Serial.print("об'єкт відсутній:");
  }
  
  Serial.println(ADC_SHARP);
  delay(10);
}

int ADC0_promedio(int n)
{
  long suma=0;
  for(int i=0;i<n;i++)
  {
    suma=suma+analogRead(A0);
  }  
  return(suma/n);
}
Зміну значення 195 можна збільшити або зменшити порігом виявлення. У нашому прикладі ми тільки міняємо світло світлодіоду, який підключений до контакту 13 і підтверджений через послідовний порт при виявленні об'єкту, але це буде залежати від вашого застосування. Тоді вихідний сигнал послідовного монітора відображається, коли об'єкт наближається до датчику на задану відстань.

Виконання вимірювання відстані з датчиком Sharp та нелінійність характеристики

В межах ділянки графіку діапазону датчика спостерігається така залежність:
distanse-sharp5.jpg
distanse-sharp5.jpg (2.16 Кіб) Переглянуто 559 разів
Напруги і значення АЦП ми читаємо з Arduino пропорційно. на основі даних (графіку) отримаємо рівняння на основі значення АЦП, це для того, щоб зберегти розрахунок лінійності по Arduino для напруги. Так що для нас, «х» значення АЦП Приклад 1, але врахувавши більшу кількість вимірів, щоб видалити шум, нобхідно взяти мінімум два вимірювання або точки. Ці точки не повинні бути дуже близько, наприклад, 15 см і 50 см показань датчика для SHARP GP2YA021. Ці дві точки виміру є: X1 = 350 до L1 = 15 см та Х2 = L2 = 129 до 50 см Підставляючи ці значення в рівняння, ми можемо сформувати систему рівнянь і знайти змінні «а» і «б»

Математичні перетворення надають формулу залежності відстані від показів датчика SHARP (для моделі GP2YA021)
distanse-sharp6.jpg
distanse-sharp6.jpg (5.62 Кіб) Переглянуто 559 разів
Той самий метод може бути застосований до інших моделей SHARP датчиків.

Скетч Тут щоб відчути дистанцію і час виміру:

Код: Виділити все

void setup() {
  // зв'язок зі швидкістю 9600 бод
  Serial.begin(9600);
  pinMode(13, OUTPUT);
}


void loop() {
  
  long tiempo=millis(); //час, перш ніж ви почнете читати
  int D_cm=distancia(20); //зчитування  відстані 
  tiempo=millis()-tiempo; //мілісекунди, які пішли на читання
  Serial.print("час читання: ");
  Serial.print(tiempo); 
  Serial.print("ms  Відстань: ");
  Serial.print(D_cm);
  Serial.println("  cm");
  delay(100);
}

float distancia(int n)
{
  long suma=0;
  for(int i=0;i<n;i++)
  {
    suma=suma+analogRead(A0);
  }  
  float adc=suma/n;
  float distancia_cm = 17569.7 * pow(adc, -1.2062);
  return(distancia_cm);
}
Як видно тільки попередньо обчислені і в доповненні до цього показує час в мілісекундах, який потрібно для виконання читання. Це дає можливість оцінити як часто ми можемо звертатися у програмі до датчика.
distanse-sharp65.jpg
Так само можна працювати з іншими моделями SHARP, якщо ви працюєте з SHARP GP2Y0A02 повинен отримати рівняння наближеним до цього:
distanse-sharp7.jpg
distanse-sharp7.jpg (4.53 Кіб) Переглянуто 559 разів

Відповісти

Повернутись до “Модулі детекції першкод, переміщення, відстані”