Raspberry, bottom, and camera, top.Lampone, in basso, e fotocamera, in alto. https://en.wikipedia.org/wiki/Raspberry_Pi è un computer da $ 35; una fotocamera aggiunge altri $ 25. Aggiungi un alimentatore e una connessione Internet ed è accessibile da remoto. Come può accedervi JMP?
In questo esempio, plink (parte di Mastice suite) e RunProgram (parte di JMP), collegano JMP all'interfaccia della riga di comando Linux nel Raspberry Pi. JMP invia il file raspistill comando, con parametri che dicono al Raspberry Pi come scattare l'immagine e dove metterla, quindi JMP chiude la connessione e visualizza l'immagine dalla sua posizione sulla rete.
Vedere https://community.jmp.com/t5/Uncharted/Can-JSL-talk-to-Linux/ba-p/33689 per idee simili utilizzando macchine Linux non Raspberry. Uno dei problemi è evitare le richieste di password creando una coppia di chiavi pubblica/privata; Ho usato puttygen (suite PuTTY) per creare la mia coppia di chiavi pubblica/privata (non mostrata) e ho reso il mio JSL molto più semplice salvando un profilo in putty chiamato telecamera ; il profilo ha le informazioni di connessione:
PuTTY dialog high lighting load/save sessions and AuthFinestra di dialogo PuTTY con illuminazione elevata, caricamento/salvataggio sessioni e autenticazione
PuTTY dialog showing private key in AuthFinestra di dialogo PuTTY che mostra la chiave privata in Auth
Login using the public/private keyAccedi utilizzando la chiave pubblica/privata
Ora il profilo è disponibile anche per plink COME telecamera . Quindi, ecco alcuni JSL per accedere:
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 );
)
)
)
);Questo JSL se ne va p.p tenendo un oggetto RunProgram in esecuzione in background, in attesa che il programma shell sul Raspberry produca un output... che copia nella finestra di registro di JMP:
The first yellow is a message from JMP; the last yellow is a prompt from the RaspberryIl primo giallo è un messaggio da JMP; l'ultimo giallo è un messaggio del Raspberry
La finestra del registro bianco contiene gli stessi risultati di accesso della finestra della shell nera. Il materiale ESC codifica a colori l'output in modo da ottenere un prompt ciano. E l'oggetto RunProgram è ancora in attesa di passare alcuni comandi al Raspberry Pi. Costruisci un comando e invialo:
// 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
Ciò produce ulteriore output nella finestra di registro:
The command is in yellow, it runs silently, and prompts for another commandIl comando è in giallo, viene eseguito in modo silenzioso e richiede un altro comando
A questo punto è possibile chiudere la connessione RunProgram; inviare il comando exit alla shell in esecuzione è il modo migliore per disconnettersi in modo pulito:
// for RunProgram to end cleanly, the shell it is running must terminate
rp << Write( "exit\!n" ); // end the Linux shell session
Ancora una volta, c'è un po' di output della finestra di registro:
The shell is now closedLa shell è ora chiusa
Il resto del JSL attenderà, se necessario, quindi ripulirà:
// 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" )
);Poiché ho già aspettato l'output, dice solo "Fatto". Potrebbe essere necessario aggiungere wait(0.1) prima di if( può leggere/può scrivere/isReadEOF ) prova per farlo ogni volta.
Ora prendi l'immagine dalla rete e mostrala:
img=newimage("h:/"||filename);
img<<SCALE></SCALE>
1/8 actual size, attic work space1/8 delle dimensioni reali, spazio di lavoro in soffitta
La fotocamera è piuttosto semplice, la risoluzione massima è 2592x1944 (penso che questa sia la fotocamera originale da 5 M, esiste anche una versione da 8 M) ma consente di controllare il tempo di esposizione e il guadagno analogico e può recuperare pixel grezzi dal sensore.