space в теме про шарп писал(а):Ребят, а как опрос датчика сделать при условие, что работает серва. То есть когда обнаружен предмет загорается светодиод и серва должна остановится в том месте где был предмет, на секунду например, потом выполнить какое то действие в связи с обнаружение предмета и по новой.
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 раз.
Причина:разделил темы
Ты извини, но там -= Александр =- показывал как скоростью управлять. А мне надо при работующей серве сделать опрос датчика.
SkyStorm писал(а):то же сделай на Бейсике.
было б знаний по больше сделал бы и глупых вопрос не задовал, а так уж извеняете из доступных материалов на русском ток Справочник по Bascom-8051 и Bascom AVR(его только скачал сегодня буду изучать мож чекго полезного и найду)
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, это положение в которое надо прийти, и ты его сразу вычислил и указал
Ты пошагово двигаешся в одну сторону, на каждом шаге можеш делать каки либо вызовы функций или процедур Шаг можно указать конкретный. Например каждые 5 градусов(если это градусы) делать измерения растояния.
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