Arduino mit Perl steuern

Hallo zusammen,

ich versuche seit graumer Zeit mein Arduino UNO über ein Perl-Skript anzusteuern. Soweit bin ich in der Lage Parameter wie Baudrate u.ä. auszulesen, doch beim konfigurieren, setzten und auslesen der I/O's bin ich keinen Schritt weiter gekommen.

Im Internet konnte ich leider auch nichts finden, weshalb ich mich an Euch wende! Ich hoffe das mir jemand weiterhelfen kann!

Equip: Arduino UNO, Windows 7, Perl 5.16.03 = Win32::SerialPort.

Gruß.

Ob sich viele hier mit Perl beschäftigen, mag ich zu bezweifeln.

Was sendest du mit Perl über die Serielle Schnittstelle, und welcher Sketch läuft auf dem Arduino?

Hallo Scripted,

Schau dir mal Firmata an. Dafür gibt es auch einen Perl Client.

Gruß
Reinhard

Auch wenn ich nicht unter Windows arbeite, so kenne ich doch sowohl Perl als auch den Arduino einigermassen gut. Leider hast Du keinen Code gepostet, so dass wir Dir nicht weiterhelfen können. Auch ist mir nicht ganz klar, welche I/O's Du setzen bzw. auslesen willst. Du bist Dir schon im Klaren, dass Du den Arduino auch programmieren musst, damit er auf der seriellen Schnittstelle antwortet?

Tschuldigung, off topic, aber ich kann gerade nicht wiederstehen:

Perl used to serve the same purpose as Python, but now only bearded ex-hippies use it.

Gibt es hier zu finden: http://crashworks.org/if_programming_languages_were_vehicles/

Grüße vom bärtigen Sven

Scripted: Im Internet konnte ich leider auch nichts finden, weshalb ich mich an Euch wende!

Merkwürdig, Dein Internet muss kaputt sein!

Einmal googeln und ich finde zum Beispiel folgenden Perl-Code zum Testen in meinem Internet:

#!perl -w

use Win32::SerialPort;
use strict;
use warnings;

$| = 1; #enable autoflush

my $PortName = "COM4";
my $sendData = "o";

### SERIAL PORT SETUP ###
my $PortObj = new Win32::SerialPort($PortName) or die "Can't open $PortName: $^E\n";
$PortObj->baudrate(57600);
$PortObj->parity("none");
$PortObj->databits(8);
$PortObj->stopbits(1);
$PortObj->write_settings(); #very important!

$PortObj->write($sendData);

$PortObj->close() || warn "\nClose failed\n";

Du mußt dabei natürlich a) auf dem Arduino ein Testprogramm laufen haben, das mit derselben Baudrate auf Daten wartet b) dem Arduino-Board den "Auto-Reset" abgewöhnt haben. (Und zwar möglichst nach dem Aufspielen des Arduino-Sketches auf das Board)

Siehe auch: http://playground.arduino.cc/Main/DisablingAutoResetOnSerialConnection

Mit aktivem Auto-Reset würde der Arduino nämlich sonst jedesmal, wenn Du die serielle Schnittstelle am PC öffnest, einen automatischen Reset ausführen, und Du würdest Dein Kommando zum Arduino wahrscheinlich in den dann gerade laufenden Bootloader hinein senden, so dass Dein Sketch das Kommando niemals sehen würde, weil er gerade neu startet.

Hallo,

vorab will ich mich bei den teilweise netten und produktiven Kommentaren bedanken.

Aktuell sieht mein Perl- sowie Arduino-Programm wie folgt aus (bzw. auch schon vorher):

use strict;
use warnings;
use Win32::SerialPort;

my $ob = Win32::SerialPort->new ('COM3') || die;
$ob->debug(0);

my $baud = $ob->baudrate;
my $data = $ob->databits;
my $parity = $ob->parity;
my $stop = $ob->stopbits;
my $hshake = $ob->handshake;

