Skocz do zawartości

Bascom - odchylenie serwa o pewien ustalony kąt


Bertos87

Pomocna odpowiedź

Witam

To mój pierwszy post 😃 więc proszę o wyrozumiałość. Ale do rzeczy - mam µC Atmege 16 z kwarcem 16 mhz i chciałbym napisać program Bascomie który obracał by serwo/a ( E sky EK2-0508) za pomocą 2 monostab µswitchy o pewien zadany kąt. Na przykład : gdy wezmę nacisnę przycisk S1 to orczyk obraca się od 0°-75° a gdy przycisne przycisk S2 to powrócił wówczas do pierwotnego położenia czyli z 75°-0°. Próbowałem modyfikować program ale nie zbyt to działa ponieważ obracają się dwa serwa w dwóch przeciwnych stronach. Prosiłbym o przykłady z innymi instrukcjami lub wskazówki albo sugestie

PS. Dokonywałem również modyfikacji parametru I=100...150 ale nie pomogło

$regfile = "m16def.dat"

$crystal = 16000000

Config Pinc.6 = Output
Config Pinc.7 = Output
Config Pina.0 = Input
Config Pina.1 = Input                                       
Config Servos = 2 , Servo1 = Portc.7 , Servo2 = Portc.6 , Reload = 10


Dim I As Byte                                               



S1 Alias Pina.1                                             

S2 Alias Pina.0                                             


Enable Interrupts                                           



Set Porta.0                                                

Set Porta.1                                                 


I = 150                                                     
Servo(1) = I                                                

Servo(1) = 300 - I                                          

Do                                                          
  Debounce S1 , 0 , Prawo , Sub                            

  Debounce S1 , 0 , Lewo , Sub                             

Loop
End                                                         

Prawo:                                                      

I = I + 20                                                 

If I = 220 Then                                            
   I = 200                                                 
End If                                                    
Servo(1) = I                                               

Servo(1) = 300 - I                                         

Return                                                      

Lewo:                                                       

    I = I - 20                                             

If I = 80 Then                                              
   I = 100                                                
End If                                                     

Servo(1) = I                                               

Servo(1) = 300 - I                                         

Return                                     
Link do komentarza
Share on other sites

Ok lecz gdy tylko zmienię na Servo(2) to wówczas gdy nacisnę s1 to będzie obracało 2 serwami na raz. Na dodatek w przeciwne strony. Natomiast moim celem jest aby za pomocą s1 obracało się tylko jedno serwo (w jednym czasie) w prawo, a gdy przycisnę s2 to w lewo i dlatego kombinowałem z tym parametrem Servo

Link do komentarza
Share on other sites

Tu też jest błąd:

  Debounce S1 , 0 , Prawo , Sub                            

  Debounce S1 , 0 , Lewo , Sub                             

Reszta powinna działać, pod warunkiem że I=150 to neutralne położenie serwa. Spróbuj najpierw prostego zwiększania I bez tego Servo(1)=300 - I bo to powoduje skoki serwa.

I jeszcze jedno: jezli zaczynasz inkrementację zmienniej od 150 co 20, warunek

If I = 220 Then                                            
   I = 200                                                  
End If 

nigdy nie będzie spełniony.

Ustaw lepiej

If I > 220 Then                                            
   I = 200                                                  
End If 
Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

Jeśli mówisz, że serwa obracają ci się w przeciwnym kierunku, to może w cale nie jest błąd programu tylko elektroniki...? (ale też nie wiem)

Może spróbuj zmienić polaryzację na jednym serwie...

jak naprawisz błąd to napisz jak ci się to udało.

Link do komentarza
Share on other sites

Mój błąd nie sprecyzowałem poprzedniego postu.

Można zmieniać jeśli z serw wy lutuje się elektronikę. Wtedy serwo działa jak zwykły silnik.

Link do komentarza
Share on other sites

Bardzo ciekawa sugestia z tym wymontowaniem elektroniki.

Napisz jeszcze jak wtedy obrócić silnik o zadany kąt - bo o to przecież autorowi chodzi.

Jeśli zasugerujesz enkoder, to będzie to dodanie elektroniki po wyrzuceniu elektroniki, więc jaki w tym sens?

