Você está na página 1de 5

Comunicando o Arduino com o PC usando Processing

2014 Juliano Mouro Vieira

PARTE I: COMUNICAO BSICA


Processing 2: ambiente simples para aprender programao (no fundo o Java), com foco em
facilidade e visualizaes.
Arduino: o ambiente de hardware e software que usa partes do Processing mas uma outra
linguagem (um C++ simplificado e C).

Objetivo Final: implementar um protocolo simples para comunicar os dois pontos, simulando
alguns eventos.

Arduino

USB

Laptop/PC

Processing 2 programao simplificada


O site http://processing.org bem completo, com download para a instalao (que simples, mas
exige o Java presente), documentao e tutoriais, mas tudo em ingls. Pra ver material em
portugus, Gugue tutorial processing portugues que aparecem vrios.
(Se quiser um tutorial detalhado de como ligar o Arduino ao Processing usando o ambiente do
Arduino, este aqui bom: https://learn.sparkfun.com/tutorials/connecting-arduino-to-processing).

Rice and Beans do Processing


Vamos pegar um dos milhes de exemplos prontos: abra o Processing e v no menu File =>
Examples... Na lista da janela nova, ache o Basics => Data => CharactersStrings. Abra e execute
com o boto do play (a seta pra direita). Teste.
O programa comea com uns comentrios e da declara duas variveis:
char letter;
String words = "Begin...";
letter um caractere, igual ao char do C; words uma String Java (ateno, S maisculo!) que
funciona diferente das strings do C. Ambas so variveis globais, ou seja, o programa inteiro pode
us-las.
A seguir, tem uma funo void setup(), que na verdade s algo que vai ser executado
uma vez antes do resto do programa. Depois dela, temos uma funo void draw() que especifica
como a tela vai ser desenhada toda vez que necessrio. O programa equivalente em C seria mais ou
menos assim:
void main() {
setup();
// inicializao
while(1)
// loop infinito
draw();
// vai repetir o desenho repetidamente
}
Mas o Processing orientado a eventos. Isso quer dizer que ao invs de fazer uma main()

sequencial, um comando depois do outro, ns vamos programar as reaes do sistema a certas


ocorrncias.
Neste programa, usada keyPressed(), que a funo que diz o que ocorre se o usurio
pressionar uma tecla. A varivel global key contm a letra da tecla pressionada, e o contedo da
funo especifica o que deve ser feito. Abaixo, a verso limpa.
void keyPressed() {
words = words + key;
}
Quando o usurio apertar qualquer tecla, ela vai ser adicionada String words. Funciona assim:
se words = "Ninjas "; e tecla = 'o'; e voc fizer words = words + 'G' + tecla; a
String words passar a valer Ninjas Go.
A funo para redesenhar a tela (isso ocorre frequentemente) fica mais ou menos:
void draw() {
background(0);
// Apaga a tela e usa fundo preto
textSize(36);
// Tamanho do texto (grande)
text(words,50,120,540,300); // Escreve a string no ponto 50,120
}

Processing Usando a Porta Serial


Quando ligamos o Arduino na USB, o sistema engana o PC fingindo que a conexo USB, que
bem difcil de trabalhar, na verdade uma simples conexo serial RS232, bem mais fcil.
Para fazer o PC conversar com a placa, vamos usar outro dos exemplos prontos: vai l em
Libraries => serial => SerialDuplex.
Logo de cara ele j seleciona uma biblioteca ( como o #include) e declara umas variveis
globais.
import processing.serial.*; // inclui todas as funes de serial
Serial myPort;
// varivel para acessar a porta serial
int whichKey = -1;
// guarda a tecla digitada
int inByte = -1;
// guarda o dado vindo da placa
Na inicializao, devemos especificar os parmetros de comunicao. A varivel da porta criada
de verdade com o comando new Serial(). Sem isso, no funciona (myPort ficaria vazia).
void setup() {
size(400, 300); // tamanho da tela
textFont(createFont("Georgia", 36));
// cria a porta serial a 9600 bps (bits por segundo)
// o nmero da COM depende do computador: pode ser COM1, COM5
myPort = new Serial(this, COM4, 9600);
}
A funo de redesenho s mostra o ltimo dado enviado e o ltimo recebido:
void draw() {
background(0);
text("Last Received: " + inByte, 10, 130);
text("Last Sent: " + whichKey, 10, 100);
}
Toda a vez que o usurio apertar uma tecla, a funo keyPressed() ser chamada. Neste caso, ela
s envia a tecla key apertada pela serial, usando a varivel criada na inicializao.

void keyPressed() {
myPort.write(key);
// manda a tecla pela serial
whichKey = key;
// salva na varivel s pra imprimir depois
}
Para enviar o byte, usamos myPort.write(), que especifica o seguinte: chame a funo write() do
objeto chamado myPort, que do tipo Serial. Isso a Orientao a Objetos do Java.
No se preocupe com isso, v seguindo os exemplos. Se quiser saber, variveis simples
(tecnicamente os tipos bsicos escalares: inteiros, floats, etc) so iguais ao C. Variveis
complicadas (tipos compostos e vetoriais e objetos) devem ser declaradas primeiro e criadas com
new depois.
Por fim, um dado pode vir pelo fio a qualquer momento, e a funo serialEvent() que
especifica o que a gente vai fazer quando um dado chegar.
void serialEvent(Serial myPort) {
inByte = myPort.read();
}
Acima, toda vez que um byte chegar pela porta, simplesmente vamos mandar ler o dado com
myPort.read() e guard-lo na varivel inByte, que ser impressa depois por draw().

Um Breve Exerccio
Eu sei, eu sei, vocs nunca viram a linguagem, esse tutorial seco feito farinha de mandioca crua e
eu j quero exerccio. Acreditem, mais rpido. E no quero aluno PhD em Processing, afinal ; )
Enunciado: Usando o exemplo de String, quero s que a string seja apagada quando o tamanho
dela chegar a 10. Pra apagar uma String s, basta fazer s = ""; e para ver seu tamanho use
s.length() (observe a draw() do exemplo CharactersStrings).

Conectando com o Arduino


Para simplificar, neste primeiro momento, usaremos os prprios ambiente e linguagem do Arduino,
que tem exemplos prontos; depois passamos para C com o Atmel Studio.
Alis, usar Processing justamente pra deixar facinho usar a serial. Eu sei fazer em C, mas
mais enjoado de fazer e no quero encher o saco de vocs.

O Exemplo de Comunicao Serial


Vamos gambiarrar o exemplo bsico pra ele fazer o que a gente quer. Abra o ambiente do Arduino,
v em File => Examples => 04.Communication => SerialEvent. Vamos fazer umas alteraes no
cara pra ele ficar menos estanho.
A inicializao esta:
String inputString = "";
boolean stringComplete = false;
void setup() {
Serial.begin(9600);
// Serial a 9600 bps
inputString.reserve(200); // reserve 200 bytes para inputString
}
J se percebem diferenas: o tipo String do Arduino exige que se especifique o tamanho com
reserve() e no precisamos criar variveis nem importar bibliotecas para usar a serial. Mas o
nome da setup() o mesmo.
S que o Arduino no tem tela grfica pra desenhar, ento a funo principal dele se chama

loop(), e ser chamada continuamente. O equivalente em C :


Void main() {
setup();
while(1)
// loop infinto
loop();
}
A funo loop() do exemplo :
void loop() {
if (stringComplete) {
// quando receber '\n'
Serial.println(inputString);// manda a string de volta
inputString = "";
// limpa para a prxima
stringComplete = false;
}
}
No vamos usar nada disso: coloque tudo dentro da funo em comentrio. O programa
espera receber um Enter; quando isso acontecer, ele simplesmente envia de volta pela serial tudo
que foi recebido at o momento, usando Serial.println().
A funo que cuida do recebimento de dados similar do Processing e tem o mesmo
nome. Quando ocorrer o evento de um byte ser recebido pela serial, ela ser chamada.
void serialEvent() {
while (Serial.available()) {
// se tiver dado pra ler
char inChar = (char)Serial.read();// l o dado
inputString += inChar;
// coloca na string
if (inChar == '\n') {
// se chegou Enter
stringComplete = true;
// marca pra loop() saber
}
}
}
Novamente, no o que eu quero. Apague e substitua pelo cdigo abaixo. Vamos fazer algo mais
simples, e s enviar de volta o byte que for recebido, imediatamente, apenas colocando para
maisculas se for recebida uma letra minscula. Para especificar esta ao de tratamento do evento,
fazemos:
void serialEvent() {
while (Serial.available()) {
// se tiver dado pra ler
char inchar = (char)Serial.read();// l o dado
if(inchar>='a' && inchar<='z')
// se for letra minusc
inchar = inchar-('a'-'A'); // faz chuncho pra maisc
Serial.write(inchar);
// manda de volta
}
}
Para mandar um byte pela porta serial do Arduino, basta usar Serial.write(x); com x sendo o
dado a mandar. Para receber, s usar Serial.read() dentro da funo SerialEvent() (no
ligue para o (char) ali). O chuncho para passar pra maiscula tem a ver com a tabela ASCII, no
se preocupe com ele.

Parte Prtica
Faa as alteraes pedidas anteriormente no exemplo SerialEvent do Arduino e grave com outro
nome. Os programas so chamados de sketches tanto no Arduino quanto no Processing.
Abra o exemplo SerialDuplex do Processing e grave com outro nome. Faa a seguinte
alterao na funo draw() do exemplo, apagando a verso anterior:
void draw() {
background(0);
text("Recebido: "+ char(inByte), 10, 130);
text("Enviado: " + (char)whichKey, 10, 100);
}
Com isto, ao invs de aparecer o cdigo das letras, ns veremos as letras em si (ou seja, veremos 'A'
ao invs de 65).

Passos
1. Compile o programa do Arduino, verifique se no h erros. Baixe ele para a placa com o
boto de Play.
2. Compile e execute o Programa do Processing.
3. Se der erro a configurao da porta serial a ser usada (eu deixei COM4, verifique qual e
altere o programa em Processing na funo setup()).
4. Digite algumas teclas. Letras maisculas e smbolos devem ser recebidos idnticos, letras
minsculas devem ser convertidas em maisculas na tela. Teclas especiais (setas, Home,
shift) tero um caractere maluco impresso ('' no meu PC).
Note que o sistema pode se perder se voc tentar mexer no Arduino com o Processing executando,
pois ambos vo requerer a porta serial para si. Qualquer coisa, feche tudo e abra de novo...

Exerccios
1. Altere o programa do Arduino para fazer o seguinte: se a sequncia de caracteres recebida
for "ABCD", a placa dever enviar ao PC uma exclamao ('!').
2. Altere o programa do Processing para imprimir na tela no s o ltimo caractere recebido,
mas os quatro ltimos.
3. Proponha alguma alterao bacana para o professor.
4. Aprenda vetores lendo a documentao do Processing e do Arduino e refaa os itens 1 e 2
com vetores.
Note, finalmente, que usar Strings no a maneira correta de fazer comunicao de dados: usamos
vetores (arrays), pois podemos ter dados numricos, como uma foto em JPEG. Na prxima parte,
usaremos vetores.

Você também pode gostar