FourTen > ExempleInterrupteurEtDEL

1.  Circuit

2.  Code Arduino/Wiring


/*
Description
=============
Exemple de l'utilisation du protocole FourTen, pour
recuperer l'etat d'un interrupteur et controler une
DEL a partir de l'ordinateur.


Circuit
=============

* une DEL a la broche numerique 3;
* un interrupteur a la broche numerique 7.


FourTen
=============

Vers carte:

Canal  Fonction
1    Allume ou eteint la DEL

Vers ordinateur:

Canal  Fonction
1    Indique l'etat de l'interrupteur


*/

int previousButtonState;

void setup() {

        Serial.begin(57600); // Initialiser la communication serie.
        pinMode(7,INPUT); // Configurer interrupteur.
        pinMode(3,OUTPUT); // Configurer DEL.

}

void loop() {

        // Est-ce qu'il y a un message FourTen de disponible?
        if ( fourTenAvailable() ) {
                int channel = fourTenReadChannel(); // Lire le canal.
                int data = fourTenReadData(); // Lire la donnee.
                // Si le canal == 1, appliquer la donnee a l'etat de la DEL.
                if ( channel == 1 ) digitalWrite(3,data);
        }

        int currentButtonState = digitalRead(7); // Lire l'etat de l'interrupteur.
        // Verifier si l'etat de l'interrupteur change
        if ( previousButtonState != currentButtonState ) {
                // Envoyer un message FourTen sur le canal 1 avec comme
                // donnee l'etat de l'interrupteur.
                fourTenWrite(1,currentButtonState);
                // Emmagasiner la valeur de l'interrupteur.
                previousButtonState = currentButtonState;
        }

}



//fourTenStart

/*
______            _______
|  ____|          |__   __|
| |__ ___  _   _ _ __| | ___ _ __
|  __/ _ \| | | | '__| |/ _ \ '_ \
| | | (_) | |_| | |  | |  __/ | | |
|_|  \___/ \__,_|_|  |_|\___|_| |_|

par Thomas Ouellet Fredericks
tof@t-o-f.info
Creative Commons Attribution-ShareAlike 3.0 Unported

Description
=============

FourTen est un protocole de communication tres simple et tres rapide.
Il permet d'envoyer des données dont la valeur se situe entre 0 et 1023 (10 bits)
sur 16 canaux numerotes de 0 a 15 (4 bits).


Installation
=============

Pour utiliser le protocole dans Arduino ou Wiring,
copier tout ce qui se trouve entre //fourTenStart et //fourTenEnd
et l'ajouter a la fin de votre sketch.


Utilisation
=============

# fourTenWrite(int canal, int donnee)
Permet d'envoyer un message fourTen.

# fourTenAvailable()
Retourne 1 si un message FourTen est disponible.
Retourne 0 sinon.

# int fourTenReadChannel()
Retourne le canal d'un message FourTen recu.

# int fourTenReadData()
Retourne la donnee d'un message FourTen recu.


Details du protocol FourTen
=============

Chaque message est construit a partir de deux octets:

|           octet 1           octet 2          |
|  bit      7 6 5 4 3 2 1 0 - 7 6 5 4 3 2 1 0  |
|  fonction 1 C C C C D D D   0 D D D D D D D  |

C: canal
D: donnee

octet 1:
bit    7 = 1
bits 6-3 = canal
bits 2-0 = bits 9-7 de la donnee
octet 2:
bit    7 = 0
bits 6-0 = bits 6-0 de la donnee

Le bit 7 de chaque octet sert a identifier si c'est
l'octet 1 ou 2. En excluant ces deux bits,
il reste donc 14 bits qui se subdivisent ainsi:
4 bits (canal) suivis de 10 bits (donnee)

Le canal peut avoir une valeur entre 0-15.
La donnee peut avoir une valeur entre 0-1023.

*/

