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
а на счёт одновременной работы сервы и датчика ни кто не подскажет можно так сделать или имеет смысл серву закрепить на отдельном мк, а датчики на основном?