digital servo kontrolü

Başlatan sinasos, 27 Mart 2017, 03:07:47

sinasos

iyi geceler arkadaşlar,
4 gündür çalışıyorum ve şu saat olmuş hala sonuca ulaşamadım. elimde 3 adet MG995 ve 1 adet SG90 servo motor var. bunun için 16f628A ile bir kontrol devresi kurdum. her motoru ileri geri olmak üzere 2 şer butonla kontrol ediyorum. SG90 servo sıkıntısız  çalışıyor ancak MG995 servolar tek yönde dönüyor, diğer yöne dönmüyor. uzun araştırmalardan sonra bunların (MG995) digital servo olduğunu öğrendim. SG90 lar ise analog servo imiş !
Forumda araştırdım digital servolar hakkında herhangi bir bilgiye rastlamadım. sadece ETE hocam bir kez böyle bir program yazmış o da sanırım zaman aşımından silinmiş.
Bana digital servolar hakkında yardımcı olabilecek arkadaşlardan yardım rica ediyorum.
selamlarımla.

programın önemli satırları aşağıda. Ancak bu şekilde sadece analogları kontrol edebiliyorum. for-next döngüsünü sorarsanız tuşlara basınca birden sağa sola dönmek yerine fasılalı olarak dönmesi için koydum.

Ayrıca Servoların datasheet'lerini ekledim incelemek isterseniz diye.

basla:
if tus1=0 then sag
if tus2=0 then sol
goto basla

sag:
FOR I=0 TO 3
PULSOUT m3,60
PAUSEUS 18000
NEXT
pause 50
goto basla

sol:
FOR I=0 TO 3
PULSOUT m3,120
PAUSEUS 18000
NEXT
pause 50
goto basla

ete

MG995 her yerde analog servo olarak gözüküyor ve maalesef her zaman olduğu gibi kısıtlı bir bilgi var bu motor hakkında.
Data sheetlere bakarsanız SG90 için puls genişliğinin 1-2ms olduğu açıkça belirtilmiş olmasına rağmen MG995 için herhangi bir süre verilmemiş. Halbuki önemli ve hatta en önemli bilgi budur bir servo için.
Genel anlamda analog servolar 0,5-2ms lik HIGH pulsları ile kontrol edilirler. Ancak toplam peryot 20ms  olmalıdır.
Yani servoya 1ms HIGH puls uyguladı isen LOW süren 20-1=19 ms olmalıdır. 2ms uyguladı isen Low süren 20-2=18 ms olmalıdır.
Pek çok servo bu sürelere pek aldırış etmiyor ama pek çoğuda bu sürelerin dışında çalışmıyor.

Bana kalırsa basit bir program yazıp bu servoya,
500us HIGH 19500us low
1 ms HIGH 19 ms LOW
1500us HIGH 18500us LOW
2ms HIGH 18ms LOW
sinyalleri ver. Sonuca bak bakalım. Burada önemli olan hangi süre motoru başlangıç konumuna alıyor hangisi orta konuma hangisi en uca alıyor bulman gerek. Sonra gerisi kolaydır.

Verdiğim açıklamaya göre yazmış olduğun kodlarda yanlış gözüküyor. Mesela;
FOR I=0 TO 3
PULSOUT m3,60
PAUSEUS 18000
NEXT
pause 50
goto basla

Motora 600us HIGH veriyorsun ama 18000 us LOW uyguluyorsun. Bu rakam 18400 olmalı.
Döngü sonunda verdiğin Pause 50 ise bütün işi bozuyor.  O gecikmeyi oradan silmen gerekir.
Böylece sistem HIGH+LOW=20000us lik peryotlarla çalışmış olacaktır.

Unutma servo motorların çoğu 500us lik HIGH ile hareket alır (kimisi 1000us den başlar). Hareket alma, motorun o andaki konumuna da bağlıdır.  Maksimum puls süresi 2000us olmalıdır. Ben olsam 500 -2000 aralığını denerdim. Hemde 100us lik artışlar vererek.
Verdiğin süreyi 20.000 den çıkartarak onuda LOW süresi olarak vermen gerekiyor bunuda ihmal etme. Başkada gecikme olmaması lazım.

