Kontrolowanie serwa modelarskiego

Jeśli jesteś modelarzem lub interesujesz się robotami i chcesz się podzielić swoim doświadczeniem to weź udział w dyskusjach na tym forum.
ODPOWIEDZ
maciekg5
-
Posty: 7
Rejestracja: 30 wrz 2007, 16:45
Lokalizacja: Polska

Kontrolowanie serwa modelarskiego

Post autor: maciekg5 » 16 sie 2008, 10:45

Jak sterować serwem? Nie chodzi mi o sterowanie z komputera, tylko za pomocą sprzętowego układu PWM, który można by sterować zdalnie (np. na zasadzie zamknięcia obwodu).

Awatar użytkownika
joon
Użytkownik
Posty: 2076
Rejestracja: 30 cze 2007, 22:56
Lokalizacja: Kraków, Przemyśl, Warszawa
Kontakt:

Post autor: joon » 16 sie 2008, 13:24

A dokładnie? Chodzi Tobie na przykład o to aby po naciśnięciu przycisku ramie obróciło się o 180 stopni?

maciekg5
-
Posty: 7
Rejestracja: 30 wrz 2007, 16:45
Lokalizacja: Polska

Post autor: maciekg5 » 16 sie 2008, 14:05

Buduję zdalnie sterowany samolot i serwa są potrzebne do sterowania sterami i lotkami. "Zamknięcie obwodu" w sensie "wybranie odpowiedniego kanału odbiornika". Np. jeden kanał to pociągnięcie lotek w jedną stronę, drugi w drugą, a brak akcji to serwo na pozycji środkowej.

Awatar użytkownika
joon
Użytkownik
Posty: 2076
Rejestracja: 30 cze 2007, 22:56
Lokalizacja: Kraków, Przemyśl, Warszawa
Kontakt:

Post autor: joon » 16 sie 2008, 17:42

I wychodzi na to że otrzymujesz sterowanie typu: lotka maks w górę, maks w dół...
Czarny masa, czerwony +4,8V do +6V a na żółty sygnał sterujący...
Sygnał sterujący to prostokątne impulsy dodatnie 1-2ms w odstępach co najmniej 18ms. Zależnie od długości impulsu serwo wychyla się o dany kąt - 1ms max w jedną, 2ms max w drugą, 1,5ms to środek i tak dalej analogicznie...

Zobacz na:
http://www.edw.com.pl/pdf/k10/56_07.pdf
Trochę tam wyczytasz...
A jak z transmisją radiową? Masz już rozwiązanie?

maciekg5
-
Posty: 7
Rejestracja: 30 wrz 2007, 16:45
Lokalizacja: Polska

Post autor: maciekg5 » 18 sie 2008, 15:08

joon pisze:I wychodzi na to że otrzymujesz sterowanie typu: lotka maks w górę, maks w dół...
Czarny masa, czerwony +4,8V do +6V a na żółty sygnał sterujący...
Sygnał sterujący to prostokątne impulsy dodatnie 1-2ms w odstępach co najmniej 18ms. Zależnie od długości impulsu serwo wychyla się o dany kąt - 1ms max w jedną, 2ms max w drugą, 1,5ms to środek i tak dalej analogicznie...
To wiem...
joon pisze: Zobacz na:
http://www.edw.com.pl/pdf/k10/56_07.pdf
Trochę tam wyczytasz...
Tylko jak wgrać kod programu do mikroprocesora? I jak później to kontrolować?
joon pisze: A jak z transmisją radiową? Masz już rozwiązanie?
Mam plany trójkanałowej aparatury zdalnego sterowania. Zrobię takie dwie i akurat będzie.

Awatar użytkownika
gwozdex
Użytkownik
Posty: 879
Rejestracja: 24 lut 2006, 10:04
Lokalizacja: Czechowice-Dziedzice
Kontakt:

Post autor: gwozdex » 18 sie 2008, 16:56

maciekg5 pisze:Tylko jak wgrać kod programu do mikroprocesora? I jak później to kontrolować?
No to już inna bajka Kolego :). Ja polecam BASCOM'a z kilku względów: jeśli nie jesteś "mikroprocesorowcem" to najszybciej odgadniesz o co w tym chodzi, najszybciej zaprogramujesz procesor. to po pierwsze, a po drugie w/w pakiet (a raczej język który obsługuje) posiada polecenie CONFIG SERVOS za pomocą którego możesz sterować nawet kilkoma serwami jednocześnie. Dodatkowych informacji możesz szukać w plikach pomocy. Powodzenia.

