Dies ist eine alte Version des Dokuments!
virtelles Java-Teleskop
Übersicht
Die grundsätzliche Arbeitsweise zwischen Linux und dem Teleskop (Steuerung) kann man auch ohne Elektronik (& Teleskop) studieren. Die drei großen Clients (KStart, Skychart und Stellarium) können mit der Indi-Schnittstelle kommunizieren und virtuelle Teleskopmontierungen einbinden. Diese Teleskopsimulatoren sind technisch gesehen INDI-C-Treiber. Ich erzeuge hier z.B. mit Java eine virtuelle serielle Schnittstelle und benutze "täusche" eine rudimentäre LX200 Montierung vor, die mit Stellarium verwendet werden kann. == Software == <WRAP center round info 95%> Um mit Java auf die serielle Schnittstelle zugreifen zu können, verwenden wir die jSSC (Java Simple Serial Connector) API. Sie besteht aus nur einer jar-Datei und wird auch von der Arduino-IDE selbst verwendet. In Eclipse wird sie über Eigenschaften (Java Build Path - Add External JAR's...) dem Projekt hinzugefügt. https://code.google.com/archive/p/java-simple-serial-connector/ oder {{ :serial.zip
socat - universelles Linux Netwerk Tool
==== Installation und Inbetriebnahme ==== - Eclipseprojekt erzeugen und die Datei (unten) SimulatorTeleskop einfügen - jssc-2.0.0.jar als Externe Library dem Projekt hinzufügen - Projekt mit Eclipse übersetzen (kann nicht fehlerfrei gestartet werden, da die Schnittstelle „/dev/ttyUSB60“ nicht vorhanden ist) - Virtuelle serielle Schnittstelle erzeugen - Rechte setzen - Testen Die virtuelle Schnittstelle wird mit dem folgenden Befehl (root erforderlich) gesetzt
socat -d -d PTY,link=/dev/ttyUSB60 PTY,link=/dev/ttyUSB61
Anschließend werden zum Testen alle Rechte vergeben (root erforderlich)
# chmod 777 /dev/ttyUSB6*
Ein erste Test erfolgt mit einer User-Konsole, indem folgender Befehlt an das Gerät gesendet wird, zuvor muss das Programm (z.B. über Eclipse gestartet werden).
echo ":GD#" > /dev/ttyUSB60
Auf der Konsole (Eclipse) sollten jetzt die Anzahl der gelesenen Bytes angezeigt werden. Damit funktioniert die Kommunikation über die virtelle serielle Schnittstelle. = Stellarium = ii) Stellarium lx200 Teleskop einrichten mit /dev/ttyUSB60 als Device Die auf diese Weise angelegte Schnittstelle muss häufig neu eingerichtet werden (Schritte 1 und 2). Es soll zum eigenen Experimentieren anregen und lediglich die grundlegende Kommunikation aufzeigen.
package test; import com.fazecast.jSerialComm.SerialPort; public class Test01 { public static void main(String[] args) { SerialPort comPort = SerialPort.getCommPorts()[2]; comPort.openPort(); comPort.setComPortTimeouts(SerialPort.TIMEOUT_READ_SEMI_BLOCKING, 100, 0); try { while (true) { byte[] readBuffer = new byte[1024]; int numRead = comPort.readBytes(readBuffer, readBuffer.length); if (numRead > 0) { plot(numRead, readBuffer); if(getRADEC(numRead,readBuffer)){ System.out.println("received radec messgage"); writeRADEC(comPort); } if (isGetRA(numRead, readBuffer)) { System.out.println("received ra messgage"); writeRa(comPort); } if (isGetDec(numRead, readBuffer)) { System.out.println("received dec messgage"); writeDec(comPort); } // } Thread.sleep(100); } } catch (Exception e) { e.printStackTrace(); } comPort.closePort(); } static void plot(int numRead, byte[] readBuffer) { System.out.println("Read " + numRead + " bytes."); for (int i = 0; i < numRead; i++) { char c = (char) readBuffer[i]; System.out.print(c); } System.out.println(""); } static boolean getRADEC(int num, byte[] readBuffer) { char c[] = new char[num]; if (readBuffer.length < 1) return false; for (int i = 0; i < num; i++) { c[i] = (char) readBuffer[i]; } if (c[0] == 'e' ) { return true; } return false; } static void writeRADEC(SerialPort p) { String str = "34AB0500,12CE0500#"; byte[] buffer = new byte[18]; byte[] byte_str = str.getBytes(); for (int i = 0; i < 18; i++) buffer[i] = byte_str[i]; // buffer[9] = 0x0D; // buffer[10] = 0x0A; p.writeBytes(buffer, (long) buffer.length); } static boolean isGetRA(int num, byte[] readBuffer) { char c[] = new char[num]; if (readBuffer.length < 4) return false; for (int i = 0; i < num; i++) { c[i] = (char) readBuffer[i]; } if (c[0] == '#' && c[1] == ':' && c[2] == 'G' && c[3] == 'R' && c[4] == '#') { return true; } return false; } static boolean isGetDec(int num, byte[] readBuffer) { char c[] = new char[num]; if (readBuffer.length < 4) return false; for (int i = 0; i < num; i++) { c[i] = (char) readBuffer[i]; } if (c[0] == '#' && c[1] == ':' && c[2] == 'G' && c[3] == 'D' && c[4] == '#') { return true; } return false; } static void writeRa(SerialPort p) { String str = "14:15:00#"; byte[] buffer = new byte[9]; byte[] byte_str = str.getBytes(); for (int i = 0; i < 9; i++) buffer[i] = byte_str[i]; // buffer[9] = 0x0D; // buffer[10] = 0x0A; p.writeBytes(buffer, (long) buffer.length); } static void writeDec(SerialPort p) { String str = "+19*10#"; //"%c%02d%c%02d:%02d#" byte[] buffer = new byte[7]; byte[] byte_str = str.getBytes(); for (int i = 0; i < 7; i++) buffer[i] = byte_str[i]; // // buffer[7] = 0x0D; // buffer[8] = 0x0A; p.writeBytes(buffer, (long) buffer.length); } }