serdasdasial processing asdwww
DESCRIPTION
asdasd asda asd daTRANSCRIPT
-
Comunicando o Arduino com o PC usando Processing2014 Juliano Mouro Vieira
PARTE I: COMUNICAO BSICA
Processing 2: ambiente simples para aprender programao (no fundo o Java), com foco emfacilidade e visualizaes.Arduino: o ambiente de hardware e software que usa partes do Processing mas uma outralinguagem (um C++ simplificado e C).
Objetivo Final: implementar um protocolo simples para comunicar os dois pontos, simulandoalguns eventos.
Processing 2 programao simplificada
O site http://processing.org bem completo, com download para a instalao (que simples, masexige o Java presente), documentao e tutoriais, mas tudo em ingls. Pra ver material emportugus, Gugue tutorial processing portugues que aparecem vrios.
(Se quiser um tutorial detalhado de como ligar o Arduino ao Processing usando o ambiente doArduino, este aqui bom: https://learn.sparkfun.com/tutorials/connecting-arduino-to-processing).
Rice and Beans do ProcessingVamos 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 executecom 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!) quefunciona diferente das strings do C. Ambas so variveis globais, ou seja, o programa inteiro podeus-las.
A seguir, tem uma funo void setup(), que na verdade s algo que vai ser executadouma vez antes do resto do programa. Depois dela, temos uma funo void draw() que especificacomo a tela vai ser desenhada toda vez que necessrio. O programa equivalente em C seria mais oumenos assim:
void main() {setup(); // inicializaowhile(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()
Arduino Laptop/PCUSB
-
sequencial, um comando depois do outro, ns vamos programar as reaes do sistema a certasocorrncias.
Neste programa, usada keyPressed(), que a funo que diz o que ocorre se o usuriopressionar uma tecla. A varivel global key contm a letra da tecla pressionada, e o contedo dafuno 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; aString 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 pretotextSize(36); // Tamanho do texto (grande)text(words,50,120,540,300); // Escreve a string no ponto 50,120
}
Processing Usando a Porta SerialQuando 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 emLibraries => serial => SerialDuplex.
Logo de cara ele j seleciona uma biblioteca ( como o #include) e declara umas variveisglobais.
import processing.serial.*; // inclui todas as funes de serialSerial myPort; // varivel para acessar a porta serialint whichKey = -1; // guarda a tecla digitadaint inByte = -1; // guarda o dado vindo da placa
Na inicializao, devemos especificar os parmetros de comunicao. A varivel da porta criadade verdade com o comando new Serial(). Sem isso, no funciona (myPort ficaria vazia).
void setup() {size(400, 300); // tamanho da telatextFont(createFont("Georgia", 36));// cria a porta serial a 9600 bps (bits por segundo)// o nmero da COM depende do computador: pode ser COM1, COM5myPort = 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, elas envia a tecla key apertada pela serial, usando a varivel criada na inicializao.
-
void keyPressed() {myPort.write(key); // manda a tecla pela serialwhichKey = key; // salva na varivel s pra imprimir depois
}Para enviar o byte, usamos myPort.write(), que especifica o seguinte: chame a funo write() doobjeto 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. Variveiscomplicadas (tipos compostos e vetoriais e objetos) devem ser declaradas primeiro e criadas comnew depois.
Por fim, um dado pode vir pelo fio a qualquer momento, e a funo serialEvent() queespecifica 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 ExerccioEu sei, eu sei, vocs nunca viram a linguagem, esse tutorial seco feito farinha de mandioca crua eeu 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 tamanhodela chegar a 10. Pra apagar uma String s, basta fazer s = ""; e para ver seu tamanho uses.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 SerialVamos 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 nocara pra ele ficar menos estanho.
A inicializao esta:String inputString = ""; boolean stringComplete = false; void setup() {
Serial.begin(9600); // Serial a 9600 bpsinputString.reserve(200); // reserve 200 bytes para inputString
}J se percebem diferenas: o tipo String do Arduino exige que se especifique o tamanho comreserve() e no precisamos criar variveis nem importar bibliotecas para usar a serial. Mas onome 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 voltainputString = ""; // limpa para a prximastringComplete = 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 tudoque foi recebido at o momento, usando Serial.println().
A funo que cuida do recebimento de dados similar do Processing e tem o mesmonome. 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 dadoinputString += inChar; // coloca na stringif (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 maissimples, e s enviar de volta o byte que for recebido, imediatamente, apenas colocando paramaisculas 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 dadoif(inchar>='a' && inchar
-
Parte Prtica
Faa as alteraes pedidas anteriormente no exemplo SerialEvent do Arduino e grave com outronome. 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 seguintealterao 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).
Passos1. 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...
Exerccios1. 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: usamosvetores (arrays), pois podemos ter dados numricos, como uma foto em JPEG. Na prxima parte,usaremos vetores.