roboforum.ru

Технический форум по робототехнике.

ИК-дальномер Sharp GP2Y0A02 (20-120см)

Re: ИК-дальномер Sharp GP2Y0A02 (20-120см)

-= Александр =- » 17 авг 2009, 13:10

Кстати я слышал что можно этот дальномер через линзу ставить - для изменения диапазона измерения. Но попробовать не с чем... Может у кого есть очки? А то у меня только линзы всякие - но они уж больно могучие...

Re: ИК-дальномер Sharp GP2Y0A02 (20-120см)

space » 17 авг 2009, 13:30

SkyStorm писал(а):Маладец!!! Давно собирался это сделать но все руки не доходили.
Сделай серию измерений м шагом 5 см и выложи пожалуста суда в след. виде
Реальное растояние; Расчитанное растояние; Значение ADC
Я беру на себя обязательство оформить это в Вике по типу странички [[GP2D12]].
И еще я не понял какие у тебя проблеммы с функцией Sharp_d12???

не компилируется. указывая на строчку где есть название Sharp_d12
Реальное растояние; Расчитанное растояние; Значение ADCэто вот эти три значение вывести на дисплей:
Код: Выделить всёРазвернуть
Vout = Vout1 + B -АДЦ
Range1 = M / Vout-по идее реальное расстояние
Range = Range1 - K -и рассчитанное

разъясни на счёт серии изменений, а то мне ни со всем понятно

Re: ИК-дальномер Sharp GP2Y0A02 (20-120см)

SkyStorm » 17 авг 2009, 13:40

1. Sharp_d12 - Это функция. В хелпе смотри "Declare Function".
В начале программы ее нужно задекларировать
Код: Выделить всёРазвернуть
Declare Function Sharp_d12(byval Adc_chanel As Byte) As Byte

В конце вставить код функции, а в теле вызывать.

2. Береш растояние 15см делаеш измерение, потом 20см, потом 25, и так с шагом 5см до 120см.
Реальное растояние; Расчитанное растояние; Значение ADC

Re: ИК-дальномер Sharp GP2Y0A02 (20-120см)

space » 17 авг 2009, 13:50

Короче вот так:
Изображение
Ток не обещаю, что будет это быстро, но сделаю

А с функцией так:
Код: Выделить всёРазвернуть
$regfile = "m16def.dat"                                     
$crystal = 16000000                                         


Declare Function Sharp_d12(byval Adc_chanel As Byte) As Byte
Const M = 10000
Const K = 0
Const B = -40
Local Range As Word , Vout As Word , Vout1 As Word
   Start Adc : Vout = Getadc(adc_chanel)                   
   Stop Adc
   If Vout < 160 Then                                       
     Sharp_d12 = 0
   Else
   Vout1 = Vout + B                                                                                 ' M/(Vout+B)
   Sharp_d12 = Range - K                                   
   End If
End Function

Исправил как ты сказал, теперь ошибка в переменных и на строчке с АДЦ

Re: ИК-дальномер Sharp GP2Y0A02 (20-120см)

SkyStorm » 17 авг 2009, 14:01

Код: Выделить всёРазвернуть
'Начало программы
'Обьявление функции
Declare Function Sharp_d12(byval Adc_chanel As Byte) As Byte
'Тело программы
'Вызов Sharp_d12

'Тело функции
Function Sharp_d12(byval Adc_chanel As Byte) As Byte
...
End Function


В примерах же все расписано, тебе что Хелп посмотреть западло???

Re: ИК-дальномер Sharp GP2Y0A02 (20-120см)

space » 17 авг 2009, 14:04

ды нет :sorry:

Re: ИК-дальномер Sharp GP2Y0A02 (20-120см)

SkyStorm » 17 авг 2009, 14:07

Что то я по поводу 5 см погоречился, давай с шагом 10 см. Ок?!?!? )))

Re: ИК-дальномер Sharp GP2Y0A02 (20-120см)

space » 17 авг 2009, 14:18

хорошо. ща пока с функцией малость увлёкся :)

Re: ИК-дальномер Sharp GP2Y0A02 (20-120см)

space » 18 авг 2009, 00:02

Код: Выделить всёРазвернуть
M=20000; B=-75; K=0
V    R     Real
971 22.32    20
774 28.61    30
601 38.02    40
477 49.75    50
410 59.70    60
358 70.67    70
307 79.74    80
284 88.51    90
255 102.77   100
246 108.18   110
232 117.83   120

вообщем что-то типо этого. Определяет не всегда точно. Зависит от цвета поверхности. Пробовал на одном и томже расстояние два разных по цвету предмета. Результат показывал разный. После 120 не стал уже делать. Там ошибается вообще по крупному. Норм только где то до 70-80 см. Пришлось ещё условие добавить. Мож ещё с функцией попробую сделать.
Код: Выделить всёРазвернуть
'-------------------------------------------------------------------------------
$regfile = "m16def.Dat"                                     ' мк ATmega16
$crystal = 16000000                                         ' частота кварца 16мГц
'-------------------------------------------------------------------------------

