[bascom] program do ramienia robota

Jeśli jesteś modelarzem lub interesujesz się robotami i chcesz się podzielić swoim doświadczeniem to weź udział w dyskusjach na tym forum.
Awatar użytkownika
c4v2
Użytkownik
Posty: 426
Rejestracja: 22 lis 2005, 15:14
Lokalizacja: z przed monitora

Post autor: c4v2 » 08 sty 2011, 0:42

keruseykaryu pisze:Pięć serwo i wolny bascom. Chyba nie wiesz czym to grozi.
Ma Pan rację. Zweryfikowałem w praktyce. Mikroprocesor AtMega168 taktowany kwarcem 18MHz.
Przy zakładanej rozdzielczości 10us w między przerwaniami od przepełnienia Timer0 jest 160 cykli maszynowych. Obsługa jednego serwa "na piechotę" była idealna, okres wynosił 20ms, ale po dodaniu instrukcji warunkowych (w obsłudze przerwania) dla drugiego serwa czas ten się rozjechał do ok 23ms.
Przy korzystaniu z dedykowanych poleceń (Config Servo) też nie jest idealnie. Parametr "Reload" wcale nie jest w us, jak napisano to w helpie. Przy wartości "Reload" ustawionej na 10 przy wyżej wymienionym taktowaniu mikroprocesora dla jednego serwa, okres wynosił 25ms. Przy wartości "Reload" ustawionej na 8 przy wyżej wymienionym taktowaniu mikroprocesora dla jednego serwa, okres wynosił 20ms. ale się zwiększał o kilka ms przy zwiększaniu ilości serw. Nie wiem jaką tolerancję mają serwa na tego typu zmiany. Co do dodatniego impulsu, który przecież wyznacza położenie wałka w serwie dla większej ilości serw też mam zastrzeżenia. Sumując, będzie działać lecz nie ma mowy o jakimś precyzyjniejszym zastosowaniu niż przysłowiowe "przesuwanie rygla". Może rozbudować układ sprzętowo o jakieś liczniki programowalne, gdzie można wpisać liczbę odpowiedzialną za długość dodatniego impulsu, taki przerzutnik o programowanym przedłużeniu impulsu? Jeżeli precyzja w tym projekcie jest wymagana to
lepiej napędy było by wykonać na bazie silników krokowych.

Awatar użytkownika
kayron
Użytkownik
Posty: 2088
Rejestracja: 21 wrz 2008, 12:53
Lokalizacja: Poland
Kontakt:

Post autor: kayron » 08 sty 2011, 9:23

Ale piszecie tak jak by ATmega168 nie miała PWMa (z noty – Six PWM Channels).
Oczywiście do takiej ilości serw trzeba napisać własne procedury, ale się da.
Powinno się dać na upartego robić nawet na jednym Timerze. Jeżeli dla jednego serwa trzeba co 20-25ms podawać impuls o czasie trwania 1-2ms, to przy przy 5 serwach, to minimalny czas wywołania to 20ms/serwo czyli 20/5 = 4ms przy 5 serwach. No tyle poradzi chyba każda Mega taktowana nawet 1MHz?

Awatar użytkownika
c4v2
Użytkownik
Posty: 426
Rejestracja: 22 lis 2005, 15:14
Lokalizacja: z przed monitora

Post autor: c4v2 » 08 sty 2011, 15:35

2ᐤ to wystarczająca precyzja sterowania ramieniem? Im dalej od osi obrotu tym precyzja przecież mniejsza.

[ Dodano: 2011-01-08, 18:03 ]
Chodziło mi nie o 2ᐤ tylko 5.2785ᐤ, co daje przy 270ᐤ obrotu serwa skok w przybliżeniu równy 2%.
Załączniki
Servo.png

konrad1115
-
Posty: 17
Rejestracja: 06 sty 2011, 9:13
Lokalizacja: Rajbrot
Kontakt:

Post autor: konrad1115 » 08 sty 2011, 20:08

to jak będzie ztym kodem pomozecie ??????
ja napisałem coś takiego ale niewiem czy dobze i niewiem co dalej

Kod: Zaznacz cały

$regfile = "m8def.dat" 

Config Servos = 5 , Servo1 = Portd.7 , Servo2 = Portd.6 , Servo3 = Portd.5 , Servo4 = Portd.4 , Servo5 = Portd.3 , Reload = 10 

