Raspberry, bottom, and camera, top.Himbeere unten und Kamera oben. https://en.wikipedia.org/wiki/Raspberry_Pi ist ein 35-Dollar-Computer; Eine Kamera kostet weitere 25 $. Fügen Sie eine Stromversorgung und eine Internetverbindung hinzu und schon ist der Fernzugriff möglich. Wie kann JMP darauf zugreifen?
In diesem Beispiel, plink (Teil der Kitt Suite) und RunProgram (Teil von JMP) verbinden JMP mit der Linux-Befehlszeilenschnittstelle im Raspberry Pi. JMP sendet die raspistill Befehl mit Parametern, die dem Raspberry Pi mitteilen, wie das Bild aufgenommen und wo es abgelegt werden soll. Anschließend schließt JMP die Verbindung und zeigt das Bild von seinem Speicherort im Netzwerk aus an.
Sehen https://community.jmp.com/t5/Uncharted/Can-JSL-talk-to-Linux/ba-p/33689 für ähnliche Ideen mit Nicht-Raspberry-Linux-Maschinen. Eines der Probleme besteht darin, Passwortabfragen durch die Erstellung eines öffentlichen/privaten Schlüsselpaars zu vermeiden; Ich habe Puttygen (PuTTY-Suite) verwendet, um mein öffentliches/privates Schlüsselpaar zu erstellen (nicht gezeigt), und ich habe meine JSL viel einfacher gemacht, indem ich ein Profil mit dem Namen in Putty gespeichert habe Kamera ; Das Profil enthält die Verbindungsinformationen:
PuTTY dialog high lighting load/save sessions and AuthDer PuTTY-Dialog beleuchtet Lade-/Speichersitzungen und Auth
PuTTY dialog showing private key in AuthPuTTY-Dialogfeld mit privatem Schlüssel in Auth
Login using the public/private keyMelden Sie sich mit dem öffentlichen/privaten Schlüssel an
Jetzt ist das Profil auch für verfügbar plink als Kamera . Hier sind also einige JSLs zum Anmelden:
rp = RunProgram(
executable( "plink" ), // plink is part of the PuTTY toolset, a bit like SSH
options( "camerapi" ), // this is a saved session in PuTTY
ReadFunction(
Function( {this},
While( this << canread,
Write( this << read ); // stream output to JMP log window
Wait( .01 );
)
)
)
);Diese JSL verlässt rp hält ein RunProgram-Objekt, das im Hintergrund läuft und darauf wartet, dass das Shell-Programm auf dem Raspberry eine Ausgabe erzeugt ... die es in das JMP-Protokollfenster kopiert:
The first yellow is a message from JMP; the last yellow is a prompt from the RaspberryDas erste Gelb ist eine Nachricht von JMP; Das letzte Gelb ist eine Aufforderung der Himbeere
Das weiße Protokollfenster enthält dieselben Anmeldeergebnisse wie das schwarze Shell-Fenster. Das ESC-Material kodiert die Ausgabe farblich, sodass ich eine Cyan-Eingabeaufforderung erhalte. Und das RunProgram-Objekt wartet immer noch darauf, einige Befehle an den Raspberry Pi zu übergeben. Erstellen Sie einen Befehl und senden Sie ihn:
// filename builds a path known to the linux (raspberry pi) computer; it is
// actually a nfs mount from yet another computer. This filename is where the
// picture will be stored. The windows computer running JMP can access the
// NFS mount via the H: drive, which is being supplied through VirtualBox.
filename = "capture/picNoOptions.jpg";
// raspistill is a raspberry pi-specific linux command to take a picture
// using the camera attached to the raspberry pi. Because this is a
// command line interface the command must end with a newline, as if
// it was typed at the keyboard and ENTER was pressed.
command = "raspistill --timeout 1000 --nopreview --output " ||"/mnt/nfsc/upscale/"|| filename;
rp << Write( command || "\!n" ); // send the raspistill command, via the linux command line
Dies führt zu einer weiteren Ausgabe im Protokollfenster:
The command is in yellow, it runs silently, and prompts for another commandDer Befehl ist gelb, er wird im Hintergrund ausgeführt und fordert zur Eingabe eines weiteren Befehls auf
An diesem Punkt kann die RunProgram-Verbindung geschlossen werden; Das Senden des Exit-Befehls an die laufende Shell ist der beste Weg, die Verbindung sauber zu trennen:
// for RunProgram to end cleanly, the shell it is running must terminate
rp << Write( "exit\!n" ); // end the Linux shell session
Auch hier gibt es eine kleine Ausgabe des Protokollfensters:
The shell is now closedDie Hülle ist nun geschlossen
Der Rest der JSL wartet nach Bedarf und bereinigt dann:
// every thing above happened very quickly, but the raspistill and exit
// commands have not finished yet. ask the rp object, over and over, if
// the pipe of data from the shell back to JSL has been closed yet. Until
// the ReadEOF happens, RunProgram will not terminate nicely.
While( !(rp << isReadEOF), write("."); Wait( .25 ) ); // wait patiently while shell output goes to log
If( !(rp << canread) & !(rp << canwrite) & rp << isReadEOF,
rp = 0; // this will really make RunProgram go away
Write( "\!nDone" );
,
// possibly need to restart JMP, and possibly need to restart raspberry
Write( "\!nFailed to release rp" )
);Da ich bereits auf die Ausgabe gewartet habe, steht dort nur „Fertig“. Möglicherweise müssen Sie wait(0.1) vor dem hinzufügen if( canread/canwrite/isReadEOF ) Testen Sie, um jedes Mal fertig zu werden.
Schnappen Sie sich nun das Bild aus dem Netzwerk und zeigen Sie es:
img=newimage("h:/"||filename);
img<<SCALE></SCALE>
1/8 actual size, attic work space1/8 der Originalgröße, Arbeitsraum im Dachgeschoss
Die Kamera ist ziemlich einfach, die maximale Auflösung beträgt 2592 x 1944 (ich glaube, das ist die ursprüngliche 5M-Kamera, es gibt auch eine 8M-Version), ermöglicht aber die Steuerung der Belichtungszeit und der analogen Verstärkung und kann Rohpixel vom Sensor abrufen.