void fourTenWrite(int channel, int data) {

        Serial.write( ( channel << 3 | ( ( data >> 7) & 0x07 )   )  | 0x80);
        Serial.write( data & 0x7F);

}


int fourTenBuffer;

int fourTenAvailable( ) {

        while ( Serial.available() ) {
                int data = Serial.read();

                if ( data & 0x80 ) {
                        fourTenBuffer = data & 0x7F;
                }
                else {
                        fourTenBuffer = ( fourTenBuffer << 7 ) | ( data & 0x7F );
                        return 1;
                }

        }

        return 0;
}


int fourTenReadChannel() {
        return fourTenBuffer>>10;
}

int fourTenReadData() {
        return fourTenBuffer & 0x3FF;
}

//fourTenEnd

3.  Code Processing

import processing.serial.*;

/*
*
*   ___ __  __ ___  ___  ___ _____ _   _  _ _____
*  |_ _|  \/  | _ \/ _ \| _ \_   _/_\ | \| |_   _|
*  | || |\/| |  _/ (_) |   / | |/ _ \| .` | | |
*  |___|_|  |_|_|  \___/|_|_\ |_/_/ \_\_|\_| |_|
*
*  Lorsque vous demarrez ce code, les noms de tous les ports series
*  sont affichés dans les messages de debogage de la fenetre Processing.
*  Vous devez changer la valeur de la variable "portName"
*  pour qu'elle corresponde au nom du port serie de l'Arduino.
*/

// Choisir le port serie.
String portName = "/dev/tty.usbserial-dfrobot";

// Declarer une instance de la classe Serial:
Serial serial;

// Declarer une instance de FourTen:
FourTen fourTen;


// Declarer une variable qui correspondra
// a l'etat de l'interrupteur.
int interrupteur;


void setup() {
        size(256, 256);
        smooth();


        println(Serial.list()); // Affiche les noms des ports.

        // Creer une instance de la classe Serial avec
        // un baud de 57600 et le port choisi.
        serial = new Serial(this, portName, 57600);

        // Creer une instance de la classe FourTen
        // et la lier à l'instance serial.
        fourTen = new FourTen(serial);

}

void draw() {

        while ( fourTen.available() ) {
                int channel = fourTen.readChannel(); // Lire le canal.
                int data = fourTen.readData(); // Lire la donnee.
                // Si le canal == 1, appliquer la donnee a l'etat de la DEL.
                if ( channel == 1 ) interrupteur = data;
        }


        if ( interrupteur == 0 ) {
                background(0);
        }
        else {
                background(255);
        }
}

void mousePressed() {
        fourTen.write(1, 1);
}

void mouseReleased() {
        fourTen.write(1, 0);
}


//fourTenProcessingStart

