PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Servosteuerung



CantStOp
23.10.2009, 22:04
Hi,

Ich habe hier 5 servos und ein atmega232.
Ich möchte die servos über die serielle schnittstelle mit dem pc steuern.

Zum programmieren habe ich bascom und visual c++ 2005.
Die frage ist wie soll die kommunikation genau ablaufen, bzw was schicke ich in welcher form?
Ich brauche ja einmal die servo-id und den winkel.

Ich verwende diese klasse hier:http://msdn.microsoft.com/de-de/library/system.io.ports.serialport.write.aspx

MfG

EDIT: ich meinte atmega32 natürlich :D

Willa
24.10.2009, 02:17
Eine sehr gut funktionierende, aber evtl. nicht die eleganteste Methode ist es Strings zu senden. z.B. "A30" für Servo1 auf 30° und "B230" für das nächste Servo auf 230°. Im µC empfängst du die Strings, und kontrollierst welcher Buchstabe am Anfang des Strings ist. Der wird dann abgeschnitten und der Rest zu einem Integer oder Byte konvertiert.
In diesem Wiki Beitrag (ganz unten) findest du ein Beispiel für Basic. Das lässt sich einfach verstehen.....
http://www.rn-wissen.de/index.php/Joystick_am_PC_zur_Kontrolle_eines_Roboters

CantStOp
25.10.2009, 00:11
Hey Willa,
Danke für den Link, ist ganz gut erklärt :)
Habe auch schon etwas ausprobiert:




$regfile = "m32def.dat"
$framesize = 32
$swstack = 32
$hwstack = 32
$crystal = 8000000
$baud = 9600

Config Servos = 5 , Servo1 = Portb.0 , Servo2 = Portb.1 , Servo3 = Portb.2 , Servo4 = Portb.3 , Servo5 = Portb.4 , Reload = 10
Config Portb = Output

Enable Interrupts

Dim Inputstring As String * 5
Dim Data_available As Byte
Dim A_empfangen As Byte
Dim B_empfangen As Byte
Dim C_empfangen As Byte
Dim D_empfangen As Byte
Dim E_empfangen As Byte
Dim A_string As String * 5
Dim B_string As String * 5
Dim C_string As String * 5
Dim D_string As String * 5
Dim E_string As String * 5
Dim A_integer As Integer
Dim B_integer As Integer
Dim C_integer As Integer
Dim D_integer As Integer
Dim E_integer As Integer


Do
Print "Test"
Data_available = Ischarwaiting()
If Data_available > 0 Then
Input "" , Inputstring
A_empfangen = Instr(inputstring , "A")
B_empfangen = Instr(inputstring , "B")
C_empfangen = Instr(inputstring , "C")
D_empfangen = Instr(inputstring , "D")
E_empfangen = Instr(inputstring , "E")
Print Inputstring

If A_empfangen = 1 Then
A_string = Mid(inputstring , 2)
A_integer = Val(a_string)
End If
If B_empfangen = 1 Then
B_string = Mid(inputstring , 2)
B_integer = Val(b_string)
End If
If C_empfangen = 1 Then
C_string = Mid(inputstring , 2)
C_integer = Val(c_string)
End If
If D_empfangen = 1 Then
D_string = Mid(inputstring , 2)
D_integer = Val(d_string)
End If
If E_empfangen = 1 Then
E_string = Mid(inputstring , 2)
E_integer = Val(e_string)
End If
End If

Servo(1) = A_integer
Servo(2) = B_integer
Servo(3) = C_integer
Servo(4) = D_integer
Servo(5) = E_integer
Waitms 1000

Loop
End


Aber noch nicht einmal Print "Test" funktioniert,
weisst du woran es liegen könnte?

Mfg

Hubert.G
25.10.2009, 11:31
Wie sieht denn deinen Hardware aus?
Schon was anderes probiert das auch wirklich alles funktioniert.

CantStOp
25.10.2009, 15:50
Ok RX und TX waren nicht connected...

Jetzt funktioniert zumindest Print.

Aber das Programm da oben läuft die Schleife nur solange durch bis ich ihm etwas sende und gibt dann bei Print Inputstring, wenn ich zum Beispiel "A100" eingebe, "A10 A1" zurück.

Irgendwie komisch, sieht so aus als würde mein Programm abstürzen.

CantStOp
27.10.2009, 16:06
Mein Code am Pc sieht so aus:


serialPort1->WriteLine(textBox1->Text->ToString()+"\r");

\r ist doch das gleiche wie chr(13)?

Ich checks nicht, warum das nicht funktioniert :evil:

Willa
27.10.2009, 16:29
\r ist doch das gleiche wie chr(13)?
Wie kommst du auf diesen Gedanken...? "\r" wird als String versendet, da kommt VB bestimmt nicht auf die Idee das vorher in einen CR zu verwandeln. Kann ich mir jedenfalls nicht vorstellen. In der Hilfe von VB.NET steht bestimmt eine Lösung.

CantStOp
27.10.2009, 16:31
jo ist mir klar aber ich schreibe in c++

Willa
27.10.2009, 16:39
Ahso :-D Deswegen die komische Syntax.... und verwandelt c++ Strings in einen CR? Oder sendet das einfach diesen String? Gibt es in c++ kein chr(13)?

CantStOp
01.11.2009, 18:26
Ok jetzt funktionierts
Ich musste einen Buffer erstellen..
Danke nochmal

Meint ihr die Übertragung funktioniert noch wenn ich einen RS232-to-Usb-Adapter benutze?

Willa
01.11.2009, 20:22
Einen Buffer auf dem µC oder auf dem PC?

Meint ihr die Übertragung funktioniert noch wenn ich einen RS232-to-Usb-Adapter benutze?
Sollte gehen, ich benutze ausschließlich solche Wandler.

CantStOp
01.11.2009, 20:33
Einen Buffer auf dem µC oder auf dem PC?
auf dem µC :)


Sollte gehen, ich benutze ausschließlich solche Wandler gut danke!


Ps: geiler Tricopter :P