Мапирование аналаговых датчиков

Dragal
Offline
Зарегистрирован: 04.09.2015

Друзья, 

передо мной стоит задача, контролировать расстояние до объекта в зависимости высоты объекта. Т.е. например при высоте объекта 1 метр, мне необходимо держать датчик расстояния от него 20 см, при высоте объекта 30 см, датчик должен быть в 40 см и т. д .

Проблема в том, чтобы перевести значения в сантиметрах обратно вольты, т.к. на  аналаговом дальномере (модель GP2Y0A021 компании Sharp) удельные характеристики меняются черт пойми по какому закону и не пропорционально.

Например,   40 см это около 0.75 В,  а 10 см это 2.25 В. (фото прилагается)

Возможно есть способы чтобы описать эту фунцкию или еще что нить ? 

Буду благодарен за помощь!

 

Dragal
Offline
Зарегистрирован: 04.09.2015

Ну хоть какие-нибудь есть предложения? 

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

Есть гугель.....

https://github.com/guillaume-rico/SharpIR

uragan
Offline
Зарегистрирован: 23.02.2015

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

Олег М.
Олег М. аватар
Offline
Зарегистрирован: 22.11.2015

Dragal пишет:

Ну хоть какие-нибудь есть предложения? 

Можно ли поподробнее описать саму задачу, а не тот кусок, который тебе нужно решить?
Навскидку, нужный тебе нисходящий участок кривой можно аппроксимировать параболой (квадратным! трехчленом!) , но для хорошего приближения и расчета нужно поточнее знать твою кривую. А еще лучше-понять саму задачу.

 

 

 

 

Олег М.
Олег М. аватар
Offline
Зарегистрирован: 22.11.2015

Снял 8 точек с твоего графика и получил две формулы зависимости расстояния (L) от напряжения (V).

1. Кубический многочлен.
L = -11.584*V*V*V + 75.941*V*V-163.46*V+126.4    (Корр=0,991)

2. Степенная функция. Она получше, но я не знаю, как в Arduino или С/С++ возводить в отрицательную степень :(
L = 27.159*V(степень -1,222)    (Корр = 0,9973)

И пусть поправит меня мудрейший!

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

Вот они формулы, из библиотеки :

1080 это тот который 10-80 сантиметров
20150 - тот что 20 см- полтора метра

int SharpIR::cm() {
    
    int raw=analogRead(_irPin);
    float voltFromRaw=map(raw, 0, 1023, 0, 5000);
    
    int puntualDistance;
    
    if (_model==1080) {
        
        puntualDistance=27.728*pow(voltFromRaw/1000, -1.2045);
        
    }else if (_model==20150){
    
        puntualDistance=61.573*pow(voltFromRaw/1000, -1.1068);
        
    }    
    return puntualDistance;
}

А это я подправлял под себя:

int SharpIR::cm() {
    
    int raw=analogRead(_irPin);
    float voltFromRaw=map(raw, 0, 1023, 0, 5000);
    
    int puntualDistance;
	static unsigned int tremboDistance;   //trembo
    
    if (_model==1080) {
        
        puntualDistance = 27.728*pow(voltFromRaw/1000, -1.2045);  
		puntualDistance = constrain(puntualDistance, 10, 80);         //trembo
		tremboDistance = (tremboDistance * 9 + puntualDistance)/10;  //trembo
        puntualDistance = tremboDistance;
    }else if (_model==20150){
    
        puntualDistance = 61.573*pow(voltFromRaw/1000, -1.1068);
		puntualDistance = constrain(puntualDistance, 20, 150);       //trembo
		tremboDistance = (tremboDistance * 9 + puntualDistance)/10;  //trembo
		puntualDistance = tremboDistance;
        
    }
    
    
       return puntualDistance;    
	


}

Только учтите без РЦ цепочки на входе АЦП будете изредка получать измерения "совсем не в дугу".
Я поставил в ряд 8 датчиков, у каждого фильтр  с тау секунда,
но всё равно пришлось считывать 10 раз подряд и если эти 10 примерно одинаковые значит сигнал похож на правду. Это видно в строках с моими комментариями

Dragal
Offline
Зарегистрирован: 04.09.2015

Скажите пожалуйста, 

правильно ли я понял на счет РЦ - резистор между аналоговым выходом датчика и аналоговым пином ардуино, а конденсатор между аналоговым выходом датчика и землей? ( как правильно подобрать их характеристики?)

Олег М.
Олег М. аватар
Offline
Зарегистрирован: 22.11.2015

Cпасибо за pow()  ;)))

И не так уж сильно я ошибся с расчетом коэффициентов: 27.159 против 27.728 и 1.222 против 1.2045

Dragal
Offline
Зарегистрирован: 04.09.2015

Да Олег, очень точно вышло) 

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

http://easyelectronics.ru/kondensator-i-rc-cepochka.html

http://tel-spb.ru/rc.html

47 кОм,  10 мкФ,   тау 0.47 секунды ,  частота среза  0.33 Герца  годится?

Dragal
Offline
Зарегистрирован: 04.09.2015

Понял, спасибо большое за помощь!

Единственное, правильно ли я понял схему подключения РЦ: