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 раз.
Причина: разделил темы
Аватара пользователя
space
 
Сообщения: 565
Зарегистрирован: 17 июн 2007, 23:44
Откуда: Тула
прог. языки: Bascom AVR Basic, CodeVisionAVR
ФИО: Замотаев Кирилл Игоревич

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

Сообщение Digit » 18 авг 2009, 14:05

А в чем вообще проблема, рулить датчиком и сервой с одного МК? Там же не требовательные к ресурсам задачи.
злой полицейский
Аватара пользователя
Digit
 
Сообщения: 3339
Зарегистрирован: 27 ноя 2004, 00:42
Откуда: совсем Москва
ФИО: Григорий

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

Сообщение SkyStorm » 18 авг 2009, 14:07

можно сделать на одном МК.
Тебе же уже показали на Си как это делается ... то же сделай на Бейсике.
Никто кроме нас!!!
4Robots.ru - Все для роботов!
Аватара пользователя
SkyStorm
 
Сообщения: 2687
Зарегистрирован: 05 фев 2008, 15:33
Откуда: St. Petersburg - Moscow
Skype: SkyStorm77
ФИО: Костюк Константин Вячеславович

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

Сообщение space » 18 авг 2009, 14:12

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

было б знаний по больше сделал бы и глупых вопрос не задовал, а так уж извеняете из доступных материалов на русском ток Справочник по Bascom-8051 и Bascom AVR(его только скачал сегодня буду изучать мож чекго полезного и найду)
Аватара пользователя
space
 
Сообщения: 565
Зарегистрирован: 17 июн 2007, 23:44
Откуда: Тула
прог. языки: Bascom AVR Basic, CodeVisionAVR
ФИО: Замотаев Кирилл Игоревич

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 раз.
Никто кроме нас!!!
4Robots.ru - Все для роботов!
Аватара пользователя
SkyStorm
 
Сообщения: 2687
Зарегистрирован: 05 фев 2008, 15:33
Откуда: St. Petersburg - Moscow
Skype: SkyStorm77
ФИО: Костюк Константин Вячеславович

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

а вот здесь не понял для чего его увеличивать
Аватара пользователя
space
 
Сообщения: 565
Зарегистрирован: 17 июн 2007, 23:44
Откуда: Тула
прог. языки: Bascom AVR Basic, CodeVisionAVR
ФИО: Замотаев Кирилл Игоревич

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
Никто кроме нас!!!
4Robots.ru - Все для роботов!
Аватара пользователя
SkyStorm
 
Сообщения: 2687
Зарегистрирован: 05 фев 2008, 15:33
Откуда: St. Petersburg - Moscow
Skype: SkyStorm77
ФИО: Костюк Константин Вячеславович

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

Сообщение space » 18 авг 2009, 14:42

Понял. Буду пробовать. спасибо :)
Аватара пользователя
space
 
Сообщения: 565
Зарегистрирован: 17 июн 2007, 23:44
Откуда: Тула
прог. языки: Bascom AVR Basic, CodeVisionAVR
ФИО: Замотаев Кирилл Игоревич

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
Аватара пользователя
space
 
Сообщения: 565
Зарегистрирован: 17 июн 2007, 23:44
Откуда: Тула
прог. языки: Bascom AVR Basic, CodeVisionAVR
ФИО: Замотаев Кирилл Игоревич

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

Сообщение setar » 19 авг 2009, 16:53

а на 6сек там что он увидел ? или сбой ??
Аватара пользователя
setar
Site Admin
 
Сообщения: 10984
Зарегистрирован: 04 окт 2004, 12:58
Откуда: St.Petersburg
Skype: taranenko.sergey
ФИО: Сергей Тараненко

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

Сообщение space » 19 авг 2009, 16:57

руку он и увидел.
пока не знаю как сделать так чтоб серва останавливалась кокретно на том градусе где было препятствие.
Аватара пользователя
space
 
Сообщения: 565
Зарегистрирован: 17 июн 2007, 23:44
Откуда: Тула
прог. языки: Bascom AVR Basic, CodeVisionAVR
ФИО: Замотаев Кирилл Игоревич


Вернуться в Новичкам или основы основ роботостроения.

Кто сейчас на конференции

Сейчас этот форум просматривают: Google [Bot] и гости: 20