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
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:
\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++
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?
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
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.