0% acharam este documento útil (0 voto)
98 visualizações

Arduino Utilizando VBA No Excel

O documento descreve como controlar saídas digitais de um Arduino UNO usando VBA no Excel, incluindo: 1) Abrir e fechar portas COM; 2) Criar botões de controle no Excel; 3) Enviar comandos para o Arduino através da porta COM; 4) Receber comandos no Arduino e definir estados de saída.

Enviado por

Carlos Wolff
Direitos autorais
© © All Rights Reserved
Formatos disponíveis
Baixe no formato DOCX, PDF, TXT ou leia on-line no Scribd
0% acharam este documento útil (0 voto)
98 visualizações

Arduino Utilizando VBA No Excel

O documento descreve como controlar saídas digitais de um Arduino UNO usando VBA no Excel, incluindo: 1) Abrir e fechar portas COM; 2) Criar botões de controle no Excel; 3) Enviar comandos para o Arduino através da porta COM; 4) Receber comandos no Arduino e definir estados de saída.

Enviado por

Carlos Wolff
Direitos autorais
© © All Rights Reserved
Formatos disponíveis
Baixe no formato DOCX, PDF, TXT ou leia on-line no Scribd
Você está na página 1/ 31

Acionamento das saídas digitais do Arduino utilizando VBA no Excel

ÍNDICE DE CONTEÚDO

 Acionamento das saídas digitais do Arduino utilizando VBA no Excel


 Histórico de dados de acionamento do Arduino no Excel utilizando VBA
 Criação de gráficos para o histórico de dados do Arduino no Excel utilizando VBA
 Acionando as saídas do Arduino com PWM utilizando VBA no Excel.

Qual é o objetivo deste artigo?

O VBA ou Visual Basic for Applications consiste em uma espécie de variante do Visual


Basic, no entanto, esta pode ser utilizada em conjunto com todos os programas existentes
dentro do pacote Microsoft Office, como por exemplo o Microsoft Excel, bem como
com outras aplicações da Microsoft. 
O princípio de funcionamento do VBA é semelhante ao de qualquer outra linguagem de
programação, onde o código é definido pelo usuário para que determinada funcionalidade
seja executada por um sistema ou dispositivo. Especificamente, no caso do Microsoft Excel,
o VBA é utilizado principalmente para automatizar planilhas, oferecendo ao usuário maior
facilidade na execução de procedimentos, utilização de recursos de análise de dados,
navegação entre as planilhas existentes, além de outras aplicações mais avançadas.  
Desta maneira, este artigo tem como objetivo apresentar uma das aplicações avançadas
citadas anteriormente, que por sua vez, consiste em criar a possibilidade de comandar
um Arduino UNO através do Microsoft Excel por meio de uma interface de comunicação
entre os mesmos utilizando o VBA. No final deste conteúdo o leitor estará capacitado para
desenvolver uma aplicação semelhante à apresentada na figura 1.
 

Fig
ura 1 - Planilha para controle do Arduino UNO.
Aba de desenvolvimento
Para começar a desenvolver a aplicação proposta, deve-se habilitar a barra de ferramentas
de desenvolvedor no Microsoft Excel. Sendo assim, torna-se necessário que o leitor acesse o
menu Arquivo (File), selecione o item opções (Options) e em seguida no item personalizar
faixa de opções (Customize Ribbon) para então marcar a caixa de seleção adequada para o
aparecimento da aba de desenvolvimento(Developer).
  

Figura 2 - Aba para o desenvolvimento de aplicações em VBA


Manipulação da porta COM
O primeiro passo na criação da interface de comando consiste na manipulação da porta
COM adequada para o recebimento e envio das informações pertinentes, sendo assim,
neste momento serão utilizados dois botões, onde um deles é responsável pela abertura
da porta COM adequada e o outro para fechar a mesma. 
O primeiro botão a ser criado é aquele que abrirá a porta COM correspondente. Neste
momento, o leitor deve selecionar a opção Inserir (insert) na aba de desenvolvimento e em
seguida a opção Botão (Button), existente dentro das ferramentas de controle
de formulário (Form Controls).
  

Figura
3 - Inserindo um botão
Após a seleção da ferramenta de criação dos botões, deve-se selecionar a área
correspondente na planilha e arrastar o mouse para obter o botão com o tamanho desejado.
 

Figura 4 - Botão para abrir a porta COM


  
Assim que o botão for criado, aparecerá a janela mostrada na figura abaixo (caso a mesma
não apareça, o leitor pode clicar com o botão direito do mouse sobre o mesmo e selecionar
a opção Atribuir Macro (Assign Macro)), onde será possível inserir um determinado código,
responsável pela realização da funcionalidade para a qual o botão foi designado. Neste
ponto, deve-se escolher um nome para a Macro e clicar em Novo(New).
 

Figura 5 - Associando uma macro a um botão


 
Neste momento aparecerá um ambiente de programação para o leitor. Repare que o
ambiente citado já traz duas linhas escritas, onde uma delas contém a sentença Sub
Button1_Click() e a outra contém a sentença End Sub. Para aqueles que não conhecem
o VBA, estas duas sentenças correspondem ao início e ao final de um bloco de ações que
podem acontecer caso o botão em questão seja acionado. Sendo assim, deve-se inserir o
código referente aos atos resultantes do clique do botão.
O código a seguir é o responsável pela determinação dos parâmetros da porta COM, bem
como pela abertura da mesma. Note que nas linhas 2 e 3, as variáveis do tipo String porta e
taxa são preenchidas com os elementos existentes nas celulas
(9,3) e (10,3) ou C9 e C10 respectivamente.
 

