Arduino Projeto "RoboCar4W Robot Machine"

Você entende - explicou o editor -, deve ser divertido, fresco, cheio de aventuras interessantes ... para que o leitor não possa sair.
I. Ilf, E. Petrov "Como foi criado Robinson" .


Começar com o Arduino, como em qualquer outra plataforma de software ou hardware, é sempre mais interessante em algum projeto real. Ao mesmo tempo, programadores escrevem código que exibe "Olá, mundo", os arduinistas piscam um LED. E todo mundo é feliz quando crianças.


Decidi começar com um projeto avançado, inclusive com a esperança secreta de arrancar a geração jovem do Counter-Strike (falhou).


Como você pode imaginar pelo nome RoboCar4W, o primeiro projeto foi um carro robô de quatro rodas. Começando o trabalho, eu já tinha experiência em programação, já sabia soldar por um longo tempo, mas nem conhecia as pinagens do Arduino e nem li a documentação. Estudei toda a sabedoria no decorrer da peça e o Google para ajudar.


Como o projeto em si não é fundamentalmente novo, essas descrições na rede são suficientes, todos os componentes são conhecidos e nenhuma surpresa foi esperada. Portanto, a idéia foi formulada nos termos mais gerais e o objetivo principal era mergulhar no "mundo das coisas" usando o Arduino, como uma plataforma para prototipagem rápida. Nesta obra, talvez alguém se reconheça no início da jornada.


Todo o hardware foi comprado no ebay e, por experiência própria, quero dizer que é mais fácil comprar um kit inicial imediatamente (procure-o nas palavras do Kit inicial do Arduino), em vez de montá-lo em detalhes. Sim, e todos juntos de uma vez. Foi decidido não brincar, comprar um chassi normal, rodas normais, motores normais, para que fosse "caro".


O principal segredo para as compras bem-sucedidas no eBay é comprar de vendedores com melhor classificação e ler atentamente a descrição do produto. Existem muitos artigos sobre isso na Internet.


Qual placa Arduino escolher?


Levei o Arduino UNO, muitos projetos com descrições para ele. Mas agora eu pegaria o Arduino Mega 2560, ele tem mais saídas digitais e analógicas e total compatibilidade em projetos com a UNO.


Descrição geral do projeto


No mundo do desenvolvimento de software, isso também é chamado de "requisitos do sistema".


A ideia do projeto foi a seguinte. A primeira versão da máquina robótica chamada RoboCar4W deve executar ações simples:


  • avançar, recuar, executar curvas
  • medir distância a obstáculos
  • ser capaz de contornar automaticamente os obstáculos à frente.

A segunda versão da máquina deve ser controlada manualmente via bluetooth a partir de um telefone Android.


Para que você trabalhe melhor aqui, todo o projeto final do RoboCar4W é montado (aqui sem bluetooth).


Arduino RoboCar4W


Aqui está um vídeo de ensaios no mar.


No primeiro vídeo, o RoboCar4W dirige automaticamente, evitando obstáculos em duas versões diferentes do "firmware", ou seja, esboce, portanto, se alguém é mais perspicaz e notou que o comportamento do robô em diferentes episódios é um pouco diferente.


Carro robô RoboCar4W


No segundo vídeo, o RoboCar4W se move com a ajuda de comandos transmitidos pelo "driver" via Bluetooth a partir de um telefone celular no Android. "Bluetooth RC Car" está instalado no telefone. Além disso, se houver um obstáculo próximo, o robô para, ou seja, forçar algo não funcionará (no entanto, existe um botão "secreto" que desativa o modo de segurança).


Carro robô RoboCar4W


No terceiro vídeo, o RoboCar4W mostra um programa de movimento de demonstração pré-programado com curvas. O programa de demonstração é ativado sob comando no mesmo telefone celular Android. O robô apenas anda por um tempo e faz curvas.


Carro robô RoboCar4W


Algoritmo de controle de movimento


É um erro chamar nosso método de "algoritmo para evitar obstáculos" ou "localização de caminho". Estas são disciplinas matemáticas separadas, matemática pura. Se você gosta muito de matemática, pesquise no google essas frases e receberá seis meses de leitura.