/*
*   ______            _______           _____                             _
*  |  ____|          |__   __|         |  __ \                           (_)
*  | |__ ___  _   _ _ __| | ___ _ __   | |__) | __ ___   ___ ___  ___ ___ _ _ __   __ _
*  |  __/ _ \| | | | '__| |/ _ \ '_ \  |  ___/ '__/ _ \ / __/ _ \/ __/ __| | '_ \ / _` |
*  | | | (_) | |_| | |  | |  __/ | | | | |   | | | (_) | (_|  __/\__ \__ \ | | | | (_| |
*  |_|  \___/ \__,_|_|  |_|\___|_| |_| |_|   |_|  \___/ \___\___||___/___/_|_| |_|\__, |
*                                                                                  __/ |
*

par Thomas Ouellet Fredericks
tof@t-o-f.info
Creative Commons Attribution-ShareAlike 3.0 Unported

Description
=============

FourTen est un protocole de communication tres simple et tres rapide.
Il permet d'envoyer des données dont la valeur se situe entre 0 et 1023 (10 bits)
sur 16 canaux numerotes de 0 a 15 (4 bits).


Installation
=============

Pour utiliser le protocole dans Processing,
copier tout ce qui se trouve entre //fourTenProcessingStart et //fourTenProcessingEnd
et l'ajouter a la fin de votre sketch.


Utilisation
=============

# FourTen( Serial serial )
Creer une instance de la classe et la lier au gestionnaire de la communication
serie de Processing.

# <FourTen>.write(int canal, int donnee)
Permet d'envoyer un message fourTen.

# boolean <FourTen>.available()
Retourne true si un message FourTen est disponible.
Retourne false sinon.

# int <FourTen>.readChannel()
Retourne le canal d'un message FourTen reçu.

# int <FourTen>.readData()
Retourne la donnee d'un message FourTen reçu.


Details du protocol FourTen
=============

Chaque message est construit a partir de deux octets:

|           octet 1           octet 2          |
|  bit      7 6 5 4 3 2 1 0 - 7 6 5 4 3 2 1 0  |
|  fonction 1 C C C C D D D   0 D D D D D D D  |

C: canal
D: donnee

octet 1:
bit    7 = 1
bits 6-3 = canal
bits 2-0 = bits 9-7 de la donnee
octet 2:
bit    7 = 0
bits 6-0 = bits 6-0 de la donnee

Le bit 7 de chaque octet sert a identifier si c'est
l'octet 1 ou 2. En excluant ces deux bits,
il reste donc 14 bits qui se subdivisent ainsi:
4 bits (canal) suivis de 10 bits (donnee)

Le canal peut avoir une valeur entre 0-15.
La donnee peut avoir une valeur entre 0-1023.

*/


class FourTen {

        Serial serial;
        int fourTenBuffer;

        FourTen( Serial serial) {

                this.serial = serial;
        }

        void write(int channel, int data) {

                serial.write( ( channel << 3 | ( ( data >> 7) & 0x07 )   )  | 0x80);
                serial.write( data & 0x7F);
        }


        boolean available() {

                while ( serial.available () > 0 ) {
                        int data = serial.read();

                        if ( (data & 0x80) == 0x80 ) {
                                fourTenBuffer = data & 0x7F;
                        }
                        else {
                                fourTenBuffer = ( fourTenBuffer << 7 ) | ( data & 0x7F );
                                return true;
                        }
                }

                return false;
        }

        int readChannel() {
                return fourTenBuffer>>10;
        }

        int readData() {
                return fourTenBuffer & 0x3FF;
        }
}


//fourTenProcessingEnd

4.  Code Max