print "Baudrate:        $baud\n"; # just debugging
print "Paritaet:        $parity\n";
print "Datenbits:       $data\n";
print "Stoppbits:       $stop\n";
print "Flusssteuerung:  $hshake\n";

$ob->baudrate(9600) 	|| die "fail setting baud";
$ob->parity($parity) 	|| die "fail setting parity";
$ob->databits($data) 	|| die "fail setting databits";
$ob->stopbits($stop) 	|| die "fail setting stopbits";
$ob->handshake($hshake)	|| die "fail setting handshake";
$ob->write_settings 	|| die "no settings"; 
$ob->save("COM_3.cfg");

print "Writting ... "; <STDIN>;
$ob->write("1");

my $result = $ob->input;
print "result = $result\n";
#define ledPin 11
int incomingByte;      

void setup() {

  Serial.begin(9600);
  pinMode(ledPin, OUTPUT);
}

void loop() {
  if (Serial.available() > 0) {

    incomingByte = Serial.read();
    
    if (incomingByte == '1')
    {
      digitalWrite(ledPin, HIGH);
      Serial.println("LED ist eingeschaltet!");
    } 

    if (incomingByte == '0')
    {
      digitalWrite(ledPin, LOW);
      Serial.println("LED ist ausgeschaltet!");
    }
  }
}
]

Soweit klappt alles bis auf das Setzen des PINs. Über den Seriellen Monitor absolut kein Problem.
Doch wenn ich in Perl $Var->write(“1”); ausführe bekomme ich keine Rückmeldung, leider habe ich auch nicht rausfinden können warum.

Desweiteren habe ich vor über $Result die Eingabe in Perl auszugeben. Doch wie vorauszusehen, klappt es nicht so. Letztendlich will ich den Inhalt des Seriellen Monitors in Perl ausgeben o.a. in Text.txt Datein.

Ich hoffe Ihr könnt mir weiter helfen.

PS: Wenn möglich mag, ich weiterhin bei den Modul Win32::SerialPort bleiben. :slight_smile:

Gruß.

/push :~

Hallo,

ich hoffe es findet sich noch jemand zu dem Thema, der sein Fachwissen mit mir/uns teilen mag. :)

Ansonsten habe ich es mit dem Modul FIRMATA ausprobiert gehabt, was aber leider immer dazu führt das ich in eine Dauerschleife springe:

Second Read attempted before First is done at C:/strawberry/perl/site/lib/Device/Firmata/IO/SerialIO.pm line 72.
Use of uninitialized value $got in numeric ne (!=) at C:/strawberry/perl/site/lib/Win32/SerialPort.pm line 1216.
Second Read attempted before First is done at C:/strawberry/perl/site/lib/Device/Firmata/IO/SerialIO.pm line 72.
Use of uninitialized value $got in numeric ne (!=) at C:/strawberry/perl/site/lib/Win32/SerialPort.pm line 1216.
Second Read attempted before First is done at C:/strawberry/perl/site/lib/Device/Firmata/IO/SerialIO.pm line 72.
Use of uninitialized value $got in numeric ne (!=) at C:/strawberry/perl/site/lib/Win32/SerialPort.pm line 1216.
Second Read attempted before First is done at C:/strawberry/perl/site/lib/Device/Firmata/IO/SerialIO.pm line 72.
Use of uninitialized value $got in numeric ne (!=) at C:/strawberry/perl/site/lib/Win32/SerialPort.pm line 1216.
Second Read attempted before First is done at C:/strawberry/perl/site/lib/Device/Firmata/IO/SerialIO.pm line 72.
Use of uninitialized value $got in numeric ne (!=) at C:/strawberry/perl/site/lib/Win32/SerialPort.pm line 1216.
Second Read attempted before First is done at C:/strawberry/perl/site/lib/Device/Firmata/IO/SerialIO.pm line 72.
Use of uninitialized value $got in numeric ne (!=) at C:/strawberry/perl/site/lib/Win32/SerialPort.pm line 1216.

Jemand ähnliche Erfahrung gemacht?

Gruß.