Archivi autore: Gianfranco Oddenino

Connessione Bluetooth PC-NXT

leJOS PC Project – Codice per il PC… (includere la libreria pccomm.jar)

public class Main extends JFrame implements Runnable {

	private DataInputStream dis;
	
	private JPanel contentPane;
	private JButton btnConnetti;
	private JTextArea txtrMessaggi;
[...]
	public void attivaComunicazione() {
		try {
			NXTComm nxtComm = NXTCommFactory.createNXTComm(NXTCommFactory.BLUETOOTH);
			NXTInfo[] nxtInfo = nxtComm.search("NXT");
			if (nxtInfo.length > 0)
				if (nxtComm.open(nxtInfo[0])) {
					btnConnetti.setEnabled(false);
					btnConnetti.setText("Connesso");
					dis = new DataInputStream(nxtComm.getInputStream());
					
					Thread thread = new Thread(this);
					thread.setDaemon(true);
					thread.start();
				}
		} catch (Exception e) {
			JOptionPane.showMessageDialog(this, "Impossibile stabilire la connesisone");
		}
	}

	@Override
	public void run() {
		boolean connected = true;
		while(connected) {
			try {
				txtrMessaggi.append(dis.readLine()+ "\n");
			} catch (IOException e) {
				connected=false;
			}
		}
	}

leJOS NXT Project – Codice per l’NXT…

import java.io.DataOutputStream;
import java.io.IOException;

import lejos.nxt.comm.Bluetooth;
import lejos.nxt.comm.NXTConnection;

public class BTHTestNXT {

	public static void main(String[] args) {
		System.out.println("Attesa connessione Bluetooth...");
		NXTConnection conn = Bluetooth.waitForConnection();
		DataOutputStream dos = conn.openDataOutputStream();
		System.out.println("Connesso");
		boolean connesso = true;
		while (connesso) {
			try {
				dos.writeChars("Ciao sono il tuo NXT");
				dos.flush();
				try {
					Thread.sleep(1000);
				} catch (InterruptedException e) {
				}
			} catch (IOException e) {
				connesso = false;
			}
		}
	}

}

Controllo in remoto da PC dell’NXT mediante la connessione Bluetooth

Caricare il progetto ComunicazioniNXT in Eclipse, inviare la classe BTHTestNXT.java sull’NXT e mandarla in esecuzione.
Caricare il progetto ComunicazioniPC in Eclipse, correggere il collegamento al file esterno pccomm.jar e lanciare Main.java.
Collegare il Bluetooth e premere connetti; attentere alcuni secondi. A collegamento avvenuto è possibile controllare il motore e la sterzata con il mouse all’interno del rettangolo di guida.

NXT: seguire un muro con angoli

Per questa applicazione il sensore ad ultrasuoni deve essere montato frontalmente all’NXT ed inclinato di 45° verso destra.

Realizzare una classe NXT che contenga un attributo int chiamato distanza. Tale attributo deve essere costantemente aggiornato mediante un thread DistanzaThread, che legge alla massima velocità possibile la distanza dell’ostacolo mediante il sensore ad ultrasuoni. Il costruttore del programma principale deve far partire il motore in avanti, quindi entrare in un ciclo che legga la variabile distanza. Mediante il metodo steer con un solo parametro l’NXT deve sterzare a sinistra di una quantità proporzionale alla differenza fra 25 e la distanza, quando la distanza diventa inferiore a 25; deve invece sterzare a destra di una quantità proporzionale alla differenza fra la distanza e 25, quando la distanza diventa superiore a 25.
L’NXT deve costeggiare il muro posto alla sua destra girando intorno agli angoli interni ed esterni.

NXT: movimento autonomo con sensore ad ultrasuoni

Realizzare una classe NXT che contenga un attributo int chiamato distanza. Tale attributo deve essere costantemente aggiornato mediante un thread DistanzaThread, che legge alla massima velocità possibile la distanza dell’ostacolo mediante il sensore ad ultrasuoni. Il costruttore del programma principale deve far partire il motore in avanti, quindi entrare in un ciclo che legga la variabile distanza. Mediante il metodo steer con un solo parametro l’NXT deve sterzare a destra di una quantità proporzionale alla differenza fra 100 e la distanza. Se la distanza è superiore a 100 deve andare dritto: steer(100). Se la distanza è 80 deve sterzare di 100-80=20.

JGuida

JGuidaRealizzare il pannello grafico JGuida di larghezza 201px ed altezza 101px rappresentato in figura a destra.
La posizione orizzontale del mouse serve a fornire il valore della sterzata dell’NXT (da -100 a +100), la posizione verticale la velocità del motore (da 0 a 100, dal basso verso l’alto)

Soluzione

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter;

import javax.swing.JComponent;

public class JGuida extends JComponent {