Enquanto isso, estamos interessados ​​em coisas muito mais fáceis. Portanto, vamos chamá-lo simplesmente - o algoritmo de controle de movimento de um robô de 4 rodas. É claro que estamos falando de controle automático sem intervenção humana.


Aqui está este algoritmo simples, escrito em palavras, para algoritmos mais complexos é necessário (se você deseja ou não) compor diagramas de blocos.


Agora, ao mesmo tempo, observe o código-fonte do esboço RoboCar4W-1.ino .


  1. Medimos a distância do obstáculo à frente.
  2. Se essa distância medida for menor que o valor DST_TRH_BACK (abreviação de limite de distância), paramos e fazemos o inverso ao girar. O sentido de rotação é escolhido da seguinte forma: se você virou à esquerda anteriormente, vire à direita e vice-versa.
  3. Se a distância medida for maior que DST_TRH_BACK , mas menor que DST_TRH_TURN , basta girar. A direção da rotação é escolhida aleatoriamente.
  4. Se você estiver longe do obstáculo, siga em frente.
  5. Repetimos tudo de novo.

O que é bom que nós temos 4 rodas e tração nas quatro rodas? Podemos executar (programar) vários tipos de voltas:


  • Rotação suave. Todas as rodas giram, mas as rodas de um lado giram mais rapidamente.
  • Uma curva acentuada. As rodas giram apenas em um lado.
  • Inversão de marcha no lugar. Como um trator, as rodas de um lado giram para trás e o outro para a frente.

Na segunda versão do programa, ao controlar a partir de um telefone Android, o modo de segurança, quando o robô tenta evitar colisões frontais, pode ser desativado se o programa for pressionado duas vezes.
Botão


e ligado novamente pressionando-o uma vez.


Nota importante . Toda lógica está sob o controle do Arduino. O Android aqui funciona como um console de jogo (sem cérebro) do console, sua tarefa é transmitir estupidamente pressionamentos de botão (ou seja, comandos) via Bluetooth para o Arduino RoboCar4W.


Componentes


Inicialmente, a máquina incluía um servoconversor que girava o medidor de distância ultrassônico em um determinado ângulo para medições em três direções. Mas durante os testes, devido ao manuseio descuidado, o servo foi queimado; agora, o sensor de distância é simplesmente rigidamente fixado na frente do gabinete.


Não há revestimento de prata, mas o esboço se tornou um pouco mais fácil.


Para o futuro, compre o servo mais simples e mais barato, não são necessários potência especial, velocidade e precisão de rotação em um determinado ângulo, e é muito fácil desativar um servo, como se viu. SG90 no valor de US $ 2 é um bom ajuste.


Portanto, os componentes do projeto RoboCar4W, uma descrição em inglês, são fornecidos para facilitar a pesquisa no ebay e similares:


  • Arduino UNO R3
  • Chassi pronto Plataforma de robô móvel com tração nas 4 rodas Chassi de carro inteligente Compatível com Arduino
  • Motores DC com rotação nos dois sentidos - 4 unid.
  • Rodas - 4 unid.
  • Placa para controle de 4 motores DC Motor Drive Shield L293D
  • Medidor de distância ultra-sônico HC-SR04 Sensor ultrassônico de medição de distância do módulo
  • Pilhas Ni-MH 1,2 V - 8 pçs.
  • Suporte de caixa de plástico para baterias, Suporte de caixa de bateria 4 pilhas AA - 2 un.
  • Tipo de bateria "Krona" 8,4 V - 1 pc.
  • Interruptor de alavanca opcional - interruptor de alimentação

Chassis, motores CC e rodas foram adquiridos imediatamente no kit e mesmo com as instruções de montagem.


Pinagem


As entradas analógicas podem ser usadas como pinos digitais das portas de E / S. Os pinos do Arduino correspondentes às entradas analógicas são numerados de 14 a 19. Isso se aplica apenas aos pinos do Arduino, e não aos números físicos dos pinos do microcontrolador Atmega.


Você não precisa desenhar, basta colocar tudo em uma mesa. Eu fiz assim.