maciekg5
-
Posty: 7
Rejestracja: 30 wrz 2007, 16:45
Lokalizacja: Polska

Post autor: maciekg5 » 18 sie 2008, 19:03

Dziękuję wszystkim za odpowiedź.

Awatar użytkownika
joon
Użytkownik
Posty: 2076
Rejestracja: 30 cze 2007, 22:56
Lokalizacja: Kraków, Przemyśl, Warszawa
Kontakt:

Post autor: joon » 18 sie 2008, 20:30

A w jakim języku chcesz to robić?

maciekg5
-
Posty: 7
Rejestracja: 30 wrz 2007, 16:45
Lokalizacja: Polska

Post autor: maciekg5 » 19 sie 2008, 15:19

W BASCOM.

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

Post autor: Pikczu » 18 sty 2009, 15:24

Witam
Musisz mieć programator żeby to wgrać do procka.
To jest bardzo wczesna wersja softu do sterowania dwoma serwami wychyleniem drążków
(potencjometrów) i przesyłania danych prze port szeregowy.
Mniej więcej możesz zobaczyć jak to wygląda , będziesz mógł napisać własny program.
Moja część sprzętowa to gotowa płytka z Atmega 128 z mikrovegi
http://mikrovega.pl/index.php?page=shop ... &Itemid=38

TX 1

Kod: Zaznacz cały

'Sterwoanie dwoma serwami przez port szeregowy
'ATmega 128 kwarc 16 MHZ
'by Pawel L. (pikczu)
'ver 1.0 /2008
'$sim
$regfile = "M128def.dat"
$crystal = 16000000                                         'Kwarc
 $baud = 9600
                                                              'predkosc transmisji
'-----------konfiguracjia portu B ----------------

Config Portb.7 = Output



'-------------deklaracia zmiennych-----------------------------

Dim Osy As Byte                                             'os y serwa
Dim Osx As Byte                                             'os x serwa
Dim os_y As Byte                                            'trymowanie Y
Dim os_x As Byte                                            'trymowanie X
Dim Channel As Byte                                         'kanal ADC
Dim Przetwornik As Word                                     'wartosc pobrana z ADC
Dim kanal As Byte

'------------konfiguracjia LCD---------------------------------

Config Lcd = 16 * 2


'-------------konfiguracjia przetwornika A/C-------------------

Config Adc = Single , Prescaler = Auto , Reference = Internal


'--------------------------------------------------------------
Enable Interrupts



Cls
Lcd "start Adc"                                             'tak dla zabawy drukowanie na LCD
Start Adc                                                   'start przetwornika ADC

Waitms 100
Reset Portb.7                                               'włacz diode
Echo On                                                     'echo dla termianla
wait 1                                                      'czekaj 1s
set portb.7                                                 'wyłacz diode
wait 2                                                      'czekaj  2s
'--------------------------------------------------------------
Cls                                                         'czysc ekran

Do                                                          'poczatek petli


For Channel = 0 To 1                                        'dwa Kanaly
    przetwornik = 0                                         'wartosc poczatkowa  ADC=0
    przetwornik = Getadc(channel)                           'pobierz z ADC
Shift przetwornik , Right , 2                               'przesun o 2 w prawo


Select Case Channel                                         'kanał przetwornika
Case 0 :                                                    'jeli kanal adc 0 to
if Osy <> Przetwornik then                                  'jeli rozne od poprzedniej wartosci
osy = przetwornik                                           'osy przypisz wartosc pobrana z przetwornika do zmiennej OSY
kanal = 35                                                  'wartosc 35 jest to # w ASCII
 If Osy < 40 Then                                           'jesli wartosc zmiennej osy mniejsz niz 40 wtedy
  Osy = 40                                                  'zmien wartosc OSY na 40 (doswiadczalnie usawiony minium wychylenia serwa)
   End If                                                   'koniec warunku
    If Osy > 180 Then                                       'jelsi wartosc OSY wieksza niz 180 to
     Osy = 180                                              'zmien wartosc na max 180    (tez ustwione doswiadczalnie)
      End If                                                'koniec warunku
        printbin kanal                                      'wysyła binarnie kanał czyli 35 lub 36  koniecznie ponizej wartosci 40
         printbin osy                                       'wysyła zmienna OSY
          print chr(13)                                     'znak enter w ASCII
           print osy                                        'drukuje w termianlu OSY i enter plus LF wASCII 10 czyli przechodzi do poczatku lini
     end if                                                 'koniec warunku

