Expansão de portas de um Raspberry Pi usando serial e Arduino – Parte 1

Este post faz parte da série Expansão de portas de um Raspberry Pi usando serial e Arduino. Leia também os outros posts da série:

A proposta desse artigo é concluir com vocês o desafio de expandir as portas de um Raspberry Pi o que nos permitirá além de ter acesso a mais portas e outras funcionalidades, ter um nível a mais de proteção do equipamento, com os princípios que vamos aprender e com o projeto final é possível desenvolver projetos de automação para diversa aplicações, com por exemplo desenvolver jogos arcade no qual o personagem se move com o movimento de um joystick, uma estação meteorológica caseira, um sistema de painéis solares que seguem o sol.

Por isso, o desafio é criar um dashboard que através de Componentes do tipo Control permitirão as seguintes interações com portas através da serial:

  • Acender e apagar 3 leds;
  • Controlar a intensidade da luz dos 3 leds;
  • Identificar se as entradas estão sendo usadas;
  • Mostrar qual os movimentos que estou fazendo no joystick;
  • Fazer medição de temperatura.

Mas claro isso não limita a essas utilizações, esses componentes podem ser alterados para quais se aplicarem melhor a seus materiais ou projetos.

E tudo isso seguindo a seguinte interface:

Design da interface para o desafio

Então vamos começar!

Começando do Início

Para alcançar nosso desafio precisamos ir por partes e a primeira é expandir as portas do Raspberry para usar as do Arduino também, assim podemos aumentar as possibilidades e proteger o Raspberry, que não possui nenhuma proteção em seus pinos,como mencionado anteriormente.

Isso será possível porque vamos usar comunicação serial nativa do sistema operacional possibilitando assim se conectar ao Arduino e fazer o uso de suas portas digitais, analógicas e PWM no RPI.

Com TotalCross no momento temos duas formas de fazer isso, com execução de aplicações externas através do uso do terminal do linux arm, ou com comunicação serial nativa, para essas opções respectivamente vamos utilizar as classes Runtime.exec e PortConnector.

A utilização de aplicações externa, além de servir para o que será abordado nesse artigo permite executar qualquer aplicação a mais que for preciso para seus projetos.

Caso esse seja seu primeiro contato com a plataforma sugiro seguir o nosso Get Started e o guia para uso do RPI, Understanding TotalCross for Linux ARM.

Materiais

  • 1 Raspberry pi 3.
  • 1 Arduino UNO.
  • 2 LEDs.
  • 2 resistor entre 1K e 2.2K Ohms.
  • 1 Push-button.
  • 1 potenciômetro entre 1K e 50K Ohms.
  • 1 Protoboard.
  • jumpers.

Arduino

No Arduino será construído um protocolo simples de comunicação para receber, tratar a comunicação que for recebida do Raspberry, fazer o que foi pedido e passar Feedback.

Definindo formato da mensagem

Toda mensagem que for recebida deve ter:

  • Indicação da função que deve ser chamada.
  • A porta que deve ser usada.
  • Separador, caso tenha necessidade.
  • Valor que deve ser passado para porta , caso seja necessário.
  • Indicação de fim da mensagem.

A escolha os caracteres que serão usados para essas funções foram escolhidos arbitrariamente por mim, podem ser alterados conforme a necessidade.

Segue abaixo uma tabela com a lista de caracteres, qual sua respectiva função, exemplo e Descrição do exemplo.

CharactersFunçãoExemploDescrição do exemplo
*Finaliza a instrução--
,Separador--
#Set Mode#8,0*PIN 8 INPUT MODE
<SET VALUE DIGITAL<1,0*SET PIN 1 LOW
>GET VALUE DIGITAL>13*GET VALUE PIN 13
+SET VALUE PWM+6,250*SET PIN 6 VALUE 250. 0
-GET VALUE ANALÓGICO-14*GET VALUE PIN A0.

Código

O código a seguir implementa o protocolo de comunicação especificado no item anterior, deve ser enviado para o Arduino para que possa interpretar e realizar os comandos desejado.

Montando eletrônica

