roboforum.ru

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

Плавное движение сервы

Плавное движение сервы

space » 20 сен 2009, 23:18

Ура нашёл то что искал. Кто знает как добиться такого же плавного движения сервы в Bascom AVR?
я такой код использую, но он с резкими движениями получается
Код: Выделить всёРазвернуть
For I = 30 To Top Step 10
X = Center + I
Servo(1) = X
Waitms Wait1
Gosub Sharp_left
Next


Re: Плавное движение сервы

=DeaD= » 20 сен 2009, 23:22

Waitl чему равно? Top чему равно? Почему Step 10 ?

Re: Плавное движение сервы

space » 20 сен 2009, 23:28

Целый код не хотел выкладывать....
Основная:
Код: Выделить всёРазвернуть
$regfile = "m16def.dat"                                     'используем мк ATmega16
$crystal = 16000000                                         'частота кварцевого резонатора 16mHz
$include "config ports.bas"

'*********************************ЖКИ*******************************************

$lib "lcd4.lbx"                                             'используем 4-х битное подключение дисплея с помощью альтернативной библиотеки
Cursor Off : Cls                                            'отключаем курсор и очищаем дисплей

'************************Переменные и константы*********************************

Dim Minimum As Byte , Maximum As Byte , Center As Byte , Speed As Byte : Speed = 200
Dim X As Integer , I As Integer

Minimum = 80 : Maximum = 160 : Center = Maximum - Minimum   'подсчитываем разворот в градусах для сервопривода

Const Wait1 = 500 : Const Top = 30


'*****************************Основной цикл*************************************

1:
Do

Gosub Вперёд                                                ' Если сигнала от ик-датчика(Sharp) не поступает, значит двигаемся всё время прямо

'******************Вращение сервопривода и датчика Sharp************************
'*********************************Вправо****************************************
For I = 30 To Top Step 10
X = Center + I
Servo(1) = X
Waitms Wait1
Gosub Sharp_left
Next

'*********************************Центр*****************************************
For I = 30 To Top Step 10
Servo(1) = Center
Waitms Wait1
Gosub Sharp_center
Next

'*********************************Влево*****************************************
For I = 30 To Top Step 10
X = Center - I
Servo(1) = X
Waitms Wait1
Gosub Sharp_right
Next

'*********************************Центр*****************************************
For I = 30 To Top Step 10
Servo(1) = Center
Waitms Wait1
Gosub Sharp_center
Next

Loop

'*******************************************************************************

$include "gosub.bas"

'*******************************************************************************

End

'*******************************************************************************


config ports:
Код: Выделить всёРазвернуть
Config Servos = 1 , Servo1 = Portc.0 , Reload = 12          ' Указываем кол-во серв, присваеваем имя Servo1 порту PD2, указываем длину импульса.


Добавлено спустя 2 минуты 11 секунд:
=DeaD= писал(а):Почему Step 10 ?

Это там не обязательно. Потом уберу

Re: Плавное движение сервы

=DeaD= » 20 сен 2009, 23:38

Шо за ересь?

Top=30
For I = 30 To Top Step 10

Это не цикл, а издевательство.

Re: Плавное движение сервы

space » 20 сен 2009, 23:58

но это ерись работает. и что тебе здесь не нравится?

Re: Плавное движение сервы

=DeaD= » 21 сен 2009, 00:00

Не нравится то, что цикл не цикл, а одна итерация - поэтому, думаю, серва и дергается.

Цикл от 30 до 30 с шагом 10 - ну что за нафиг? Конечно он 1 раз выполнится со значением 30 и всё.

Re: Плавное движение сервы

space » 21 сен 2009, 00:32

Усё осознал. И впрям ерись получается. Порыскал хелп и нашёл такое:
Код: Выделить всёРазвернуть
$regfile = "m16def.dat"                                     ' specify the used micro

$crystal = 16000000                                         ' used crystal frequency

$baud = 19200                                               ' use baud rate

$hwstack = 32                                               ' default use 32 for the hardware stack

$swstack = 10                                               ' default use 10 for the SW stack

$framesize = 40                                             ' default use 40 for the frame space

'Servo's need a pulse in order to operate

'with the config statement CONFIG SERVOS we can specify how many servo's we

'will use and which port pins are used

