logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

ATmega8: Sterowanie serwem Hitec HS322 w Bascomie - problem z ruchem w lewo

francu 05 Maj 2006 11:12 3777 7
REKLAMA
  • #1 2593845
    francu
    Poziom 16  
    Posty: 242
    Pomógł: 2
    Ocena: 1
    Witam.

    Buduję sterownik kamery z servo, sterowanie podczerwienią RC5. Zacząłem od servo. Zmodyfikowałem program z książki M.Wiązani. Dwa przyciski obracają servem w prawo i w lewo. Oto program:

    $regfile = "m8def.dat"
    $crystal = 10000000

    Config Pinc.1 = Output
    Config Pinb.1 = Input
    Config Pinb.2 = Input
    Config Servos = 1 , Servo1 = Portc.1 , Reload = 10
    Dim I As Byte

    S1 Alias Pinb.2
    S2 Alias Pinb.1

    Enable Interrupts

    Set Portb.1
    Set Portb.2

    I = 100
    Servo(1) = I

    Do
    Debounce S1 , 0 , Prawo , Sub
    Debounce S2 , 0 , Lewo , Sub
    Loop
    End

    Prawo:
    I = I + 2

    If I = 162 Then
    I = 160
    End If
    Servo(1) = I

    Return

    Lewo:
    I = I - 2

    If I = 38 Then
    I = 40
    End If
    Servo(1) = I

    Return


    Kilka dni temu chodziło dobrze na dwóch moich servach Hitec: HS81 i HS322. Dziś odpaliłem i i HS322 nie chce się obracać w lewo. W prawo obraca się, ale gdy wciskam przycisk obracający w lewo servo stoi. Mogę je ręcznie obrócić w lewo do pewnego położenia. Dopiero wtedy ponownie mogę obracać je w prawo (jakby zapamietało położenie zgodnie z wciśnięciami przycisku, ale nie mogło się obrócić). Normalne, że serva lekko brzęczą, nawet gdy się nie poruszają??

    Jaka powinna być warość parametru RELOAD?? Od czego zależy??

    W książce M.Wiązani autor pisze, że wychylenie wałka można zmieniać w zakresie 0,9 - 2,1ms, a środkowe położenie jest 1,5ms dla serva HS311.

    Z mojego doświadczalnego programu wynika, że środkowe położenie mam 1ms (wartość I=100 mnożę przez reload??) dla HS322. Dobrze rozumuję??


    Napisałem też podobny program, ale dla dwóch serv. Nie działał jednak własciwie. Serva nie zmieniały położenia osi wogóle, albo z opóźnieniem po wciśnięciu przycisku.
  • REKLAMA
  • #2 2595266
    slawko_k
    Poziom 35  
    Posty: 2928
    Pomógł: 253
    Ocena: 236
    Cytat:

    I = 100
    Servo(1) = I

    Do
    Debounce S1 , 0 , Prawo , Sub
    Debounce S2 , 0 , Lewo , Sub
    Loop
    End


    niemozliwe ze to dzialalo. przeciez w petli wogole nie modyfikujesz polecania servo.
    wg mnie powinno byc tak

    I = 100
    do
    Servo(1) = I

    Debounce S1 , 0 , Prawo , Sub
    Debounce S2 , 0 , Lewo , Sub
    Loop
    End

    a tak na marginesie to bawilem sie serwami i uwazam ze polecenie servo niezbyt dobrze dziala
  • REKLAMA
  • #3 2595702
    francu
    Poziom 16  
    Posty: 242
    Pomógł: 2
    Ocena: 1
    I=100 to położenie początkowe. Program tak działa. Położenie jest modyfikowane w 60 krokach w podprogramach Prawo i Lewo.

    Jak rozwiązałeś sterowanie?? Masz jakieś propozycje dotyczące mojego problemu?? I tak muszę zrobić sterowanie pilotem RC5. Na przyciskach robiłem programy próbne.
  • #4 2653122
    francu
    Poziom 16  
    Posty: 242
    Pomógł: 2
    Ocena: 1
    Stworzyłem następny program. Położenie serva jest zmieniane za pomocą dwóch przycisków pilota RC5. Oto on:

    'Jedno servo sterowane pilotem, 60 kroków
    $regfile = "m8def.dat"
    $crystal = 10000000

    Config Pinb.0 = Output
    Config Int0 = Low Level
    Config Rc5 = Pind.2
    Config Servos = 1 , Servo1 = Portb.0 , Reload = 10
    On Int0 Pobr_rc5

    Dim Address As Byte , Command As Byte
    Dim I As Byte
    Dim Odebr_kod As Bit

    Enable Interrupts
    Enable Int0

    Set Odebr_kod

    I = 100
    Servo(1) = I

    Do
    If Odebr_kod = 1 Then
    If Command = 53 Then
    Gosub Prawo
    Elseif Command = 43 Then
    Gosub Lewo
    End If
    Reset Odebr_kod
    Enable Int0
    End If
    Loop
    End

    Prawo:
    I = I + 2
    If I = 162 Then
    I = 160
    End If
    Servo(1) = I
    Return

    Lewo:
    I = I - 2
    If I = 38 Then
    I = 40
    End If
    Servo(1) = I
    Return

    Pobr_rc5:
    Disable Int0
    Enable Interrupts
    Getrc5(address , Command)
    Command = Command And &B01111111
    Set Odebr_kod
    Return

    Nie działa on jednak właściwie. Podczas kompilacji pojawiają się trzy błędy dla ostatniej linii: 2 razy "60 Ta etykieta już istnieje" i "221 Skok do tyłu poza dozwolonym zakresem". Jeśli zaprogramuję proca to wciśnięcie dowolnego klawisza pilota powoduje obrót osi w prawo i po 8 krokach oś przesuwa sie o 1 krok w prawo i w lewo. Co moze być przyczyną??

    Wyczytałem w helpie, że Config servos i getrc5 korzystają z licznika timer0. Może to być przyczyną takiego zachowania układu??

    Program juz działa. Do obsługi RC5 użyłem Timer2.

    Docelowo chcę korzystać z 4 przycisków pilota do sterowania 2 serwami. Pobawię się później.
  • #5 2653786
    McRancor
    VIP Zasłużony dla elektroda
    Posty: 5326
    Pomógł: 479
    Ocena: 124
    Brzęczące serwo świadczy o 2 rzeczach:
    -albo jest kiepski i najzwyklej w świecie drży,
    -albo zrób to ręcznie na timerach, bo bascom i servo to tandeta
  • REKLAMA
  • #6 2662111
    francu
    Poziom 16  
    Posty: 242
    Pomógł: 2
    Ocena: 1
    Stworzyłem następny program:

    $regfile = "m8def.dat"
    $crystal = 10000000

    Config Pinb.0 = Output
    Config Pinb.1 = Output
    Config Int0 = Change
    Config Rc5 = Pind.2 , Timer = 2
    Config Servos = 2 , Servo1 = Portb.0 , Servo2 = Portb.1 , Reload = 10
    On Int0 Pobr_rc5

    Dim Address As Byte , Command As Byte
    Dim I As Byte
    Dim J As Byte
    Dim Odebr_kod As Bit

    Enable Interrupts
    Enable Int0

    Set Odebr_kod

    I = 100
    J = 100
    Servo(1) = I
    Servo(2) = J
    Do
    If Odebr_kod = 1 Then
    Select Case Command
    Case 53:
    Gosub Prawo
    Case 43:
    Gosub Lewo
    Case 46:
    Gosub Gora
    Case 42:
    Gosub Dol
    End Select
    Reset Odebr_kod
    Enable Int0
    End If
    Loop
    End

    Prawo:
    I = I + 1
    If I = 161 Then
    I = 160
    End If
    Servo(1) = I
    Return

    Lewo:
    I = I - 1
    If I = 39 Then
    I = 40
    End If
    Servo(1) = I
    Return

    Gora:
    J = J + 2
    If J = 132 Then
    J = 130
    End If
    Servo(2) = J
    Return

    Dol:
    J = J - 2
    If J = 78 Then
    J = 80
    End If
    Servo(2) = J
    Return


    Pobr_rc5:
    Disable Int0
    Enable Interrupts
    Getrc5(address , Command)
    Command = Command And &B01111111
    Set Odebr_kod
    Return

    Też nie działa właściwie:/ Po wciśnięciu przycisku pilota oś serwa którego przycisk dotyczy obraca się, ale o 1 krok obraca się też oś drugiego serva. Po puszczeniu przycisku drugie sevo wraca do poprzedniego położenia. Jak to ominąć?? Ma ktoś jakiś pomysł??

    Posiada ktoś przykładowe programy do obsługi serva w Bascomie na timerach??
  • REKLAMA
  • #7 2694821
    francu
    Poziom 16  
    Posty: 242
    Pomógł: 2
    Ocena: 1
    Stworzyłem nowy program działający dokładnie tak jak chcę. Obsługa rc5 jest w pętli a nie na przerwaniu.
    $regfile = "m8def.dat"
    $crystal = 10000000
    
    Config Pinb.0 = Output
    Config Pinb.1 = Output
    Config Rc5 = Pind.2 , Timer = 2
    Config Servos = 2 , Servo1 = Portb.0 , Servo2 = Portb.1 , Reload = 10
    
    Dim Address As Byte , Command As Byte
    Dim I As Byte
    Dim J As Byte
    
    Enable Interrupts
    
    I = 100
    J = 100
    Servo(1) = I
    Servo(2) = J
    Do
    Getrc5(address , Command)
     Command = Command And &B01111111
     Select Case Command
       Case 53:
          Gosub Prawo
       Case 43:
          Gosub Lewo
       Case 46:
          Gosub Gora
       Case 42:
          Gosub Dol
       End Select
    Loop
    End
    
    Prawo:
    I = I + 1
    If I = 161 Then
    I = 160
    End If
    Servo(1) = I
    Return
    
    Lewo:
    I = I - 1
    If I = 39 Then
    I = 40
    End If
    Servo(1) = I
    Return
    
    Gora:
    J = J + 2
    If J = 132 Then
    J = 130
    End If
    Servo(2) = J
    Return
    
    Dol:
    J = J - 2
    If J = 78 Then
    J = 80
    End If
    Servo(2) = J
    Return


    Dołaczę jeszcze 4 diodki wskazujące kierunek obrotu i zapis aktualnej pozycji do pamieci eeprom i jej odczyt po włączeniu zasilania.

    Ma ktoś pomysł jak bardziej rozbudować ten projekt?? Jakie dodatkowe funkcje dodać?? Zastanawiałem się nad dodaniem LCD, ale chyba nie ma to wiekszego sensu.

    Czekam na sugestie.
  • #8 2786730
    francu
    Poziom 16  
    Posty: 242
    Pomógł: 2
    Ocena: 1
    Rozbudowałem program o obsługę 4 diod wskazujących kierunek ruchu:

    $regfile = "m8def.dat"
    $crystal = 10000000
    
    Config Pinb.0 = Output
    Config Pinb.1 = Output
    
    Config Pinc.0 = Output
    Config Pinc.1 = Output
    Config Pinc.2 = Output
    Config Pinc.3 = Output
    
    Config Rc5 = Pind.2 , Timer = 2
    Config Servos = 2 , Servo1 = Portb.0 , Servo2 = Portb.1 , Reload = 10
    
    Dim Address As Byte , Command As Byte
    Dim I As Byte
    Dim J As Byte
    
    Set Portc.0
    Set Portc.1
    Set Portc.2
    Set Portc.3
    
    Portc = &B11111111
    
    Enable Interrupts
    
    I = 100
    J = 100
    Servo(1) = I
    Servo(2) = J
    Do
    Getrc5(address , Command)
     Command = Command And &B01111111
     Select Case Command
       Case 53:
          Gosub Prawo
    
       Case 43:
          Gosub Lewo
    
       Case 46:
          Gosub Gora
    
       Case 42:
          Gosub Dol
    
       End Select
    Loop
    End
    
    Prawo:
    Portc = &B11111110
    I = I + 1
    If I = 161 Then
    I = 160
    End If
    Servo(1) = I
    Return
    
    Lewo:
    Portc = &B11111101
    I = I - 1
    If I = 39 Then
    I = 40
    End If
    Servo(1) = I
    Return
    
    Gora:
    Portc = &B11111011
    J = J + 2
    If J = 132 Then
    J = 130
    End If
    Servo(2) = J
    Return
    
    Dol:
    Portc = &B11110111
    J = J - 2
    If J = 78 Then
    J = 80
    End If
    Servo(2) = J
    Return


    Jest mały problem. Po puszczeniu przycisku dioda nie gaśnie. W jaki sposób napisać program, aby dioda zgasła po puszczeniu przycisku??
    Wygaszanie diod przed instukcją Return nic nie daje, gdyż dioda w tym czasie nie zdąży się pewnie zapalić. Jakieś propozycje??[/url]

