roboforum.ru

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

Как одновременно крутить серву и читать данные дальномера Sh

Как одновременно крутить серву и читать данные дальномера Sh

space » 18 авг 2009, 13:59

Тема выделена оттуда: ИК-дальномер Sharp GP2Y0A02 (20-120см)

space в теме про шарп писал(а):Ребят, а как опрос датчика сделать при условие, что работает серва. То есть когда обнаружен предмет загорается светодиод и серва должна остановится в том месте где был предмет, на секунду например, потом выполнить какое то действие в связи с обнаружение предмета и по новой.
Код: Выделить всёРазвернуть
'-------------------------------------------------------------------------------
$regfile = "m16def.Dat"                                     ' мк ATmega16
$crystal = 16000000                                         ' частота кварца 16мГц
'-------------------------------------------------------------------------------

Config Servos = 1 , Servo1 = Portd.7 , Reload = 12          ' Указываем кол-во серв, присваеваем имя Servo1 порту PD2, указываем длину импульса.
Config Portd.7 = Output                                     ' конфигурируем вывод 2 порта D на ВЫХОД
Config Portc.2 = Output : Led Alias Portc.2
Led = 0
Dim Minimum As Byte
Dim Maximum As Byte
Dim X As Integer
Dim Center As Byte
' берём серву, которая вращается на 180 градусов, если будете брать другую, то придётся изменить длину импульса и мак. и мин. градусы.
Minimum = 85                                                ' минимальный разворот сервопривода в градусах
Maximum = 170                                               ' максимальный разворот сервопривода в градусах
Const Wait1 = 300                                           ' задержка в мс.
Center = Maximum - Minimum                                  ' считаем под каким углом будет центр у сервопривод
' в моём случае это 90 (180-90=90) градусов.

Const Top = 51                                              ' постоянная для изменения положения вала сервопривода.
Const Top1 = 56
Const Top2 = 30

Enable Interrupts

'--------------------------------Настройка ADC----------------------------------
Config Adc = Single , Prescaler = Auto , Reference = Internal
'-------------------------------------------------------------------------------
'Начало цикла основной программы
Do

X = Center - Top2
Servo(1) = X
Waitms Wait1
If Sharp_d12 = Sharp_d12 Then : Led = 1 : Waitms 300 : End If

X = Center + Top2
Servo(1) = X
Waitms Wait1


Loop

Sharp:
Declare Function Sharp_d12(byval Adc_chanel As Byte) As Byte
Const M = 20000
Const K = -1
Const B = -40
Function Sharp_d12(byval Adc_chanel As Byte) As Byte
Local Range As Word , Vout As Word , Vout1 As Word
   Start Adc : Vout = Getadc(adc_chanel)                    'Sharp connected for example to PA=0(ADC0)
   Stop Adc
   If Vout < 500 Then                                       ' if les 160 its out of range
     Sharp_d12 = 0
   Else
   Vout1 = Vout + B                                         ' (Vout+B)
   Range = M / Vout1                                        ' M/(Vout+B)
   Sharp_d12 = Range - K                                    ' Range = M/(Vout+B)-K
   If Sharp_d12 = Sharp_d12 Then : Led = 1 : Waitms 300 : End If
   End If
End Function
Return



а на счёт одновременной работы сервы и датчика ни кто не подскажет можно так сделать или имеет смысл серву закрепить на отдельном мк, а датчики на основном?
Последний раз редактировалось Digit 18 авг 2009, 14:33, всего редактировалось 1 раз.
Причина: разделил темы

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

Digit » 18 авг 2009, 14:05

А в чем вообще проблема, рулить датчиком и сервой с одного МК? Там же не требовательные к ресурсам задачи.

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

SkyStorm » 18 авг 2009, 14:07

можно сделать на одном МК.
Тебе же уже показали на Си как это делается ... то же сделай на Бейсике.

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

space » 18 авг 2009, 14:12

Ты извини, но там -= Александр =- показывал как скоростью управлять. А мне надо при работующей серве сделать опрос датчика.
SkyStorm писал(а):то же сделай на Бейсике.

было б знаний по больше сделал бы и глупых вопрос не задовал, а так уж извеняете из доступных материалов на русском ток Справочник по Bascom-8051 и Bascom AVR(его только скачал сегодня буду изучать мож чекго полезного и найду)

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

SkyStorm » 18 авг 2009, 14:22

Твой код поворота X, это положение в которое надо прийти, и ты его сразу вычислил и указал
Код: Выделить всёРазвернуть
X = Center - Top2
Servo(1) = X

Нужно это X увеличивать в цикле, на вскидку вот так:
Код: Выделить всёРазвернуть
For i=1 to Top2
X = Center - i
Servo(1) = X
Next