	private int speed, steer;

	private class MouseMotionListener extends MouseMotionAdapter {
		@Override
		public void mouseMoved(MouseEvent e) {
			steer = e.getX() - 100;
			speed = 100 - e.getY();
		}
	}

	public JGuida() {
		setPreferredSize(new Dimension(201, 101));
		speed = 0;
		steer = 0;
		addMouseMotionListener(new MouseMotionListener());
	}

	@Override
	public void paintComponent(Graphics g) {
		g.setColor(Color.WHITE);
		g.fillRect(0, 0, 201, 101);
		g.setColor(Color.GRAY);
		for (int i = 10; i <= 90; i += 10)
			g.drawLine(0, i, 200, i);
		for (int i = 10; i <= 190; i += 10)
			g.drawLine(i, 0, i, 100);
		g.setColor(Color.BLACK);
		g.drawRect(0, 0, 200, 100);
		g.drawLine(100, 0, 100, 100);
		g.setFont(new Font("Arial", Font.BOLD, 18));
		g.setColor(Color.BLUE);
		g.drawString("Sinistra", 20, 95);
		g.setColor(Color.RED);
		g.drawString("Destra", 120, 95);
		g.setColor(Color.ORANGE);
		g.drawString("Motore", 70, 25);
	}

	public int getSpeed() {
		return speed;
	}

	public int getSteer() {
		return steer;
	}

}

Rivelatore di Radon

Realizzare un programma per l’NXT che simuli il funzionamento di un sistema per il controllo del livello di Radon in un edificio. Utilizzare il sensore di luce per simulare il rivelatore di Radon.
Creare un ascoltatore di evento connesso con il sensore di luce che visualizza sul display dell’NXT il valore letto ad intervalli di 10 secondi.
Creare un altro ascoltatore di evento connesso con i tasti Destra/Sinistra dell’NXT che serve per aumentare o diminuire il valore di soglia, che deve anch’esso essere visualizzato sul display.
Quando il valore misurato dal sensore supera la soglia prefissata deve essere azionato un ventilatore (motore A dell’NXT); quando il valore misurato scende al di sotto della soglia il ventilatore deve essere fermato.
Utilizzare il tasto ESCAPE per far terminare il programma.

Soluzione

package rivelatoreradon;

import lejos.nxt.Button;
import lejos.nxt.ButtonListener;
import lejos.nxt.LCD;
import lejos.nxt.LightSensor;
import lejos.nxt.Motor;
import lejos.nxt.SensorPort;
import lejos.nxt.SensorPortListener;
import lejos.util.Delay;

public class RivelatoreRadon {

	LightSensor light;
	private int soglia;

	class LeftButtonListener implements ButtonListener {

		@Override
		public void buttonPressed(Button b) {
			soglia--;
			LCD.drawString(soglia + "  ", 0, 4);
		}

		@Override
		public void buttonReleased(Button b) {
		}

	}

	class RightButtonListener implements ButtonListener {

		@Override
		public void buttonPressed(Button b) {
			soglia++;
			LCD.drawString(soglia + "  ", 0, 4);
		}

		@Override
		public void buttonReleased(Button b) {
		}

	}

	class LightSensorPortListener implements SensorPortListener {

		@Override
		public void stateChanged(SensorPort aSource, int aOldValue,
				int aNewValue) {
			int valore = light.readValue();
			LCD.drawString(valore + "  ", 0, 1);
			if (valore >= soglia)
				Motor.A.forward();
			else
				Motor.A.stop();
//			Delay.msDelay(10000);
		}

	}

	public RivelatoreRadon() {
		soglia = 50;
		LCD.drawString("Valore [Bq/mc]", 0, 0);
		LCD.drawString("Soglia [Bq/mc]", 0, 3);
		LCD.drawString(soglia + "  ", 0, 4);
		Button.LEFT.addButtonListener(new LeftButtonListener());
		Button.RIGHT.addButtonListener(new RightButtonListener());
		light = new LightSensor(SensorPort.S1, false);
		SensorPort.S1.addSensorPortListener(new LightSensorPortListener());
	}

	public static void main(String[] args) {
		new RivelatoreRadon();
		Button.ESCAPE.waitForPressAndRelease();
	}
}