Iniciando com TotalCross para Raspberry PI

Neste tutorial você vai aprender como:

  • Iniciar com TotalCross;

  • Fazer seu primeiro programa;

  • Visualizar sua aplicação;

  • Ir além do básico!

Pré Requisitos:

Para isto você precisará ter instalado no seu computador os seguintes softwares:

E deve ter em mãos os hardwares abaixo:

  • Raspberry Pi 3;

  • 7x jumpers macho-fêmea;

  • Protoboard;

  • Módulo LED RGB (ou um LED RGB comum);

  • Módulo push-button (ou push-button comum).

Preparando o ambiente

Um jeito rápido de começar com TotalCross é instalando a extensão do TotalCross para VSCode. Aqui assumimos que está tudo pronto para utilizar o Java JDK 1.8 e o Maven. Você pode verificar se está com a versão correta do Java da seguinte forma $ sudo update-alternatives --config java

Caso não esteja com a desejada já podemos alterar selecionando um dos itens ou instalando a versão correta. Também podemos verificar a instalação do Maven:

$ mvn -version

Com isso, basta a abrir o console do VSCode (CTRL + Shift + P) e digitar TotalC… o autocomplete deve ajudar! Você deve visualizar as seguintes opções:

Selecionaremos a opção TotalCross: Create new Project. Criaremos a pasta HelloWorld e selecionaremos ela. Chamaremos o GroupId de com.totalcross e o ArtifactId de HelloWorld. Seguiremos selecionando a versão mais recente do TotalCross SDK e plataforma alvo -linux-arm. Estes passos podem ser visualizados abaixo:

Em seguida, na aba de exploração de arquivos devemos clicar com o botão direito no arquivo RunHelloWorldApplication.java e selecionar Run. O resultado deve ser

Pronto! Você deve ter visualizado o HelloWorld no nosso simulador integrado!

Seu primeiro programa!

Propomos aqui um projeto básico de controle de um LED RGB com TotalCross, basicamente teremos 3 botões na tela para controlar cada pino do LED e um botão de GPIO para resetar os pinos!

Seguiremos o seguinte esquemático:

Se você deseja usar outros pinos ou verificar qual a numeração de cada um desses utilizados recomendamos verificar o pinout do WiringPi. O TotalCross SDK contempla todas as Setup Functions e as Core Functions desta biblioteca. Dito isso, vamos ao código, dentro de initUI() em HelloWorld.java adicionaremos uma label embaixo da anterior:

// Label para indicar de forma feliz o controle do LED
Label labelRGB = new Label("RGB:");
// Também adicionamos essa label à tela após a anterior com um fill de 20
add(labelRGB, CENTER, AFTER + 20);

Para começar a trabalhar com os pinos criaremos (como atributos) variáveis para os pinos e botões da tela:

// Inteiros para guardar a numeração dos pinos
private int pinR = 0, pinG = 2, pinB = 3, pinReset = 7;
// Inteiros para guardar o status de cada pino do LED, 0 (LOW) e 1 (HIGH)
private int stsR, stsG, stsB;
// Botões para controle de cada cor
private Button btnR, btnG, btnB;

Em seguida iniciaremos o GPIO com a classe Gpio:

// Fazemos o setup da placa
Gpio.setup();
// Iniciamos os pinos do LED como saída
Gpio.pinMode(pinR,1);
Gpio.pinMode(pinG,1);
Gpio.pinMode(pinB,1);
// Iniciamos o pino do botão de reset com entrada
Gpio.pinMode(pinReset, 0);

Adicionaremos nosso primeiro botão na interface:

// Os botões TotalCross:
btnR = new Button(""); // Instanciamos um novo
// botão sem texto
btnR.setBackColor(Color.RED); // Escolhemos a cor de
// background do botão,
// neste caso vermelho
btnR.addPressListener(new PressListener() { // Definimos o comportamento
// do botão ao ser clicado
@Override
public void controlPressed(ControlEvent controlEvent) {
stsR = 1 - stsR; // Invertemos o estado do pino
Gpio.digitalWrite(pinR, stsR); // Fazemos uma escrita digital
// para atualizar o estado do
// pino
}
});
add(btnR, CENTER - 70, AFTER + 40); // Queremos os 3 botões alinhados
// horizontalmente o R será o
// primeiro a ser adicionado
// portanto usamos AFTER no
// eixo Y. No X usar utilizamos
// o CENTER menos um fill para
// ser o botão mais a esquerda!

Faremos a mesma coisa para os outros dois botões:

btnG = new Button("");
btnG.setBackColor(Color.GREEN);
btnG.addPressListener(new PressListener() {
@Override
public void controlPressed(ControlEvent controlEvent) {
stsG = 1 - stsG; // Atenção para alterar o pino!
Gpio.digitalWrite(pinG, stsG);
}
});
add(btnG, CENTER, SAME); // O botão verde será o botão
// central e estará alinhado
// com o último componente na
// horizontal por isso usamos
// o SAME
btnB = new Button("");
btnB.setBackColor(Color.BLUE);
BtnB.addPressListener(new PressListener() {
@Override
public void controlPressed(ControlEvent controlEvent) {
stsB = 1 - stsB; // Atenção para mudar o pino
Gpio.digitalWrite(pinB, stsB);
}
});
add(btnB, CENTER + 70, SAME); // O último botão será colocado
// mais à direita do centro

Por fim, em criaremos uma thread para verificar a cada 20ms o estado do push-button e tomar a ação de desligar o LED caso esteja pressionado:

// Utilizaremos uma thread para ficar checando a cada 20ms se o botão de reset foi pressionado
// se sim, então voltamos o estado dos pinos para LOW
new Thread() {
@Override
public void run() {
while(true){
if(Gpio.digitalRead(pinReset) == 1) {
stsR = 0;
Gpio.digitalWrite(pinR, stsR);
stsG = 0;
Gpio.digitalWrite(pinG, stsG);
stsB = 0;
Gpio.digitalWrite(pinB, stsB);
}
Vm.sleep(20);
}
}
}.start();

Novamente, vamos rodar a classe RunHelloWorldApplication.java para obter este resultado no simulador:

O código completo pode ser encontrado aqui.

O deploy da aplicação

O último passo para visualizar sua aplicação no Raspberry Pi é fazer o deploy. Da mesma forma no console

Esperamos o tempo de build… Pronto, uma caixa de diálogo como essa aparecerá e basta preencher com as informações do seu RPI

Na tela ou no VNC vemos o resultado!

Indo além do básico

Você já é capaz de iniciar suas primeiras aplicações com TotalCross, que tal dar uma olhada na nossa documentação? A ferramenta vai muito além do foi visto neste tutorial, todo poder do TotalCross pode ser visto no TCSample.

Este foi um exemplo de dashboard apresentado no Web Summit 2019, como você pode ver abaixo:

Que tal fazer o seu e enviar pra gente? Estamos esperando vocês no nosso grupo do telegram sobre sistemas embarcados linux arm. Lá enviaremos documentação, exemplos, respondemos dúvidas e discutimos sobre desenvolvimento!

Bruno Muniz, Lucas Galvanini e Pedro Lyra no WebSummit