Ete

sinasos

ETE hocam merhaba;
aşağıdaki kurguyu yaparak sizin söylediklerinizi uyguladım eksik birşeyim varmı diye size de bildirmek istedim. ancak ilginç birşey oldu ! tesadüfen right1 ve left1 deki değerleri değiştirmemişim sadece o kısım çalıştı.
500-19500
600-19400
700-19300
.
.
.
1900-18100
2000-18000
şeklinde değiştirdim hiçbirisi çalışmadı sadece titriyor. çalışıyor dediğim kısım ise çok kararlı çalışmıyor! sizce bu neden kaynaklanabilir ?
selamlarımla.



start:
IF pin1 = 0 Then left1
IF pin2 = 0 Then right1

IF pin3 = 0 Then left2
IF pin4 = 0 Then right2

IF pin5 = 0 Then left3
IF pin6 = 0 Then right3

IF pin7 = 0 Then left4
IF pin8 = 0 Then right4

GoTo start

'************************ 1.servo motor sürücü *********************************
left1:
FOR I=0 TO 3
PULSOUT m1,75 '75 sola dönüş açısı
PAUSE 19500'0 'servo için 19,5 ms bekleme süresi

NEXT
goto start

right1:
FOR I=0 TO 3
PULSOUT m1,225 '225 sağa dönüş açısı
PAUSE 18000 'servo için 18 ms bekleme süresi 
NEXT
goto start
'************************ 2.servo motor sürücü *********************************
left2:
FOR I=0 TO 3
PULSOUT m1,1500 '75 sola dönüş açısı
PAUSEUS 18500 'servo için 19,5 ms bekleme süresi
NEXT
goto start

right2:
FOR I=0 TO 3
PULSOUT m1,1600 'sağa dönüş açısı
PAUSEus 18400 'servo için 18 ms bekleme süresi 
NEXT
goto start

'************************ 3.servo motor sürücü *********************************
left3:
FOR I=0 TO 3
PULSOUT m1,1700 '75 sola dönüş açısı
PAUSEUS 18300 'servo için 19,5 ms bekleme süresi
NEXT
goto start

right3:
FOR I=0 TO 3
PULSOUT m1,1800 'sağa dönüş açısı
PAUSEus 18200 'servo için 18 ms bekleme süresi 
NEXT
goto start

'************************ 4.servo motor sürücü *********************************
left4:
FOR I=0 TO 3
PULSOUT m1,1900 '75 sola dönüş açısı
PAUSEUS 18100 'servo için 19,5 ms bekleme süresi
NEXT
goto start

right4:
FOR I=0 TO 3
PULSOUT m1,2000 'sağa dönüş açısı
PAUSEus 18000 'servo için 18 ms bekleme süresi 
NEXT
goto start

end

MB_77

#3
bu mesaj tarafımdan silinmiştir.

MB_77

#4
bu mesaj tarafımdan silinmiştir.

ete

pulsout sireleride hatalı bence. Pulsout komutu mikrosn cinsinden puls çıkartır ve parametre olarak 10'un katlarını kullanır. Yani çıkıştan 100us puls çıkarmak için 10 vermeniz gerekir. 500us puls için 50 vermeniz yeterlidir. 1000us pulsiçin 100 vermeniz gerekir.
Ayrıca izah ettim. Bu aletlere peryodik 50 Hzlik sinyaluygulanması gerekir. Yani sürekli olarak
x (us) kadar HIGH
20.000-X kadar LOW vermeniz gerekir.
bir döngü ile 3 adet puls vermeniz yeterli olmayabilir.
Ete


sinasos

ilginize çok teşekkür ederim,
aşağıdaki bazı örnekleri buldum denedim ancak çalıştıramadım.  sayın MB_77 nin bahsettiği datasheet te geçen
Pulse width range   500~2500usec
Neutral position   1500usec
Running degree   180±2°(when 500~2500usec)