Figura 6 - Parâmetros da porta COM


Posteriormente, a função Shell (linha 5) é utilizada para definir os parâmetros da
porta COM e a função Application.Wait (linha 6) é utilizada para determinar um tempo de
espera de cerca de 2 segundos (note o +2 no terceiro parâmetro da função TimeSerial) para
que a função Open (linha 8) possa proceder com segurança na abertura da
porta COM escolhida (repare que na sintaxe desta função, referencia-se a porta COM aberta,
pelo termo #1, ou seja, sempre que for necessário executar algum procedimento que
envolva a porta em questão, deve-se identifica-la no código por meio da nomenclatura #1).
 
Sub Button1_Click()
com$ = UCase(Cells(9, 3))         
baud$ = UCase(Val(Cells(10, 3)))  
ReturnValue = Shell("mode.com " + com$ + " baud=" + baud$ + " parity=n data=8
stop=2 to=off xon=off dtr=off rts=off")
Application.Wait TimeSerial(Hour(Now()), Minute(Now()), Second(Now()) + 2)  
Open com$ For Binary Access Read Write As #1
End Sub
 
O mesmo procedimento de criação deve ser feito para a elaboração do botão responsável
por fechar a porta COM aberta.
 

Figura 7 - Botão utilizado para fechar a porta COM


 
No entanto, para realizar o fechamento da porta COM que está sendo utilizada, deve-se
apenas inserir a função Close (lembre-se que o #1 representa a porta COM que foi aberta
anteriormente) no código referente à ação que deve ser executada quando ocorrer um
clique neste botão.
Sub Button2_Click()
Close #1
End Sub
 
Botões de controle
 
Existem várias maneiras diferentes para elaborar os elementos gráficos responsáveis por
interagir com o Arduino UNO, porém neste artigo foram utilizados dois botões por saída
digital, sendo que um deles possui a função de fazer com que uma determinada saída fique
em nível alto (HIGH) enquanto o outro atua nesta mesma saída, no entanto, fazendo com
que a mesma permaneça em nível baixo (LOW).
 
Figura 8 - Botões de Controle
 
A criação dos botões de controle é feita da mesma maneira que os botões de manipulação
da porta COM, de modo que as diferenças entre eles aparecem apenas nos códigos. Para
que o Arduino UNO execute alguma ação proveniente dos botões de controle, ele deve ler a
instrução que chega através da porta serial e interpreta-la da maneira correta.
O código abaixo traz as ações que devem ser realizadas quando houver um clique
no Botão3 (responsável por colocar uma determinada saída digital em nível alto). Observe
que primeiramente deve ser colocado um caractere (neste caso a letra a) na porta
COM (referenciado por #1) e envia-lo através da função Put. Obviamente, como já
ressaltado, torna-se necessário que o código do Arduino UNO seja capaz de receber este
caractere e executar a função de colocar o pino em questão em nível alto. 
Em seguida, escreve-se a palavra HIGH na célula R24 (posteriormente será explicado o
porque deste procedimento) da planilha Embarcados (este é o nome da planilha que está
sendo utilizada).
Sub Button3_Click()
Put #1, , "a"
Sheets("Embarcados").Range("r24") = "HIGH"
End Sub
Considere que o Botão4 por exemplo, cumpra a tarefa de colocar a saída digital descrita
anteriormente em nível baixo, portanto, quando houver um clique no mesmo, será enviado
um caractere (neste caso, o caractere b) e em seguida escreve-se a palavra LOW na
célula R24 da planilha Embarcados.
Sub Button4_Click()
Put #1, , "b"
Sheets("Embarcados").Range("r24") = "LOW"
End Sub
 
 Código do Arduino UNO
 
Neste momento será abordado um exemplo para ilustrar o funcionamento do código que
deve ser inserido no Arduino UNO. Existem várias maneiras de implementar o modo pelo
qual o Arduino UNO irá interpretar a informação recebida, uma delas consiste em utilizar um
conjunto de sentenças Switch/Case para cada botão de controle. O exemplo dado a seguir
consiste em criar um código para os botões HIGH eLOW do pino de saída digital 2 citados
anteriormente.
O primeiro passo na criação do código consiste na declaração da variável do tipo char
(utilizada para armazenar a informação enviada pelo Microsoft Excel) chamada comando. 
Em seguida, dentro da função setup() inicia-se a comunicação serial por meio da
função Serial.begin() e além disso define-se o pino 2 para atuar como uma saída digital por
meio da função pinMode().
 
Na função loop() ocorre primeiramente a verificação da existência de algum tipo de
informação para leitura por meio da porta serial, de modo que, caso exista, esta é
armazenada na variável comando e posteriormente é analisada no conjunto de
sentenças switch/case, onde caso o valor contido na mesma seja o caractere a, o Arduino
UNO deve proceder colocando a saída digital existente no pino 2 em nível alto, ao passo
que, caso o caractere encontrado seja b, o Arduino UNO deverá colocar a saída citada
em nível baixo.
char comando;
void setup() {
Serial.begin(9600);
pinMode(2,OUTPUT);
}
void loop() {
if (Serial.available()>0)
{
comando = Serial.read();
switch (comando)
{
case 'a':
digitalWrite(2, HIGH);
break;
case 'b':
digitalWrite(2,LOW);
break;
}
}
}
 
 Estados dos pinos de saída digital
 
Para finalizar este conteúdo será apresentado para o leitor como foi elaborado o painel que
mostra o estado de cada saída digital existente no Arduino UNO.  
Neste momento é necessário lembrar que no passo anterior, ao clicar em um determinado
botão de controle, além do envio de caracteres, também ocorre a escrita de uma palavra
(HIGH ou LOW) em uma certa célula. Sendo assim, no exemplo apresentado escreveu-se
uma das duas palavras citadas (conforme o botão pressionado) na célula R24, no entanto,
qual é a função desta célula? Conforme a figura 8, a célula R24 é justamente aquela que
apresenta o estado da saída digital existente no pino 2, para o operador.
 
Figura 9 - Painel para apresentar os estados das saídas
 
Além disso para colorir as células que contêm o estado das saídas digitais, formulou-se
algumas regras para os elementos da coluna R, associando uma determinada cor ao
respectivo texto, neste caso, a cor verde está relacionada com a palavra HIGHenquanto a cor
vermelha está ligada à palavra LOW.
 

Fig
ura 10 - Criação de regras para mostrar os estados das saídas
 
A formulação de regras pode ser feita acessando o item  Formatação
condicional(Conditional Formatting) contido na aba Página Inicial (Home). Neste momento
deve-se selecionar a opção de criação de uma nova regra (New Rule) para então optar pelo
tipo de regra desejada (neste caso foi utilizada a regra formatar somente células que
contenham (Format only cells that contain)).
Em seguida deve-se especificar o texto (na primeira lista de seleção na parte referente à
edição da regra é necessário que o leitor selecione a opção Texto Específico (Specific Text))
que, caso esteja presente na célula, desencadeará mudança de cor da mesma (aqui foi
estabelecido que quando houver a palavra HIGH em uma determinada célula existente na
região citada (coluna R), a mesma deverá ser colorida com a cor verde). 
Repare que o procedimento para os casos em que as células estiverem escritas comLOW é
exatamente o mesmo.
 

Figura 11 - Criação de uma nova regra


 
Seguindo os passos demonstrados neste artigo será possível obter um resultado semelhante
ao da figura 11 (idêntica à figura 1).

 
Figura 11 - Resultado final.
Histórico de dados de acionamento do Arduino no Excel
utilizando VBA

Qual é o objetivo deste artigo?

 Sabe-se que uma das coisas mais importantes para qualquer tipo de controle de processos é
a realização do registro de uma série de dados essenciais e que podem ser utilizados para
auxiliar nas tomadas de decisão por parte das pessoas responsáveis pela eficiência de um
determinado processo.
Propõe-se neste artigo uma continuação do conteúdo pelo qual introduziu-se a utilização
do VBA com o Microsoft Excel para realizar o controle das saídas digitais de um  Arduino
UNO. Sendo assim, o objetivo do presente material consiste em compartilhar uma maneira
pela qual pode-se elaborar um registro histórico para os valores das saídas digitais citadas.
Depois de conferir o conteúdo deste artigo, o leitor poderá obter um resultado semelhante
ao apresentado na figura 1.
 

Figura 1 - Resultado final esperado.


 Formato do histórico de dados
 O primeiro passo para a criação de um histórico de dados (que consiste basicamente em
uma tabela) é a elaboração de um cabeçalho adequado para proporcionar uma organização
eficiente das informações.
Neste sentido, utilizou-se a estrutura apresentada na figura 2 para a organização dos dados:
 
Figura 2 - Histórico de dados.
Repare que em uma determinada linha insere-se a data, hora e o estado de todas as saídas
digitais, ao passo que, no próximo registro, as informações são inseridas na linha posterior.
Desta maneira, neste artigo, apresenta-se primeiramente o procedimento utilizado para
registrar as informações e em seguida será mostrado para o leitor como determinar quando
acontecerão estes registros.
Registro das informações no histórico
 Para registrar os estados das saídas em um determinado momento, basta copiar as
informações contidas no painel de estados (apresentado no artigo anterior) e inserir as
mesmas em uma determinada linha do histórico de dados. 
 

Figura 3 - Painel de estados.


 
Note que algumas informações são importantes para a realização do procedimento citado.
Primeiramente, o painel de estados esta contido em uma planilha chamada Embarcados,
enquanto o histórico de dados esta em uma planilha chamada Gráficos.
Suponha agora que o estado do pino 2 esteja localizado na célula R4 da
planilha Embarcados e o cabeçalho do histórico, localizado na planilha Gráficos, esteja
localizado na linha 3 e o campo DATA esteja localizado na coluna L, portanto, o estado
do pino 2 deve ser colocado na célula imediatamente abaixo do campo PINO 2(portanto, na
célula N4). O código em VBA responsável por este procedimento é o seguinte:
1 Sheets("Gráficos").Range("n4") = Sheets("Embarcados").Range("r4")
O mesmo procedimento pode deve ser feito para todas as outras saídas, no entanto repare
que as primeiras células de uma determinada linha do histórico contém a data e a hora. Isto
pode ser feito da seguinte maneira:
 1 Sheets("Gráficos").Range("l4") = Date()

2 Sheets("Gráficos").Range("m4") = Time()
Observe que a maneira descrita para a realização do preenchimento do históricopossui um
caráter manual, de modo que, para que o mesmo seja preenchido linha por linha
automaticamente, torna-se necessário a criação de um procedimento dinâmico. Para isso é
necessário criar uma variável que percorra as células adequadas inserindo os valores
correspondentes do painel de estados no histórico de dados. 
A variável citada será denominada RangeDinamico e pode ser criada da seguinte maneira:
 1 Dim RangeDinamico As Range

Para preencher a linha adequada do histórico, é necessário descobrir qual foi a última linha
preenchida para então completar a linha posterior, isto pode ser feito escolhendo uma
célula como ponto de partida, no caso a célula L3 (correspondente ao campo Data,
no cabeçalho), de modo que, a partir desta testa-se as células imediatamente abaixo para
verificar qual é a próxima célula não escrita (esta estará contida na linha a ser preenchida).
 
Set RangeDinamico = Sheets("Gráficos").Range("l3")
Do
If IsEmpty(RangeDinamico) = False Then
Set RangeDinamico = RangeDinamico.Offset(1, 0)
End If
Loop Until IsEmpty(RangeDinamico) = True

Em um primeiro momento associa-se a variável do tipo Range RangeDinamico à célula L3.


Posteriormente, nota-se que existe a função Do/Loop Until() que irá fazer com que o seu
conteúdo interno seja repetido até o momento em que uma determinada sentença seja
verdadeira (esta sentença é o retorno da função IsEmpty(), que verifica se o argumento da
mesma é uma célula vazia).  
Dentro da função Do/Loop Until() encontra-se uma função If que juntamente com a
função IsEmpty() verifica se a célula associada ao RangeDinamico está com algum conteúdo,
caso esteja, a variável RangeDinamico apontará a célula imediatamente abaixo da qual
estava relacionada anteriormente. Isto é feito através da função Offset(), onde o primeiro
parâmetro da mesma corresponde ao deslocamento em linha e o segundo em coluna. Este
deslocamento irá sendo feito até o momento em que a próxima célula vazia contida na
coluna das datas (onde está o campo Data), for encontrada.
Neste momento, escreve-se os respectivos nas células da linha encontrada, desde a célula
que irá conter a data até a célula que conterá o último pino de saída digital. Note no código
abaixo que parte-se da célula apontada por RangeDinamico e desloca-se para a direita
tendo a mesma como referência.
RangeDinamico = Date
RangeDinamico.Offset(0, 1) = Time()
RangeDinamico.Offset(0, 2) = Sheets("Embarcados").Range("r26")
RangeDinamico.Offset(0, 3) = Sheets("Embarcados").Range("r24")
RangeDinamico.Offset(0, 4) = Sheets("Embarcados").Range("r22")
RangeDinamico.Offset(0, 5) = Sheets("Embarcados").Range("r20")
RangeDinamico.Offset(0, 6) = Sheets("Embarcados").Range("r18")
RangeDinamico.Offset(0, 7) = Sheets("Embarcados").Range("r16")
RangeDinamico.Offset(0, 8) = Sheets("Embarcados").Range("r14")
RangeDinamico.Offset(0, 9) = Sheets("Embarcados").Range("r12")
RangeDinamico.Offset(0, 10) = Sheets("Embarcados").Range("r10")
RangeDinamico.Offset(0, 11) = Sheets("Embarcados").Range("r8")
RangeDinamico.Offset(0, 12) = Sheets("Embarcados").Range("r6")
RangeDinamico.Offset(0, 13) = Sheets("Embarcados").Range("r4")

 Momento de realização dos registros no histórico


Por ultimo é necessário definir o momento em que o histórico de dados deve ser atualizado.
Neste artigo optou-se por atualizar o mesmo sempre que um dos botões de controle
(apresentados no artigo anterior) for acionado, ocasionando portanto, uma mudança de
estado em alguma das saídas.  
Lembre-se que quando um botão de controle é acionado, além de escrever no painel de
estados o novo estado de uma determinada saída, era enviado um caractere pela porta
serial para o Arduino UNO. O código abaixo refere-se ao botão responsável por levar fazer
com que a saída digital do pino 2 fique em nível alto (para ver o código que já está associado
ao botão basta clicar com o botão direito sobre o mesmo, selecionar a opção atribuir macro
e escolher a opção editar).
Sub Button3_Click()
Put #1, , "a"
Sheets("Embarcados").Range("r24") = "HIGH"
End Sub

Para que as novas funcionalidades deste botão sejam implementadas, deve-se alterar a
programação do mesmo utilizando as porções de códigos descritas anteriormente, além
disso, uma pequena modificação deve ser realizada para o caso onde a saída esteja em um
determinado estado e o botão que leva a mesma para este mesmo estado seja apertado.
Neste caso, ignora-se o acionamento do botão, já que não houve alteração de estado,
portanto, não há motivo para atualizar o histórico (segundo o critério de atualização
utilizado). 
Desta maneira o código do botão HIGH da saída do pino 2 deve ser alterado primeiramente
conforme apresentado abaixo. Note que a alteração do estado do botão somente ocorrerá
quando o estado desejado for diferente do estado atual.
Sub Button3_Click()
If (Range("24") = "LOW") Then
Put #1, , "a"
Range("r24") = "HIGH"
End If  

Finalmente, para inserir os dados no histórico a partir do clique deste botão de controle,
basta completar a programação do mesmo com as porções de código mostradas
anteriormente.
 Sub Button3_Click()
 Dim RangeDinamico As Range
 Put #1, , "a"  
 If (Range("r24") = "LOW") Then
 Range("r24") = "HIGH" 'Escreve no painem de estados
 Set RangeDinamico = Sheets("Gráficos").Range("l3")
 Do
 If IsEmpty(RangeDinamico) = False Then
 Set RangeDinamico = RangeDinamico.Offset(1, 0)
 End If
 Loop Until IsEmpty(RangeDinamico) = True
 RangeDinamico = Date
 RangeDinamico.Offset(0, 1) = Time()
 RangeDinamico.Offset(0, 2) = Sheets("Embarcados").Range("r26")
 RangeDinamico.Offset(0, 3) = Sheets("Embarcados").Range("r24")
 RangeDinamico.Offset(0, 4) = Sheets("Embarcados").Range("r22")
 RangeDinamico.Offset(0, 5) = Sheets("Embarcados").Range("r20")
RangeDinamico.Offset(0, 6) = Sheets("Embarcados").Range("r18")
RangeDinamico.Offset(0, 7) = Sheets("Embarcados").Range("r16")
 RangeDinamico.Offset(0, 8) = Sheets("Embarcados").Range("r14")
 RangeDinamico.Offset(0, 9) = Sheets("Embarcados").Range("r12")
 RangeDinamico.Offset(0, 10) = Sheets("Embarcados").Range("r10")
 RangeDinamico.Offset(0, 11) = Sheets("Embarcados").Range("r8")
 RangeDinamico.Offset(0, 12) = Sheets("Embarcados").Range("r6")
 RangeDinamico.Offset(0, 13) = Sheets("Embarcados").Range("r4")
    
 End If
Note que este procedimento deve ser realizado para todos os outros botões de controle (no
caso de o leitor utilizar a alteração de um estado qualquer como parâmetro para a
atualização do histórico).

Atualizando o histórico de dados

Como dito anteriormente, as informações do histórico são atualizadas sempre houver


alteração no estado de uma das saídas, no entanto, percebe-se que, caso estas não sofram
nenhum tipo de alteração, o histórico ficará defasado no tempo, bem como os dados dos
gráficos, portanto, uma maneira de resolver este impasse, consiste em criar um botão que
apenas adiciona uma linha contendo os estados atuais das saídas no histórico (da mesma
forma realizada anteriormente).

Figura 4 - Manipulação do histórico.

Apagando o histórico de dados

Para encerrar este conteúdo, note que na figura anterior também existe um botão para
limpar o histórico. Além de cumprir esta função, o botão em questão ainda realiza o registro
da primeira linha com os estados atuais para que o histórico possua um ponto de partida. 
Este procedimento pode ser realizado criando-se o botão (como já apresentado) e inserindo
no mesmo o seguinte código em VBA.
Sub botao_apagar()
Dim tabela As Range
Set tabela = Range("l3").CurrentRegion
tabela.Offset(1, 0).Resize(tabela.Rows.Count - 1, tabela.Columns.Count).Select
Selection.ClearContents
PreencherHist
End Sub

Este código começa com a declaração da variável tabela e em seguida esta é associada a
célula L3 (esta é a célula onde está localizado o campo Data no histórico). Posteriormente,
na próxima linha de códigos seleciona-se a célula imediatamente abaixo do campo Data e a
partir da mesma seleciona-se os demais dados da tabela (deixando somente o cabeçalho
fora da seleção) e por fim, a função Selection.ClearContents() é a responsável por apagar
toda a região selecionada. Observe que após estes procedimentos, chama-se a função para
preenchimento da primeira linha do histórico (a função PreencherHist equivale ao código
utilizado anteriormente para preencher uma linha do mesmo). 
Seguindo os passos demonstrados neste artigo será possível obter um resultado semelhante
ao da figura 5 (idêntica à figura 1). 
 

Figura 5
- Resultado da aplicação proposta.
Criação de gráficos para o histórico de dados do Arduino no Excel utilizando VBA
Qual é o objetivo deste artigo?
No artigo anterior foi possível apresentar para o leitor uma ideia de como elaborar
um histórico de dados cujo objetivo consiste em armazenar os estados de todas as saídas
digitais do Arduino UNO em um determinado instante. 
Neste material, será dada uma espécie de continuação do conteúdo anterior, onde será
abordada uma maneira de representar os estados de uma determinada saída ao longo do
tempo por meio de um gráfico, que por sua vez, apresentará a variação da mesma entre os
níveis alto e baixo.   
Após a leitura deste o conteúdo e do anterior, o leitor poderá obter um resultado
semelhante ao apresentado na figura 1.
 

Figura 1 - Resultado esperado.


Manipulando os dados para plotar
 O primeiro passo para plotar um gráfico consiste em tratar os dados que serão utilizados de
modo que seja possível representá-los graficamente, portanto, deve-se realizar algumas
alterações nas informações existentes para que o Microsoft Excelentenda o que fazer com as
mesmas. 
Desta maneira, a alteração citada consiste em converter os estados das saídas que estão
representados por HIGH e LOW nos números 1 e 0 respectivamente. Um dos caminhos para
realizar este procedimento é criar uma coluna auxiliar e preenche-la de maneira idêntica à
realizada no painel de estados (caso o leitor tenha dúvida nesta parte, consulte o
nosso primeiro artigo), inclusive no mesmo momento, porém com zeros e uns.
 

Figura 2 - Painel de estados e coluna auxiliar.


Em seguida, deve-se criar um histórico de dados auxiliar (na planilha Gráficos), da mesma
maneira que o histórico apresentado no artigo anterior, no entanto, este será utilizado
somente para a criação dos gráficos.
Fi
gura 3 - Histórico de dados auxiliar.
 
Antes de partir para o objetivo proposto, deve-se compreender como realizar a criação de
um gráfico. Imagine que deseja-se plotar um gráfico contendo o comportamento do pino 2
nos dois momentos diferentes apresentados figura 3.
Uma das maneiras de realizar este procedimento consiste em selecionar na
guia Inserir (Insert), a opção de Gráfico de dispersão (Scatter Chart).
 

Figura 4 -
Criação de gráfico de dispersão.
 
Em seguida, deve-se clicar sobre o gráfico e definir um nome para o mesmo conforme a
figura 5.
 

Figura 5 - Definição
do nome para o gráfico.
 
Para selecionar os dados basta clicar com o botão direito sobre o gráfico e em seguida na
opção selecionar data (select data). Neste momento será aberta uma janela onde o usuário
deve especificar onde estarão os dados para compor o gráfico desejado. 
A especificação dos mesmos deve ser feita da seguinte forma: Primeiramente seleciona-se a
coluna cujo cabeçalho contém o campo Hora, digita-se ";" e em seguida seleciona-se a
coluna cujo cabeçalho contém o elemento PINO 2.
 

F
igura 6 - Seleção dos dados.
 
 O resultado desta seleção está apresentado na figura 7

Figura 7 - Plotando pontos no gráfico.


 
Note que em um primeiro momento, este gráfico mostra apenas os valores dos estados nos
seus respectivos instantes. Observe o que acontece quando os dois pontos são ligados por
uma linha (para fazer isto basta clicar com o botão direito sobre os dados e escolher a cor
desejada de linha).
 
Figura 8 - Inserção de uma linha entre os pontos plotados.
 
Na figura 8 pode-se perceber que esta não é a melhor maneira de representar o estado de
uma saída digital, pois entende-se a partir do mesmo, que a saída em questão apresenta
valores diferentes de 0 e 1 ao longo do tempo. 
Observe na figura 6 que em um primeiro momento o estado da saída digital do pino 2 é 0,
no entanto, em um segundo momento, a mesma saída apresenta nível lógico alto.Por este
motivo, o gráfico é plotado como uma linha inclinada ascendente (neste caso).
Para corrigir este impasse deve-se preencher o histórico de dados auxiliar de uma maneira
diferente da utilizada para preencher o histórico de dados original. O método utilizado para
preencher o histórico de dados auxiliar consiste em preencher duas linhas para uma única
atualização, conforme apresentado na figura abaixo
 

Figura 9 - Histórico auxiliar com a linha extra


 
Por meio deste procedimento considera-se que a saída digital do pino 2 assume os 2 valores
possíveis no momento da transição, fazendo com que seja plotada uma linha
horizontal entre os pontos que representam o estado da saída no primeiro momento e no
momento da transição (ou seja, mantem-se o primeiro estado até o momento exato da
ocorrência do segundo), onde então será plotada uma linha vertical para cima, mostrando
que o nível lógico alto foi atingido.
 
Figura 10 - Gráfico demonstrando exatamente os níveis lógicos
 
Observe que para gerar este gráfico, assim como o anterior, foi necessário selecionar
manualmente os dados a serem utilizados (já que uma nova linha foi incluída entre as que
continham os dados desejados). Logo, deve-se desenvolver uma maneira para que
o Microsoft Excel consiga selecionar os dados corretamente e de maneira automática, isto é,
independente do tamanho da tabela existente no histórico auxiliar.
Para fazer com que o Microsoft Excel trabalhe da maneira citada anteriormente, deve-se
criar intervalos dinâmicos, os quais serão inseridos no gráfico, automatizando o processo de
elaboração do conteúdo informativo visual. 
Seguindo a linha do exemplo que está sendo tratado, primeiramente, elabora-se o intervalo
dinâmico para a coluna onde está inserido o campo Hora. Para realizar este procedimento
deve-se acessar a aba fórmulas e selecionar a opção definir nome(Define Name).
 

Figura 11 - Criação dos intervalos dinâmicos


 
Ao clicar no item citado, será aberta uma janela onde o leitor deve inserir um nomepara
o respectivo intervalo dinâmico e também a fórmula que será utilizada para defini-lo. Na
figura abaixo vale a pena ressaltar que os itens demarcados em vermelho consistem
no nome da planilha em que está a tabela que contém os dados para a criação
dos intervalos dinâmicos. Já os itens demarcados em verde constituem o ponto de partida
do intervalo dinâmico (repare que neste caso, este ponto de partida é a primeira
informação numérica de tempo, ou seja, é a célula abaixo do campo Hora) e os itens
demarcados em azul selecionam a coluna inteira, para que as demais funções encontrem o
último elemento escrito desta coluna automaticamente.
 

Figura 12 - Definição dos intervalos dinâmicos


 
 Para facilitar, aqui está a linha de código para aqueles que quiserem copiar e modificar:
 1 =OFFSET(Gráficos!$AB$2;0;0;COUNTA(Gráficos!$AB:$AB)-1;1)
Em seguida, deve-se realizar o mesmo procedimento para a criação do intervalo dinâmico
referente ao estado da saída digital do pino 2. 
Para finalizar este artigo basta fazer com que o gráfico possa ser criado através do clique de
um botão. O primeiro passo para a criação desse mecanismo consiste em gravar
uma macro cujo principio de funcionamento corresponde à modificação dos dados utilizados
para plotar as informações. 
Observe atentamente o que acontece quando seleciona-se os dados plotados no gráfico da
figura 13. Perceba que a região demarcada contém a série de dadosutilizada para elaborar a
imagem plotada no gráfico, a ideia é elaborar uma macro para modificar esta série.
 
Figura 13 - Série de
dados
 
Para gravar uma Macro basta clicar no ícone localizado na região inferior da tela do
Microsoft Excel:
 

Figura 14 - Gravar macro


 
A macro consiste na gravação de uma sequência de atos efetuados pelo usuário, de forma
que, após a finalização da gravação, torna-se possível reproduzir estes mesmos
procedimentos, porém, de maneira automática. Após clicar no ícone apresentado na figura
anterior, basta preencher as informações (opcionais, exceto o nome) e começar a gravação
pressionando o botão OK.
 

Figura 15 - Começando a gravação da macro.


Neste momento, tudo que for realizado pelo usuário será gravado pelo Microsoft Excel,
portanto, o usuário vai realizar as seguintes ações:
 Clicar no Gráfico;
 Clicar nos dados contidos no mesmo;
 Alterar a série da seguinte maneira:

Figura 16 - Alterar série de dados


 
Após a realização destes procedimentos, deve-se clicar no mesmo botão acionado para
iniciar a gravação e então finaliza-la.
 

Figura 17 - Parando a gravação da macro


 
Por fim, deve-se criar um botão e associar a macro recém-criada ao mesmo (caso o leitor
tenha dúvida em como realizar este procedimento, favor consultar o primeiro artigo desta
série). A intenção desta associação consiste em fazer com que o gráficoapresente o
comportamento da saída digital do pino 2 sempre que o botão em questão for acionado.
 
O código em VBA do botão citado deve ser semelhante a este:
 1 Sub botão_pino2()

3     ActiveSheet.ChartObjects("GrafEmbarcados").Activate
4     ActiveChart.FullSeriesCollection(1).Select
5     Selection.Formula = "=SERIES(Gráficos!R1C29,emb.xlsm!Hora,emb.xlsm!PINO2,1)"

7 End Sub
 
O resultado obtido é exatamente o demonstrado na figura 18:
 
Figura 18 - Gráfico
Para apresentar o comportamento de todos os pinos individualmente, deve-se repetir o
procedimento apresentado, criando macros, botões e associando os mesmos de acordo com
o número de saídas que o leitor desejar.
 

Figura 19 - Painel de escolha do gráfico desejado


 
Como dito anteriormente, as informações do histórico são atualizadas sempre houver
alteração no estado de uma das saídas, no entanto, percebe-se que, caso estas não sofram
nenhum tipo de alteração, o histórico ficará defasado no tempo, bem como os dados
dos gráficos. Portanto, uma maneira de resolver este impasse, consiste em criar um botão
que adiciona apenas uma linha contendo os estados atuais das saídas tanto no histórico de
dados original quando no auxiliar.
 
Para encerrar este conteúdo, note que na figura anterior também existe um botão para
limpar os dois históricos (original e auxiliar). Além de cumprir esta função, o botão em
questão ainda realiza o registro da primeira linha com os estados atuais para que
os históricos possuam um ponto de partida.
 
Este procedimento pode ser realizado criando-se o botão (como já apresentado) e inserindo
no mesmo o seguinte código em VBA.
 
1   Sub botao_apagar()
2  
3   Dim tabela1 As Range
4   
5   Set tabela1 = Range("AA1").CurrentRegion
6   tabela1.Offset(1, 0).Resize(tabela1.Rows.Count - 1, tabela1.Columns.Count).Select
7   Selection.ClearContents
8   PreencherHistAux
9   
10   Set tabela1 = Range("l1").CurrentRegion
11   tabela1.Offset(1, 0).Resize(tabela1.Rows.Count - 1, tabela1.Columns.Count).Select
12   Selection.ClearContents
13   PreencherHistOrig
14  
15 End Sub
 
Este código começa com a declaração da variável tabela1 e em seguida esta é associada a
célula AA1 (esta é a célula onde está localizado o campo Data no histórico auxiliar).
Posteriormente, na próxima linha de códigos seleciona-se a célula imediatamente abaixo do
campo Data e a partir da mesma seleciona-se os demais dados da tabela (deixando somente
o cabeçalho fora da seleção) e por fim, a função Selection.ClearContents() é a responsável
por apagar toda a região selecionada. Observe que após estes procedimentos, chama-se a
função para preenchimento do histórico auxiliar.
 
A mesma coisa deve ser realizada para o histórico de dados original, no entanto, após a
exclusão dos dados já inseridos, chama-se a função adequada para a escrita da primeira
linha do mesmo.
 
Acionando as saídas do Arduino com PWM utilizando VBA no
excel
Qual é o objetivo deste artigo?
Sabe-se que um dispositivo como o Arduino UNO possui uma série de saídas digitais, as
quais por meio de seus acionamentos podem ligar ou desligar elementos que estiverem
conectados nas mesmas. Desta maneira, pode-se utilizar uma das saídas em questão para,
por exemplo, controlar o estado de um LED, ligando ou desligando o mesmo. 
 
No entanto, em algumas aplicações necessita-se mais do que este dois estados (ligado e
desligado) no controle dos dispositivos, como é o caso do controle do brilho de um LED ou a
alteração da velocidade de um motor elétrico. Para lidar com esta situação utiliza-se
uma técnica chamada PWM ou Pulse Width Modulation, que consiste na aplicação de um
sinal digital pulsante para manipular as características citadas. 
Sendo assim, este artigo tem como objetivo complementar os materiais
produzidos anteriormente referentes à utilização do Microsoft Excel para a realização do
acionamento das saídas do Arduino UNO, no entanto, desta vez, será apresentado como
utilizar o PWM nas saídas digitais através do mesmo. 
Ao final deste artigo espera-se que o leitor seja capaz de desenvolver uma aplicação
semelhante à apresentada na figura abaixo.
 
Figura
1 - Planilha de acionamento utilizando PWM
Manipulação da porta COM
Primeiramente, deve-se ter em mente que este artigo faz parte de uma série de conteúdos
que abordam o mesmo assunto (a utilização do VBA para implementar aplicações
envolvendo o Arduino UNO), portanto, alguns procedimentos que foram realizados
previamente serão omitidos neste momento.
Esta observação é necessária, pois, neste artigo, assim como no primeiro desta série,
ocorre o envio de informações através da porta COM, portanto, deve-se ressaltar que,
para a utilização correta do conteúdo presente aqui, deve-se proceder da mesma forma
demonstrada anteriormente para a manipulação da porta COM.
Envio dos dados de acionamento para o Arduino UNO
O procedimento de envio das informações adequadas para o acionamento de uma
determinada saída digital utilizando PWM é semelhante ao utilizado no primeiro artigo desta
série para o estabelecimento dos níveis lógicos alto e baixo. No entanto, neste caso é
necessário que mais parâmetros sejam passados do Microsoft Excel para o Arduino UNO,
pois, além de identificar a saída, deve-se também identificar o valor que será utilizado como
parâmetro para o PWM.

 
Figura 2 - Painel de acionamento do PWM
Os dados que serão enviados pela comunicação serial possuem o seguinte formato:
 

Figura 3 -
String passada do Microsoft Excel para o Arduino UNO
O código abaixo descreve justamente o funcionamento do botão responsável por fazer com
que a saída digital do pino 11 seja acionada utilizando o PWM. 
 1 Dim pwm As String


3 pwm = Range("L12")
4 pwm = "p" & "1" & pwm
5 Range("C10") = Range ("L12")

7 Put #1, , pwm
Primeiramente, declara-se a variável pwm como uma variável do tipo String. Em seguida,
esta é preenchida com o valor contido na célula L12 (célula onde o usuário deve inserir o
valor desejado para ser utilizado como parâmetro na função analogWrite()). 
Na terceira linha deste código realiza-se a concatenação dos caracteres p e 1 (aqui existente
na condição de caractere) com string contida na variável pwm, para que a mensagem a ser
enviada esteja com o formato descrito na figura 3.
Por fim, registra-se o valor encontrado na célula L12 na célula C10 (contida no painel de
estados (apresentado na figura 4), para conter o valor atual do pwm que está sendo
utilizado) e envia-se através da o conjunto de caracteres pela porta serial.
 
Figura 4 - Painel de estados
Desenvolvimento do código do Arduino UNO
No código do Arduino UNO deve-se primeiramente declarar 3 variáveis que serão utilizadas
para realizar o acionamento proposto. Uma destas deve ser do
tipo char(denominada comando), para conter os caracteres recebidos através da
porta COMpela função Serial.read(). Por outro lado, deve-se ter uma variável do
tipo String (denominada pwm) que será preenchida com os caracteres da
variável comandoe uma variável do tipo int, chamada valor, utilizada no acionamento da
saída digital existente no pino 11 por meio da função analogWrite(). 
1 char comando;
2 String pwm;
3 int valor;  
 
Posteriormente, na função setup(), inicializa-se a interface de comunicação através da porta
serial e além disso declara-se os pinos que serão utilizados como saídas (como o exemplo
será dado utilizando apenas o pino 11, somente este está sendo declarado).
 1 void setup()

2{
3     Serial.begin(9600);
4     pinMode(11,OUTPUT);
5}
 O procedimento realizado pelo código inserido dentro da função loop() é análogo ao
realizado no primeiro artigo desta série, onde, primeiramente, verifica-se a existência de
algum byte no buffer da porta serial para ser lido e, caso exista, a variável comando recebe o
caractere em questão.
 
Se o conteúdo da variável comando for a letra p, o Arduino UNO deve entender que
o Microsoft Excel requisitou um pedido de acionamento de uma saída digital
utilizando PWM. Em seguida, limpa-se a variável do tipo string pwm e lê-se o
próximo byte do conjunto de dados que foi enviado (note que esta segunda leitura identifica
qual porta deve ser acionada neste caso, a saída presente no pino 11).
 
Posteriormente utiliza-se um laço for para ler os próximos 3 bytes, ou seja, 3 caracteres
existentes no buffer da porta COM, de modo que, a cada leitura, adiciona-se estes
caracteres à variável do tipo string pwm. Por fim, após a execução total do laço, utiliza-se a
função toInt() para transformar o conteúdo da variável pwm em um número inteiro e este é
armazenado na variável valor, que por sua vez é utilizada para o acionamento da porta
correspondente por meio da função analogWrite().
 

void loop() {
if (Serial.available()>0)
 {
    comando = Serial.read();
    switch (comando)
        {
           case 'p':
                delay(50);
                pwm = "";
                comando = Serial.read();
                switch (comando)
                     {
                          case '1':
                          for ( int i = 0; i < 3; i++)
                             {
                                 comando = Serial.read();
                                 pwm += comando;
                             }
                          valor = pwm.toInt();
                          analogWrite(11,valor);
                          break;
                   }
         }
   }
}
 
No meio do código é possível encontrar a função delay() sendo utilizada, pois comprovou-se
experimentalmente que, caso esta não estivesse presente, o Arduino UNO não conseguiria
realizar as leituras dos dados recebidos através da porta COMcorretamente. 
Esperamos que você tenha gostado deste conteúdo, sinta-se à vontade para nos
dar sugestões, críticas ou elogios.

Você também pode gostar