- 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.
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).
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).
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.
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).
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.
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).
1 2 3 4 5 6 7 8 9 10 |
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.
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.
1 2 3 4 5 6 |
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).
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).
1 2 3 4 5 6 |
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.
1 2 3 4 |
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 e LOW 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.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
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.
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 HIGH enquanto a cor vermelha está ligada à palavra LOW.
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 com LOW é exatamente o mesmo.
Seguindo os passos demonstrados neste artigo será possível obter um resultado semelhante ao da figura 11 (idêntica à figura 1).
Esperamos que você tenha gostado deste conteúdo, sinta-se à vontade para nos dar sugestões, críticas ou elogios.
Boa noite. Gostei muito do artigo. Muito útil. Um problema que eu tenho é que ao mudar o cabo de porta USB, a porta COM também muda. Como posso fazer para testar isso? Ver se a porta existe? Evitando um erro de execução.
Daniel, Parabéns!
Muito legal seu artigo, funcionou perfeitamente e me ajudou bastante. Se possível gostaria de saber como adicionar o código das saídas dos demais pinos (3, 4 ,5, 6, 7, 8, 9, 10, 11, 12 e 13).
Abraços!
Boa tarde Daniel,
Gostei muito desta aplicação.
Gostaria de enviar dados Hexadecimais que estão em células do excel, ou mesmo decimais, porém não no formato ASCII com indicado na sua aplicação “a” , “b”, Seria possível? Como definir um grupo de células e enviá-las serialmente?
Abraços
Bom dia… alguém tem algum esquema para fazer essa integração VBA para MS Access ? Obrigado.
Daniel,
Sou iniciante em arduino, fiz o procedimento e ao carregar os comandos no arduino fica com Led L (2) aceso e não responde ao comando. O que poderia ser?
O erro aprece nesta linha
Sheets(“Embarcados”).Range(“r24”) = “HIGH”
Como posso resolver isto?
Você poderia enviar os arquivos fonte?
Cara, o meu tava dando o mesmo problema, pesquisei sobre o “Sheets” e é o nome planilha que vc estará referenciando, por default ela fica como “Plan1” e “Range” é a célula da planilha que vc quer que apareça o valor HIGH e LOW. Renomeie o nome da planilha para “Embarcados” , assim como está especificado na linha “Sheets(“Embarcados”).Range(“r24”) = “HIGH””, sem aspas, q vai funcionar.
referência https://msdn.microsoft.com/pt-br/vba/excel-vba/articles/sheets-object-excel
Ola Daniel. O seu trabalho é muito interessante Consegui fazer o programa rodar e fazer Todos os procedimentos ate obter um gráfico dos dados e controle PWM. Porem analisando os procedimentos percebi que na realidade não estou recebendo dados do Arduino e sim enviando comandos ao Arduino. Porem; observe que é possível fazer com que o LED acenda ou apague via Excel mas não a um retorno real do Arduino dizendo que o LED esta aceso pois o restante do código é gerado pelo próprio Excel. Se fosse gerado pelo Arduino uma programação básica como “Blink” poderia gerar o mesmo… Leia mais »
Daniel,
Você poderia enviar os arquivos fonte?
Sou iniciante em arduino, fiz o procedimento e ao carregar os comandos no arduino fica com Led L (13) aceso e não responde ao comando. O que poderia ser?
Juarez, creio que este led aceso não tenha nada a ver com o procedimento descrito. Você conseguiu resolver este problema??
Quero controlar uma placa de relés USB, posso usar as mesmas funções escrevendo 1 ou 0 nas saídas ao invés de high e low ?
case ‘a’:
digitalWrite(2, 1);
break;
case ‘b’:
digitalWrite(2,0);
break;
Willyam, não sei dizer se o Arduino aceita esta nomenclatura, no entanto, você mesmo pode tentar e depois avisar a gente se deu certo, tudo bem?
Sim ! Você pode sim. Alem de utilizar 1,0 e HIGH e LOW você ainda pode inclusive usar “true” ou “false”. Todos são “comandos” que referem a ligado e desligado (true nada mais é do que “1”).Concluindo, sim, você pode, não se esqueça que também pode utilizar variáveis para controle destas saídas.
Olá Daniel, tudo bem?
Não tenho nenhum conhecimento no Visual Basic, assim estou utilizando a sua programação e copiando para o o visual, mas na hora de executar a primeira sub, na qual habilita a porta serial ocorre um erro “Erro de acesso a caminho/arquivo” no caso é o “Erro 75”, tu saberia me explicar o porque disso estar acontecendo?
Você verificou se o arduino está na mesma porta que vc escreveu no excel? Meu arduino estava na com4 e eu tinha colocado COM3 .. deu erro tbm..
Amigo, como podemos ler dados diretamente do Arduino através do Excel? Você poderia montar um exemplo de um supervisório, com leitura de dados digitais, analógicos e acionamento de saídas? Agradeço a atenção! Parabéns pelo POST!
Fala Leo, tranquilo?
Então, meu amigo, isso está nos nossos planos. Por enquanto temos ainda alguns artigos para publicar referentes a esta parte de acionamento e logo em seguida iremos produzir conteúdo sobre aquisição de dados.
Olá Daniel, muito interessante essa integração do Arduíno com o VBA. Com relação ao VBA receber dados do Arduíno, voces já tem algum material? Obrigado