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

Программирование микроконтроллеров AVR, PIC, ARM.
Разработка и изготовление печатных плат для модулей.

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

Сообщение 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

https://vk.com/ledscale - платы, vk.com/ledscale3dprintig - 3Д печать\моделирование, vk.com/ledrenovation- ремонт светодиодных источников света
Аватара пользователя
space
 
Сообщения: 565
Зарегистрирован: 17 июн 2007, 23:44
Откуда: Тула
прог. языки: Bascom AVR Basic, CodeVisionAVR
ФИО: Замотаев Кирилл Игоревич

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

Сообщение =DeaD= » 20 сен 2009, 23:22

Waitl чему равно? Top чему равно? Почему Step 10 ?
Проект [[Open Robotics]] - Универсальные модули для построения роботов
Аватара пользователя
=DeaD=
 
Сообщения: 24218
Зарегистрирован: 06 окт 2004, 18:01
Откуда: Ебург
прог. языки: C++ / PHP / 1C
ФИО: Антон Ботов

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 ?

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

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

Сообщение =DeaD= » 20 сен 2009, 23:38

Шо за ересь?

Top=30
For I = 30 To Top Step 10

Это не цикл, а издевательство.
Проект [[Open Robotics]] - Универсальные модули для построения роботов
Аватара пользователя
=DeaD=
 
Сообщения: 24218
Зарегистрирован: 06 окт 2004, 18:01
Откуда: Ебург
прог. языки: C++ / PHP / 1C
ФИО: Антон Ботов

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

Сообщение space » 20 сен 2009, 23:58

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

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

Сообщение =DeaD= » 21 сен 2009, 00:00

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

Цикл от 30 до 30 с шагом 10 - ну что за нафиг? Конечно он 1 раз выполнится со значением 30 и всё.
Проект [[Open Robotics]] - Универсальные модули для построения роботов
Аватара пользователя
=DeaD=
 
Сообщения: 24218
Зарегистрирован: 06 окт 2004, 18:01
Откуда: Ебург
прог. языки: C++ / PHP / 1C
ФИО: Антон Ботов

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

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

Сообщение galex1981 » 21 сен 2009, 00:37

По поводу "неуверенности" попробуй поиграть параметром Step, варьируй 1..10
if(!Operate) Read(pDatasheet);
Аватара пользователя
galex1981
 
Сообщения: 4363
Зарегистрирован: 04 дек 2008, 22:44
Откуда: Камышин
Skype: galk-aleksandr1
прог. языки: Kotlin, Java, C, C++, Assm, BasCom, VB, php
ФИО: Галкин Александр Владимирович

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

Сообщение space » 21 сен 2009, 00:40

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

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

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

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

Сообщение =DeaD= » 21 сен 2009, 16:49

2space: Маленькая проблема - серва получает сигнал каждые 20мс только, поэтому лучше сделать именно такой шаг в цикле. Иначе половина шагов будет пропущена и движения будут чуть дерганные.
Проект [[Open Robotics]] - Универсальные модули для построения роботов
Аватара пользователя
=DeaD=
 
Сообщения: 24218
Зарегистрирован: 06 окт 2004, 18:01
Откуда: Ебург
прог. языки: C++ / PHP / 1C
ФИО: Антон Ботов

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

Сообщение space » 21 сен 2009, 16:50

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

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

Сообщение yak-40 » 21 сен 2009, 16:51

А зачем всередине то останавливается?
- Этот человек - не человек! это робот!
- Как? уже делают?!
- Делают!!!
Аватара пользователя
yak-40
 
Сообщения: 3037
Зарегистрирован: 23 окт 2007, 22:03
Откуда: Москва
прог. языки: С
ФИО: Евгений Яковец

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

Сообщение space » 21 сен 2009, 16:52

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

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

Сообщение yak-40 » 21 сен 2009, 16:54

Там не останавливается :)
Смысла в этой остановке нет. Только потеря времени.
- Этот человек - не человек! это робот!
- Как? уже делают?!
- Делают!!!
Аватара пользователя
yak-40
 
Сообщения: 3037
Зарегистрирован: 23 окт 2007, 22:03
Откуда: Москва
прог. языки: С
ФИО: Евгений Яковец

След.

Вернуться в Микроконтроллеры

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

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 7