Pinagem


Os pinos D4, D7, D8, D12 estarão ocupados se forem utilizados motores DC ou de passo.


Os pinos D9 (controle servo nº 1) e D10 (controle servo nº 2) serão utilizados apenas se forem utilizados servomotores.


O pino do Arduino não ocupa os pinos do Arduino para controlar o L293D do Motor Drive Shield.


Os pinos de alimentação de 3,3 V, 5 V e o terra são duplicados na blindagem de acionamento do motor em quantidades suficientes. Portanto, não há necessidade de se preocupar com a escassez.


Se você ainda deseja desenhar lindamente, o programa Fritzing gratuito o ajudará.


Nutrição


Este é o segundo ponto muito importante. Depende muito da nutrição. Por exemplo, um servo motor ao girar o eixo em um determinado ângulo começa a consumir muita corrente. Ao mesmo tempo, se o servo for alimentado por um Arduino de 5 V, haverá um "rebaixamento" de tensão e o restante do circuito começará a falhar, e o Arduino pode até reiniciar ao mesmo tempo.


De qualquer forma, se você usar motores na embarcação, será necessário um protetor de acionamento do motor (ou um circuito semelhante).


Portanto, temos 4 motores DC, um servoconversor, a própria placa Arduino e vários sensores. Os motores são os mais glutônicos, mas os sensores podem ser alimentados com sucesso a partir dos conectores da própria placa Arduino, então tudo é simples com eles. Por conveniência, reduzi toda a economia em uma tabela.


Tensão recomendada ou típica. Consumo atualTensão máximaO que está planejado para alimentarAnotações
Placa Arduino UNO R37 - 12V, 200mA (média)6 - 20"Krone 9V" Li-ion 650mAh, 8.4VConector central
Servo Motor MG-9955-6 V, 0,1 - 0,3A (pico)4.8 - 7.2Pilhas (5) pçs. Ni-Mh 1.2V = 6VAlimentos apenas de uma fonte separada. Se você ligar o Arduino, tudo falhará. Tensões da bateria Ni-Mh 4pcs * 1.2V = 4.8V não é suficiente. Alguns argumentam que este servo não deve ser usado em apenas 6 volts.
Motores DC (4 unid.)6 - 8V, corrente de 70mA a 250mA3 - 12baterias (5 + 3) unid. Ni-Mh 1.2V = 9.6VVocê não poderá dar partida nos motores normalmente a partir de uma bateria de 9V, portanto nem perca tempo (e baterias)!
Escudo de acionamento do motor L293Dnão é necessário4.5 - 36não é necessário
Módulo Bluetooth HC-05063,3 V, 50 mA1.8—3.6Com placa de pinos 3.3V Arduino
Medidor de distância ultra-sônico HC-SR045 V, 2 mA5Com placa de pino 5V Arduino

Eu não tinha um conversor de tensão DC / DC. O Krona 9V não era uma fonte muito boa de energia, eu já tinha.


Mas me recusei a usar baterias de alta capacidade de íon de lítio. Em primeiro lugar, devido ao alto custo e, em segundo lugar, nas compras online chinesas, é fácil encontrar uma farsa. Mais precisamente, não é "fácil", mas "sempre". Além disso, o íon de lítio requer tratamento especial e não é seguro.


Portanto, como vemos na tabela, precisamos de 3 fontes de energia independentes:


  • Para placa Arduino e sensores.
  • Para servomotor.
  • Para 4 motores de corrente contínua.

Onde posso conseguir tanto? De qualquer forma, a própria placa Arduino deve ser alimentada por uma fonte separada, como quando a tensão "afunda", por exemplo, ao ligar os motores, a placa pode reiniciar ou simplesmente falhar. Aqui usamos a bateria do fator de forma Krona 9V, e o conector que será conectado ao Arduino deve estar com uma “vantagem no centro”.


Para um servomotor e 4 motores DC, você pode fazer com uma fonte de energia. O único problema é que o servomotor foi projetado para tensão 5-6V (máximo 7,2V) e corrente de 100-300mA (pico), e os motores CC precisam de 6-8V (máximo de 12V) e corrente de 250mA.