Link do komentarza
Share on other sites

rezolut, można odwrócić bieguny silnika oraz zamienić kolejność nóżek potencjometru, powinno działać, ale nie ręczę za to rozwiązanie - proście w programie robić "odwrotnie", czyli jedno serwo w prawo, drugie w lewo (dodawanie I dla drugiego serwa zamiast odejmowania powinno dać radę).

Link do komentarza
Share on other sites

rezolut, nie mam pojęcia czy zalogowałeś się do tego portalu żeby się kłócić, czy w jakimś innym celu...?

Ja próbowałem odpowiedzieć koledze na pytanie dlaczego serwa kręcą mu się w odwrotną stronę, ponieważ (jak pewnie zauważyłeś) też o tym pisał.

Nie mam zamiaru na forum kłócić się z innymi użytkownikami.

Moim zamiarem było tylko spróbować pomóc koledze.

Link do komentarza
Share on other sites

Oj no sorry 😉

Póki co widzę błędy w programie. Jeśli zostaną poprawione i serwo nadal będzie się kręciło odwrotnie, pewnie przyjdzie pora na myśleniu o podmianie kabelków 😉

Link do komentarza
Share on other sites

A co wy chcecie w servie podmieniać ? Oczywiście bez rozbierania go.

Co do śledzenia pozycji serv, to powinno to być wykonalne programowo, ale wymagane jest taktowanie procesora kwarcem, generowanie impulsów sterujących Timerem, pamietanie odpowiednich danych, i korygowanie ich. No i wskazane by było żeby wszystkie serva miały identyczne parametry, czyli były takiego samego typu i producenta, nawet serii.

Natomiast na pewno nie jest to zagadnienie dla całkiem początkującego, bo trzeba dosyć dobrze znać zasadę działania serv i ich sterowania.

Link do komentarza
Share on other sites

Przepraszam bo z pośpiechu wprowadziłem Was trochę w trochę inne tory.

Otóż powyższy kod (w lekkiej modyfikacji) pochodzi z książki M.Wiązani i autor napisał, że jak zaprogramuję się atmege 8 (w/w kodem)i gdy zostaną podłączone 2 serwa to pierwszy przycisk będzie zmieniał położenie pierwszego serwa w lewo a drugiego w prawo a drugi przycisk odwrotnie (pierwszego w prawo a drugiego w lewo).

Natomiast moim celem jest napisanie kodu takiego aby 1szy przycisk obracał tylko 1 serwo o kąt 75° w lewo a drugi przycisk [te same serwo] o 75° w prawo.

Mam nadzieję że teraz wyjaniłem prawidłowo

Link do komentarza
Share on other sites

$regfile = "m16def.dat"
$crystal = 16000000

Config Pinc.6 = Output

Config Pina.0 = Input
Config Pina.1 = Input                                       
Config Servos = 1 , Servo1 = Portc.7 , Reload = 10

Dim I As Byte                                               
S1 Alias Pina.1                                             
S2 Alias Pina.0                                             
Enable Interrupts                                           

Set Porta.0                                               
Set Porta.1                                                 

I = 150                                                     
Servo(1) = I                                               

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

Prawo:                                                     
   I = 100                                                 
  Servo(1) = I                                               
Return                                                     

Lewo:                                                       
   I = 200                                               
  Servo(1) = I                                               
Return

Dobierz I i zastąp I=100 i I=200 zgodnie z żądanymi wychyleniami serwa.

Link do komentarza
Share on other sites

Ok ale muszę się przyznać, że mam jeszcze jeden problem. Otóż non stop od początku 1 postu serwo "wariuję" tzn orczyk wykonuje ciągłe gwałtowne drgania o 1° raz w lewo raz w prawo. Odbywa się to bez naciskania przycisku.

1.Czy winą za ten stan odpowiada zły dobór parametru "I" czy elektronika ?

2.Czy można podać kondensatory między linią sygnału do serwa a GND ?

PS. Narysowałem schemat mojego obecnego układu zasilania żeby można było go zweryfikować.

Zmieniłem trochę zdjecie żeby być bardziej prezycyjny

Link do komentarza
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.