Crie um App Android Personalizado para Controlar Arduino com MIT App Inventor
Neste tutorial Arduino, aprenderemos a construir aplicativos Android personalizados para controlar Arduino usando o aplicativo online MIT App Inventor. Você pode assistir ao vídeo a seguir ou ler o tutorial escrito abaixo.
Visão Geral
Para este tutorial, temos dois exemplos. O primeiro é controlar um LED simples e o segundo é controlar um Motor de Passo usando smartphone. No meu tutorial anterior, já aprendemos como fazer a comunicação Bluetooth entre a placa Arduino e o Smartphone usando o módulo Bluetooth HC-05 e explicamos o código Arduino necessário para o primeiro exemplo.
Código Arduino
Aqui está uma visão rápida desse código. Então, via porta serial, recebemos os dados de entrada do smartphone e os armazenamos na variável 'state'. Se recebermos o caractere '0' que é enviado do smartphone quando o botão 'LED: OFF' é pressionado, desligaremos o LED e enviaremos de volta ao smartphone a String "LED: OFF". Por outro lado, se recebermos o caractere '1', ligaremos o LED e enviaremos de volta a String "LED: ON".
/* Arduino e Módulo Bluetooth HC-05 Tutorial
* por Dejan Nedelkovski, www.HowToMechatronics.com
*/
#define ledPin 7
int state = 0;
void setup() {
pinMode(ledPin, OUTPUT);
digitalWrite(ledPin, LOW);
Serial.begin(38400); // Taxa de comunicação padrão do módulo Bluetooth
}
void loop() {
if (Serial.available() > 0) {
state = Serial.read();
}
if (state == '0') {
digitalWrite(ledPin, LOW); // Desliga LED
Serial.println("LED: OFF"); // Envia de volta, para o telefone, a String "LED: ON"
state = 0;
} else if (state == '1') {
digitalWrite(ledPin, HIGH);
Serial.println("LED: ON");
state = 0;
}
}
Agora, precisamos construir nosso aplicativo Android personalizado que enviará esses caracteres '0' e '1' quando um botão particular for pressionado, bem como receber as Strings de entrada do Arduino.
MIT App Inventor
No site do MIT App Inventor, precisamos fazer login no aplicativo de construção online clicando no botão "Create apps!". Para fazer login, precisamos ter uma conta Gmail. Uma vez logados, agora podemos criar nosso primeiro projeto. Veja como a janela de design se parece e agora podemos começar a construir nosso aplicativo.

Mas antes de fazer isso, podemos conectar nosso smartphone a este projeto para que possamos ver como o app está tomando forma diretamente no nosso smartphone em tempo real. Para fazer isso, primeiro temos que baixar o aplicativo MIT AI2 Companion na Play Store e instalá-lo no nosso smartphone. Então, no menu Connect do editor online, selecionaremos AI Companion e um código de barras aparecerá, que só precisamos escanear ou inserir o código no aplicativo do smartphone e a conexão entre o editor online e o aplicativo do smartphone será estabelecida.

Agora, por exemplo, se inserirmos um botão na tela do editor online, o botão aparecerá em tempo real no smartphone também. Similar a isso, se você não quiser usar seu smartphone enquanto constrói o app, pode instalar o Emulador Android no seu computador e usar da mesma forma. Você pode encontrar mais detalhes de como configurar o Emulador no site deles.
Construindo o App – Exemplo 1
Agora, estamos prontos para construir o primeiro exemplo. Começaremos com o layout do programa. Primeiro, adicionaremos alguns HorizontalArrangements da paleta de Layout e definiremos suas propriedades como altura, largura e alinhamento para combinar com a aparência desejada do nosso programa. Em seguida, da paleta UserInterface, adicionaremos um ListPicker e anexaremos uma imagem a ele. O ListPicker será usado para selecionar o dispositivo Bluetooth ao qual nosso smartphone se conectará.