Para resolver o problema, existem conversores DC-DC, mas eu não tinha. Como resultado, apliquei meu diagrama de fiação "proprietário" (sem circuitos eletrônicos reduzidos, apenas tensão e corrente ecológicas!): Conectei 8 peças. Baterias de 1,2V em série e torneiras nos lugares certos, conforme mostrado no diagrama.


Nutrição


6V foram para o servomotor e 9,6 para motores de corrente contínua. É claro que as baterias de 1 a 5 sofrerão aumento de carga.


Para controlar motores servo e CC, usei um Motor Drive Shield de 4 canais baseado no chip L293D.


Assembléia


A montagem do chassi acabado é um pequeno problema. Mas não pense que sem o doping você conseguirá tudo imediatamente. Portanto, prepare arquivos.


Assembléia


Assembléia


Não é possível conectar vários motores normalmente, um servo motor ou um stepper diretamente ao Arduino. Como os pinos (conclusões) do Arduino são de baixa corrente. Para solucionar o problema, existe um módulo de controle de acionamento adicional - Motor Drive Shield baseado no chip L293D, que é um dos chips mais comuns projetados para essa finalidade. O chip L293D também é conhecido como H-Bridge.


Usei uma placa que fornece 4 canais para conexão em dois chips L293D e um registrador de deslocamento. Comprado no eBay por US $ 5.


Esta placa do módulo de controle do inversor possui as seguintes especificações.


  • Escudo de acionamento de motor L293D compatível com Arduino Mega 1280 e 2560, UNO, Duemilanove, Diecimila
  • Controle de 4 canais
  • motores alimentados de 4.5V a 36V
  • corrente de carga admissível 600mA por canal, corrente de pico - 1.2A
  • proteção contra superaquecimento
  • 2 interfaces com um timer Arduino exato (não haverá "instabilidade") para conectar servomotores a 5V, se a tensão de alimentação precisar ser maior, a conexão de alimentação deverá ser refeita conforme descrito abaixo
  • 4 motores coletores CC bidirecionais ou 2 servomotores de passo e 2 podem ser controlados simultaneamente
  • 4 motores CC bidirecionais são conectados a um barramento de 8 bits para seleção individual de velocidade
  • conexão de até 2 drives de passo (unipolar ou bipolar), com uma bobina, bobina dupla ou etapas alternadas
  • conector para conectar uma fonte externa para fonte de alimentação separada da lógica de controle e dos motores
  • Botão RESET Arduino
  • A biblioteca Adafruit AFMotor é usada para gerenciamento.

O Motor Drive Shield precisa de um pouco de aperfeiçoamento para que você possa conectar qualquer coisa depois dele. Soldamos os conectores necessários no topo, foi o que aconteceu.


Blindagem de acionamento do motor


Os motores podem ser conectados a uma fonte de alimentação adicional em relação à placa Arduino. Eu recomendo apenas este método de conexão. Para fazer isso, remova, abra o jumper, como mostra a figura.


Desativação do acionamento do motor L293D de 4 canais.  Jumper para alimentação externa


Nesse caso, o Arduino é alimentado e os motores são alimentados independentemente um do outro.


O LED na blindagem do motor acende quando há energia para os motores; se não estiver aceso, os motores não funcionarão.


Novo problema.


A posição do jumper de força não se aplica aos servos, eles ainda serão alimentados por 5V Arduino. Como os servomotores geralmente consomem muita corrente e, se a energia é insuficiente, todo o dispositivo começa a falhar, no "melhor" caso, apenas o servoconversor falha - ele não gira no ângulo definido ou o tempo todo antes de cada turno girar primeiro a 0 graus e somente então em um determinado ângulo (e se você conseguir acompanhar). Portanto, recomendo alimentar o servo também a partir de uma fonte de energia adicional. Para fazer isso, você precisará refazer um pouco o diagrama de conexão: retire o fio positivo (geralmente vermelho) do conector padrão e conecte-o diretamente ao sinal de adição da fonte de alimentação.


Finalização para conectar o poder do servomotor


