ArduinoLib für leJOS

Die ArduinoLib ist eine Erweiterung für leJOS. Sie ermöglicht es, einfach auf die Pins von angeschlossenen Arduinos zuzugreifen. Sie ist modular aufgebaut und leicht erweiterbar.

Die ArduinoLib steht hier zum Download bereit. Im .jar-Archiv ist das Programm für den Arduino unter „nxtarduinolib“ zu finden. Außerdem befindet sich die Dokumentation im Ordner „doc“. Sie kann aber auch hier online eingesehen werden. Der Sourcecode und die    .class-Dateien sind im Ordner „com/wordpress/backsite/arduino“.

Der Aufbau

Es können mehrere Arduinos wie folgt an einen NXT-SensorPort angeschlossen werden:

Schaltplan

Das Arduino Programm

Nachdem man alles erfolgreich zusammengebaut hat, kann man nun die nxtaduinolib.ino auf den Arduino laden. Achtung: Wenn man mehrere Arduinos an einem NXT-Port nutzt, muss die ARDUINO_ADDRESS immer unterschiedlich sein.

Das NXT Programm

Um die ArduinoLib nutzen zu können, muss man sie entweder zum Classpath hinzufügen oder, wenn man Eclipse nutzt, zum Projekt hinzufügen.

Zum Testen der Verbindung führt man am Besten dieses Programm aus. Dazu muss der Arduino mit SensorPort 1 verbunden sein und die ADDRESSE 0x43 haben.


import com.wordpress.backsite.arduino.ArduinoSensor;
import com.wordpress.backsite.arduino.ArduinoUno;

import lejos.nxt.SensorPort;

public class testconnection {
	public static void main(String[] args) throws InterruptedException{

		ArduinoSensor as = new ArduinoSensor(SensorPort.S1);
		ArduinoUno ard = new ArduinoUno(as, 0x43);

		as.cancelSendingOnEscape(true);
		as.debugOptions(ArduinoSensor.DEBUG_SHOW_CONNECTION_ERROR, true);

		System.out.println(ard.echo.echo("Connection etablished!"));

		Thread.sleep(5000);
        }
}

Code Analyse

Zuerst erstellt man einen ArduinoSensor an SensorPort.S1 mit:

ArduinoSensor as = new ArduinoSensor(SensorPort.S1);

Nun kann man einen neuen ArduinoUno mit

 ArduinoUno ard = new ArduinoUno(as, 0x43);

hinzufügen. Wichtig ist, dass im Arduino-Sketch die Adresse „0x43“ eingestellt ist. Der Adressraum vom Arduino besteht aus 7bit, das heißt man kann maximal 112 Arduino parallel betreiben(theoretisch natürlich 😉 ). Sie muss nur auch im Sketch eingestellt sein. Wenn man mehrere Arduinos an einen SensorPort anschließt, muss man sogar mehrere verschiedene Adressen verwenden.

Wenn die Verbindung erfolgreich getestet wurde kann man alle debugOptions getrost aus geschaltet lassen. Um mehrere debugOptions in einem Schritt ein zuschalten kann man sie addieren:

as.debugOptions(
ArduinoSensor.DEBUG_SHOW_CONNECTION_ERROR
+ArduinoSensor.DEBUG_SHOW_RETURN);

Man sollte aber cancelSendingOnEscape aktivieren, damit man das Programm im Notfall abbrechen kann, falls die Verbindung nicht funktioniert.

as.cancelSendingOnEscape(true);

Das Sketch auf dem Arduino empfängt einen Befehl, bearbeitet diesen und schickt eine Antwort zurück. Jeder Befehlaufruf wird in der ArduinoLib in eine Methode verpackt. Wenn man diese aufruft, führt sie den Befehl aus und gibt das Ergebnis zurück. Jede Hardware-Resource vom Arduino wird in einer Class abgebildet. Diese Class enthält alle Methoden, um auf die spezielle Hardware zu zugreifen. In der Class DigitalPin sind alle Befehle führ einen digitalen Pin. Befehle die keine Auswirkungen auf die Hardware haben, werden in Klassen inhaltlich gruppiert. Momentan ist der Befehl echo, der einen String an den Arduino schickt und diesen wieder empfängt, aber noch in der Class echo(Wahrscheinlich wird er in die Class System mit allen Systembefehlen wechseln).

Zum testen der Verbindung lässt man den Arduino einfach einen String zurückgeben:

System.out.println(ard.echo.echo("Connection etablished!");

Nachdem die Verbindung erfolgreich überprüft worden ist, kann man nun zum Beispiel die LED an Pin 13 anschalten. Wenn ein Fehler ausgegeben wird muss man die Verbindung noch einmal überprüfen(siehe „Der Aufbau“).

Ein einfaches LED-Beispiel

An Pin 13 des Aruino Uno befindet sich eine LED. Diese kann man mit folgendem Code an und aus schalten.

import com.wordpress.backsite.arduino.ArduinoSensor;
import com.wordpress.backsite.arduino.ArduinoUno;

import lejos.nxt.SensorPort;

public class test {
	public static void main(String[] args) throws InterruptedException{

		ArduinoSensor as = new ArduinoSensor(SensorPort.S1);
		ArduinoUno ard = new ArduinoUno(as, 0x43);
		as.cancelSendingOnEscape(true);
		as.debugOptions(ArduinoSensor.DEBUG_SHOW_CONNECTION_ERROR, true);
		System.out.println(ard.echo.echo("Connection etablished!"));

		ard.D13led.defineOutput();
		ard.D13led.setHIGH();
		Thread.sleep(5000);
		ard.D13led.setLOW();
		Thread.sleep(5000);

	}
}

Not a Bug

Wenn man an einem PWM-Pin eine Spannung anlegt und diese dann mit einem Analog-Pin misst, wird das Ergebnis entweder 0 (LOW) oder 1023 (HIGH) sein, weil der PWM-Pin keine bestimmte Spannung anlegt sondern in bestimmten Intervallen zwischen HIGH und LOW wechselt.

import com.wordpress.backsite.arduino.ArduinoSensor;
import com.wordpress.backsite.arduino.ArduinoUno;

import lejos.nxt.SensorPort;

public class test {
	public static void main(String[] args) throws InterruptedException{

		ArduinoSensor as = new ArduinoSensor(SensorPort.S1);
		ArduinoUno ard = new ArduinoUno(as, 0x43);
		as.cancelSendingOnEscape(true);
		as.debugOptions(ArduinoSensor.DEBUG_SHOW_CONNECTION_ERROR, true);
		System.out.println(ard.echo.echo("Connection etablished!"));

		ard.D5pwm.defineOutput();

		ard.D5pwm.setValue(255);

		ard.A1.defineInput();

		System.out.println(ard.A1.readValue());
		System.out.println(ard.A1.readValueInPercent());

		/*
		 * in 1/4 all fault its returns 1023 otherwise i returns 0 because D5 is a pwm pin
		 * it will propably never return 25;
		 */
		ard.D5pwm.setValueInPercent(25);
		System.out.println(ard.A1.readValueInPercent());

		Thread.sleep(5000);
	}
}

Ein Gedanke zu „ArduinoLib für leJOS

Hinterlasse einen Kommentar