----------begin_max5_patcher----------
2914.3oc6cssaiaiF9ZmmBBgtEyflDHRczKBB1Y21KJPawfs6cyTDHKw3nVY
IsRzooa29.0tOB8tYdwVRQJYIacf1wVlZPtH1w53O+zO+Oye8qWLSaQxS3bM
veE7NvrY+5EylUrI1FlI98LsUdO4G4kWbXZ9IqVgiIZWx2GA+DoX6ecLAmks
NkfWmUty6ShI4g+GL6.fnq0EaNd8pv3HLo3BBKO1rkKX+Vu5vR8H9ODFu7tL
rOgShVlrcCLrbt15R.zp3WH5mfePbRgAETSxhe7JnUc5H1aUAcn8lrPuHsMj
RxZRIsny13ucwErOt7YhGe4W8MmNX.VLvcrXeNDJXNFn.IY4xHb40iewH+RJ
lSuZgT.ph3Zcb2xnzjOvrgrm0lEiU1msNHQsOT1b0ynCbJC5c3XuEQXkZX5x
4o2LB6YbBGmwYL9mo2tc3oyn2RL.143W6R5eUzsLr8ngwEHGQb6iI2Ye4wQG
.nrBmm6sDuCp.AeVOPxQCN3yFfHA2RwObaGNP68bd3wiIIEbex5r+EN9JRxU
dYAqCiSNRvyvBKf17ufy6icY9dCO0uw3LAnHPE5kILB+HNKOLIt1QOSyKMs1
lmU6TXP4OlTbgrurZSTjpXS5UaJC+XX446v2H8AzEk6rbzOWWvOXTLWwfO5M
L1L7oOLWFk3+S3f52.sjTbbXbZFNmpCyiHtSU6N.eu25Hxcs+vo49u2yG24I
2JHOSaYVXPRLiHZblrMWd6nZ6XCFq5Ckh8G6k1xolSGEqyW3kwvMgDPT4NII
IQM2U0iJJqtWb3JOBlDxIUjd0EMbUZVgr8Z2Ht.1Gx8yRhhZbo364wV1S.8o
oO9mCCHOzPGOaOzCOLs7AfVEBEDtDmSZtMh2x7laogUb0YypOGtw16atby4y
3mRy.u5UeVHB7W.Pcj4qA2dKv40fu.7J.cyP1lseM3la.FuF7eo7Gt0uNcOk
umo8cJYrqo+PC97d9WHGmsm9uiHRj1VTQ6rncHpbVo3RwLxiOrS.Qfn9AxKO
TvD1OX5nuwRDCDy5q9PRnyghjnwAI4LvL92OmhJNud74NsK7VgyaN2dHVSns
JvZxurZOKVHpHzhurJ+ryYicOlpi4k9ZwNs2SklCxwL.48ZZGwAdwXbO3QZ.
K5x.KVxAJvddP2Anbi+Cdww3naA2D3Q7tsMbYiZznv3tzZTP6r82NfkSsvyu
DNJEmBZNRnpzHgwU1T7tpmzacbODFDzTINWuWNSKZPkGLC9zceIYlbK.TFRV
wnYYfYlLDUglsmdrFxhxNGIRF7CWT2zdsbuGwA2QuETIG24QHYgKnddmuseG
OWyuG1798vpzVIhdt4ccSotorvKR3oU041hwuWrADORdtxLxGbeVxp2zzs0m
ouoFbM+huf5F84aJZLBW2ftty.gwy4ciRy1EFw2K.A+jy6cGWdfbKPNf67he
4p+h26u389XXqtw7qQT+SrrkztTq82XcYrK8D34WXulwWOZ8GSu8D3oH90P8
4W6LfKzlJerHV.5GKW3EujEOhCFSkiG0zPxfRXnBwjXXOI2At1GmI4Q71U+j
4M460XlAbRbxtGlsatA3bVl25.KlnZXKxw7fgPzRwm1d6s.iyiDvFF7JARZn
3H4metXIMKD6UBjCJ1S4ip8WbV0HqKKLBUdExgfgMt4DpOtjwTZDUWwSRPQp
ANmywEN+ZhFL8.tJNyYpm+OMH+4obdtEuFI1sjQNdotZrDWBfmEdRXY8DH4z
anpaJzROBFfF.MO7DpJGeIhyWZYNHeo4DPZo6YkyzRRokNunIWFuHgHIcrFc
L4LOIohT5TjYoL4axbry2zymjMjjjMUJJFJKHCUBRFYIapSgpCMuObFJBIKc
wKnNhLPxliZC0gj0ksfKTLZVeZUjHHIgYGkhhkR+m5Hyf4EtbLF5SupGRcDy
As1GVCEglM2Gs1JDMKk0QtStpzB8RQZMEKRqEkkqi.tezayMZqc0SkIgWsf+
DEt2KnHd16KV8gH95N013Zq1JII6oYcGYqyWmPt7.kVMFaT1Q9IQ7K+6.vBD
o5C8Cr9jfuTeRur5hpuLWFNprmrxJwhO81Uxne4p3wkkUnN5m0B0wRr.lMqs
LU6sPcbTdHEBVhIoIYD.Rl.0dJQWHr9R92YvBqv3fyKiw3sJ2NeS+MmKJ3XY
qpLknrxZtNzahm4XxlUi9Hl40RjjWColFau5z2AIU8BUg2pCXy5OOoLrDP4c
5C6AyyExVwkiddy.KxpXYWZVz2XFNArGdo8MVSz8iRxwms44hu38Yf9lmilB
k1740hInsQs9+xvVLgPpNuomOI7Q74TODqFdYSzGj+TMVq0LjawZBg5dV8gW
VBIgAXUjD0yznn6VjjEfyntZOnjz13Z4mcRbM+50EdyK9.tEbsXYxi6bFF5H
S37Ka8+19BzyyV50dOnj5QRngUwEB2Equ91m.wG166ftww6VMP28+19zO.qP
MlKh3jd6CfdhDSe3z1D.GH1dqs0io1eeFpsGp8SwA7vA4dcyExPKsnpsjhHB
SQTRRZOJ+dYBnpLAzZyzOnt0Ta9WYw0qFS+LU9YeY36oCvGFokCTThW.2Drg
rQ6jXblkUslPms9PFmYpDEBaydRYS77av.gsafO7+JB77G9Sf282GxRQAHBC
hSVABv4E99lCx+3umEhAAdw4fHOv833O9GjLL3a8d555WeVd67obcjsYE6S1
y5ETVv7vfcXC46Y6mOc9famllYmONc3gmPuV0Maa2i4gG7xVPejr0lm5fQ2N
agaf5lLyr2sYDpjUgautrjR0xG.dEio+LzfnPksxU9R+evvm8IPGhxvz85Mq
UiSRKhZpzUnPyKLi3pSWegRajTt7Ov.+j.LHEmQsxfpFAj8we2ecJUIRgxkb
l1k7ZpW3GTZR55Ht1G5kdMHMZcNXgWd2ZXLelp5kVigCrRmOa9oaoY.cZ.fo
xqwfkIqyQrYDIaUXnMe0Y0aNBrmHZMNGfoXsDAcKz8Z6LHXNEBDaD8O+HrWl
TAjk8W4+yOqSgG.hLGHx7p87AS45AG9DyiHPulIGs9spd0SsyNSYUu1pjfcr
3tubbKMZ2WPCDAKniDYSvqD0chVokY.sKYerNeAusTbUv8YIKRHU64e9clnq
rcMMt56e6aq15eOZMljjPd3pukNLW07ngFeErii9se4at56+kXesCN5BB9Gj
HoSv1cgruPFTm4R+XDcfN6R7iPG4gfyNABKgxIrjadMZ3lC77WxNsLL07xlR
hjSqD0Mk7QEghqe3OqYDq+CIg4gE1mVX8DOnHWqsOg433GLixZrRzCFDRVL6
wwg4GSaSOIKdSYWUEFpS+M0U1JmWcHYmIWGYU1dHqg5rZaLsldKcLYW4JJz5
PVZdYS0hlmXhLLldcwYCqo2x5sflQSPZFNsXMLmd5SLjcg0afTKZdpIoCMA4
MfRJ1vVsHYofYK0hlMlfrFRIcdt5Pyx1oHTmEibKnWGrFpicnHo81VcVn5Ho
8DTgZhHRaHpqZQyRI1PcTofLmb9nHcqGxQsHY3mnuChfJTK4PZCjbldsjCqi
Ti7opmbb7dI3vyqH3usvac.vxwVWu222yWd7eO3.myW2JvdemGaMFuyi6.i9
2qvjrjddSP2nfbetu5iqdwIUjzIqdQkQ4Me7o30.tXP5Xtobi5ZLZbVeIfyJ
HaVtx.vQ6ECEeow4f580B0y4AewErYdr3Hz1B.E3ztB9ZnGWpPPuqDuck1sy
SLYoGGIHmlJXNojCbtDziynQNxPMViF0XqTTSCMyxDEoVnlUgAoITofhISlF
t7lnDprnw063WFt67CWaQOy1h++aHsi5PdvIKyGsm.lJE+fgDTy3IWCIC3LW
sjqgFOxQBpw3.oFtJxs5MYLBYqdR1V8irs6EYzq1ucw+Gq06t3B
-----------end_max5_patcher-----------