bilgileri beni şaşırttı. pdf de farklı bu sitede farklı yazıyor. en bariz farkı pdf de 120 derece sitede 180 derece açılı demesi.
ayrıca ;
http://www.teknolojiekibi.com/yeni/index.php?topic=1672.0
burada da MG995 servodan bahsedilmiş, bu konuda kafa karıştırıcı !


sweep: pulsout m1,pw
pause 18
pw = pw + 1
if pw > 200 then back
goto sweep
back: pulsout m1,pw
pause 18
pw = pw - 1
if pw < 60 then sweep
goto back

başka bir örnek (tabiki yine çalışmadı !)

inc:

FOR i = 30 TO 1 STEP -1 '' Count from 200 to 100 by -1
PULSOUT m1,w1 ' Send position signal to servo
PAUSE i ' Pause 20 msec
NEXT i

FOR i = 1 TO 30 STEP 1 '' Count from 200 to 100 by -1
PULSOUT m1,w1 ' Send position signal to servo
PAUSE i ' Pause 20 msec
NEXT i


bir örnek daha !

mainloop:
   If pin1 = 0 Then
       Gosub leftq
   Endif
   If Pin2 = 0 Then
      Gosub center
   Endif
   If Pin3 = 0 Then
      Gosub rightq
   Endif

   servo1 = 1           ' Start servo pulse
   Pauseus pos          ' Delay for servo pulse high time
   servo1 = 0           ' End servo pulse
   Pause 16             ' Servo update rate about 60Hz
   Goto mainloop        ' Do it all forever

leftq:
   If pos < 2000 Then
      pos = pos + 1
   Endif
   Return

rightq:
   If pos > 1000 Then
      pos = pos - 1
   Endif
   Return

center:
   pos = 1500
  Return


hangi yoldan gitsem bilemedim !

MB_77

#7
bu mesaj tarafımdan silinmiştir.

sinasos

sayın MB_77 ;
ilginize teşekkürler. bahsettiğiniz proteus çalışmasını zaten yaptım orada çalışıyor ancak gerçekte MG995 de çalışmıyor. birde 2. 3.motoru takınca hiç çalışmıyor. her motor ayrı ayrı 2 amper akım çekmeye başlıyor. ben farklı yollara sapmayı tercih etmiyorum sadece çalıştırmak istiyorum. hala da başarılı olamadım. aşağıda kaynak kodları ve proteus çizimi var. bakabilirseniz sevinirim. (Ayrıca ne tesadüftür ki left1 ve right1 blokları sıkıntılı da olsa çalışıyor diğerleri çalışmıyor.)

Include "modedefs.bas"         
@ device pic16F628A, INTRC_OSC_NOCLKOUT, wdt_on, pwrt_on, lvp_off, protect_off
DEFINE OSC 4

TRISA=%00000000  'A portu çıkış olarak ayarlandı.
TRISB=%11111111  'B portu çıkış olarak ayarlandı.
PORTA=0:portb=0
CMCON=7
INTCON.7=1
symbol m1=porta.0 'notorlar
symbol m2=porta.1
symbol m3=porta.2
symbol m4=porta.3

symbol pin1=portb.0 'butonlar
symbol pin2=portb.1
symbol pin3=portb.2
symbol pin4=portb.3
symbol pin5=portb.4
symbol pin6=portb.5
symbol pin7=portb.6
symbol pin8=portb.7

i var byte


start:
IF pin1 = 0 Then left1
IF pin2 = 0 Then right1

IF pin3 = 0 Then left2
IF pin4 = 0 Then right2

IF pin5 = 0 Then left3
IF pin6 = 0 Then right3

IF pin7 = 0 Then left4
IF pin8 = 0 Then right4

GoTo start

'************************ 1.servo motor sürücü *********************************
left1:
FOR I=0 TO 3
PULSOUT m1,75
PAUSE 19500

NEXT
goto start

right1:
FOR I=0 TO 3
PULSOUT m1,225
PAUSE 18000
NEXT
goto start
'************************ 2.servo motor sürücü *********************************
left2:
FOR I=0 TO 20
PULSOUT m1,100
PAUSEUS 19400
NEXT
goto start

