Hallo,
ich hab einen Antennenrotor gebaut den ich via Arduino und Perl steuere.
Ich greife auf den Steuerrechner(Dachboden) via ssh von meinem Shack zu.
Das ganze funktioniert sehr gut bis auf ein kleines Problem das ich am Ende beschreibe.
Als erstes mein Lösungsanzatz, nicht relevater Code lasse ich weg und
ich habe versucht die einzelenen Aktionen in Funktionen zu packen.
Arduino
RS232 init:
Code:
void setup ()
{
Serial.begin (9600);
}
RS232 einlesen:
Mit der Methode wir ASCII eingelesen. In meinem Fall
3 Ziffern die dann in Zahlen gewandelt werden um dann eine
3-stellige Zahl zu werden. Beispiel: wenn 1 gesendet wird
kommt eine ASCII 49 die durch -48 zur 1 wird. Siehe ASCII-Tabelle
Code:
/* Sollwinkel via serieller Schnittstelle Empfangen
Sollwinkel muss 3-Stellig + LF uebertragen werden
*/
void Empfangen(){
int count = 0; // eingehende Byte zaehlen
beschleunigung=true; // => 1x bei neuem Winkel Motor in der Regelschleife hochfahren
schleichgang=false;
boolean ok = true;
while(ok){
if (Serial.available () > 0){
incomingByte = Serial.read ();
data_in[count] = incomingByte;
count++;
if (incomingByte == 10){ // dez 10 = Zeilenende
ok=false;
}
}
}
}
RS232 ausgeben:
Code:
/*Info an serielle Schnittstelle senden*/
void RS232OUT(){
Serial.println("Winkel liegt an. Done");
delay(10);
}
Perl via Linux
Ich denke man kann den Code leicht in die Windows-Welt umsetzen.
RS232 init:
Code:
use Device::SerialPort;
# init globale Variablen
my $port = Device::SerialPort->new("/dev/ttyACM0");
my $PeilungSoll="";
my $VonArduino="";
an Arudino senden:
Code:
sub senden{
my $Var=shift @_;
$port->write($Var); # via RS232 senden
return(1);
}
von Arduino empfangen:
Code:
sub empfangen{
my $Input="";
my $OK=0;
until($OK){
sleep(1);
$Input = $port->lookfor(); # von RS232 lesen
if ($Input) {
$OK=1;
$port->lookclear; # Buffer loeschen?
}
}
return($Input);
}
Nun zu meinem Problem. Auf der Werkbank "hundert" mal geteste.
Jetzt hab ich die Steuerung auf dem Dachboden und bediene den Rotor
von einem anderen Raum. Die Rechner sind via Netzkabel verbunden.
Es kommt zu sporadischem hägenbleiben bei meinem Perlprogramm.
Nach einem Durchlauf soll der Arduino "ferig melden". Perl wartet
in einer Schleife auf diese Meldung. Ich denke der Arduino liefert nicht.
Ich sehe meinen Rotor ist in Position. Der Motor ist aus. Nun müsste via
RS232 die Meldung vom Arduino kommen und mein Perlprogramm wieder
in die Eingabe springen, tut es aber nicht immer.
Viel Text, aber man muss ja die Sachlage einigermaßen genau schlidern.
Hat jemand eine Rat?
Gruß
Lesezeichen