Ao conectar uma blindagem de acionamento do motor, não são utilizados pinos analógicos. Os pinos digitais 2, 13 não são usados.


Os seguintes pinos são usados ​​apenas se os motores CC ou motores de passo correspondentes estiverem conectados e usados:


  • D11: Motor DC nº 1 / Passo nº 1 (ativação e controle de velocidade)
  • D3: Motor DC nº 2 / Passo nº 1 (ativação e controle de velocidade)
  • D5: Motor DC nº 3 / Passo nº 2 (ativação e controle de velocidade)
  • D6: Motor DC # 4 / Stepper # 2 (ativação e controle de velocidade)

Esses pinos estarão ocupados se qualquer DC / stepper for usado: D4, D7, D8, D12.


Os seguintes pinos serão ocupados apenas se os servomotores apropriados forem utilizados:


  • D9: Controle servo nº 1
  • D10: Controle servo # 2

Tabela de conexão


Para começar a usar o Motor Drive Shield, é necessário baixar e instalar a biblioteca do Adafruit AFMotor .


Exemplo de código para controle de motores:


 #include <AFMotor.h> //   Adafruit #include <Servo.h> //     AF_DCMotor motor(1); //   ,    DC    Motor Shiled , ,  frequency Servo servo; //    servo.attach(10); //     9  10 (    Motor Shiled) motor.setSpeed(speed); //   DC   0 ()  255 ( ) motor.run(RELEASE); // DC   motor.run(FORWARD); // DC   motor.run(BACKWARD); // DC   servo.write(90); //    90 . 

O motor DC começou a girar apenas quando indica uma velocidade maior que 100, se menor, apenas vibra. Você terá que determinar a velocidade mínima do seu motor experimentalmente.


Para motores conectados a M1 e M2, você pode definir a frequência: MOTOR12_64KHZ, MOTOR12_8KHZ, MOTOR12_2KHZ, MOTOR12_1KHZ. A maior velocidade de rotação é alcançada em 64KHz, essa frequência será ouvida, menor frequência e velocidade em 1KHz, mas também usa menos energia. Os motores 3 e 4 sempre funcionam a 1 KHz; outros valores são ignorados. O padrão é 1KHz em todos os lugares.


Depois disso, é necessário executar um teste de motores. Esboço para teste pode ser feito aqui . No início do esboço, altere o número do motor em uma linha (ou em linhas) do tipo:


 AF_DCMotor motor(); 

Um esboço, durante algum tempo, gira o (s) motor (es) para frente ao longo do movimento do robô e depois para trás. Observe atentamente se o motor gira nessa direção e, se necessário, altere a polaridade da conexão.


Conectamos o medidor de distância ultrassônico HC-SR04 Módulo ultrassônico. Pinagem:


  • Vcc
  • Trig (T)
  • Eco (r)
  • GND

O tempo gasto pelo telêmetro ultrassônico nas medições (determinadas empiricamente):


  • 240 ms no máximo se a distância for muito longa (fora da faixa)
  • pelo menos 1 ms se a distância for muito curta
  • uma distância de 1,5 m é determinada em aproximadamente 10 ms

Módulo ultra-sônico de medidor de distância ultra-sônico HC-SR04


Um sensor ultrassônico de telêmetro, devido à sua natureza física, e não porque a China, em alguns casos, determina mal a distância de um obstáculo:


  • se o obstáculo é de forma complexa, o ultrassom é refletido em ângulos diferentes e o sensor está errado,
  • o ultrassom é perfeitamente absorvido (ou seja, não é refletido) por móveis ou brinquedos estofados e o sensor acredita que não há nada à sua frente.

Em outras palavras, para um telêmetro ultrassônico, seria ideal se todos os obstáculos estivessem na forma de um plano sólido perpendicular à direção da radiação ultrassônica.


Alguns problemas podem ser resolvidos com um sensor de distância por infravermelho. Mas também não é perfeito:


  • alcance máximo pequeno comparado ao ultrassom: 0,3-0,8 m versus 4 m
  • grande distância mínima em comparação ao ultrassom: 10 cm vs 2 cm
  • dependência da sensibilidade do sensor na iluminação geral.

