71
Raspberry…Python Python è il linguaggio di programmazione scelto dalla Fondazione Raspberry Per verificare la sua presenza in un computer basta digitare, nella finestra di terminale, il comando: python -V (maiuscolo) Se è presente, l'interprete Python ci risponde con la versione installata. python Se si digita unicamente: si apre l'ambiente di programmazione

Raspberry Python - Unisalento.it

  • Upload
    others

  • View
    40

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Raspberry Python - Unisalento.it

Raspberry…Python

Python è il linguaggio di programmazione scelto dalla Fondazione Raspberry

Per verificare la sua presenza in un computer basta digitare, nella finestra di terminale, il comando:

python -V (maiuscolo)

Se è presente, l'interprete Python ci risponde con la versione installata.

python

Se si digita unicamente:

si apre l'ambiente di programmazione

Page 2: Raspberry Python - Unisalento.it

Raspberry…Python

Python è un linguaggio interpretato e non richiede di essere compilato prima dell'esecuzione

La struttura dei programmi si imposta indentando i gruppi di istruzioni in base alla logica che si vuole realizzare. Non esistono parentesi graffe che racchiudono i gruppi di istruzioni o istruzioni "end" che chiudono cicli "while" o strutture "if".

Non si usano caratteri di chiusura delle istruzioni, come il ‘’;’’ in C.

La struttura del programma si imposta indentando correttamente le istruzioni, in modo da rispettare i blocchi di istruzioni che appartengono a sequenze, cicli e selezioni. Solo le istruzioni di selezione sono terminate da ":"

Page 3: Raspberry Python - Unisalento.it

Raspberry…Python Tabella delle parole/istruzioni chiave del linguaggio

Page 4: Raspberry Python - Unisalento.it

Raspberry…Python

Per lanciare un programma si deve usare la forma:

python nome-file

Proviamo la linea di comando e digitiamo:

python

al prompt " >>>" digitate:

print "Ciao a tutti " seguito da "invio"

Page 5: Raspberry Python - Unisalento.it

Raspberry…Python

L'istruzione viene eseguita immediatamente. Per chiudere digitate:

exit ()

Page 6: Raspberry Python - Unisalento.it

Raspberry…Python Passiamo all'utilizzo di Python in modalità "normale", cioè con il listato del programma contenuto in un file di testo. Possiamo utilizzare ‘’Geany’’, inserito nelle distribuzioni per la scrittura e la modifica di programmi in vari linguaggi.

Page 7: Raspberry Python - Unisalento.it

Raspberry…Python

La prima riga è il cosiddetto shebang, una direttiva per l'interprete a linea di comando che indica quale "interprete" di linguaggio utilizzare per l'esecuzione del programma. Nel nostro caso il Python

Page 8: Raspberry Python - Unisalento.it

Raspberry…Python Salviamo il programma in /home/pi

Page 9: Raspberry Python - Unisalento.it

Raspberry…Python Digitiamo:

python /home/pi/Prova .py

Page 10: Raspberry Python - Unisalento.it

Raspberry…Python

GPIO, essendo un registro hardware, è comandabile nativamente dal sistema operativo attraverso alcuni comandi, che possono essere lanciati da riga di comando, o da programma scritto ad hoc.

Iniziamo ad utilizzare i GPIO pins…Premettiamo che..

Il valore più “standard” a cui fare riferimento è il numero BCM, ma attenzione che il numero BCM non ha una corrispondenza diretta con il reale PIN. Ad esempio, al BCM 17 corrisponde il pin fisico 11. (La codifica BCM è la codifica “nativa” di Raspberry PI, ed in particolare del chip BCM2835, e viene utilizzata per comandare i singoli Pin da linguaggi come ad esempio Python o altre librerie).

Page 11: Raspberry Python - Unisalento.it

Raspberry…Python

l circuito più “basic” possibile è sicuramente l’accensione di un LED tramite GPIO.

Innanzitutto, come ricordato in precedenza, i pin del GPIO vanno sempre protetti con una resistenza al fine di limitare la corrente (sia in ingresso che in uscita). Per un LED è sufficiente una resistenza da 330 Ω – 1k Ω

Colleghiamo il pin 6 (ground) alla massa e il

pin 11 (BCM 17) al segnale (+).

Page 12: Raspberry Python - Unisalento.it