Em seguida, adicionaremos outro HorizontalArrangements no qual colocaremos um Label. Este label indicará se o smartphone está conectado ou não ao módulo Bluetooth e é por isso que definiremos o texto inicial deste label como "Not Connected". O próximo label será usado para exibir o status do LED, se está desligado ou ligado. O estado inicial será "LED: OFF". Em seguida, adicionaremos os dois botões, 'Turn On' e 'Turn Off' para controlar o LED. Neste ponto, é bom renomear os componentes para que possamos reconhecê-los e usá-los mais facilmente no editor de Blocos posteriormente. O que resta agora é adicionar o BluetoothClient, que é um componente não visível, bem como um clock que será usado para a indicação em tempo real do status da conexão.
Editor de Blocos
Agora, no editor de Blocos, estamos prontos para dar vida ao nosso programa. Do lado esquerdo, temos todos os blocos e funções relacionados aos componentes adicionados anteriormente.

Começaremos com o BluetoothList ListPicker. De lá, primeiro adicionaremos o bloco 'BeforePicking' e anexaremos a ele o bloco 'set Bluetooth Elements'. Em seguida, dos blocos BluetoothClient, adicionaremos o bloco 'BluetoothClient AddressesAndNames'. O que este conjunto de blocos fará é definir uma lista de dispositivos Bluetooth que já estão pareados com nosso telefone, então, quando clicarmos no ListPicker "Connect Button", a lista de todos os dispositivos pareados aparecerá.

Em seguida, temos que definir o que acontecerá depois que escolhermos ou selecionarmos nosso módulo Bluetooth particular. Do bloco BluetoothClient, adicionaremos o bloco 'call BluetoothClient .Connect address' e adicionaremos o bloco 'BluetoothList Selection' a ele, o que significa que nosso telefone se conectará ao endereço Bluetooth que selecionamos anteriormente.

Em seguida, dos blocos Clock, adicionaremos o bloco ".Timer". Dentro deste bloco, faremos a indicação em tempo real se o telefone está conectado ou não ao módulo Bluetooth usando o bloco "set Text" do label chamado "Connected".

Em seguida, precisamos dar vida aos dois botões. Então, quando o "TurnOn_Button" for clicado, usaremos a função Bluetooth client "Send1ByteNumber" para enviar um número para o módulo Bluetooth do Arduino. No nosso caso, esse é o número 49, que corresponde ao caractere '1' de acordo com a tabela ASCII e isso ligará o LED. Logo após, usaremos a função "ReceiveText" do BluetoothClient para receber a String de entrada que é enviada de volta do Arduino para o telefone. Esta String é definida no Label "LED_Status".

O mesmo procedimento vale para o "TurnOff_Button", onde o número de envio deve ser alterado para 48, que corresponde ao caractere '0'. O que resta agora é baixar e instalar o programa no nosso smartphone. Podemos fazer isso no menu "Build", salvando no nosso computador e depois transferindo para o telefone ou escaneando um código QR para download online do programa. Aqui está a demonstração do exemplo.
Aqui está um arquivo para download do projeto MIT App Inventor acima:
Exemplo de Controle de Motor de Passo
Agora, vamos analisar o segundo exemplo: controle de um motor de passo. No topo da tela, temos os mesmos componentes para a conexão Bluetooth do exemplo anterior. Em seguida, temos um componente Canvas usado para desenho e inserção de imagens. Inseri duas imagens transparentes que desenhei anteriormente. A primeira é uma imagem de um medidor (gauge) que ficará fixa no lugar e a segunda é uma imagem de um ponteiro que estará rotacionando. Em seguida, temos um botão Check para alternar entre modo Manual e Auto (execução contínua) e um botão para mudar a direção de rotação. Na parte inferior, temos um slider para alterar a velocidade de rotação do motor de passo.

Aqui estão os blocos e o código Arduino por trás deste exemplo. No editor de Blocos, novamente temos os mesmos blocos para a conexão Bluetooth do exemplo anterior.

Agora, para rotacionar a imagem do ponteiro, usamos a função ImageSprite ".PointInDirection", que rotaciona a imagem da posição 0° para as coordenadas X e Y onde o Canvas foi tocado. Ao mesmo tempo, definimos o heading do ImageSprite rotacionado para o label de texto acima. Depois, chamamos um procedimento personalizado, ou função, que é na verdade um atraso de 10ms.
Por fim, enviamos o valor do heading como Texto para o Arduino usando a função Bluetooth "SendText". Esse valor será aceito pelo Arduino e ele rotacionará o motor de passo de acordo.

