Olá tudo bem? Hoje vamos iniciar uma série de posts os quais irão abordar sobre: Processing com Arduino.
Vamos aprender a como mostrar graficamente os nossos projetos e como através da tela do nosso computador, controlar as saídas do Arduino. Vamos nessa?
O que é Processing?
Basicamente, Processing é uma linguagem de programação, totalmente gratuita e de código aberto. Ela foi um projeto iniciado em 2001 por Casey Reas e Ben Fry, ambos ex-membros do Grupo de Computação do MIT Media Lab, tendo como objetivo, desenvolver artes eletrônicas e projetos visuais.
Além disso, ela busca ensinar noções básicas de programação de computadores em um contexto totalmente visual.
A sua instalação é igual a IDE do Arduino, basta realizar o seu download de acordo com o sistema operacional da sua máquina e depois é só executar a instalação e pronto, você já pode começar a criar suas primeiras artes eletrônicas!
Mas você sabia também que já temos no blog um projeto de radar utilizando o Processing? Ainda não viu? Então clica no link abaixo e confira uma aplicação com Arduino utilizando a ferramenta Processing.
Sendo assim, para realizar o seu download, basta clicar na imagem abaixo que você será direcionado a página de download do processing:
Testando o Processing
Para testar se o nosso software está funcionando corretamente, vamos realizar um pequeno “Olá Mundo!” para você começar a compreender como essa ferramenta trabalha.
Assim, ao abrir a IDE do Processing, você vai notar uma certa familiaridade com a IDE do nosso Arduino, o que facilita bastante o nosso trabalho. Com a IDE aberta, digite:
println (“Olá Mundo”);
Observe que no espaço onde aparece os erros do código, tem alguma coisa escrita ali, o que é? Exatamente, é a mensagem que escrevemos!
Agora vamos para outro teste, que tal criar um elipse? E ainda aprender a escrever na janela que abre quando executamos o código? Para isso basta executar o seguinte código:
frame.setTitle ("Nome da Janela"); // Código para colocar nome na janela size (500,500); // Tamanho da janela que será aberta ellipse (250, 250, 150, 150); // Objeto a ser criado (Elipse) (x, y, Larg, Compri) text("Controle do Led", 200, 50); // Texto a ser escrito na tela ("Texto", x, y)
Processing com Arduino
Vamos entrar agora no objetivo do post de hoje, que é mostrar como é realizada a comunicação entre Processing e Arduino. Para isso, precisamos saber de alguns detalhes:
- Primeiro, vamos ter que realizar dois upload de código, um no Arduino e outro no Processing.
- Segundo, realize o upload no Arduino para depois realizar no Processing.
- Os código utilizados no Processing são baseados na linguagem Java.
Além disso, a ideia da comunicação entre Processing e Arduino é basicamente assim: o Processing pode ser utilizado de duas formas, fazendo o Arduino executar determinada tarefa ou atuando como uma representação gráfica e visual daquilo que está acontecendo no seu protótipo em protoboard.
Quando o Processing atua como um agente que vai “comandar” o Arduino, então temos que fazer com que o Arduino apenas realize a leitura da porta serial (onde é feita a comunicação entre eles).
Caso o Arduino receba algum valor, enviado pelo processing, ele realiza determinada função, ou seja, ele só fará uma ação X, ligar um led, por exemplo, se, o Processing mandar o valor correto, caso contrário isso não ocorrerá.
Agora quando o processing atua como uma representação visual daquilo que está ocorrendo na protoboard, temos basicamente o contrário. Agora é o Arduino que vai enviar pela serial o que está acontecendo na protoboard e a partir desse dado enviado, uma imagem (ou uma janela de cores) é mostrada no processing.
Caso contrário, outra imagem (ou uma janela de cores) é mostrada. Sabendo disso, vamos partir para o nosso primeiro exemplo, vamos piscar um Led através do Processing. Então para isso, vamos aos materiais do nosso projeto.
Materiais Utilizados
Processing com Arduino – Ligação do Circuito
Fonte: AutoCore Robótica
Código do Arduino Comentado
Como já mencionei, devemos realizar o upload do código no Arduino primeiro, assim, realize o upload do seguinte código em seu Arduino:
/* ======================================================================================================== Projeto: Utilizando Processing com Arduino Parte 1 Autor: Danilo Nogueira Data: 16/10/2018 // ======================================================================================================== */ // -- Definindo as variáveis -- int LED = 13; int entrada = 0; // ======================================================================================================== // -- Definindo o Setup() -- void setup() { Serial.begin(9600); pinMode(LED, OUTPUT); } // ======================================================================================================== // -- Definindo o Loop() -- void loop() { if (Serial.available() > 0) { entrada = Serial.read(); if (entrada == '0') digitalWrite(LED, LOW); else if (entrada == '1') digitalWrite(LED, HIGH); } } // ========================================================================================================
Agora basta realizar o upload da pasta com as imagens dos leds mais o código abaixo e realizar o upload em seu Processing, para que o led conectado ao pino 13 comece a piscar:
Código do Processing Comentado
/* ======================================================================================================== Projeto: Utilizando Processing com Arduino Parte 1 Autor: Danilo Nogueira Data: 16/10/2018 // ======================================================================================================== */ // --- Iniciando a Serial --- import processing.serial.*; // ======================================================================================================== // --- Definindo as Variáveis --- Serial porta; PImage imagem; int valor = 0; // ======================================================================================================== // --- Definindo o Setup() --- void setup() { frame.setTitle ("Controle do Led"); //Criando a janela size (1280,765); //Tamanho da janela println("Portas seriais disponíveis:"); //Mostra a lista de postas disponíveis println(Serial.list()); String nomePorta = Serial.list()[0]; porta = new Serial(this, nomePorta, 9600); //Salva a porta que o Arduino está imagem = loadImage("led-off.png"); //Carrega a imagem inicial do led } // ======================================================================================================== // --- Definindo o Draw() --- void draw() { fill(0); textFont(createFont("SansSerif", 36)); text("Controle do Led", 10, 40); //Título da janela textFont(createFont("SansSerif", 18)); //Fonte utilizada e o seu tamanho text("Clique sobre a imagem para acender ou apagar o led.", 10, 80); // Exibir a imagem carregada image(imagem, 250, 120); //Atualização da imagem do led ao clicar nela } // ======================================================================================================== // --- Definindo o mouseClicked() --- void mouseClicked() { if (valor == 0) //Verifica se o led está apagado { valor = 1; imagem = loadImage("led-on.png"); porta.write('1'); //Escreve o numero '1' na serial do Arduino println("Enviando: 1"); } else { valor = 0; imagem = loadImage("led-off.png"); porta.write('0'); println("Enviando: 0"); } } // ========================================================================================================
Analisando o Código
Código do Arduino
No código do Arduino, como sempre, iniciamos definindo o pino que estamos trabalhando e colocamos ele como saída.
Mas além disso, também inicializamos a comunicação serial, a qual é o meio de comunicação entre o Arduino e o Processing.
Logo depois entramos no loop do código, onde nele temos o seguinte código:
void loop() { if (Serial.available() > 0) { entrada = Serial.read(); if (entrada == '0') digitalWrite(LED, LOW); else if (entrada == '1') digitalWrite(LED, HIGH); } }
Inicialmente temos um comando if, o qual vai ter a tarefa de checar se algo foi enviado para a serial do Arduino, caso chega alguma coisa na serial, ela será lida através do código:
entrada = Serial.read();
Após essa informação ser lida, ela será armazenada na variável ‘entrada’. Esse valor armazenado será comparado para saber se o led será habilitado ou não. Essa comparação é feito no próximo if o qual verifica se o valor é igual a zero, caso seja, o led é desligado.
Mas caso o valor armazenado seja igual a 1, então o led é habilitado e, se nenhuma dessas condições for verdadeira, o Arduino volta a ler a serial e espera um outro valor.
Código Processing
Inicialização do Código
Primeiro, em todo projeto que vamos utilizar o processing devemos sempre iniciar a comunicação serial, pois é com ela que vamos nos comunicar com o Arduino, dessa forma escrevemos o comando:
import processing.serial.*;
Após de iniciar a serial, vamos definir os tipos de variáveis que vamos utilizar em nosso código. Vamos começar com a variável do tipo Serial:
Serial porta;
Esse comando criou uma variável do tipo Serial a qual vai armazenar qual porta o Arduino está conectado (é aquela COMx, lembra?) e além disso, será por ela que vamos enviar os valores para a serial do Arduino.
Logo depois, foi definido a variável do tipo PImage:
PImage imagem;
Este tipo de variável é utilizada para armazenar imagens. Ou seja, é através dessa variável que vamos colocar imagens na janela do programa. Os formatos de imagens que ela suporta são: .gif , .jpg , .tga e.png .
Além disso, a classe PImage contém campos para a largura e altura da imagem. Contudo, para chamar uma imagem ao programa, devemos utilizar o comando:
imagem = loadImage("nome-da-imagem-salva");
Definindo o Setup
Entrando no void setup() temos a construção da nossa janela inicial do programa através da linha de código:
frame.setTitle ("Controle do Led"); size (800,480);
As linhas que seguem irão mostrar no espaço das mensagens de erro, quais portas estão disponíveis (normalmente aparece só aquela que o Arduino está) e vai armazenar essa porta na variável portaCOM do tipo String:
println("Portas seriais disponíveis:"); println(Serial.list()); String nomePorta = Serial.list()[0];
Logo depois, utilizamos a variável porta criada para guardar a porta do Arduino para que futuramente possamos enviar dados através dela, no comando ela armazena qual porta será utilizada e qual será a velocidade de conexão:
porta = new Serial(this, nomePorta, 9600);
Definindo o Draw
Dentro do draw, que é o void loop do Arduino, é onde vai acontecer todo o efeito de apagar e acender o led no momento que você clicar no led que aparece na tela. Todos os comandos que estão dentro dessa função, irão configurar toda a parte gráfica da janela que abre quando executamos o programa:
fill(0); textFont(createFont("SansSerif", 36)); text("Controle do Led", 10, 40); textFont(createFont("SansSerif", 18)); text("Clique sobre a imagem para acender ou apagar o led.", 10, 80); // Exibir a imagem carregada image(imagem, 250, 120);
Definindo o mouseClicked()
A função mouseClicked() tem como aplicação, identificar se o botão do mouse foi pressionado e solto, ou seja, foi clicado. Assim, toda vez que clicarmos no led que vai aparecer na tela, a função vai entrar dentro do if. Tal if vai verificar se o led está em posição de ligado ou desligado.
Caso o led esteja desligado (valor == 0) então valor passa a valer 1. Assim, escrevemos na serial do Arduino o valor de 1, para poder ligar o led na protoboard, através do comando:
porta.write('1');
Ou seja, vamos escrever 1 (write) na porta serial que está armazenada na variável porta (que é a porta no Arduino COM-valor-da-porta). Mas, se quando eu clicar no led e ele estiver ligado, então será enviado o valor de 0 na serial e o led será apagado.
Resultado do Projeto
Para terminar, segue o vídeo do nosso canal do Youtube onde mostra o código do nosso projeto de hoje em funcionamento!
Mas e ai? Gostou? Caso tenha ficado algo incompleto para você, comenta abaixo
Dicas?
Forte abraço!