Это есле я правильно понял что X, Center и Top2 это градусы.
Последний раз редактировалось SkyStorm 18 авг 2009, 14:27, всего редактировалось 1 раз.

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

space » 18 авг 2009, 14:25

Вчера когда сам пробовал, то сделал так:
Код: Выделить всёРазвернуть
Do
X = Center - Top2
Servo(1) = X
Waitms Wait1
Gosub Sharp
Led = 0

X = Center + Top2
Servo(1) = X
Waitms Wait1
Gosub Sharp
Led = 0

Loop
Sharp:
Declare Function Sharp_d12(byval Adc_chanel As Byte) As Byte
Const M = 20000
Const K = -1
Const B = -40
Function Sharp_d12(byval Adc_chanel As Byte) As Byte
Local Range As Word , Vout As Word , Vout1 As Word
   Start Adc : Vout = Getadc(adc_chanel)                    'Sharp connected for example to PA=0(ADC0)
   Stop Adc
   If Vout < 500 Then                                       ' if les 160 its out of range
     Sharp_d12 = 0
   Else
   Vout1 = Vout + B                                         ' (Vout+B)
   Range = M / Vout1                                        ' M/(Vout+B)
   Sharp_d12 = Range - K                                    ' Range = M/(Vout+B)-K
   If Sharp_d12 = Sharp_d12 Then : Led = 1 : Waitms 300 : End If
   End If
End Function
Return

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

Добавлено спустя 1 минуту 42 секунды:
SkyStorm писал(а):Твой код поворота X, это положение в которое надо прийти, и ты его сразу вычислил и указал
Код: Выделить всёРазвернуть
X = Center - Top2
Servo(1) = X


ну да
SkyStorm писал(а):Нужно это X увеличивать в цикле, на вскидку вот так:
Код: Выделить всёРазвернуть
For i=1 to Top2
X = Center - i
Servo(1) = X
Next

а вот здесь не понял для чего его увеличивать

Re: Как одновременно крутить серву и читать данные дальномера Sh

SkyStorm » 18 авг 2009, 14:37

а вот здесь не понял для чего его увеличивать

Ты пошагово двигаешся в одну сторону, на каждом шаге можеш делать каки либо вызовы функций или процедур
Шаг можно указать конкретный. Например каждые 5 градусов(если это градусы) делать измерения растояния.
Код: Выделить всёРазвернуть
For i=1 To Top2 Step 5
X = Center - i
Servo(1) = X
Waitms Wait1
Gosub Sharp
Next

Re: Как одновременно крутить серву и читать данные дальномера Sh

space » 18 авг 2009, 14:42

Понял. Буду пробовать. спасибо :)

Re: Как одновременно крутить серву и читать данные дальномера Sh

space » 19 авг 2009, 15:39

Спасибо всем за помощь.
Собственно вот что получилось:

Код на BAscom AVR в архиве, если кому будет интересно взглянуть на целый код, а части вот:
Robbe:
Код: Выделить всёРазвернуть
For I = 25 To Top Step 7
X = Center + I
Servo(1) = X
Waitms Wait1
Gosub Sharp_left
Next

For I = 25 To Top Step 7
X = Center - I
Servo(1) = X
Waitms Wait1
Gosub Sharp_right
Next


Gosub:
Код: Выделить всёРазвернуть
Sharp_right:
Declare Function Sharp_a02(byval 0 As Byte) As Byte
Function Sharp_a02(byval 0 As Byte) As Byte
Local Vout As Word
   Start Adc : Vout = Getadc(0)                             'Sharp connected for example to PA=0(ADC0)
   Stop Adc
   If Vout < 600 Then : Sharp_a02 = 0 : Else : Sharp_a02 = 1 : End If
   If Sharp_a02 = 1 Then : Led = 1 : Waitms 1000 : Led = 0 : End If
End Function
Return

Sharp_left:
Declare Function Sharp_a0(byval 0 As Byte) As Byte
Function Sharp_a0(byval 0 As Byte) As Byte
Local Vout As Word
   Start Adc : Vout = Getadc(0)                             'Sharp connected for example to PA=0(ADC0)
   Stop Adc
   If Vout < 600 Then : Sharp_a0 = 0 : Else : Sharp_a0 = 1 : End If
   If Sharp_a0 = 1 Then : Led = 1 : Waitms 1000 : Led = 0 : End If
End Function
Return
Вложения
WinRAR.rar
(16.85 КиБ) Скачиваний: 8

Re: Как одновременно крутить серву и читать данные дальномера Sh

setar » 19 авг 2009, 16:53

а на 6сек там что он увидел ? или сбой ??

Re: Как одновременно крутить серву и читать данные дальномера Sh

space » 19 авг 2009, 16:57

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


Rambler\'s Top100 Mail.ru counter