Programmare LEGO NXT con Java
Overview NXT Hardware Ambiente di sviluppo Eclipse Java Virtual Machine Programmare con JAVA
NXT hardware 4 Inputs (digitali e analogici) 3 Outputs (supporto per encoders) Schermo (100x64 pixels) 4 Bottoni Suono USB e Bluetooth
Processori Processore principale: Atmel 32-bit ARM processor, AT91SAM7S256 256 KB FLASH 64 KB RAM 48 MHz Co-processore: Atmel 8-bit AVR processor, ATmega48 4 KB FLASH 512 Byte RAM 8 MHz
Comunicazione tramite Bluetooth e USB Bluetooth wireless communication CSR BlueCoreTM 4 v2.0 +EDR System Supports the Serial Port Profile (SPP) Internal 47 KByte RAM External 8 MBit FLASH 26 MHz USB 2.0 Full speed com port (12 Mbit/s)
Monitor, Suono e bottoni Display in bianco e nero 100 x 64 pixel LCD Uscita audio con canale con risoluzione a 8-bit resolution 4 bottoni
Schema a blocchi del mattoncino intelligente
Qualche dettaglio 3 output con connessione a 6-fili che supportano anche l'input dagli encoder 4 input con connessione a 6-fili che supportano: - segnali digitali - segnali analogici - protocollo I2C - high speed port, IEC 61158 Type 4/EN 50170 LEGO ha distribuito tutta la documentazione
Documentazione online http://mindstorms.lego.com/ - cliccare sul bottone NXTreme button per informazioni e downloads per utenti avanzati Open source firmware!!! SDK Software Developer Kit HDK Hardware Developer Kit BDK Bluetooth Developer Kit
Motori Encoder integrato nel motore con sensibilità 1 Posizioni relative e non assolute Velocità massima pari a circa 200 RPM Coppia massima 24 Ncm Motori estremamente robusti
Motori
Sensori nel kit Sensore a ultrasuoni (3cm-100cm) Sensore di luce attivo Sensore acustico DB and DBA Sensore di contatto
Cavi di connessione I cavi LEGO NXT (come I connettori DEC RJ-12 ma al contrario) Schemi: Analog input
3 rd Party Sensors Prezzi da $30 a $50 HiTechnic (www.hitechnic.com) Esteticamente simili ai sensori LEGO Autorizzati da LEGO MindSensors (www.mindsensors.com) Compatibili ma meno curati esteticamente
HiTechnic Sensors Color Sensor Compass Sensor Acceleration Sensor More coming Prototype board Gyro sensor (analog, not I2C digital) IR Link (to talk to RCX and other LEGO IR devices) IR Seeker (for robo soccer, for example)
MindSensors Sensors Acceleration Sensor RCX to NXT communications link PS2 controller interface Motor Multiplexor Magnetic Compass Pneumatic Pressure Sensor
Bluetooth Utilizzabile per scaricare i programmi Permette il trasferimento di dati da un NXT all'altro (fino a quattro collegati in rete) Permette il controllo a distanza da parte di qualsiasi dispositivo con BT
Linguaggi di programmazione NXT-G NXC e NBC (in ambiente BricX) Robot C pblua Java ed altri
NXT-G code Ambiente di sviluppo della LEGO Programmazione grafica Basato su National Instruments LabView Ottimo per programmi semplici Ideale per I ragazzi delle scuole medie inferiori ed elementari
NXC e NBC NXC (Not exactly C) è un linguaggio simile al C Costruito sull'assembler NBC, the Next Byte Code Utilizza il firmware standard della LEGO e un firmware potenziato
NXC in BricxCC BricxCC è un ambiente di sviluppo Supporta tutte le piattaforme LEGO E' opensource e compatibile anche con hardware non LEGO
Robot C Linguaggio di programmazione di Carnegie Mellon s per varie piattaforme (tra cui VEX, RCX e NXT) Firmware dedicato Costo30 $
Robot C Linguaggio di programmazione di Carnegie Mellon s per varie piattaforme (tra cui VEX, RCX e NXT) Firmware dedicato Costo30 $
pblua New firmware, and language Small portable language for embedded systems By Ralph Hemple, the author of pbforth for the RCX Compiles on brick! Use any terminal device to talk to it
Altri linguaggi Java MS Robotic Studio!!!!!!!!!! Si deve scaricare un piccolo programma client Il controllo reale è fatto dal PC
Programmare con Java Linguaggio orientato agli oggetti Senza fare un corso sul linguaggio cercheremo subito di: Utilizzare i motori Acquisire dati dai sensori
Link utili http://www.tutorialspoint.com/java/ http://www.html.it/guide/guida-java/ http://android.devapp.it/01-corso-completo-diprogrammazione-java-hello-world
La rivoluzione di Java - permette la realizzazione di programmi non legati ad una architettura precisa - Macchina Virtuale (JVM), i programmi non vengono compilati in codice macchina (nativo) ma in un codice intermedio chiamato bytecode - JVM e JDK
Architettura JVM
Paradigma della OOP Entità fondamentale è la classe, contenente: - lo stato, cioè i campi dell oggetto; - le procedure per la gestione, i metodi. Incapsulamento, ereditarietà
Classi e Oggetti
Un problema...
La soluzione Nel package navigation c'è la classe differentialpilot DifferentialPilot(float wheeldiameter, float trackwidth, Motor leftmotor, Motor rightmotor)
Esempio di oggetto
LEJOS lejos è una VM Java ridotta per l'nxt lejos NXJ offre: Object oriented language (Java) Preemptive threads (tasks) Arrays, including multi-dimensional Recursion Synchronization Exceptions Java types including float, long, and String Most of the java.lang, java.util and java.io classes A Well-documented Robotics API
Il NOSTRO riferimento http://www.lejos.org/nxj.php
Installazione in window http://www.lejos.org/nxt/nxj/tutorial/preliminaries/gettingstartedwindo Oppure dalla cartella sul desktop: - fantom driver - jdk - Lejos - Eclipse
Trasferire il firmware nell'nxt http://www.lejos.org/nxt/nxj/tutorial/menusystem/menusystem. htm
Il primo programma import lejos.nxt.button; public class HelloWorld { public static void main (String[] args) { System.out.println("Hello World"); Button.waitForAnyPress(); } }
Per fortuna abbiamo Eclipse http://www.lejos.org/nxt/nxj/tutorial/preliminaries/usingides.htm http://www.lejos.org/nxt/nxj/tutorial/preliminaries/usingeclipse.htm
Controllo dei motori I nostri motori sono a corrente continua dotato di due morsetti, la velocità e il verso di rotazione dell'albero dipendono da: - tensione applicata - corrente assorbita dal rotore - carico applicato
Struttura dei motori DC la corrente scorre negli avvolgimenti e si genera un campo magnetico la parte sinistra del rotore è respinta dal magnete di sinistra ed attirata da quello di destra. la coppia genera la rotazione
Struttura dei motori DC quando gli avvolgimenti si allineano orizzontalmente, il commutatore inverte la direzione di corrente attraverso gli avvolgimenti, modificando il campo magnetico; il processo ritorna quindi allo stato di partenza e il ciclo si ripete (http://it.wikipedia.org/wiki/file:electric_motor.gif)
Controllo PWM dei motori DC Modulazione di larghezza di impulso, dall'inglese pulse-width modulation onda quadra di duty cycle variabile che permette di controllare la potenza assorbita da un carico elettrico
Controllo dei motori dell'nxt i connettori sono a sei fili. controllo degli attuatori con segnali PWM alla tensione di 4,3 V e con correnti da 700 ma fino a 1 A valore di picco il motore è anche equipaggiato con una protezione termica interna due collegamenti per le informazioni provenienti dal decoder integrato nel motore
Controllo software dei motori http://www.lejos.org/nxt/nxj/tutorial/motortutorial/controllingmotors. htm
La classe NXTRegulatedMotor Ha tre istanze, una per ogni motore e i seguenti metodi principali: - forward(), backward(), stop() - gettachocount(), setspeed(int speed), Delay - rotate(int angle), rotateto(int angle) - rotaterotate(int angle,boolean immediatereturn), rotateto(int angle,booleanimmediatereturn), (boolean)isrotating()
Primi esempi di gestione motori http://www.lejos.org/nxt/nxj/tutorial/motortutorial/motortutor1.html Per un uso di base http://www.lejos.org/nxt/nxj/tutorial/motortutorial/motortutor2.html Per utilizzare l'encoder. http://www.lejos.org/nxt/nxj/tutorial/motortutorial/motortutor3.html Gestione della rotazione, inerzia e freno. http://www.lejos.org/nxt/nxj/tutorial/motortutorial/motortutor4.html Esecuzione rotazione in un thread http://www.lejos.org/nxt/nxj/tutorial/motortutorial/motortutor5.html Regolazione della velocità
Il primo programma
Cosa usare
La soluzione
Controllo software dei motori
Altri metodi della classe NXTRegulatedMotor boolean ismoving(); int getlimitangle() int getspeed() int getactualspeed() boolean isstalled() resettachocount() void setacceleration(int acceleration) void getacceleration() suspendregulation()
Altre classi per i motori La classe NXTMotor per esempio è utile quando non si vuole regolare la velocità dei motori. - setpower(int apower) Used to control motor power directly. Use a value between 0 and 100. - int getpower()
Provare i programmi Riportati al seguente link: http://www.lejos.org/nxt/nxj/tutorial/motortutorial/controllingmotors.ht Scrivere un programma per replicare il movimento di un motore B in base allo spostamento manuale di un motore A
Gli encoder Il trasduttore di posizione angolare, è un dispositivo elettromeccanico che converte la posizione angolare del suo asse rotante in segnali elettrici numerici digitali Gli encoder si possono dividere in due grandi categorie: * assoluti (http://it.wikipedia.org/wiki/codice_gray) * relativi (noti anche come incrementali)
Gli encoder relativi
Gli encoder relativi hanno in genere da 100 a 6.000 aree per giro due piste fuori fase permettono di ottenere sia la posizione che la direzione della rotazione
Controllo dei motori in retroazione Gli encoder, tramite opportune funzioni, permettono di controllare la velocità, la posizione e di sincronizzare i motori.
Controllo dei Sensori Lejos mette a disposizione diverse classi per controllare e interrogare i sensori, le porte di collegamento vengono identificate con SensorPort.S1, S2, S3 o S4. Iniziamo dal più semplice: il sensore di contatto La classe è la TouchSensor, che va istanziata con il costruttore TouchSensor(SensorPort port)
Il sensore di contatto
Esempio di utilizzo del sensore di contatto import lejos.nxt.lcd; import lejos.nxt.sensorport; import lejos.nxt.touchsensor; public class TouchTest { public static void main(string[] args) throws Exception { TouchSensor touch = new TouchSensor(SensorPort.S1); while (!touch.ispressed()) { // try again } LCD.drawString("Finished", 3, 4); } }
Lettura dei valori dal sensore Come si può notare dall'esempio, per interrogare il sensore si usa il metodo Bool ispressed()
Programma di esempio task main() { SetSensor( S1, SENSOR_TOUCH ); } while( true ) { if( Sensor(S1)==0 ) { OnFwd(OUT_AB,50); } else { OnRev(OUT_AB,50); Wait(500); OnFwd(OUT_A,50); Wait(500); } }
Esercizi 1) Spostare in avanti per 2 secondi con potenza pari al 25% e tornare indietro per 1 secondo con velocità al 50%. 2) Mettere a velocità massima solo una ruota per tre secondi. 3) Mettere a velocità massima una ruota e massima negativa l'altra, per 3 secondi.
Esercizi da svolgere 4) Cosa cambia nel comportamento dell'esercizio 2 e 3? 5) Ripetere le istruzioni degli esercizi precedenti per tre volte usando un blocco di ripetizione, intervallando ogni ripetizione con tre secondi di pausa. 6) Usando il righello e gli altri strumenti necessari, determinare per quanto tempo devo far funzionare i motori al 50% perché il robot si sposti di 20 cm in linea retta. Come posso fare per avere una risposta più precisa?
Esercizi da svolgere 7) Far muovere il robot lungo il perimetro di un quadrato di lato 40 cm, al 60% della velocità utilizzando una delle funzioni degli esercizi precedenti. 8) Il robot si deve muovere a velocità costante pari al 50%. In caso di urto (rilevato dal sensore di contatto) deve arretrare di 20 cm, ruotare di 120 e ripartire al velocità costante.
Esercizi da svolgere 9) Contiamo gli urti: il robot si deve muovere a velocità costante, pari al 60%, in caso di urto (rilevato dal sensore di contatto) deve incrementare un'apposita variabile. Se il numero nella variabile è pari deve arretrare di 20 cm, ruotare di 120 e ripartire a velocità costante, se il numero è dispari deve arretrare di 20 cm, ruotare di 180 e ripartire a velocità costante.
Il sensore di luminosità Il sensore determina il livello di luminosità nell'ambiente; può anche emettere luce per poi rilevare quella riflessa.
Il sensore di luminosità
Controllo e utilizzo del sensore di luminosità La classe per l'utilizzo del sensore di luminosità è LightSensor istanziata con il costruttore LightSensor(SensorPort port) Possiamo interrogarlo con i metodi getlightvalue() getnormalizedlightvalue() oppure SensorPort.S1.readRawValue() SensorPort.S1.readValue()
Esempio di utilizzo del sensore di luminosità import lejos.nxt.lcd; import lejos.nxt.lightsensor; import lejos.nxt.sensorport; public class LightTest { } public static void main(string[] args) throws Exception { } LightSensor light = new LightSensor(SensorPort.S1); while (true) { } LCD.drawInt(light.getLightValue(), 4, 0, 0); LCD.drawInt(light.getNormalizedLightValue(), 4, 0, 1); LCD.drawInt(SensorPort.S1.readRawValue(), 4, 0, 2); LCD.drawInt(SensorPort.S1.readValue(), 4, 0, 3);
Il monitor dell'nxt Il monitor risulta utile per Debugging Settaggio di parametri Messaggi durante l'esecuzione Grafica Giochi
Carateristiche del monitor Il display ha una risoluzione 100 x 64 px è possibile disegnare qualsiasi cosa sullo schermo, ma visualizzeremo solo numeri o testi
Principali funzioni per il controllo del monitor La classe non ha istanze, solo metodi statici In modalità testo x da 0 to 15 e y da 0 a 7 void drawstring(string str, int x, int y) void drawint(int i, int x, int y) void drawint(int i, int places, int x, int y) void clear()
Esempi di utilizzo del display import lejos.nxt.lcd; public class LCDTest { public static void main(string[] args) throws Exception { LCD.drawString("Free RAM:", 0, 0); LCD.drawInt((int) System.getRuntime().freeMemory(), 6, 9, 0); Thread.sleep(2000); } }
Esercizi 1) Visualizzare sul monitor dell'nxt il valore di luminosità rilevato dal sensore impostato in modalità percentuale e poi in modalità raw. 2) Scrivere un programma per seguire una linea scura su fondo bianco utilizzando un solo sensore di luminosità.
Esercizi 3) Far ruotare per 360 il robot attorno al proprio asse. Memorizzare per ogni grado la luminosità rilevata utilizzando un vettore. Al termine della rotazione individuare l'angolo in cui è stata rilevata la massima luminosità e quindi riportare il robot in quella posizione.
Sensore ad ultrasuoni Valuta la distanza degli oggetti tramite onde acustiche E' un sensore intelligente, utilizza il protocollo I2C
Programmi 1) Far muovere in linea retta il robot fino a quando incontra un ostacolo ad una distanza inferiore a 40 cm. In questo caso farlo ruotare su se stesso di un angolo casuale compreso tra 100 e 180 e farlo di nuovo muovere in linea retta. Terminare il programma dopo cinque incontri.
Programmi 2) Far muovere il robot in linea retta. Quando viene rilevato un ostacolo ad una distanza inferiore al metro, la velocità deve diminuire direttamente proporzionale alla distanza fino ad annullarsi a 40 cm dall'ostacolo stesso. In ogni caso, giunto a 50 cm dall'ostacolo, il robot deve ruotare di 180 e riprendere il movimento rettilineo al 75% della velocità massima.
Programmi 3) Usare il sensore ad ultrasuoni per determinare la velocità di avvicinamento ad un muro (in cm/s) del vostro robot e visualizzarla sul monitor in modo che sia leggibile. Confrontare il risultato con una misura spazio/tempo effettuata da voi e con i calcoli teorici effettuati conoscendo il diametro della ruota e il numero di giri della ruota.