Raspberry…Python Colleghiamo il pin 6 (ground) alla massa e il

pin 11 (BCM 17) al segnale (+).

Page 13: Raspberry Python - Unisalento.it

Raspberry…Python Apriamo Geany e scriviamo il seguente codice per la gestione dell’accensione e lampeggio di un LED

Page 14: Raspberry Python - Unisalento.it

Raspberry…Python Code per accendere (e far lampeggiare) un LED

Page 15: Raspberry Python - Unisalento.it

Raspberry…Python Digitare

sudo python LED.py

CTRL+C per uscire dal programma

Page 16: Raspberry Python - Unisalento.it

Raspberry…Python Esempio con LED and BUTTON:

Il circuito farà una cosa molto semplice: di default sarà acceso un LED Tendendo premuto il pulsante, spegniamo il LED e accendiamo quello accanto.

Page 17: Raspberry Python - Unisalento.it

Raspberry…Python

…continua..

Page 18: Raspberry Python - Unisalento.it

Raspberry…Python …continua..

Page 19: Raspberry Python - Unisalento.it

Raspberry PI – Sensori Lettura dati dai sensori - Temperatura (Termistore NTC - Analogico)

Termistore NTC

Page 20: Raspberry Python - Unisalento.it

Lettura dati dai sensori - Temperatura (Termistore NTC - Analogico)

Il termistore NTC e connesso è collegato, attraverso un partitore di tensione, all’integrato PCF8591 che si occupa di effettuare la conversione analogico

digitale, come evidenziato in figura

Termistore NTC

Integrato PCF8591

Raspberry PI – Sensori

Page 21: Raspberry Python - Unisalento.it

Lettura dati dai sensori - Temperatura (Termistore NTC - Analogico)

Il PCF8591 è un Convertitore Analogico Digitale (ADC: Analog to Digital Converter) ADC ad 8 bit

Premettiamo che…un ADC è un circuito che converte una tensione analogica (fornita ai capi del nostro termistore), compresa in un certo intervallo, in un numero intero binario, anche lui compreso in un intervallo, in modo esso possa essere elaborato dai circuiti digitali. Ovviamente questa operazione implica un'approssimazione: - Due tensioni in ingresso vicine tra di loro possono essere convertite nello stesso numero intero in uscita - Ad un numero in uscita non corrisponde una tensione precisa, ma un (piccolo) intervallo di tensioni

Raspberry PI – Sensori

Page 22: Raspberry Python - Unisalento.it

Il simbolo spesso utilizzato per un ADC è il seguente:

In ingresso (linee inclinate, non la punta di una freccia) è rappresentata una sinusoide, tipico segnale analogico

In uscita (linee squadrate, a gradino), un'onda quadra, tipico segnale digitale

Raspberry PI – Sensori La conversione Analogico - Digitale

Page 23: Raspberry Python - Unisalento.it

Il legame tra ingresso e uscita di un ADC può essere rappresentato con il grafico “a scala”, come riportato nella figura esemplificativa seguente:

In ascissa è riportato l'ingresso:

sono per esempio ammessi tutti i

valori di tensione compresi tra 0 e

10 V (in questo esempio).

La massima tensione che l'ingresso

può assumere viene detta tensione

di fondo scala (VFS, nell'esempio

pari a 10 V).

Raspberry PI – Sensori La conversione Analogico - Digitale

Page 24: Raspberry Python - Unisalento.it

In ordinata sono riportato i valori numerici

binari in uscita, otto nell'esempio. Si noti

che non sono ammessi valori intermedi a

quelli indicati

Guardando il grafico si vede, per esempio,

che la tensione di 3 V viene convertita nel

numero 010; anche la tensione di 2,7 V

viene convertita nello stesso numero 010,

a causa delle approssimazioni introdotte.

La tensione di 4,5 V viene invece

convertita nel numero 011

Con il termine risoluzione si indica il numero di bit necessari per esprimere il massimo numero in uscita al convertitore, che di solito è una potenza di due. Nell'esempio in figura l'uscita dell'ADC è un numero intero compreso tra 0 e 7 (000... 111 in binario). Quindi la risoluzione è pari a 3 bit.

Raspberry PI – Sensori La conversione Analogico - Digitale

3V

2.7V

Page 25: Raspberry Python - Unisalento.it

