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?