Para testar a comunicação e se as entradas e saídas do Arduino estão respondendo de acordo com o esperado.

  • LEDs serão ligados com lógica positiva, vão estar conectados ao pino GND através de um resistor e serão acionados pela porta digital I/O 2 e PWM 3.
  • Botão está com resistor de pull down, que enviará sinal 0 caso não pressionado e 1 caso pressionado, conectado a porta digital I/O 4.
  • Potenciômetro conectado com o pino central na entrada analogia A0 com um dos pinos laterais no positivo e o outro no negativo.

Testando comunicação

Envie o código para o Arduino e abra o monitor serial.

Em seguida envie os comandos:

  • #2,1*<2,1*>2*
  • #3,1*+3,10*
  • #4,0*>4*
  • #14,0*-14*

Deve ter como resultado no monitor serial:

Resposta do Arduino

E no equipamento um led ligado como iluminação máxima e outro com emissão mais fraca:

Resultado

Se apertar o botão e mudar a posição do potenciômetro ao enviar os comandos de leitura para eles, verá que os valores estarão diferente por exemplo gire o potenciômetro para o lado do positivo e aperte o botão, ainda com o botão pressionado envie os comandos:

  • 4*
  • -14*

Deve aparecer duas linhas como as a seguir:

Raspberry Pi

Usando o Raspberry Pi é possível acessar o serial através do terminal usando cat para ler as entradas e o echo para enviar os comandos.

Testando serial

Conecte o Arduino a uma das portas USB do Raspberry pi, abra o terminal e execute o comando a seguir.

  • cat /dev/ttyUSB0 9600

Isso iniciará a conexão com o Arduino e exibirá o que for retornado para o serial.

Para testar o envio de comandos, é preciso abrir um novo terminal mantendo o anterior aberto, e enviar o comando da seguinte forma.

  • echo “comando” > /dev/ttyUSB0 9600

Pode-se enviar os mesmos comandos apresentados na seção 2.4.

O feedback deve aparecer no primeiro terminal como abaixo além de ter o mesmo resultado da imagem da seção 2.4, “Resultado” .

Interface Gráfica

A interface gráfica para esse projeto será bem simples, pois o objetivo é mostrar a expansão das portas com o uso das portas seriais, em um artigo futuro será mostrado como criar uma interface gráfica de alta qualidade para esse projeto com totalcross.

Para esta primeira etapa, será necessário apenas dois componentes: um ListBox e um Edit. Isto porque nesta primeira fase, vamos apenas construir a conexão entre Raspberry Pi e Arduino e testar se está tudo funcionando conforme o desejado. A parte dois deste artigo terá o foco em criar a interface e começar o backend da aplicação (trabalhando com sensores), como mostra a imagem do dashboard no início.

Por hora, vamos apenas simular o terminal onde poderá colocar os comandos que serão enviados e ver, se houver, os feedbacks.

  • O Edit onde será colocado os comando para envio é colocado na parte inferior e possui largura FILL que o fará ocupar a largura inteira da tela.
  • O Listbox é um componente onde se pode adicionar várias linhas com texto, ele será adicionado na parte superior esquerda e tarar largura igual ao Edit e altura de FIT ocupando verticalmente todo espaço que não foi ocupado pelo Edit.

Veja o resultado:

Comunicação serial

Usando Runtime.exec

A classe java.lang.Runtime permite que o aplicativo faça interface com o ambiente em que está sendo executado, isso é o que vai permitir fazer uso da comunicação serial nativa do raspberry.

Os comandos que serão usados para ler e enviar informações no serial com essa classe, serão os mesmos utilizados no teste de comunicação na seção 3.1, apenas adaptados para receber os que foi escrito no Edit.

Lendo serial

A leitura deve ser feita constante, e sempre algum valor for retornado adicioná-lo no listbox usando threads. Vale ressaltar que threads nada mais são do que a forma que se usa em Java para trabalhar com processos em segundo plano sem bloquear a interação com o usuário.

Como mostrado no código a seguir, nessa thread será criado um novo processo, que executará o comando cat visto em, testando serial e iniciará um loop infinito onde será verificado se algo está sendo recebido, caso seja recebido algo, será adicionado ao listbox o valor além disso a próxima linha do list box será marcada pra receber a próxima informação, esse processo permanecerá em execução enquanto a aplicação estiver rodando.

Enviando comandos

O envio do comando é um processo mais simples, será enviado sempre que for apertado enter no Edit.