La “lunghezza” di un gradino (in genere tutti uguali tra loro) si indica con il termine quanto (Q). Esso indica la minima variazione della tensione in ingresso che causa una variazione nel codice binario in uscita. L'operazione di approssimazione di una tensione ad un numero intero si chiama quantizzazione.

quanto (Q)

Nel caso in esempio:

In genere la risoluzione è molto più elevata dei 3 bit dell'esempio: nel mondo reale varia tra 8 e 16 bit e anche oltre. Più è elevata la risoluzione, in genere, migliore è il convertitore perché migliore è l'approssimazione effettuata nella conversione (“gradini” più piccoli).

Raspberry PI – Sensori La conversione Analogico - Digitale

Page 26: Raspberry Python - Unisalento.it

Per digitalizzare un segnale variabile nel tempo è necessario, prima di effettuare la quantizzazione, individuare, istante dopo istante, alcuni valori di tensione da sottoporre successivamente a quantizzazione. Questa operazione si chiama campionamento e, praticamente sempre, viene effettuata ad intervalli di tempo costanti. L'intervallo T tra due istanti di campionamento si chiama periodo di campionamento; il suo inverso frequenza di campionamento

Dato un generico segnale variabile nel tempo, solo i punti evidenziati saranno sottoposti a quantizzazione.

Raspberry PI – Sensori La conversione Analogico - Digitale

Page 27: Raspberry Python - Unisalento.it

Il protocollo I2C Vediamo ora come comunica l’integrato ADC PCF8591 con la scheda

Raspberry PI. Esso usa il protocollo di comunicazione digitale I2C

Raspberry PI – Sensori

Il protocollo I2C (pronuncia I-quadro-C, in Inglese I-squared-C) è stato creato dalla Philips Semiconductors nel 1982; la sigla, comunemente indicata anche con con I2C, sta per Inter-Integrated Circuit.

Il protocollo permette la comunicazione di dati tra due o più dispositivi I2C utilizzando un bus (canale di comunicazione ) a due fili, più uno per il riferimento comune di tensione (la massa)

In tale protocollo le informazioni sono inviate serialmente usando una linea per i dati (SDA: Serial Data line) ed una per il Clock (SCL: Serial Clock line).

Page 28: Raspberry Python - Unisalento.it

Il protocollo I2C

Microcontrollore (Master = inizia la comunicazione)

(Il microprocessore di Raspberry nel nostro caso)

Dispositivo Slave = risponde alla

comunicazione (Il nostro ADC)

Due linee di comunicazione: SDA per lo scambio dei dati SCL per il segnale di temporizzazione (clock)

Raspberry PI – Sensori

Page 29: Raspberry Python - Unisalento.it

Raspberry PI – Sensori

Una sequenza elementare di lettura o scrittura di dati tra master e slave segue il seguente ordine :

1. Invio del bit di START (S) da parte del master

2. Invio dell’indirizzo dello slave (ADDR) ad opera del master

3. Invio del bit di Read (R) o di Write (W), che valgono rispettivamente 1 e 0 (sempre ad opera del master)

4. Attesa/invio del bit di Acknowledge (ACK)

5. Invio/ricezione del byte dei dati (DATA)

6. Attesa/invio del bit di Acknowledge (ACK)

7. Invio del bit di STOP (P) da parte del master

Il protocollo I2C

Page 30: Raspberry Python - Unisalento.it

Raspberry PI – Sensori Il protocollo I2C

Sequenza di start

Sequenza di stop

1 2 3 4

5 6 7

Page 31: Raspberry Python - Unisalento.it

Le linee del bus I2C, SDA (dati) ed SCL (clock), sono collegate rispettivamente ai pin fisici 3 e 5

del connettore GPIO di Raspberry Pi

Il bus di comunicazione I2C con l'integrato convertitore PCF8591 funziona con i livelli a 3,3 V

Lettura dati dai sensori - Temperatura (Termistore NTC - Analogico)

Raspberry PI – Sensori

Page 32: Raspberry Python - Unisalento.it

Lettura dati dai sensori – Pin da utilizzare

Raspberry PI – Sensori

Page 33: Raspberry Python - Unisalento.it

Lettura dati dai sensori – Termistore NTC

