« VideoDLL - A simple way for using webcams with DirectX | Το Project αποκτά και καινούγιο σώμα , γιατί Νούς υγιής εν σώματι υγιή :) » |
LEGO Mindstorm Programming SetOuputSettings problems solved with SendMessage
Ενώ το Mindstorm έχει τόσα καλά (Δυνατότητες/Community/Δεκάδες APIs/ακόμα και Open Source Firmware , τους ελαφρύτατους Fantom Drivers κτλ κτλ ) ωστόσο έχει ένα μάλλον μέτριο Documentation..
Για κάποιο περίεργο λόγο λοιπόν η Built-in Direct Command SetOutputState που επιτρέπει την χρήση των μοτέρ από τον υπολογιστή δεν φρενάρει.. Και ιδιαίτερα όταν το μοτέρ έχει μεγάλο βάρος ή είναι ρυθμισμένο σε μεγάλη ταχύτητα το overshoot είναι πολλών μοιρών 60+ οπότε το καθιστά όχι χρίσιμο..
Από την στιγμή λοιπόν που δεν φρενάρει η λύση είναι συνεχόμενο Polling του μοτέρ ( GetOutputState ) με την προοπτική της διακοπής τροφοδοσίας του μοτέρ για να το αναγκάσουμε να φρενάρει . Το 2ό πρόβλημα που προκύπτει είναι το delay στην επικοινωνία το οποίο σε συνδυασμό με την ταχύτητα του μοτέρ ( 900 degrees/sec ) απαιτεί delay 1 ms για ακρίβεια 1 μοίρας , και τα πράγματα γίνονται χειρότερα προσθέτοντας και το βάρος..
Παρ`όλα αυτά τα προγράμματα που γίνονται compile μέσω του LabView (*.rxe) επειδή εκτελούνται τοπικά και όλοι οι έλεγχοι γίνονται απευθείας από τον ARM7 επεξεργαστή , έχουν την καλύτερη δυνατή επίδοση..
Έτσι λοιπόν με περιφάνεια παρουσιάζω το motor_control.rxe
Τρέχοντας το στο Mindstorm το τοποθετείτε σε κατάσταση αναμονής για οδηγίες ακριβείας..
Μπορείτε να το ανεβάσετε στο Mindstorm χρησιμοποιώντας το NXTExplorer
Σημειωτέον οτι τα Mailboxes στο SendMessage γίνονται address με πρώτο το 0 , δηλαδή το Mailbox 1 έχει αριθμό 0 , το Mailbox 2 αριθμό 1 κτλ..
Mailbox // Variable Type // Label
1 -> True/False - Mprosta/Pisw
2 -> Integer - Moires strofis
3 -> Integer - Dynami Peristrofis ( 0 - 100 )
4 -> Integer - Motor Port ( 1=A , 2=B , 3=C )
5 -> True/False - Next Action ( true=brake , false=coast )
6 -> Integer - Action ( 0 = Constant , 1 = Ramp Up ,2 = Ramp Down )
7 -> True/False - Control Motor Power ( True on , False off)
8 -> True/False - Wait for completion ( true on , false off)
9 -> String - ‘ok’ ektelei tin entoli
10 -> String - ‘ok’ kleinei to programma
Για να στείλει κανείς ένα μήνυμα , μπορεί να χρησιμοποιήσει κάποιος τον παρακάτω κώδικα (όποιος έχει ασχοληθεί με Direct Commands Θα καταλάβει )..
Code:
void LoadSendMessageCommand(unsigned char mailbox,string msg) | |
{ | |
int str_size=(int)strlen(msg.c_str()); | |
mess_str[0]=0x09; //Send msg | |
mess_str[1]=(char) (mailbox); | |
mess_str[2]=(char) (str_size+1); | |
| |
int i=0; | |
while (i<str_size) | |
{ | |
mess_str[3+i]=msg[i]; | |
++i; | |
} | |
mess_str[4+i]=0; | |
mess_str_len=4+str_size; // the last of the mess_str array | |
if (mess_str_len>59) { mess_str_len=59; mess_str[58]=0; } | |
| |
return; | |
| |
} | |
| |
| |
void LoadSendMessageCommandint(unsigned char mailbox,unsigned int msg) | |
{ | |
mess_str[0]=0x09; //Send msg | |
mess_str[1]=(char) (mailbox); | |
mess_str[2]=(char) (4+1); | |
for (char offset = 0; offset <= 3; offset++) | |
{ | |
mess_str[3 + offset] = (char) (msg % 0x100); | |
msg >>= 8; | |
}; | |
mess_str[7]=0; | |
mess_str_len=8; | |
return; | |
} | |
| |
| |
void LoadSendMessageCommandbool(unsigned char mailbox,bool msg) | |
{ | |
mess_str[0]=0x09; //Send msg | |
mess_str[1]=(char) (mailbox); | |
mess_str[2]=(char) (1+1); | |
if (msg) { mess_str[3]=(char) (0x01); } else | |
{ mess_str[3]=(char) (0x00); } | |
mess_str[4]=0; | |
mess_str_len=5; | |
return; | |
} |