Embora se você instalar esses rangefinders em um par, a eficiência do trabalho deles aumentará significativamente.


Conectar Bluetooth HC-05


Como você pode ver na folha de dados, os pinos principais do HC-05 “nu”:


  • Transmissão TX (pino 1)
  • Recepção RX (pino 2)
  • Fonte de alimentação 3.3V (pino 12)
  • Terra de GND (pino 13)
  • Indicador de modo PIO8 (pino 31)
  • Status da conexão PIO9 (pino 32), se a conexão for estabelecida, a saída será alta
  • PIO11 (pino 34) para ativar o modo de comando AT

Nosso módulo é soldado à placa Breakout / Base, onde já existe um divisor de tensão, portanto, ele possui uma faixa de tensão de trabalho de 3,3V a 6V.


Conectamos nosso conjunto de módulo Bluetooth:


  • Arduino (TX) - (RX) HC-05
  • Arduino (RX) - (TX) HC-05
  • Arduino (+ 5V) - (VCC) Bluetooth
  • Arduino (GND) - (GND) Bluetooth
  • Os pinos LED, CHAVE não são usados

Após a alimentação do módulo Bluetooth HC-05, o LED deve piscar, o que significa que o bluetooth está funcionando.


Ligue o bluetooth no celular, encontre o dispositivo com o nome HC-05 e conecte, senha 1234.


Para testar, preencha um esboço simples no Arduino:


 int count = 0; void setup() { Serial.begin(9600); Serial.println("Test Arduino + Bluetooth. http://localhost"); } void loop() { count++; Serial.print("Count = "); Serial.println(count); delay(1000); } 

No telefone Android, instale o terminal Bluetooth. Estamos conectados ao dispositivo HC-05 e observamos na tela do telefone linhas rastejantes com um contador crescente.


Para que o módulo possa receber comandos AT, é necessário colocá-lo no modo apropriado - para isso, é necessário definir a saída KEY (PIO11) como lógica 1. Em algumas placas Breakout / Base, em vez da saída KEY, existe uma saída EN (ENABLE), que pode ou não ser soldado ao pino no próprio chip. Isso se aplica apenas aos chips HC05. Isso é apenas minha saída do terminal EN não é soldada em nenhum lugar. Portanto, ele pode ser soldado com um fio separado ao terminal KEY (PIO11) do chip. Ou, durante a operação, para colocar o HC05 no modo de comando AT, provoque um curto-circuito na saída do chip KEY (PIO11) na saída de energia Vcc por alguns segundos. Para o HC06, o pino CHAVE não é necessário.


De software


Nota Antes de baixar o programa para o Arduino, verifique se o módulo Bluetooth não está conectado ao Arduino. Isso causará problemas de preenchimento de esboço. Apenas desconecte a energia do módulo Bluetooth ou dos fios que conectam os pinos dos módulos Arduino e RX, TX.


No início do esboço, altere os números do motor nas linhas do tipo:


 AF_DCMotor motor(); 

Esboço para o modo automático com download de prevenção de obstáculos aqui .


Se você substituir a sequência


 byte debug = 0; 

em


 byte debug = 10; 

Isso ativará o modo de depuração.


No modo de depuração, o RoboCar4W realmente não dirige ou roda. Em vez disso, ative o monitor da porta serial e você verá como ele "dirige" virtualmente. Em vez de um avanço real da unidade, a sequência "Forward" será gravada no monitor da porta serial, em vez de reverter com uma curva à esquerda, "Turn Back L (eft)", etc. O sensor de distância ultrassônico também não faz nada; as distâncias dos obstáculos são geradas de forma programática e aleatória.


Esse modo de depuração é conveniente se você alterar o algoritmo de movimento e, em vez de pegar a máquina pela sala, basta verificar tudo no modo inativo.


Esboço Bluetooth para controle manual, faça o download aqui . O esboço não possui o modo de depuração, pois tudo é transparente lá. Você pressiona o botão - o robô continua.


Programa para Adnroid Bluetooth RC Car .


Bem, é isso! Boa viagem!


Boa viagem!

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


All Articles