Come accennato prima, l'elemento che realizza il sensore di temperatura è la resistenza NTC da 10 kohm, collegata, tramite il partitore di tensione composto da R16 e dall'NTC stessa, all'ingresso analogico AN_0 dell'integrato

PCF8591. La tensione di riferimento per la misura degli ingressi analogici è fornita dalla resistenza di limitazione R18, dal diodo Zener DZ1 e dal condensatore elettrolitico C1, che mantiene stabile la tensione.

Raspberry PI – Sensori

Page 34: Raspberry Python - Unisalento.it

Lettura dati dai sensori – Temperatura (Termistore NTC) – script in Python per la lettura del valore di temperatura rilevato dal sensore

Raspberry PI – Sensori

Page 35: Raspberry Python - Unisalento.it

Lettura dati dai sensori – Temperatura (Termistore NTC) – script in Python per la lettura del valore di temperatura rilevato dal sensore

Raspberry PI – Sensori

Page 36: Raspberry Python - Unisalento.it

Lettura dati dai sensori – Temperatura (Termistore NTC) – script in Python per la lettura del valore di temperatura rilevato dal sensore

Raspberry PI – Sensori

Page 37: Raspberry Python - Unisalento.it

Lettura dati dai sensori – Temperatura (Termistore NTC) – script in Python per la lettura del valore di temperatura rilevato dal sensore

Raspberry PI – Sensori

Page 38: Raspberry Python - Unisalento.it

Lettura dati dai sensori – Temperatura (Termistore NTC) – script in Python per la lettura del valore di temperatura rilevato dal sensore

Raspberry PI – Sensori

Page 39: Raspberry Python - Unisalento.it

Lettura dati dai sensori – Temperatura (Termistore NTC) – script in Python per la lettura del valore di temperatura rilevato dal sensore

Raspberry PI – Sensori

Page 40: Raspberry Python - Unisalento.it

Libreria per la comunicazione con protocollo I2C usata nel programma

Raspberry PI – Sensori

Page 41: Raspberry Python - Unisalento.it

Raspberry…Arduino Interfacciamo Raspberry PI con Arduino

Page 42: Raspberry Python - Unisalento.it

Raspberry…Arduino Interfacciamo Raspberry PI con Arduino: pacchetti da installare:

Package: arduino (2:1.0.5+dfsg2-4.1)

Page 43: Raspberry Python - Unisalento.it

Raspberry…Arduino Interfacciamo Raspberry PI con Arduino: pacchetti da installare: Package: openjdk-8-jre (8u151-b12-1~deb9u1)

Page 44: Raspberry Python - Unisalento.it

Raspberry…Arduino Interfacciamo Raspberry PI con Arduino: pacchetti da installare: Package: default-jre (2:1.8-58)

Page 45: Raspberry Python - Unisalento.it

Raspberry…Arduino Interfacciamo Raspberry PI con Arduino: IDE Arduino

Page 46: Raspberry Python - Unisalento.it

Raspberry…Arduino Interfacciamo Raspberry PI con Arduino: Carichiamo lo sketch:

Page 47: Raspberry Python - Unisalento.it

Raspberry…Node-RED Apriamo Node-RED

Page 48: Raspberry Python - Unisalento.it

Raspberry…Node-RED Visualizziamo l’indirizzo con cui collegarci a Node-RED: http:// IP di Raspberry:1880

Digitiamo sul nostro browser l’indirizzo di Node-RED

Page 49: Raspberry Python - Unisalento.it

Raspberry…Node-RED L’ambiente Node-RED

Le applicazioni Node-RED sono definite come "flow" ( flusso) la rappresentazione visuale è realizzata attraverso HTML (ed in parte anche JavaScript) mentre la parte implementativa ed elaborativa esclusivamente in JavaScript, in quanto tutto si basa sul framework NodeJS (JavaScript server side). I "blocchi" che compongono il flusso sono chiamati "nodi" .

Nodi

Page 50: Raspberry Python - Unisalento.it

Raspberry…Node-RED L’ambiente Node-RED - Flow-Based Programming

Un’applicazione è costituita da una serie di blocchi (nodi).

Tali blocchi utilizzano una o più porte (sia in ingresso che in uscita) per poter essere collegati tra loro attraverso delle connessioni in modo da costituire una rete nell’ambito della quale comunicano scambiandosi dati sotto forma di messaggi noti anche come “information packets” (IP).