Podsumowanie tematu

✨ Dyskusja dotyczy problemu sterowania serwem Hitec HS322 za pomocą mikrokontrolera ATmega8 i języka Bascom. Autor buduje sterownik kamery z serwomechanizmem, sterowany pilotem na podczerwień RC5. Początkowy program umożliwiał obrót serwa w prawo i w lewo za pomocą dwóch przycisków, jednak serwo HS322 przestało reagować na ruch w lewo, mimo że w prawo działa poprawnie. Wątek obejmuje analizę kodu, gdzie wskazano, że polecenie Servo(1) powinno być wywoływane w pętli głównej, a nie tylko w podprogramach. Autor rozwijał program, implementując obsługę RC5 w pętli zamiast w przerwaniu, dodając sterowanie dwoma serwami oraz diodami wskazującymi kierunek ruchu. Wskazano również, że sterowanie serwami w Bascomie może być niedokładne i czasem powodować drżenie serwa, sugerując ręczne sterowanie timerami jako alternatywę. Ostatecznie autor osiągnął stabilne działanie programu z obsługą czterech kierunków i dwoma serwami, poprawiając zakresy wartości sterujących i eliminując problemy z ruchem w lewo.
Podsumowanie wygenerowane przez AI na podstawie treści dyskusji.
REKLAMA