right2:
FOR I=0 TO 20
PULSOUT m1,200
PAUSEus 19300
NEXT
goto start

'************************ 3.servo motor sürücü *********************************
left3:
FOR I=0 TO 10
PULSOUT m1,100
PAUSEUS 19400
NEXT
goto start

right3:
FOR I=0 TO 10
PULSOUT m1,300
PAUSEus 19200 
NEXT
goto start

'************************ 4.servo motor sürücü *********************************
left4:
FOR I=0 TO 30
PULSOUT m1,200
PAUSEUS 19300
NEXT
goto start

right4:
FOR I=0 TO 30
PULSOUT m1,300
PAUSEus 19200
NEXT
goto start

end

sinasos

çalışma videosu aşağıda (pardon çalışamama :))

1-2 kez çalışıp kilitleniyor. servoyu çıkartıp takınca tekrar çalışıyor. dönüş yönü sonuna gelince kilitleniyor. anlamadım bir türlü !

https://www.izlesene.com/video/servomotor/9789544

ete

Bu kadar mesaj yazıyorum hepsini es geçiyorsun anlatamıyorum galiba. Mesajlarıda okumıuyorsun sanırım.
Pulsout komutunda yer alan Puls süreleri en büyük 250 en küçük de 50 olmalı. Bunun dışındakiler ile çalışmaz o motor. Linklerde yazılanlara bakılırsa akım ve voltaj seviyeside çok önemli bu motor için .
Yazdıklarının hepsini sil aşağıdaki ver bakalım motora ne olacak.

W VAR WORD 'bunu programın değişken tanımlama
BASLA:
FOR I=50 to 250 STEP 10
    FOR W=0 to 1000
        PULSOUT M1, I
        PAUSEUS (20000-(I*10))
    NEXT
NEXT
GOTO BASLA


Ete

sinasos

Alıntı yapılan: ete - 27 Mart 2017, 19:29:06
Bu kadar mesaj yazıyorum hepsini es geçiyorsun anlatamıyorum galiba. Mesajlarıda okumıuyorsun sanırım.
Pulsout komutunda yer alan Puls süreleri en büyük 250 en küçük de 50 olmalı. Bunun dışındakiler ile çalışmaz o motor. Linklerde yazılanlara bakılırsa akım ve voltaj seviyeside çok önemli bu motor için .
Yazdıklarının hepsini sil aşağıdaki ver bakalım motora ne olacak.

hocam teşekkür ederim. hatamı maruz görün uzun süredir çalışıyorum ve kafam karıştı  :-[
kodu yükledim saat yönüne döndü sonuna kadar sonra titremeye başladı. motoru elle başa getirip tekrar enerji verince yine aynısını yapıyor.

ete

Sonuna kadar gidip titreme yaptı ise 2500us lik süre ona fazla sanırım. Sistem değiştirelim aşağıdaki kodu ver bakalım.
BASLA:
FOR I=50 to 200 STEP 10
    FOR W=0 to 1000
        PULSOUT M1, I
        PAUSEUS (20000-(I*10))
    NEXT
NEXT
FOR I=200 TO 50 STEP -10
   FOR W=0 TO 1000
      PULSOUT m1,I
      PAUSEUS (20000 - (I*10))
   NEXT
NEXT

GOTO BASLA


Şayet titremeden motor bir uçtan diğer uca gider ve aynı şekilde geriye döner ise bu kodu örnek alarak kendine yeni kod yaz. bunu yapmayıp yine saçmalıyor ise kaldır at o motoru başka birmarka motor al.

ETE

sinasos

aynı hocam sağa dönüyor tekrar geri gelmiyor titriyor. SG 90 taktım o da aynısını yapıyor.

ete

motor değiştirme. 1000 lik döngü çok uzun zaman alıyor. 1000 yerine 10 yaz her iki döngüyede. Tekrar dene hemde iki motorlada deneyebilirsin.
İsisde denedim güzel çalışıyor
Ete

Powered by EzPortal