serdasdasial processing asdwww

5
Comunicando o Arduino com o PC usando Processing 2014 © Juliano Mourão Vieira PARTE I: COMUNICAÇÃO BÁSICA Processing 2: ambiente simples para aprender programação (no fundo é o Java), com foco em facilidade e visualizações. 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. Processing 2 – programação simplificada O site http://processing.org é bem completo, com download para a instalação (que é simples, mas exige o Java presente), documentação e tutoriais, mas tudo em inglês. Pra ver material em português, Gugue “tutorial processing portugues” que aparecem vários. (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 milhões 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 botão do play (a seta pra direita). Teste. O programa começa com uns comentários e daí declara duas variáveis: char letter; String words = "Begin..."; letter é um caractere, igual ao char do C; words é uma String Java (atenção, S maiúsculo!) que funciona diferente das strings do C. Ambas são variáveis globais, ou seja, o programa inteiro pode usá-las. A seguir, tem uma função void setup(), que na verdade é só algo que vai ser executado uma vez antes do resto do programa. Depois dela, temos uma função void draw() que especifica como a tela vai ser desenhada toda vez que necessário. O programa equivalente em C seria mais ou menos assim: void main() { setup(); // inicialização while(1) // loop infinito draw(); // vai repetir o desenho repetidamente } Mas o Processing é orientado a eventos. Isso quer dizer que ao invés de fazer uma main() Arduino Laptop/PC USB

Upload: jotajota1112

Post on 25-Sep-2015

1 views

Category:

Documents


0 download

DESCRIPTION

asdasd asda asd da

TRANSCRIPT

  • 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.