датчик шарп 2Y0A21

artemon123
Offline
Зарегистрирован: 03.01.2016

здравствуйте подскажите пожалуйста как считывать данные с датчика шарп 2Y0A21 зарание спасибо !!

(мне нужна программа)

artemon123
Offline
Зарегистрирован: 03.01.2016

если можно рпспишиите по детально

 

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011

Посмотрите кино........

https://www.youtube.com/watch?v=GKa_gkkK8SA

Запустите примеры......

https://github.com/jeroendoggen/Arduino-GP2Y0A21YK-library
http://playground.arduino.cc/Main/SharpIR
https://github.com/guillaume-rico/SharpIR
 

Будут вопросы- задавайте.....

artemon123
Offline
Зарегистрирован: 03.01.2016

а шарп 0a41sk f 4z также прописывать ?

 

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011

Я буду у вас гуглем подрабатывать......

https://www.google.ru/?gws_rd=ssl#newwindow=1&q=gp2y0a41sk0f+arduino

https://github.com/jeroendoggen/Arduino-distance-sensor-library

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

_mikka
Offline
Зарегистрирован: 01.11.2015

Привет, сам невдано работал с этим датчиком, не забудь парраллельно питанию датчика потавить кондер 200-400 мкФ.

// SHARP_2Y0A21.h

#ifndef _SHARP_2Y0A21_h
#define _SHARP_2Y0A21_h

#if defined(ARDUINO) && ARDUINO >= 100
	#include "arduino.h"
#else
	#include "WProgram.h"
#endif
// длина массива, для медианной фильтрации
#define ARRLEN 5      

class SHARP_2Y0A21
{
  //public:
    //SHARP_2Y0A21(const SHARP_2Y0A21&);
    //SHARP_2Y0A21& operator=(const SHARP_2Y0A21&);

  public:
    
    void  init (byte bPort);//: _iS ensorPort(port);
    word  wGetDistanceRaw();
    word  wGetDistanceMiddle();
    byte  bGetDistanceSm();
    
  private:
    word   _wArrRawData[ARRLEN];
    byte   _bSensorPort;
    byte   _bMeasureCntr;
                                         
    word   middle();
    
};

#endif

// обработка показаний с датчика SHARP 2Y0A21
// класс реализует медианный фильтр 
// и преобразование показаний датчика в сантиметры
 
#include "SHARP_2Y0A21.h"

void SHARP_2Y0A21::init(byte bPort)// : _iSensorPort(port)
// конструктор
{
  
   _bMeasureCntr=0;
   _bSensorPort=bPort;
   pinMode( _bSensorPort, INPUT);
   _wArrRawData[_bMeasureCntr]=analogRead(_bSensorPort);
   
   ++_bMeasureCntr;
   
   // Заполняем пул фильтра первоначальными значениями
   for (int ii=0; ii<ARRLEN; ii++) {
     _wArrRawData[ii]=_wArrRawData[0];  
   }
   
   Serial.print("Start: ");
   Serial.print(bPort);
   Serial.println("");
}

word SHARP_2Y0A21::wGetDistanceMiddle()
{

   wGetDistanceRaw();
   return middle();
}

word  SHARP_2Y0A21::wGetDistanceRaw()
{
  word wTemp;
  
  //Serial.print(_bMeasureCntr);

  wTemp = analogRead(_bSensorPort);
  _wArrRawData[_bMeasureCntr]=wTemp;
  ++_bMeasureCntr;
  
     
  if (_bMeasureCntr >= ARRLEN)  {
     _bMeasureCntr=0;
  }
   
   
   // Выводим значение массива
   Serial.print(" | ");
   for (int ii=0; ii<ARRLEN; ii++) {
     Serial.print(_wArrRawData[ii]);
     Serial.print(' ');
   } 
   Serial.print(" | ");
 
  return wTemp;
}

#define SWAP(A, B) { word t = A; A = B; B = t; }
  
word SHARP_2Y0A21::middle()
// медианный фильтр по произвольном кол-ву элементов
{
  word _iArrTmp[ARRLEN];
  
  //Serial.print(" || ");
  for (int i = 0; i < ARRLEN; i++)  {
      _iArrTmp[i]=_wArrRawData[i];     
  }

  // сортировка пузырьком
	for (int i = ARRLEN-1 ; i >= 0; i--){
  	for (int j = 0; j < i; j++)  	{
    	if (_iArrTmp[j] > _iArrTmp[j + 1]) {
    	  SWAP( _iArrTmp[j], _iArrTmp[j + 1]);}
  	}
	}

  // медиана - центральный элемент отсортированного массива
  return (_iArrTmp[ ARRLEN/2]+_iArrTmp[ ARRLEN/2+1])/2;
  
}

byte SHARP_2Y0A21::bGetDistanceSm()
// дистанция в см, формулы получены апроксимацией кривой
// из даташита 4 линиями...
{
   word wRaw=wGetDistanceMiddle();
   if (wRaw > 335) {
     return (7500-9*wRaw)/299;
   } 
   else if (wRaw > 184) {
     return (7290-15*wRaw)/151; 
   }
   else if (wRaw > 102) {
     return (7980-60*wRaw)/82;
   }
   else {
     return (3240-15*wRaw)/151;
   }
   
}



 

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011

И желательно ещё на выходе РЦ цепочку с тау 0.1 - 1 секунды.....