Dispositivo Android controlado por Bluetooth controlado por Arduino - ciclo completo (parte 1)

1. Introdução


Uma história detalhada de como o carro Arduino, controlado por um dispositivo Android via Bluetooth, foi montado a partir de três motores. Em várias dezenas de parágrafos, tentarei explicar o máximo possível onde conectar cada um dos fios, como escrever um aplicativo proprietário e em qual rake infantil tive que pular por mais de uma semana.

Um pouco sobre nível, autor e avisos


Eu, um autor, um garoto de 16 a 17 anos de uma vila perto de Moscou, sou especializado em escrever aplicativos para Android (e é mais difícil gravar algo lá), então assumo a responsabilidade por uma abordagem ideal para resolver problemas.

Praticamente cada uma das etapas descritas abaixo me levou mais do que valeria a pena. Provavelmente, por esse motivo, quero compartilhar minha experiência. E, ao mesmo tempo, ficarei muito feliz se você repreender por erros e me pedir otimização.

Desafio


A tarefa mais fácil é fazer o carro controlado pelo Arduino e substituir o controle remoto por um androide. Mas na maioria dos momentos tive que reinventar a roda, porque nenhuma solução adequada foi encontrada na Internet.

Vai precisar


  1. Arduino
  2. Motor Shield (no meu caso dois)
  3. Bluetooth
  4. Android
  5. Fios convencionais

Base de projeto


O Lego Outdoor Challenger foi tomado como base (na realidade, parece menos patético). Tudo o que resta dela: o estojo (todos os elementos decorativos são removidos) e três motores.
imagem
A máquina tinha seu próprio painel, mas uma das tarefas implicava universalidade: eu fiz isso, outros podem repeti-lo. Ele tirou o cérebro, colocou o Arduino Uno.

Instalação do Arduino


Por alguma razão, os criadores não forneceram espaço para o Arduino, então eles o prenderam aos parafusos perfurando o plástico. Ele colocou madeira compensada embaixo do quadro para que nada ficasse em curto-circuito. É melhor deslizar algo de plástico sob os parafusos (um pedaço de garrafa), porque a placa não está protegida contra parafusos de ferro.



No topo da placa, imediatamente coloquei dois motores ligados, que assim seja. Para controlar o segundo, você precisará lançar um fio de qualquer porta digital para H1 (direção) e o segundo de um pino com suporte de calço (marcado com um "~", geralmente 10, 11) a E1 (velocidade).



Determinação do ângulo de rotação


Surpreendentemente, não é o servoconversor que responde à rotação da máquina, mas o motor comum. Há um problema: seria bom não queimá-lo, porque o ângulo de rotação é limitado e o motor pode girar o quanto você quiser.

A opção com o método de puxão desaparece, pois em um nível de bateria diferente, a quantidade de corrente fornecida ao motor mudará, o que levará a um ângulo em constante mudança. Também é impossível girar para a parada, mais cedo ou mais tarde as engrenagens desmoronarão.

Solução: acompanhe o ângulo através do circuito. A foto mostra uma coisa pequena, montada perto do mecanismo rotativo. Na parte que gira com as rodas esquerda / direita pelo motor, é anexada uma vieira com contatos de ferro.





Princípio de operação: um fio é soldado a cada linha (são quatro no total), o fundo é conectado ao sinal de adição (sempre é preso com um pente, veja a figura), os demais fios vão para menos. Quando o dente de vieira cai na linha inferior e, no terceiro, por exemplo, ocorre um curto-circuito, a corrente flui, isso é percebido pelo Arduino.



Graças às várias combinações das três bandas, é possível definir até sete ângulos. Por exemplo, quando houver corrente em todas as linhas, as rodas serão giradas para a posição mais à direita, quando houver corrente apenas na parte superior, as rodas serão giradas para a esquerda o máximo possível. A tabela fornece todas as opções.



Ângulo e código de conexão


Cada cor tem sua própria cor: o fundo é verde, o primeiro abaixo é vermelho, o segundo é preto e o terceiro é branco. No estágio inicial, a placa de ensaio e os LEDs foram usados ​​para depuração visual.



O diagrama de conexão é mostrado na figura. Além disso, puxamos para o verde, os outros, para o menos. Através do resistor instalado para eliminar a interferência e a ausência de curto-circuito, conecte os fios às saídas A0-A2. Eles são selecionados simplesmente salvando outras portas.



O código é fornecido com comentários. Conectamos pinos e os interrogamos através de digitarRead (). Se houver tensão, true será retornado. Em seguida, verificamos se o resultado significa que as rodas estão em posições extremas, proibimos uma nova curva nessa direção.

Um pequeno truque: como as saídas em 5V e 3,3V serão necessárias no futuro, você pode acrescentar um dos pinos digitais. Antes de cada verificação de ângulo, forneça uma corrente através de digitalWrite (whitePin), verifique o ângulo e remova a corrente.