Il programma non è più una sequenza di istruzioni ma è caratterizzato da un insieme di flussi di dati che vengono scambiati tra i blocchi in maniera completamente asincrona.

Le “strade” percorse dai dati possono essere molteplici e parallele.

Page 51: Raspberry Python - Unisalento.it

Raspberry…Node-RED L’ambiente Node-RED - Flow-Based Programming

Realizzeremo un semplicissimo flow nel quale iniettare come ingresso il nostro nome (es. Paolo) e visualizzare sulla finestra di debug il messaggio “Hello, <nome> !” (es. Hello, Paolo !).

Dalla toolbox sul lato sinistro, tra i nodi di “input”, trasciniamo il nodo denominato inject all’interno dello sheet

Page 52: Raspberry Python - Unisalento.it

Raspberry…Node-RED L’ambiente Node-RED - Flow-Based Programming

Realizziamo un semplicissimo flow nel quale iniettare come ingresso il nostro nome (es. Paolo) e visualizziamo sulla finestra di debug il messaggio “Hello, <nome> !” (es. Hello, Paolo !).

Dalla toolbox sul lato sinistro, tra i nodi di “input”, trasciniamo il nodo denominato inject all’interno dello sheet

Questo nodo permette di “iniettare” un messaggio all’interno del flusso in modalità “on demand” ossia alla pressione del tasto che troviamo alla sinistra del nodo stesso oppure in maniera periodica ed automatica

Page 53: Raspberry Python - Unisalento.it

Raspberry…Node-RED L’ambiente Node-RED - Flow-Based Programming

Per default, il payload del messaggio (il dato) è un timestamp ma possiamo specificare una stringa oppure lasciarlo completamente vuoto; quest’ultimo caso può essere utile quando vogliamo rappresentare un evento che non abbia necessariamente del contenuto informativo da portare con sé.

Una volta trascinato il nodo all’interno del flusso, se clicchiamo due volte su di esso, sarà visualizzata una finestra per la relativa configurazione.

Page 54: Raspberry Python - Unisalento.it

Raspberry…Node-RED L’ambiente Node-RED - Flow-Based Programming

Cambiamo solo il tipo di payload da “timestamp” a “string” ed assegnare come valore per tale stringa il proprio nome (es. Paolo); possiamo eventualmente assegnare un nome al nodo (in modo da riconoscerlo nel flusso) utilizzando il campo “Name”

Page 55: Raspberry Python - Unisalento.it

Raspberry…Node-RED L’ambiente Node-RED - Flow-Based Programming Attraverso l’impostazione “Repeat” è possibile specificare un’eventuale periodicità con cui il messaggio deve essere iniettato (es. ogni 10 sec), in quale intervallo temporale (es. dalle 10:00 alle 12:00 del Lunedi) oppure in un istante preciso (es. alle 11:00 di ogni giorno).

Page 56: Raspberry Python - Unisalento.it

Raspberry…Node-RED L’ambiente Node-RED - Flow-Based Programming

Il nodo di “inject” ha alla sua sinistra un tasto attraverso il quale possiamo iniettare quando vogliamo il messaggio nel flusso e sulla sua destra un piccolo quadratino che rappresenta la porta di uscita grazie al quale possiamo collegarlo ad un altro nodo, in modo tale che il messaggio prodotto in uscita diventi l’ingresso per il nodo successivo.

Page 57: Raspberry Python - Unisalento.it

Raspberry…Node-RED L’ambiente Node-RED - Flow-Based Programming

Abbiamo a disposizione il messaggio che porta con se la stringa contenente il nostro nome, a questo punto vogliamo processarlo per poter generare un nuovo messaggio contenente l’intera stringa “Hello, <nome>!” da visualizzare attraverso il nodo di debug. Per fare ciò, trasciniamo all’interno del flusso il nodo “function” che troviamo nell’omonima sezione di nodi della toolbox

Page 58: Raspberry Python - Unisalento.it

Raspberry…Node-RED L’ambiente Node-RED - Flow-Based Programming

La relativa finestra di configurazione che in questo caso è un vero e proprio “piccolo editor” grazie al quale possiamo scrivere del codice JavaScript che effettua l’elaborazione di cui abbiamo bisogno.