Em seguida, o bloco CheckBox. Então, se o CheckBox estiver marcado, enviaremos o texto "Auto" para o Arduino, que ativará o motor de passo para rotacionar continuamente. Enquanto estivermos neste modo, se pressionarmos o botão "Reverse", enviaremos o texto "Reverse" para o Arduino, que mudará a direção de rotação do motor. Também, enquanto estivermos neste modo, podemos alterar a velocidade de rotação. Se mudarmos a posição do slider, o valor atual da posição do slider será enviado para o Arduino, que alterará a velocidade de rotação do motor de passo. Se desmarcarmos o CheckBox, voltaremos ao modo manual. Aqui está a demonstração do exemplo.

Aqui está um arquivo para download do projeto MIT App Inventor acima, bem como as duas imagens usadas no projeto:
Aqui está o código Arduino do segundo exemplo:
/* Controle de Motor de Passo via Módulo Bluetooth HC-05
* por Dejan Nedelkovski, www.HowToMechatronics.com
*/
// Definindo variáveis
const int stepPin = 7;
const int dirPin = 6;
String state = "";
int currentHeading = 0;
int currentAngle = 0;
int lastAngle = 0;
int angle = 0;
int rotate = 0;
int runContinuously = 0;
String mode = "Manual";
boolean dirRotation = HIGH;
int rotSpeed = 1500;
void setup() {
pinMode(stepPin, OUTPUT);
pinMode(dirPin, OUTPUT);
Serial.begin(38400); // Taxa de comunicação padrão do módulo Bluetooth
}
void loop() {
delayMicroseconds(1);
if (Serial.available() > 0) {
state = Serial.readString();
}
// Quando botão Auto é pressionado
if (mode == "Auto") {
if (state == "Reverse") {
delay(10);
if (dirRotation == HIGH) {
dirRotation = LOW;
} else {
dirRotation = HIGH;
}
digitalWrite(dirPin, dirRotation);
delay(10);
state = "";
}
rotSpeed = state.toInt();
if (rotSpeed >= 300 && rotSpeed <= 3000) {
digitalWrite(stepPin, HIGH);
delayMicroseconds(rotSpeed);
digitalWrite(stepPin, LOW);
delayMicroseconds(rotSpeed);
} else {
digitalWrite(stepPin, HIGH);
delayMicroseconds(1500);
digitalWrite(stepPin, LOW);
delayMicroseconds(1500);
}
if (state == "Manual") {
mode = state;
}
}
// Quando programa está em modo Manual
else if (mode == "Manual") {
currentHeading = state.toInt();
if (currentHeading < 0) {
currentHeading = 360 + currentHeading;
}
currentAngle = map(currentHeading, 0, 359, 0, 200);
digitalWrite(dirPin, HIGH);
if (currentAngle != lastAngle) {
if (currentAngle > lastAngle) {
rotate = currentAngle - lastAngle;
for (int x = 0; x < rotate; x++) {
digitalWrite(stepPin, HIGH);
delayMicroseconds(500);
digitalWrite(stepPin, LOW);
delayMicroseconds(500);
}
}
if (currentAngle < lastAngle) {
rotate = lastAngle - currentAngle;
digitalWrite(dirPin, LOW);
for (int x = 0; x < rotate; x++) {
digitalWrite(stepPin, HIGH);
delayMicroseconds(500);
digitalWrite(stepPin, LOW);
delayMicroseconds(500);
}
}
}
lastAngle = currentAngle;
if (state == "Auto") {
mode = state;
}
}
}
Processo de manufatura
- Projetando um Sistema de Recuperação por Paraquedas Balístico para UAVs
- Escolhendo o Material Certo para Seu Projeto: Guia Prático
- Crie um Sistema Ambilight Impressionante para Monitor com Arduino
- Controle Remoto Universal Android com Arduino, 1Sheeld e IR
- 7 Passos para Construir um Roteiro de Automação Bem-Sucedido
- Escolhendo a Liga Certa: Magnésio vs. Alumínio para Projetos de Fundição Personalizados
- Selecionando o Guindaste Ideal para Seu Projeto de Construção: Guia Prático
- Como Preparar Seu Projeto de Usinagem Personalizada para uma Cotação Competitiva
- Estimativa Precisa de Aço: Guia Passo a Passo para Seu Projeto
- Por Que o Jateamento de Areia Melhora Projetos de Fabricação de Metal Personalizada