Hallo,
ich möchte meinen RC-Modellhelikopter über meine Fernsteuerung (Graupner MX-12) mit meinem X-Box Controller steuern können.
|X-Box Controller| --USB--> |PC| --COM--> |Arduino Uno Rev.3| --PPM--> |MX-12| --Funk--> |RC-Heli|
Die Steuerung mit dem X-Box Controller funktioniert sogar teilweise schon aber leider sehr Zeitverzögert (ca. 0,5 sec). :~ Der X-Box Controller ist per USB an meinem PC angeschlossen. Ein Vb.net Programm liest die Achsenpositionen des Controllers aus und sende diese an den Arduino Uno per serieller Schnittstelle. Der Arduino Uno erzeugt dann ein PPM-Signal (Puls-Pausen-Modulation), welches von der Fernsteuerung verarbeitet werden kann. Dieses PPM-Signal wird über die Lehrer-Schüler-Schnittstelle der Fernsteuerung übermittelt. Die Fernsteuerung steuert dann den RC-Heli.
Hier mein Vb.net Code zum Auslesen und Senden der X-Box Controller Achsen:
Imports System.IO.Ports 'COM-Port
Imports System
Public Class Form1
Dim JInfo As JOYINFO
Public Shared indata As String
Public s As New SerialPort
Private Declare Function joyGetPos Lib "winmm.dll" (ByVal uJoyID As Integer, ByRef pji As JOYINFO) As Integer
Private Structure JOYINFO
Dim X As Integer
Dim Y As Integer
Dim Z As Integer
Dim Buttons As Integer
End Structure
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
s.Close()
s.PortName = "com3" 'will need to change to your port number
s.BaudRate = 9600
s.DataBits = 8
s.Parity = Parity.None
s.StopBits = StopBits.One
s.Handshake = Handshake.None
s.Encoding = System.Text.Encoding.Default 'very important!
s.Open()
s.RtsEnable = True
AddHandler s.DataReceived, AddressOf DataReceviedHandler
End Sub
Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
Dim x, y, z, b As Integer
joyGetPos(0, JInfo) 'Joystick 0
b = Str$(JInfo.Buttons)
x = Math.Round(Str$(JInfo.X) / 65525 * 255, 0)
y = Math.Round(Str$(JInfo.Y) / 65525 * 255, 0)
z = Math.Round(Str$(JInfo.Z) / 65525 * 255, 0)
TextBox1.Text = b
TextBox2.Text = x
TextBox3.Text = y
TextBox4.Text = z
s.Write(Chr(x))
's.Write(Chr(y))
's.Write(Chr(z))
End Sub
Private Shared Sub DataReceviedHandler(ByVal sender As Object, ByVal e As SerialDataReceivedEventArgs)
Dim sp As SerialPort = CType(sender, SerialPort)
indata = sp.ReadLine
End Sub
End Class
Hier mein Arduino-Code zur Erzeugung des PPM-Signals:
int pin = 3; // PPM INPUT PIN
unsigned int duration1 = 1000;
unsigned int duration2 = 1000;
unsigned int duration3 = 1000;
void setup()
{
Serial.begin(9600);
pinMode(pin, OUTPUT);
}
void loop()
{
digitalWrite(3, LOW);
delayMicroseconds(350);
digitalWrite(3, HIGH);
delayMicroseconds(1000);
digitalWrite(3, LOW);
delayMicroseconds(400);
digitalWrite(3, HIGH);
delayMicroseconds(duration1);
digitalWrite(3, LOW);
delayMicroseconds(400);
digitalWrite(3, HIGH);
delayMicroseconds(1000);
digitalWrite(3, LOW);
delayMicroseconds(400);
digitalWrite(3, HIGH);
delayMicroseconds(1000);
digitalWrite(3, LOW);
delayMicroseconds(400);
digitalWrite(3, HIGH);
delayMicroseconds(1000);
digitalWrite(3, LOW);
delayMicroseconds(400);
digitalWrite(3, HIGH);
delayMicroseconds(1000);
digitalWrite(3, LOW);
delayMicroseconds(400);
digitalWrite(3, HIGH);
delayMicroseconds(20000 - (400*7) - (1000*5) - duration1);
}
void serialEvent(){
duration1 = map(Serial.read(), 0, 255, 700, 1500);
}
Habt ihr eine Idee wie ich die oben beschriebene Zeitverzögerung minimieren kann?
Danke vorab für eure Ideen und schönen Gruß :),
Christoph