int speedTurn = 180; // ,  0  255 //    int pinRed = A0; int pinWhite = A1; int pinBlack = A2; int pinAngleStop = 12; //   ,    ,  //   void setup() { //    pinMode(pinRed, INPUT); pinMode(pinBlack, INPUT); pinMode(pinWhite, INPUT); // pinMode(pinAngleStop, OUTPUT); //  ,    pinMode(angleDirection, OUTPUT); pinMode(angleSpeed, OUTPUT); Serial.begin(9600); } //   loop(),      void turn(int angle) { digitalWrite(pinAngleStop, HIGH); //   ,    delay(5); // ,   ""  if(angle > 149) { if( digitalRead(pinWhite) == HIGH && digitalRead(pinBlack) == LOW && digitalRead(pinBlack) == LOW) { //    ,      ,   //  return; } //   ,  digitalWrite(angleDirection, HIGH); analogWrite(angleSpeed, speedTurn); } else if (angle < 31) { if(digitalRead(pinRed) == HIGH && digitalRead(pinBlack) == HIGH && digitalRead(pinWhite) == HIGH) { //    ,      ,   //  return; } //   ,  digitalWrite(angleDirection, LOW); analogWrite(angleSpeed, speedTurn); } digitalWrite(pinAngleStop, LOW); //     delay(5); } 

Paralelização de rodas de rolamento


Inicialmente, dois motores de propulsão são conectados juntos. Eles foram desconectados por dois motivos: uma curva é mais eficaz se as rodas girarem em direções diferentes e dois motores potentes não puxam uma placa.

Problema: a blindagem do motor possui duas saídas, cada uma das quais produz até 2 amperes. Cada motor come 0.7A. Parece menos, mas não com cargas máximas. Digamos que a máquina esteja presa na areia ou descansada, a corrente sobe acima do ampère. Não é crítico, mas potencialmente perigoso.

Mas acabou sendo crítico que o conselho esquentasse. Minutos e meio após a corrida, o escudo do motor estava esquentando e começou a funcionar feio: as correntes não eram fornecidas corretamente, as rodas não giravam e assim por diante.

A solução para os dois problemas: um motor conectado a uma blindagem do motor, o segundo ao outro. Curiosamente, isso ajudou. A temperatura caiu, não há superaquecimento. Você pode colocar um radiador, mas é difícil de montar.



Conexão Bluetooth


Eu usei o modelo HC-05, que jogou uma piada fatal. Todos os bluetooth são conectados da mesma maneira: um fio a 3,3V (às vezes começou a funcionar apenas a partir de 5V), o segundo em menos, mais dois na porta 0 e 1 (leitura e envio, respectivamente). Um fio assinado pelo RXD no bluetooth está preso no TXD arduino e no TXD no RXD (se você o misturar, não verá os dados).

Há uma ressalva: as portas 0 e 1 são usadas por padrão por Serial, através das quais o esboço é inundado. Ou seja, enquanto o bluetooth estiver bloqueado, o esboço não será inundado. Existem duas maneiras: retire o bluetooth pelo tempo de preenchimento ou reatribua as entradas e saídas do bluetooth. A segunda opção é realizada em duas linhas.

 #include <SoftwareSerial.h> \\  SoftwareSerial BTSerial(8, 9); \\ 8  9   0  1 

A armadilha que me comeu por três dias de trabalho é a velocidade da comunicação. Por hábito, instalei o 9600 e tentei. Os dados não chegaram, então houve uma confusão de caracteres. E, no final, a resposta é que o HC-05 se comunica no 38400! Preste muita atenção ao fato de que em Setup () eu executarei BTSerial.begin (39400), embora Serial.begin (9600).

Sistema de envio de comando


O artigo está ficando muito longo, então analisarei o código do Arduino e do Android em uma segunda parte separada e agora descreverei o princípio.

Há um joystick no dispositivo Android (um círculo, cuja implementação também está na segunda parte). O Android lê as leituras e as converte em números adequados para o arduino: a velocidade dos pixels se transforma em um valor de -255 a 255 (negativo - reverso) e também determina o ângulo. Deliberadamente, entreguei essa tarefa ao telefone, pois é muito mais poderoso e calmamente capaz de lidar com o cálculo de várias centenas de valores por segundo.



Após a instalação do soquete, os dados são enviados no seguinte formato: @ speed # * angle #. @ - indica que os dígitos a seguir contêm a velocidade, # - indica o final do valor da velocidade, * - o início do valor do ângulo, # - termina a gravação do ângulo. O ciclo é interminável, os comandos são enviados a cada 100 milissegundos (o número ideal é selecionado). Se nada for pressionado no android, nada será enviado.

O algoritmo de recepção de dados é descrito em detalhes no código do esboço. Ele correspondeu mais de uma vez e, quanto a mim, funciona perfeitamente.

Conclusão da primeira parte


Neste artigo, tentei divulgar tudo o que se relaciona com a parte física da máquina. Provavelmente, eu perdi alguma coisa, por isso não deixe de perguntar.

Mas o mais interessante, quanto a mim, permaneceu pelo segundo - o programa Arduino e o aplicativo Android, a mágica real está acontecendo lá, pelo menos para os jovens.

Se você não encontrar a resposta para alguma parte e quiser me cutucar pessoalmente, eu espero - dendolg1@mail.ru ,.

UPD: a segunda parte já está disponível - habr.com/post/424813

Source: https://habr.com/ru/post/pt424087/


All Articles