'-------------------------------- LCD-дисплей-----------------------------------
$lib "lcd4.lbx"                                             'используем 4-х битное подключение дисплея с помощью альтернативной библиотеки
'Библиотека lcd4.lbx использует следующее подключение:
Config Lcdpin = Pin , Rs = Portb.0 , E = Portb.2 , Db4 = Portb.4 , Db5 = Portb.5 , Db6 = Portb.6 , Db7 = Portb.7
Config Lcd = 16 * 2                                         'используем дисплей на 2 строчки по 16 знакомест в каждой
'-------------------------------------------------------------------------------

'----------------------------Константы и переменные-----------------------------
'Формула: R=M/(V+B)-K
Const M = 20000
Const K = 0
Const B = -75

Dim Range As Word , Range1 As Single , Vout As Word , Vout1 As Word , M1 As Word
'-------------------------------------------------------------------------------

'--------------------------------Настройка ADC----------------------------------
Config Adc = Single , Prescaler = Auto , Reference = Internal
'-------------------------------------------------------------------------------

'---------------------------------------------   ----------------------------------
'Далее перед вывод информации на дисплее отключаем курсор,
'если этого не сделать он будет мешаться в виде такого
' знака "_". И делаем очистку с помощью команды "Cls".
Cursor Off                                                  'отключаем отображение курсора на LCD
Cls                                                         'очитка дисплея

Locate 1 , 5                                                'позиция курсора(1-строка, 5-начало надписи с 5-ого знакоместа)
Lcd "RoboHome"                                              'выводим надпись
Locate 2 , 4                                                ' позиция курсора(2-строка, 4-начало надписи с 4-ого знакоместа)
Lcd "Sharp test"                                            'выводим надпись
Waitms 2                                                    'задержка 2 секунды
'-------------------------------------------------------------------------------

'Начало цикла основной программы

Do
Start Adc : Vout1 = Getadc(0)                               'Запускаем ADC на PA0
Stop Adc                                                    'Останавливаем ADC
Vout = Vout1 + B
If Vout < 325 Then : M1 = M - 1500 : Else : M1 = M : End If
Range1 = M1 / Vout
Range = Range1 - K

Cls                                                         'очитка дисплея
Locate 1 , 1                                                ' позиция курсора
Lcd "Real=" ; Range ; "cm" ; " M1=" ; M1 ; ""                   'выводим результат преобразования на ЖК
Locate 2 , 1                                                ' позиция курсора
Lcd "Vout=" ; Vout1 ; " " ; "R=" ; Range1 ; ""              'выводим результат преобразования на ЖК
Waitms 100                                                  ' зедержка 0,1 секунды
Loop
End


Добавлено спустя 1 час 6 минут 9 секунд:
Вопрос про одновременное управление сервой и шарпом вынесен туда.
<Digit>

Re: ИК-дальномер Sharp GP2Y0A02 (20-120см)

EdGull » 18 авг 2009, 07:24

space а у тебя опора какая и из чего опора на AREF?

Re: ИК-дальномер Sharp GP2Y0A02 (20-120см)

space » 18 авг 2009, 12:07

если про ножку на мк, то она вообще не подключена

Re: ИК-дальномер Sharp GP2Y0A02 (20-120см)

Digit » 18 авг 2009, 12:23

Ты на внутренней опоре делаешь? В ДШ и аппноутах такая куча рекомендаций, как правильно подключать АЦП...

Re: ИК-дальномер Sharp GP2Y0A02 (20-120см)

space » 18 авг 2009, 12:33

Код: Выделить всёРазвернуть
'--------------------------------Настройка ADC----------------------------------
Config Adc = Single , Prescaler = Auto , Reference = Internal
'-------------------------------------------------------------------------------

Получается тогда на INTERNAL – внутренний источник опорного напряжения на 2,56 в.

Re: ИК-дальномер Sharp GP2Y0A02 (20-120см)

Digit » 18 авг 2009, 12:46

Вот тут и вот тут читал?
По первой ссылке, например, вот:
Выбор опорного сигнала
Это максимальное напряжение, которое будет взято за максимум при измерениях. Опорное напряжение должно быть как можно стабильней, без помех и колебаний — от этого кардинальным образом зависит точность работы АЦП. Задается он в битах REFS1..0 регистра ADMUX.
[...удалил...]
* REFS1..0 = 11 - внутренний источник опорного напряжения на 2.56 вольт. Честно говоря, качество этого источника мне сильно не понравилось. С ним показания АЦП плавают как говно в проруби. Но если невозможно обеспечить гладкую и стабильную подачу напряжения на AREF или AVCC то прокатит. Кстати, внутренний ИОН подключен к выводу AREF так что можно повесить туда кондер и попробовать его чуть чуть сгладить. Немного, но помогает.

Ну а лучше, канеш, внешнюю опору. Хоть будешь знать, от чего у тебя пляшет...

Re: ИК-дальномер Sharp GP2Y0A02 (20-120см)

space » 18 авг 2009, 12:52

Не не читал, но почитаю спасибо.


Rambler\'s Top100 Mail.ru counter