Config Portc.0 = Input 
Config Portc.1 = Input 
Config Portc.2 = Input 
Config Portc.3 = Input 
Config Portc.4 = Input 
Config Portc.5 = Input 
Config Portd.3 = Output 
Config Portd.4 = Output 
Config Portd.5 = Output 
Config Portd.6 = Output 
Config Portd.7 = Output 

Enable Interrupts 

Servo(1) = 126 
Servo(2) = 150 
Servo(3) = 150 
Servo(4) = 250 
Servo(5) = 250

Awatar użytkownika
c4v2
Użytkownik
Posty: 426
Rejestracja: 22 lis 2005, 15:14
Lokalizacja: z przed monitora

Post autor: c4v2 » 09 sty 2011, 2:39

Serwa jak najbardziej ma Pan dobrze skonfigurowane. Parametr "Reload" trzeba będzie w praktyce zweryfikować. Na początku programu potrzebna jest deklaracja częstotliwości "CRYSTAL=wartość".
Konfigurację pinów kolumn (przyjmuję że multipleksowane będą kolumny) klawiatury należy zmienić:

Kod: Zaznacz cały

Config Portc.0 = Output
Config Portc.1 = Output
oraz

Kod: Zaznacz cały

Config Portb.0 = Output
Po skonfigurowaniu wejść/wyjść należy podciągnąć wejścia

Kod: Zaznacz cały

Set Portc.2
Set Portc.3
Set Portc.4
Set Portc.5
Instrukcje "Servo(x)=wartość" trzeba zapętlić:

Kod: Zaznacz cały

Do
...
...
...
Loop
End

konrad1115
-
Posty: 17
Rejestracja: 06 sty 2011, 9:13
Lokalizacja: Rajbrot
Kontakt:

Post autor: konrad1115 » 09 sty 2011, 9:44

w pętli mam picać coś typu tego

Kod: Zaznacz cały

if portx.x = 0 then portx.x=1
tak????

Awatar użytkownika
matrix
Użytkownik
Posty: 1796
Rejestracja: 15 mar 2006, 5:21
Lokalizacja: Sochaczew
Kontakt:

Post autor: matrix » 09 sty 2011, 10:52

Ja to mam jedno pytanie:
Jak kolega chce napisać obsługę ramienia robota jak kolega nie ma pojęcia od czego zacząć, jak, gdzie i co napisać?

Awatar użytkownika
Pikczu
Użytkownik
Posty: 754
Rejestracja: 18 lip 2005, 18:33
Lokalizacja: Dublin
Kontakt:

Post autor: Pikczu » 09 sty 2011, 11:58

Matrix przestań zniechęcać gościa :lol:
Jak nie będzie próbował to się nie nauczy.

Konrad na dzień dzisiejszy Matrix ma dużo racji.
Zapomnij narazie o całości, rozbij ten projekt na małe części.
Naucz się podstaw bo szybko zrozumiesz że wcale nie jest to takie łatwe i będzie to frustrujące. Zacznij od jednego serwa.

Awatar użytkownika
kayron
Użytkownik
Posty: 2088
Rejestracja: 21 wrz 2008, 12:53
Lokalizacja: Poland
Kontakt:

Post autor: kayron » 09 sty 2011, 12:16

A ja bym zapytał najpierw tak:
Do czego pan te ramie chce wykorzystać? Tzn. ma to być projekt czysto edukacyjny, czy ma to mieć jakieś zastosowanie, nie wiem w domu.
Pytam bo są 2 podejścia programistyczne:
- obecne, czyli takie luźne poznawanie BASCOMa.
- półprofesjonalne, bardziej skomplikowane (więcej wnikania w szczegóły), ale i efektywniejsze jeżeli chodzi o efekt końcowy.

konrad1115
-
Posty: 17
Rejestracja: 06 sty 2011, 9:13
Lokalizacja: Rajbrot
Kontakt:

Post autor: konrad1115 » 09 sty 2011, 12:41

zacząłem projekt ramienia robota bo chciałem sie poduczyć robienia schematów na uC i to bylo moim celem program potrzebuje zeby sprawdzić jak dziala robot i zebym mógł robić coraz lesze konstrukcje projekt jest typowo edukacyjny jeśli projekt wypali sprubuje dołączyć do tego wyświetlacz lcd klawiature przerobic na pada potemmoze sprubuje zrobić robota wielozadaniowego

Awatar użytkownika
matrix
Użytkownik
Posty: 1796
Rejestracja: 15 mar 2006, 5:21
Lokalizacja: Sochaczew
Kontakt:

Post autor: matrix » 09 sty 2011, 12:44

