Testo della verifica:
Correzione:
NXT avanza di 1 m per volta, rileva la distanza del soffitto con il sensore ad ultrasuoni e invia con il BT il dato al PC.
Creare una connessione Bluetooth fra PC e NXT che permetta la lettura ad intervalli di 1 secondo dell’intensità sonora mediante il sensore montato sull’NXT. I valori letti devono essere inviati al PC che mediante un thread li visualizza in una JTextArea.
Soluzione:
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; } } } }
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.
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.
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.
ThreadUS [PDF]
Realizzare 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)
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; } }
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.
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(); } }