Witam
Przez ostatni czas zabrałem się za budowę manipulatora, konstrukcja powstała ze sklejki 3mm ciętej laserowo, do napędu użyłem serw, wiadomo łatwe sterowanie i duży udźwig. Jednostką sterującą jest procesor AT89S52, program napisany został w assemblerze. Głównym programem sterującym jest program na komputerze. Komunikacja odbywa się poprzez port szeregowy RS232. Szkielet programu napisany w C++, z dodatkami winAPI, grafika pisana w OpenGL. W programie mamy możliwość podglądu aktualnego położenia robota i kąta każdego z ramion, nagrywania i odtwarzania sekwencji z plików.
Wszystko pięknie ładnie ale mam jeden problem, którego jak na razie nie udało mi sie wyeliminować a mianowicie jak włączam zasilanie robota to ustawia się do pozycji startowej i utrzymuje ją bez problemów, kiedy tylko włączam program na PC i otwiera sie port szeregowy i zaczyna sie transmisja danych to ramie zaczyna wykonywać szarpnięcia wynikające chyba z tego, że dochodzą błędne liczby bo po każdym szarpnięciu wraca do swojej pozycji. Próbowałem zmieniać prędkości transmisji i nic nie pomogło, wymieniłem tez kabel na podwójnie ekranowany mikrofonowy i dalej to samo.
Poniżej kilka zdjęć manipulatora i filmik z działania.
A tak wygląda główne okno programu:
A oto filmik z działania manipulatora, na którym widać trzęsienie się robota po włączeniu programu.
Zamieszczam również program który odbiera dane i steruje serwami:
Może jakiś bardzie zaawansowany programista wymyśli lepszy sposób komunikacji i sterowania. Liczę na każdą waszą opinie która może pomóc w wyeliminowaniu tego problemu. Zależy mi również na czasie, ponieważ we wtorek mam dni otwarte w szkole i chciałbym zaprezentować swoją pracę.
Kodu programu na PC nie zamieszczam gdyż zajmuje za dużo miejsca i praca ma iść również na konkurs więc na razie nie mogę udostępnić kodu.
Przez ostatni czas zabrałem się za budowę manipulatora, konstrukcja powstała ze sklejki 3mm ciętej laserowo, do napędu użyłem serw, wiadomo łatwe sterowanie i duży udźwig. Jednostką sterującą jest procesor AT89S52, program napisany został w assemblerze. Głównym programem sterującym jest program na komputerze. Komunikacja odbywa się poprzez port szeregowy RS232. Szkielet programu napisany w C++, z dodatkami winAPI, grafika pisana w OpenGL. W programie mamy możliwość podglądu aktualnego położenia robota i kąta każdego z ramion, nagrywania i odtwarzania sekwencji z plików.
Wszystko pięknie ładnie ale mam jeden problem, którego jak na razie nie udało mi sie wyeliminować a mianowicie jak włączam zasilanie robota to ustawia się do pozycji startowej i utrzymuje ją bez problemów, kiedy tylko włączam program na PC i otwiera sie port szeregowy i zaczyna sie transmisja danych to ramie zaczyna wykonywać szarpnięcia wynikające chyba z tego, że dochodzą błędne liczby bo po każdym szarpnięciu wraca do swojej pozycji. Próbowałem zmieniać prędkości transmisji i nic nie pomogło, wymieniłem tez kabel na podwójnie ekranowany mikrofonowy i dalej to samo.
Poniżej kilka zdjęć manipulatora i filmik z działania.
A tak wygląda główne okno programu:
A oto filmik z działania manipulatora, na którym widać trzęsienie się robota po włączeniu programu.
Zamieszczam również program który odbiera dane i steruje serwami:
$MOD52
$DEBUG(asm.aof)
;********************;
;PROGRAM ;
;********************;
org 00H
LJMP Init
;********************;
;WEKTORY PRZERWAŃ ;
;********************;
org 0BH
LJMP PRZERWANIE
org 23H
LJMP intRS232
;********************;
;INIT ;
;USTAWIENIA RS232 I ;
;LICZNIKOW ;
;********************;
org 30H
Init:
MOV SCON,#01000000B ;TRYB 1,
ORL TMOD,#00100001B ;T1, 8BIT, AUTOMATYCZNE PRZEŁADOWANIE
;T0, 16BIT
ORL PCON,#80H ;SMOD = 1
MOV TH1,#0FAH ;PREDKOŚĆ 9600
SETB TR1 ;START LICZNIKA T1
SETB ES ;START UART'u
SETB ET0 ;ODBLOKOWANIE T0
SETB EA ;ODBLOKOWANIE GLOBALNYCH PRZERWAŃ
SETB REN ;ODBLOKOWANIE ODBIORNIKA
LJMP WARTOSCI
org 50H
;********************;
;POCZĄTKOWE WARTOŚCI ;
;********************;
WARTOSCI:
MOV R0,#69H
MOV 69H,#154
MOV 68H,#104
MOV 67H,#49
MOV 66H,#221
MOV 65H,#154
MOV 64H,#154
LJMP BUFOR
;********************;
;MAIN PĘTLA GŁÓWNA ;
;********************;
MAIN:
;********************;
;OBSŁUGA SERVA1 ;
;********************;
CLR TR0
MOV A,#9H
MOV B,59H
MUL AB
XCH A,R5
MOV A,#0FFH
CLR C
SUBB A,R5
MOV TL0,A
MOV R5,B
MOV A,#0FFH
SUBB A,R5
MOV TH0,A
MOV P2,#00000001B
SETB TR0
JNB TF0,$
;********************;
;OBSŁUGA SERVA2 ;
;********************;
CLR TR0
MOV A,#9H
MOV B,58H
MUL AB
XCH A,R5
MOV A,#0FFH
CLR C
SUBB A,R5
MOV TL0,A
MOV R5,B
MOV A,#0FFH
SUBB A,R5
MOV TH0,A
MOV P2,#00000010B
SETB TR0
JNB TF0,$
;********************;
;OBSŁUGA SERVA3 ;
;********************;
CLR TR0
MOV A,#9H
MOV B,57H
MUL AB
XCH A,R5
MOV A,#0FFH
CLR C
SUBB A,R5
MOV TL0,A
MOV R5,B
MOV A,#0FFH
SUBB A,R5
MOV TH0,A
MOV P2,#00000100B
SETB TR0
JNB TF0,$
;********************;
;OBSŁUGA SERVA4 ;
;********************;
CLR TR0
MOV A,#9H
MOV B,56H
MUL AB
XCH A,R5
MOV A,#0FFH
CLR C
SUBB A,R5
MOV TL0,A
MOV R5,B
MOV A,#0FFH
SUBB A,R5
MOV TH0,A
MOV P2,#00001000B
SETB TR0
JNB TF0,$
;********************;
;OBSŁUGA SERVA5 ;
;********************;
CLR TR0
MOV A,#9H
MOV B,55H
MUL AB
XCH A,R5
MOV A,#0FFH
CLR C
SUBB A,R5
MOV TL0,A
MOV R5,B
MOV A,#0FFH
SUBB A,R5
MOV TH0,A
MOV P2,#00010000B
SETB TR0
JNB TF0,$
;********************;
;OBSŁUGA SERVA6 ;
;********************;
CLR TR0
MOV A,#9H
MOV B,54H
MUL AB
XCH A,R5
MOV A,#0FFH
CLR C
SUBB A,R5
MOV TL0,A
MOV R5,B
MOV A,#0FFH
SUBB A,R5
MOV TH0,A
MOV P2,#00100000B
SETB TR0
JNB TF0,$
;********************;
;OBSŁUGA SERVA7 ;
;********************;
CLR TR0
MOV A,#9H
MOV B,5AH
MUL AB
XCH A,R5
MOV A,#0FFH
CLR C
SUBB A,R5
MOV TL0,A
MOV R5,B
MOV A,#0FFH
SUBB A,R5
MOV TH0,A
MOV P2,#01000000B
SETB TR0
JNB TF0,$
;********************;
;OPUZNIENIE 3mS ;
;********************;
CLR TR0
MOV TH0,#0F5H
MOV TL0,#32H
SETB TR0
JNB TF0,$
;********************;
;BUFOR PORTU RS232 ;
;********************;
BUFOR:
MOV 59H,69H
MOV 58H,68H
MOV 57H,67H
MOV 56H,66H
MOV 55H,65H
MOV 54H,64H
MOV 5AH,68H
LJMP MAIN
;********************;
;KONIEC PETLI GŁÓWNEJ;
;********************;
;********************;
;PRZERWANIE T0 ;
;********************;
PRZERWANIE:
CLR TF0
MOV P2,#0H
RETI
;********************;
;OBSŁUGA RS232 ;
;********************;
intRS232:
clr RI
MOV A,SBUF
MOV @R0,A
MOV A,R0
CLR C
SUBB A,#64H
DEC R0
JNZ PETLA1
MOV R0,#69H
PETLA1:
RETI
END
Może jakiś bardzie zaawansowany programista wymyśli lepszy sposób komunikacji i sterowania. Liczę na każdą waszą opinie która może pomóc w wyeliminowaniu tego problemu. Zależy mi również na czasie, ponieważ we wtorek mam dni otwarte w szkole i chciałbym zaprezentować swoją pracę.
Kodu programu na PC nie zamieszczam gdyż zajmuje za dużo miejsca i praca ma iść również na konkurs więc na razie nie mogę udostępnić kodu.