Para encaminhar o comando, como é feito no 3.1 é preciso instanciar um novo terminal para isso o Runtime deve executar um sh.

 

O após o usuário escrever o edit, apertando o Enter deve acionar um evento que executará o comando de echo com o valor que foi adicionado no Edit.

Ao executar a aplicação no Raspberry Pi com o Arduino conectado e enviado os mesmos comando usados no teste o resultado deve se aproximar ao visto a seguir.

5.1.3 Código Runtime.exec

A seguir temos o código com todas as partes explicadas para a interface e runtime.exec, pegando como base o código da interface temos a adição da thread que fará a leitura do serial na linha 31 e a keylistener que enviara os comandos na linha 55.

Uma alternativa: PortConnector

PortConnector é uma opção ao runtime.exec específica para o trabalho com serial.

Se você quer seguir exatamente como está no exemplo original, pode pular este passo. A intenção aqui é mostrar uma forma alternativa.

A estrutura da aplicação com essa lib não se diferencia em muito da usada anteriormente, reaproveitando a interfase e estruturas anteriores, removendo onde houver utilização do runtime as mudanças que devem ser feitas são:

A declaração do PortConnector em vez do OutputStream.

Na thread a inicialização da conexão e leitura.

O catch deve ser alterado para:

Por fim no envio das mensagens o uso abstração suportada.

Usando o PortConnector para essa aplicação as abstrações permitem uma compreensão mais simples. O resultado apresentado deve ser idêntico ao resultado do Runtime.exec.

Código PortConnector

O código a seguir pode ter como base, o criado para o runtime.exec, como explicado nos itens anteriores, partindo deste e com as alteração indicadas previamente é possível usar o portConnector para executar a comunicação da mesma forma que o Runtime.exec, sendo assim mais uma opção para utilização da comunicação serial.

Você pode encontrar o código completo no repositório abaixo:

pattrickx/TotalCrossSerialCommunication

_Contribute to pattrickx/TotalCrossSerialCommunication development by creating an account on GitHub._github.com

Conclusão

Com o que foi apresentado nesse artigo é possível fazer o uso das portas seriais do Raspberry, mas com o Runtime.exec é possível fazer bem mais, como você pode conferir no guia. É possível chamar arquivos externos em outras linguagens e com isso criar inúmeros projetos como alguns que já desenvolvi para meu próprio uso, um sistema de monitoramento de qualidade da água de um aquário, com medição de temperatura com as entradas analógicas e acionamento de uma resistência ou cooler para regulagem da temperatura com controle PWM de intensidade, outro foi uma chocadeira, com timer para tempo de chocagem, regulagem de temperatura,regulagem de umidade, e um servo motor para girar os ovos.

Como esse projeto é focado na expansão de portas do Raspberry com o uso das portas seriais, para o próximo artigo optei em usar o PortConnector pois é focado nesse tipo de comunicação, o que vai reduzir um pouco a complexidade de desenvolvimento.

Se você tiver alguma dúvida ou sugestão é só entrar no grupo do telegram da TotalCross ou comentar aqui.

No próximo artigo iremos partir para a construção da interface gráfica com entrada digital!

Referências

Outros artigos da série

Expansão de portas de um Raspberry Pi usando serial e Arduino - Parte 2 >>
Licença Creative Commons Esta obra está licenciada com uma Licença Creative Commons Atribuição-CompartilhaIgual 4.0 Internacional.

Receba os melhores conteúdos sobre sistemas eletrônicos embarcados, dicas, tutoriais e promoções.

Raspberry Pi » Expansão de portas de um Raspberry Pi usando serial e Arduino - Parte 1
Comentários:
Notificações
Notificar
guest
1 Comentário
recentes
antigos mais votados
Inline Feedbacks
View all comments
Alex Barbosa Camilo
02/08/2020 13:51

Boa tarde,
Não seria mais interessante ter usado a comunicação através do JSON por ser mais conhecido e usado.

export-json.jpg
Talvez você goste:

Séries



Outros da Série

Menu

WEBINAR
 

Soluções inteligentes para acionamento de MOSFETs/IGBTs com família STDRIVE

Data: 08/10 às 15:00h - Apoio: STMicroelectronics
 
INSCREVA-SE AGORA »



 
close-link