Pikczu pisze:Matrix przestań zniechęcać gościa
Jak nie będzie próbował to się nie nauczy.
Pawełku, tu nie chodzi o to że chcę kolegę zniechęcić tylko pokazać realia. Nie znając "podstaw" nie można brać się za tak dość "skomplikowany" projekt jak ramię robota. To jest obsługa kilku serw na raz.

Jeszcze raz powtarzam, nie chcę zniechęcić. Jeśli zajdzie potrzeba to sam chętnie pomogę czy podpowiem jeśli będę wiedział.

Awatar użytkownika
kayron
Użytkownik
Posty: 2088
Rejestracja: 21 wrz 2008, 12:53
Lokalizacja: Poland
Kontakt:

Post autor: kayron » 09 sty 2011, 13:08

Tzn. TAK ja co prawda schematu nie oglądałem bo nie mam zainstalowanego EAGLE na tym kompie. Ale za nim zacznie się programowanie czegokolwiek należy stworzyć założenia funkcjonalne.
Z tego co się orientuję to posiadając klawiaturą 3x4, mamy możliwość zbudowania 12 przyciskowego pada którym będzie się wygodnie sterować takim ramieniem.
Ja bym proponował taką koncepcję jak na rysunku, gdzie 1L oznacza pierwszą oś obrotu, w lewo, analogicznie należy interpretować pozostałe skróty. Więc najpierw należało by napisać procedurę obsługi takiej klawiatury/pada, a dopiero potem zabierać się za serwa.
Ja osobiście proponował bym dla każdej osi zmienną o nazwie OS_nr (Dim Os1 as word),. Teraz naciśniecie 1L spowoduje zmniejszenie o np.2 (pod warunkiem oczywiście że nie ma w niej 0) takiej zmiennej która będzie reprezentować czas impulsu dla danego serwa w us. Później ten czas podstawi się do waitus jako czas trwania impulsu dodatniego dla danego serwa.
PS. Ma pan może już jakiś model czy to tylko układ na razie na papierze ?
Załączniki
Ramie_pad.JPG

konrad1115
-
Posty: 17
Rejestracja: 06 sty 2011, 9:13
Lokalizacja: Rajbrot
Kontakt:

Post autor: konrad1115 » 09 sty 2011, 13:18

wcześniej yślałem zeby kpić pada od ps2 i sterować aalogami ale stwierdzilem ze na początek styknie klawiatura pozatym niewiem jak podpiąc pada z analogami

Awatar użytkownika
kayron
Użytkownik
Posty: 2088
Rejestracja: 21 wrz 2008, 12:53
Lokalizacja: Poland
Kontakt:

Post autor: kayron » 09 sty 2011, 13:21

Tzn. to co ja narysowałem to nic innego jak ta pańska klawiatura 3x4, tylko z tak rozłożonymi przyciskami, żeby się tym wygodnie i intuicyjnie sterowało. Nazwy 1L, 2G są tylko umowne i reprezentują jaką osią i w jakim kierunku steruje dany przycisk. Właściwie to na tej podstawie należało by teraz zrobić rysunek PCB, aby wiedzieć w programie który przycisk (fizycznie w matrycy 3x4) do czego przypisać.

Awatar użytkownika
c4v2
Użytkownik
Posty: 426
Rejestracja: 22 lis 2005, 15:14
Lokalizacja: z przed monitora

Post autor: c4v2 » 09 sty 2011, 14:39

kayron pisze:Ja osobiście proponował bym dla każdej osi zmienną o nazwie OS_nr (Dim Os1 as word),. Teraz naciśniecie 1L spowoduje zmniejszenie o np.2 (pod warunkiem oczywiście że nie ma w niej 0) takiej zmiennej która będzie reprezentować czas impulsu dla danego serwa w us. Później ten czas podstawi się do waitus jako czas trwania impulsu dodatniego dla danego serwa.
Jeżeli zrezygnuje się z pre definiowanych poleceń obsługi serw to idea Pana Kayrona może być słuszna.
Tylko odmierzanie czasu warto wykonać w przerwaniu od Timera, a nie Waitus.
Aby sterować kilkoma serwami jednocześnie trzeba zapewnić sekwencję w której impuls dodatni dla następnego serwa występował zaraz za impulsem poprzedniego serwa Czasy poszczególnych impulsów sumować... Dodanie obsługi multipleksowanej klawiatury może być nieco karkołomne (lecz pewnie nie niewykonalne).

A tymczasem może należało by wypróbować pre definiowane instrukcje obsługi serw?

ODPOWIEDZ