Ogni messaggio viaggia nel flusso sotto forma di oggetto JSON chiamato “msg” con le due seguenti proprietà: - payload contiene il body

del messaggio (nel nostro caso la stringa con il nostro nome)

- topic rappresenta il medesimo concetto di topic del protocollo MQTT

Page 59: Raspberry Python - Unisalento.it

Raspberry…Node-RED L’ambiente Node-RED - Flow-Based Programming

Attraverso il campo “Outputs”, il numero di porte di uscita che esso deve avere (di default una sola porta) e quindi poter restituire un array di messaggi in luogo del singolo messaggio.

Page 60: Raspberry Python - Unisalento.it

Raspberry…Node-RED L’ambiente Node-RED - Flow-Based Programming

Terminata la configurazione del nodo, possiamo collegare la porta di uscita del nodo “inject” con la porta di ingresso del nodo “function”

Page 61: Raspberry Python - Unisalento.it

Raspberry…Node-RED L’ambiente Node-RED - Flow-Based Programming

Uno dei nodi utilizzati tipicamente per funzionalità di debug è l’omonimo nodo che possiamo trovare nella toolbox all’interno della sezione “output”. Attraverso di esso, abbiamo la possibilità di stampare il contenuto del messaggio ricevuto in ingresso nella “debug tab” che troviamo sul lato destro all’interno brower.

Page 62: Raspberry Python - Unisalento.it

Raspberry…Node-RED L’ambiente Node-RED - Flow-Based Programming Attraverso il campo “Output” possiamo specificare se deve essere visualizzato l’intero messaggio (in formato JSON) oppure solo il corrispondente payload; nel campo “to” è possibile impostare la visualizzazione nella “debug tab” oppure anche sulla console (da cui abbiamo lanciato Node-RED

Page 63: Raspberry Python - Unisalento.it

Raspberry…Node-RED L’ambiente Node-RED - Flow-Based Programming

Colleghiamo la porta di output del nodo “function” con la porta di input del nodo “debug”

Il tasto quadrato che troviamo alla destra del nodo “debug” permette di disattivare la visualizzazione nella “debug tab”; in questo modo possiamo escludere il debugging senza rimuovere i nodi dal flusso ma semplicemente disabilitandoli.

Page 64: Raspberry Python - Unisalento.it

Raspberry…Node-RED L’ambiente Node-RED - Flow-Based Programming

Effettuare il deploy del flusso utilizzando il tasto di “Deploy”

Cliccare su ‘’inject’’

1

2

Page 65: Raspberry Python - Unisalento.it

Raspberry…Node-RED L’ambiente Node-RED - Flow-Based Programming

Effettuare il deploy del flusso utilizzando il tasto di “Deploy”

Page 66: Raspberry Python - Unisalento.it

Raspberry…Node-RED L’ambiente Node-RED - Flow-Based Programming

Per evidenziare la modalità con cui i messaggi si muovono nel flusso sotto forma di oggetti JSON, modifichiamo la configurazione del nodo “debug” impostando il campo “Output” su “complete msg object” ed il campo “to” su “debug tab and console”; ogni qual volta eseguiamo una modifica al flusso, va ovviamente rieseguito il deploy dello stesso.

Page 67: Raspberry Python - Unisalento.it

Raspberry…Node-RED L’ambiente Node-RED: installiamo la ‘’dashboard’’ con cui creare un’interfaccia grafica per l’utente

Page 68: Raspberry Python - Unisalento.it

Raspberry…Node-RED …per far questo…

Cliccare per aprire il menu

Page 69: Raspberry Python - Unisalento.it

Raspberry…Node-RED Dobbiamo installare ‘’Manage palette’’

Page 70: Raspberry Python - Unisalento.it

Raspberry…Node-RED Per installare ‘’Manage palette’’ apriamo LX terminal e digitiamo i seguenti comandi:

sudo apt-get update

sudo apt-get upgrade

sudo apt-get install npm

sudo npm install -g npm@ 3.x

P.S. Per verificare la versione in uso di Node-RED digitare: node -v Per verificare la versione in uso di npm digitare: npm -v

Page 71: Raspberry Python - Unisalento.it

Raspberry…Node-RED Colleghiamoci a http:// indirizzo IP di Raspberry:1880

E verifichiamo che abbiamo installato ‘’Manage palette’’