'A maximum of 14 servos might be used

'The SERVO statements use one byte for an interrupt counter and the TIMER0

'This means that you can not use TIMER0 anymore

'The reload value specifies the interval of the timer in uS

'Config Servos = 2 , Servo1 = Portb.0 , Servo2 = Portb.1 , Reload = 10

Config Servos = 1 , Servo1 = Portc.0 , Reload = 10

'as an option you can use TIMER1

'Config Servos = 2 , Servo1 = Portb.0 , Servo2 = Portb.1 , Reload = 10 , Timer = Timer1

'we use 2 servos with 10 uS resolution(steps)

'we must configure the port pins used to act as output

Config Portc = Output

'finally we must turn on the global interrupt

Enable Interrupts

'the servo() array is created automatic. You can used it to set the

'time the servo must be on

Servo(1) = 10                                               '10 times 10 = 100 uS on

'Servo(2) = 20                                               '20 times 10 = 200 uS on

Dim I As Byte

Do

For I = 50 To 200 Step 1

  Servo(1) = I

  Waitms 30

Next

For I = 200 To 50 Step -1

  Servo(1) = I

  Waitms 30

Next

Loop

End

Вроде двигается медленно но чуть "неуверенно". С английским туго, если можешь, то объясни для чего это:
Servo(1) = 10 '10 times 10 = 100 uS on
I = 50-как понял теже градусы. Тоесть задаём начало движения сервы от 50 градусов. До To 200 с шагом 1. И тоже самое в обратном направление For I = 200 To 50 Step -1.
Роль задержки Waitms 30. Эксперементируя выяснил, что чем она больше тем медленнее двигается серва.
Тогда хоть смогу добиться такого же результата как на видео :)

Re: Плавное движение сервы

galex1981 » 21 сен 2009, 00:37

По поводу "неуверенности" попробуй поиграть параметром Step, варьируй 1..10

Re: Плавное движение сервы

space » 21 сен 2009, 00:40

Ок попробую.
Во видео загрузил. Когда крутится, трясётся что-ли. Типо мизирных рывков получается. Собсно так и работает:

Re: Плавное движение сервы

space » 21 сен 2009, 16:45

Ну вот сделал.

Прога если кому пригодится:
Код: Выделить всёРазвернуть
$regfile = "m16def.dat"

$crystal = 16000000

Config Servos = 1 , Servo1 = Portc.0 , Reload = 10

Config Portc = Output

Enable Interrupts

Servo(1) = 10                                               '10 times 10 = 100 uS on

Dim I As Byte

Do

For I = 45 To 90 Step 1                                     ' начинаем движение от 45 градусов и до 90 с шагом 1

  Servo(1) = I

  Waitms 12                                                 ' время за которое будет выполняться один шаг(движение на один градус).
  ' то есть в нашем случае каждые 12 мс серва будет сдвигаться влево или вправо на один градус.

Next

Waitms 500                                                  ' задерживаем серву в данном положение на 0, 5 секунды

For I = 90 To 135 Step 1

  Servo(1) = I

  Waitms 12

Next

Waitms 500

For I = 135 To 90 Step -1

  Servo(1) = I

  Waitms 12

Next

Waitms 500

For I = 90 To 45 Step -1

  Servo(1) = I

  Waitms 12

Next

Waitms 500

Loop

End

Прокоментировал один цикл. Если я всё правильно понял, то работает именно так как описал.

Re: Плавное движение сервы

=DeaD= » 21 сен 2009, 16:49

2space: Маленькая проблема - серва получает сигнал каждые 20мс только, поэтому лучше сделать именно такой шаг в цикле. Иначе половина шагов будет пропущена и движения будут чуть дерганные.

Re: Плавное движение сервы

space » 21 сен 2009, 16:50

Что то я тебя не совсем понял :unknown:

Re: Плавное движение сервы

yak-40 » 21 сен 2009, 16:51

А зачем всередине то останавливается?

Re: Плавное движение сервы

space » 21 сен 2009, 16:52

просто так. на роботе сделаю так как на первом видео

Re: Плавное движение сервы

yak-40 » 21 сен 2009, 16:54

Там не останавливается :)
Смысла в этой остановке нет. Только потеря времени.


Rambler\'s Top100 Mail.ru counter