Programmare con NXC
Transcript
Programmare con NXC
Programmare LEGO NXT con BricX Overview • • • • NXT Hardware Ambiente di sviluppo NXC Programmare con NXC Interazione NXT - PC 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 3rd 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) No-contact touch sensor (electrostatic sensor) Motor Multiplexor 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 $ 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 e molti altri • MS Robotic Studio!!!!!!!!!! Si deve scaricare un piccolo programma client Il controllo reale è fatto dal PC Programmare con NXC L'unico prerequisito è la conoscenza del C… Impareremo inizialmente a: • Utilizzare i motori • Leggere dai sensori Caratteristiche di NXC • NXC è basato sul C • Memoria limitata (rispetto al PC) • Numero massimo di task 256 Scheletro di un programma NXC task main() { - istruzione; } − istruzione; − istruzione; 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 Le funzioni più semplici sono: (pag. 4960) • OnFwd(porta, potenza) • OnRev(porta, potenza) è del tutto simile alla precedente ma fa girare il motore nel verso opposto. Entrambe le funzioni azzerano il tachimetro integrato nei motori. Controllo software dei motori OnFwdEx(output,power,constant reset) parametro in più alla fine per controllare il comportamento del tachimetro (tabella 19 pag 53) OnRevEx(output,power,constant reset) Off(output port) togli potenza all'uscita specificata OffEx(output, constant reset) Altre funzioni: OnFwdReg(), OnFwdSinc(), RotateMotor(), RotateMotorPID(), con le relative Rev ed Ex. Il primo programma task main() { OnFwd(OUT_A,75); OnFwd(OUT_B,75); Wait(5000); } La funzione Wait(in millisecondi) permette di impostare un tempo di attesa. 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. OnFwdSync(outputs, pwr, turnpct) l'ultimo parametro può variare tra -100 e 100 RotateMotor(outputs, pwr, angle) angolo in gradi Controllo dei Sensori NXC Vedere il manuale da pagina 42 Per impostare il funzionamento del sensore si usano le seguenti funzioni: -SetSensor( porta, tipo da tabella 10 pag 43) -SetSensorType( porta, tipo da tabella 8 pag 43) - SetSensorMode( porta, modalità tabella 9 pag 43) Il sensore di contatto SetSensorTouch(porta) Controllo dei sensori task main() { SetSensor( S1, SENSOR_TOUCH ); --------------} Lettura dei valori dei sensori Per leggere il valore dei sensori analogici: - x = Sensor(S1); - x=SENSOR_1; 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 da svolgere martedì 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? RotateMotor • RotateMotor( port, potenza, angolo ); La porta si indica con le costanti OUT_A, OUT_B, OUT_C, o combinazioni OUT_AB, OUT_ABC La potenza è compresa tra -100 e 100 angle è la rotazione desiderata espressa in gradi 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à Il modo più veloce per impostrarlo è SetSensorLight(porta) Oppure usiamo le funzioni generiche con le costanti delle tabelle 8-9-10 a pag. 43 del manuale Esempio di utilizzo del sensore di luminosità task main() { SetSensorLight(S1); while(true) { ClearScreen(); NumOut(0,LCD_LINE1,SENSOR_1); Wait(200); } } 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 • TextOut( x, y, text,clear ); • NumOut( x, y, number,clear ); • ClearScreen(); • per la coordinata y possiamo utilizzare le costanti LCD_LINE1... LCD_LINE8 • Si veda pagina 66 del manuale Esempi di utilizzo del display y = 42; TextOut(0, LCD_LINE5, "Answer:" ); NumOut( 8*6, LCD_LINE5, y ); // I caratteri sono di dimensioni 6 pixels Esercizi per mercoledì • 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 per mercoledì 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 Per impostarlo si usa la funzione SetSensorLowspeed(porta) Per leggere è necessaria la funzione SensorUS(porta) Esempio di utilizzo del sensore ad ultrasuoni ...... x=SensorUS(S1); Programmi per giovedì 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 per giovedì 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 per giovedì 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. Multitasking - L'NXT supporta il multitasking, quindi è possibile definire più task (compiti) che vengono eseguiti in parallelo dal processore - Il numero massimo di task è 256 - Un task termina quando si arriva alla fine dello stesso. Multitasking - StartTask(nome task) - StartTask(nome task) - StopAllTask() Vedere pag. 19 del manuale Multi tasking programma Scrivere un programma con due task, il main che come al solito gestisce il movimento del robot nel recinto, il secondo che fa lampeggiare il LED con periodo sempre più breve. Il periodo deve partire da 10 s e diminuire di 1 s ogni 10 s; quando T diventa 0 il programma deve terminare. Il sensore acustico Sensore analogico Risposte in dBA o in dB. Fino a 90 dB. SetSensorSound(porta) Il sensore acustico 1) Memorizzare in un vettore i valori rilevati da un sensore acustico, ogni 400 ms. Dopo 60 secondi determinare il valore massimo, quello minimo e quello medio. Visualizzare sul monitor i valori ed attendere che l'utente prema il bottone centrale prima di terminare il programma. Sensore acustico 2) Il robot deve procedere in linea retta fino a quando non vengono battute le mani. Se le mani vengono battute due volte entro 500 ms deve ruotare di una angolo compreso tra 120° e 180° in verso orario, se le mani vengono battute una volta sola deve ruotare tra 120° e 180° in verso antiorario. Battiti consecutivi in un intervallo di tempo compreso tra 500 ms e 1 s non devono essere considerati. Per finire Muoversi solo quando il rumore è al di sotto di un certo valore, gestendo gli urti e tornando vicino alla parete quando il rumore diventa molto intenso. Il campo di gara è delimitato da una riga nera. Il robot che esce dalla riga perde la sfida. Ogni robot è dotato di un sensore di luminosità, un sensore ad ultrasuoni ed un sensore di contatto. Quando il robot percepisce un corpo a meno di 40 cm deve cercare di raggiungerlo e a contatto avvenuto può mettere i motori al massimo con l'intento di spingere l'altro robot fuori dal campo di gara..... I protocolli di trasmissione Il protocollo Bluetooth Bluetooth è una specifica industriale per reti personali senza fili Mette in comunicazione dispositivi entro un raggio di qualche decina di metri Formalizzata dalla Bluetooth Special Interest Group (SIG) nel 1999 Caratteristiche del protocollo Bluetooth - bassi consumi - un corto raggio di azione (1-100 metri) - un basso costo di produzione Attualmente un miliardo di dispositivi montano un'interfaccia Bluetooth! Tipi di reti Bluetooth - collegamento di tipo master slave con fino a 7 slave, detta piconet; - collegando due piconet si forma una scatternet; - ogni dispositivo è configurabile per cercare costantemente altri dispositivi (eventualmente con password). Reti Bluetooth Il master si occupa della la sincronizzazione del clock degli altri dispositivi (slave) e la sequenza dei salti di frequenza. Qualche dettaglio su BT - Lavora nelle frequenze libere di 2,45 Ghz, dividendo la banda in 79 canali e commutando tra i vari canali 1600 volte al secondo; - la versione 1.1 e 1.2 gestisce velocità di trasferimento fino a 723,1 kb/s, la 2.0 gestisce una modalità ad alta velocità fino a 3 Mb/s. Qualche dettaglio su BT I dispositivi dotati di Bluetooth si dividono in 3 classi: Classe Potenza(mW) Distanza(m) 1 100 ~ 100 2 2,5 ~ 10 3 1 ~1 Il clock Dopo decido se metterlo Connessioni ACL SCO Modalità operative - Standby (ascolto ogni 1,28 s) - Connessione - Active mode L’unità partecipa attivamente alla piconet, sia in ricezione che in trasmissione, ed è sincronizzata al clock del master; - Hold mode Il master può mettere i dispositivi slave nello stato di Hold per un tempo determinato, nessun pacchetto può essere trasmesso dal master anche se il dispositivo mantiene la sincronizzazione; Modalità operative - Sniff mode Lo slave che passa in questo stato si trova in una modalità di risparmio energetico. Per entrare nello sniff mode, master e slave devono negoziare; - Park mode Il dispositivo è ancora sincronizzato alla piconet ma perde il suo indirizzo di dispositivo attivo (AM_ADDR) e riceve un nuovo indirizzo di 8 bit (PM_ADDR, Park Mode Address). Questa modalità è stata ideata per avere la possibilità di costituire piconet con più di sette slave. Bluetooth e NXT Bluetooth (a 460.8 kb/s) Bluetooth per monitorare un programma in fase di esecuzione Si possono far comunicare diversi NXT tra di loro o con altri dispositivi portatili Il canale 0 viene utilizzato dagli slave, i canali 1, 2 e 3 dal master La distanza massima è di circa 10 m. Funzioni della BT dell'NXC - con il firmware standard la comunicazione può essere iniziata solo manualmente - il mattoncino che inizia la procedura diventa il master della rete - la comunicazione è criptata grazie ad una password concordata tra gli utenti Poche regole e alcune funzioni - di dieci "mailbox" di ingresso che possono contenere fino a cinque messaggi di 59 caratteri l'uno. - dieci "mailbox" di uscita utilizzate dagli slave per rispondere al master. La risposta nella mailbox con identificativo numerico dato da quello di ingresso +10. - messaggi sono sempre memorizzati in formato stringa chiuso dal carattere NULL. Le funzione dell'NXC int Bluetoothstatus(connessione) ritorna lo stato della connessione: - NO_ERR oppure STAT_COMM_PENDING int SendMessage(mailbox, stringa) int ReciveMessage(mailbox, bool clear, stringa) int BluetoothWrite(connessione,byte buffer) Il paragrafo 3.13 (da pagina 90) del manuale dell'NCX riporta tutte le funzioni per comunicare tramite BT. La libreria di Benedettelli Daniele Benedettelli ha scritto una libreria di funzioni che semplifica notevolmente l'utilizzo di BT - la libreria - utilizzo come master -utilizzo come slave Tasks and Subroutines • Multiple tasks are possible, but don’t work like you might expect • Scheduling is different – tasks start when a ‘dependant’ task finishes There is no easy way of stopping a task Use Precedes() or Follows() in a task to define task dependencies Tasks task FooTask() { // will start executing when main() finishes } task main() { // program starts here Precedes( FooTask ); } task BarTask() { Follows( main ); // will also start executing when main() finishes } Subroutines • Essentially a task that can be called • It suspends the calling task until it returns • Don’t use task keyword to define these • Can pass in parameters or return a value Subroutine Example void TestSub( int x, int y, short i ) { x = y + i; } task main() { TestSub( 1, 2, 3 ); } NXC Help • Preliminary help file is a PDF • There are many samples and a tutorial online Demo Robots • • • • • Dog 6-legged walker Crane Crate Dump truck Others?