Case 1 :                                                    'kanał przetwornika jak wyzej
if Osx <> Przetwornik then                                  'jeli rozne od poprzedniej wartosci
osx = przetwornik                                           'osx przypisz wartosc pobrana z przetwornika do zmiennej OSX
kanal = 36                                                  'wartosc 36 jest to $ w ASCII
       If Osx < 40 Then                                     'jesli wartosc zmiennej osx mniejsz niz 40 wtedy
           Osx = 40                                         'zmien wartosc OSX na 40 (doswiadczalnie usawiony minium wychylenia serwa)
            End If                                          'koniec warunku
             If Osx > 180 Then                              'jelsi wartosc OSX wieksza niz 180 to
              Osx = 180                                     'zmien ratosc na max 180
               End If                                       'koniec warunku
                printbin kanal                              'wysyła binarnie kanał tym razem 36 $ w ASCII
                 printbin osx                               'wysyła binarnie OSX
                  print chr(13)                             'znak enter w ASCII
                  print osx                                 'drukuje wartosc OSX plus enter ASCII 13 i LF w ASCII 10 czyli przechodiz do poczatku lini


    end if                                                  'koniec warunku

End Select                                                  'koniec select case

next                                                        'następny kanał z przetwronika ADC


Loop                                                        'petla
End                                                         'koniec tych wypocin






Teraz część odbiorcza


Kod: Zaznacz cały

'---CZĘŚĆ ODBIORCZA-------------------------------------------------------------
'Sterwoanie dwoma serwami przez port szeregowy
'ATmega 128 kwarc 16 MHZ
'by Pawel L. (pikczu)
'ver 1.0 /2008

'$sim

$regfile = "M128def.dat"
$crystal = 16000000                     'Kwarc
 $baud = 9600

'-----------konfiguracjia portu B i C jako wyjscie ----------------
Config Portb = Output
Config portc = Output

'-------------deklaracia zmiennych-----------------------------

Dim Osy As Byte
Dim Osx As Byte
Dim Channel As Byte
Dim Przetwornik As Word
dim value as byte



'-----------------konfiguracjia serv---------------------------

Config Servos = 2 , Servo1 = Portb.7 , Servo2 = Portb.6 , Reload = 10
Enable Interrupts
Echo On

servo(1) = 40                           'wartosc poczatkowa
servo(2) = 40                           'wartosc poczatkowa

Cls
Lcd "start"                             'wdrukuj na lcd start
Wait 1                                  'czekaj 1
Cls                                     'czysc ekran

lcd "servo test"                        'drukuj na lcd
wait 1                                  'czekaj
lcd "servo max"                         'drukuj na lcd
servo(1) = 180                          'ustaw servo na max wartosc dobrana doswiadczalnie
servo(2) = 180
wait 1                                  'czekaj
cls
servo(1) = 40                           'servo na min
servo(2) = 40
lcd "servo MIN"
wait 1
cls
LCD "System on"

wait 1
cls
Do


value = inkey()                         'zmienna do której bedzie przypisana wartosc odebrana

 if value = 35 then                     'jelsi znak w ASCII #
   channel = 1                          'to bedzie to kanal 1 czyli OSY
   end if
 if value = 36 then                     'jesli znak w ASCII $
    channel = 2                         'to bedzie to kanał 2    czyli OSX
    end if                              'koniec warunku

Select case channel
 case 1 : inputbin osy                  'kanał 1 to zapisz do OSY
  channel = 0                           '  wyzeroj kanał
  servo(1) = osy                        'ustaw servo, wartosc w zmiennej OSY


case 2 : inputbin osx                   'kanał 2 to zapisz do OSX
 channel = 0                            'wyzeroj kanał
 servo(2) = osx                         'ustaw servo , wartosc w zmiennej OSX


Case else
End select


Loop
End
' to tyle

wmalec
-
Posty: 1
Rejestracja: 30 sty 2009, 13:28
Lokalizacja: LUBLIN

Post autor: wmalec » 30 sty 2009, 15:45

Zobacz tutaj - http://forumrc.alexba.eu/ipw-web/bullet ... php?t=4795

Sprawdzone gotowe rozwiązanie.

ODPOWIEDZ