Você está na página 1de 33

Universidade Federal de Pernambuco

Centro de Tecnologia e Geociências


Departamento de Engenharia Mecânica

Projeto e construção de um robô de resgate

Disciplina: Laboratório de Automação e Controle


Professora: Arianna Zoila Oliveira Salmon

Alunos: Caio Leonardo Falcão Monteiro


Ivan Mendes Dionizio
Henrique Medeiros
Lucas de Melo Souza
Matheus de Carvalho Leite
Thales Henrique Torres de Almeida
Walber de Barros Moreira
Washington Avelino da Silva

Recife, 18 de dezembro de 2017


Projeto e construção de um robô de resgate

Relatório do Projeto e Construção de um


Robô de Resgate, apresentado à professora
Arianna Zoila Olivera Salmon como
requisito parcial à aprovação na disciplina
Laboratório de Automação e Controle
(ME472), turma MD, referente ao curso de
Engenharia Mecânica da Universidade
Federal de Pernambuco.

Recife, 18 de dezembro de 2017

2
Sumário

Introdução 4
Processos 6
Metodologia 7
Equipamentos 7
Motores 14
Código 19
Servo e Ultrassom 19
PID 20
Gastos e Divisão de Tarefas 24
Gastos 24
Divisão de tarefas 24
Dificuldades Encontradas 25
Conclusão 28
Referências Bibliográficas 29
Anexo 30

3
Introdução

A importância da robótica para a atual sociedade, iniciada a partir do século


anterior, pode ser medida em termos de uma verdadeira Revolução, que transformou
radicalmente as relações sociais e marcou profundamente o modo como os seres
humanos interagem entre si e com o planeta que os abriga. A humanidade viu os robôs
sendo utilizados cada vez mais com fins industriais, militares e aeroespaciais, tomando
o espaço dos seres humanos em atividades que exigiam muita repetição e precisão
considerável.
O século XXI chega com grandes avanços na robótica que fazem com que ela se
apresente como algo cotidiano nesta geração. Tornou-se comum ver robôs industriais
que soldam, pintam e movimentam grandes peças. Robôs que atuam em laboratórios
farmacêuticos, em salas de cirurgias ou nas atividades diárias de pessoas necessitadas de
atenções especiais. Até robôs que procuram e desativam minas, procuram por
sobreviventes em zonas de desastres naturais e realizam tarefas agrícolas:
definitivamente a robótica se instala no entorno trazendo segurança e qualidade.
Para um engenheiro, cujo campo de atuação principal é a indústria, observa-se
um grande benefício advindo da força de trabalho dos robôs. Máquinas autômatas
vieram retirar dos humanos as obrigações em trabalhos perigosos e repetitivos, o que
permitiu grande produtividade. O fato de que os robôs apresentam constância em seu
trabalho permitiu que as fábricas pudessem obter maiores lucros; e sua acurácia maior
reduz drasticamente o desperdício de material.
Dentro deste vasto campo da robótica, os robôs autônomos são caracterizados
como máquinas inteligentes que realizam tarefas em ambientes desfavoráveis ou
desestruturados, sem que haja controle humano explícito sobre seus movimentos.
Dentre os robôs autônomos, podem ser encontrados desde pequenos insetos robóticos
até robôs humanoides altamente sofisticados com inteligência social e consciência de
seu ambiente.
Uma característica fundamental sobre os robôs autônomos é que eles podem
sentir e obter informações sobre seu entorno, podem se movimentar total ou
parcialmente sem assistência humana, bem como evitar situações que são prejudiciais
para si mesmo, para determinados bens ou pessoas. Além disso, um robô autônomo
pode aprender - ou seja, adquirir novas habilidades - ao se adaptar a novas condições
que for submetido, criando novas estratégias para realizar suas tarefas.
Como última prática da disciplina de Laboratório de Automação e Controle, foi
realizado o projeto de construir e programar um robô móvel autônomo que reconheça e
percorra certa trajetória corretamente e consiga localizar e transportar o objeto final. Tal
trajetória que o robô deverá seguir consiste em uma arena dividida em três partes, que
são o percurso em si, a rampa e a sala de resgate.
O percurso (primeira etapa) caracteriza-se em uma trajetória pré estabelecida no
chão da arena, que o robô deverá seguir sem tomar desvios ou atalhos até o final. Na
rampa (segunda parte), o robô estará numa transição entre o percurso e a sala de resgate,

4
apresentando uma certa inclinação. Por fim, a sala de resgate (etapa final) conterá uma
bola de isopor, que o robô deverá reconhecer, capturar e transportar para uma zona de
segurança.
A prova tem uma duração de 5 minutos para sua realização, sendo que, na
primeira etapa (percurso), apresentam-se dois tipos de desafios (gaps e encruzilhadas),
na segunda etapa também se terá um gap, e na terceira etapa o robô deverá localizar a
vítima e conduzi-la para a safe zone. A execução completa da prova gera 500 pontos
equivalentes a 5,0 da nota do projeto final, os quais estão divididos em 260 pontos na
pista, 60 na rampa e 180 na área de resgaste.
No controle do funcionamento do robô de resgate, deverá ser utilizada a
plataforma Arduino, que é muito utilizada atualmente para fins educacionais por sua
facilidade de programação (uso da linguagem C e grande disponibilidade de
bibliotecas), bem como uma vasta documentação em plataformas abertas. Na construção
dos robôs foram utilizados diversos componentes eletrônicos, os quais serão melhor
descritos em uma seção posterior.

5
Processos

Os processos se resumem aos sensores ópticos que determinam a posição do


robô em relação as linhas e a trajetória do robô que é controlada através da tensão
aplicada aos motores. Dependendo da tensão aplicada nos motores da esquerda ou
direita, pode-se definir a direção de movimentação, assim como sua velocidade de
deslocamento.
Uma vez identificada a linha, o robô deverá ajustar a sua posição para continuar
sua trajetória em função das marcações. Na primeira etapa (o percurso), o marcador
preto significa o percurso a ser seguido e o marcador verde indica o sentido que o robô
deve tomar nas encruzilhadas. A figura a seguir mostra o percurso da pista.

Figura 1 - Percurso da pista

Na zona de resgate (terceira etapa), devido à ausência de linhas, o robô tem


como objetivo detectar a vítima, assim como os limites da arena e a localização da safe
zone.

Metodologia

6
Para inicio de projeto, definiu-se que seria utilizado um framework de
desenvolvimento ágil, baseado no scrum, onde inicialmente foi implementado um
brainstorm para levantar as tarefas para um ciclo de desenvolvimento sprint de 15 dias.
Após a finalização deste ciclo de 15 dias, era realizada uma reunião para
desenvolvimento das tarefas do próximo ciclo. Como princípio do desenvolvimento
ágil, não foi necessário fazer um gerenciamento padrão em cascata ou uma divisão de
tarefas tão fixas. Apenas responsáveis por realizar certas tarefas prioritárias em prazos
definidos. Podemos então, para deixar mais claro, listar alguns pontos chaves que
podem simplificar uma visão macro do projeto:
● Equipamentos
● Código
● Construção Mecânica
● PID

Equipamentos

A seguir, apresenta-se uma descrição mais ampla dos componentes utilizados na


construção do robô móvel autônomo desenvolvido pela equipe.

- Servo Motor - 9G SG90: Foi pensado para realizar o movimento do sensor


ultrassônico HC-SR04, de modo que seja possível ter o reconhecimento de toda a área
ao redor para descobrir onde estaria a bolinha para resgate. As especificações estão na
figura abaixo:

Figura 2 - Datasheet Servo Motor

7
Figura 3 - Servo Motor 9G - SG90

- Sensor Ultrassônico HC-SR04: Sensor bastante comum em projetos de arduino,


serve para medir distâncias de dois centímetros até 4 metros, com uma precisão de 3
milímetros. Funciona basicamente com o envio de sinais ultrassônicos que aguarda o
retorno do sinal, com base no tempo de retorno, calcula a distância do objeto, conforme
é mostrado na figura a seguir.

Figura 4 - Funcionamento do Sensor Ultrassônico

Primeiramente é enviado um pulso de 10µs, indicando o início da transmissão de


dados. Depois disso, são enviado 8 pulsos de 40 KHz e o sensor então aguarda o retorno
(em nível alto/high), para determinar a distância entre o sensor e o objeto, utilizando a
equação Distância = (Tempo echo em nível alto * velocidade do som) /2. O programa
usa a biblioteca Ultrasonic.

8
Figura 5 - Gráfico de Funcionamentos

Figura 6 - Datasheet Sensor

- Sensor Óptico Reflexivo TCRT5000: Esse sensor tem 2 componentes no mesmo


suporte : um led infravermelho (cor azul) e um transistor IR(fototransistor - cor preta),
separados por uma pequena "parede". Quando algum objeto se aproxima do sensor, a
luz infravermelha é refletida no objeto, "passa" para o outro lado e ativa o transistor,
como demonstrado na figura abaixo.

9
Figura 7 - Esquema de um Sensor Reflexivo

Figura 8 - Esquema físico de fenômenos que ocorrem num sensor reflexivo

Figura 9 - Datasheet Sensor Reflexivo

10
- Sensor de reconhecimento de cor Módulo TCS230/TCS3200: Distribuídos
uniformemente sobre o sensor reflexivo, esses sensores captam a luminosidade,
filtrando as cores, e geram na saída um sinal de onda quadrada com as informações
sobre a intensidade das cores vermelho, verde e azul. Como no módulo mostrado nas
próximas figuras, o sensor TCS230 geralmente vem montado em conjunto com quatro
leds brancos para iluminação, e oito pinos para conexão. O módulo aceita alimentação
de 3 a 5 volts.

Figura 10 - Sensor de cor

- Bateria HobbyKing 1500mAh Life 3S 9.9V: Para alimentar com qualidade o carro,
era necessário uma bateria boa que não ficasse oscilando ou acabasse muito rápido. A
bateria HobbyKing é bastante condecorada no mercado, tendo servido de forma
satisfatória aos requisitos deste projeto.

Figura 11 - Bateria HobbyKing

11
Figura 12 - Datasheet HobbyKing

- Módulo Ponte H L298N: O CI L298N é muito utilizado para o propósito de controle


de motores, ele nada mais é que uma ponte H em um componente integrado. Uma das
vantagens do uso desse CI é o menor espaço ocupado, a baixa complexidade do circuito
e o fato de ele já possuir dois circuitos H, podendo assim, controlar dois motores. Na
figura a seguir pode-se conferir o diagrama de blocos do CI L298N, retirado de seu
datasheet.
Dentro do projeto, os motores CC precisam ser acionados nos dois sentidos, portanto há
a necessidade de controlar o sentido da corrente fornecida para que o motor inverta o
sentido de rotação. Esse controle é feito pela ponte H, que controla o sentido da corrente
para o motor através da disposição de quatro chaves eletrônicas em que o motor é
posicionado entre elas, de modo que formem uma letra “H”, daí o seu nome.

Figura 13 - Bloco L298N

Agora, também veremos como utilizar esse módulo:

12
Figura 14 - Ponte H

● Motor A e Motor B: Conectores para os dois motores.


● 6-35V: Porta para alimentação da placa com tensão entre 6 a 35V.
● Ativa 5V: Quando jumpeado, a placa utilizará o regulador de tensão integrado para
fornecer 5v (na porta 5v) quando a porta 6-35V estiver sendo alimentada por uma
tensão entre 6 e 35V. Neste caso, não se deve alimentar a porta 5V pois pode
danificar os componentes. A tensão fornecida na porta 5V pode ser usada para
alimentar o Arduino, por exemplo.
● 5V: Em casos de não haver fonte de alimentação com mais de 6V pode-se
alimentar a placa com 5V por esta porta.
● Ativa MA: Quando jumpeado aciona o motor A com velocidade máxima. Para
controlar a velocidade do motor A basta remover o jumper e alimentar o pino com
uma tensão entre 0 e 5V, onde 0V é a velocidade mínima (parado) e 5V a
velocidade máxima.
● Ativa MB: Quando jumpeado aciona o motor B com velocidade máxima. Para
controlar a velocidade do motor B basta remover o jumper e alimentar o pino com
uma tensão entre 0 e 5V, onde 0V é a velocidade mínima (parado) e 5V a
velocidade máxima.
● IN1 e IN2: são utilizados para controlar o sentido do motor A.
● IN3 e IN4: são utilizados para controlar o sentido do motor B.

- Ponte H SBT 0811: Assim como o módulo L298N descrito acima, a SBT0811 tem a
mesma função do L298N,com uma complexidade diferente, porém, funciona bem pois
já veio com o motor de passo. Não conseguimos muitas informações do datasheet.
Segue foto da placa abaixo:

13
Figura 15 - Módulo SBT0811

Motores

Motor de Passo

Um motor de passo é um dispositivo eletromecânico que converte os impulsos elétricos


em movimentos discretos mecânicos. O eixo de um motor de passo gira em incrementos
discretos quando os impulsos de comando elétricos são aplicados a ele na sequência
correta. A rotação dos motores tem várias relações diretas a estes pulsos de entrada
aplicados. A sequência dos impulsos aplicados está diretamente relacionada com a
direção de rotação do eixo do motor, a velocidade de rotação do motor com a frequência
dos impulsos de entrada e o comprimento de rotação com o número de impulsos de
entrada. Ou seja, para controlar o motor de passo precisa-se aplicar tensão a cada uma
das bobinas em sequência específica.

Figura 16 - Fotografia que mostra um motor de passo

Pontos fortes
Os motores de passo possuem como vantagem em relação aos outros tipos de motores
disponíveis os seguintes pontos:
• Seguem uma lógica digital: Diz-se que o motor de passo segue uma lógica digital,
pois seu acionamento é feito através de pulsos elétricos que ativam sequencialmente
suas bobinas, fazendo o rotor se alinhar com as mesmas e assim provocando um
deslocamento do mesmo.

14
• Alta precisão em seu posicionamento: O posicionamento do motor de passo é
preciso uma vez que o rotor sempre se movimentará em ângulos bem determinados,
chamados “passos”, cujo erro de posicionamento é pequeno e não-cumulativo (em geral
5%).
• Precisão no torque aplicado: As variações no torque aplicado por um motor de passo
são pequenas, tendo em vista seu funcionamento.
• Excelente resposta a aceleração e desaceleração: O movimento que um motor de
passo produz é resultado das ativações em sequência de suas bobinas. A resposta para
tais solicitações de aceleração e desaceleração é rápida pois o rotor se alinha
rapidamente com a(s) bobina(s) que se encontra(m) energizada(s).

Pontos fracos
Em relação com outros tipos de motores podemos destacar os seguintes fatos como
desvantagens no uso de motores de passo:
• Baixo desempenho em altas velocidades: O aumento de rotações no motor de passo
(sua aceleração) é gerado pela variação no tempo entre o acionamento de uma bobina e
a seguinte. Entretanto, é necessário um rápido chaveamento de um solenóide energizado
para outro de forma que tal velocidade seja mantida, o que muitas vezes é complexo e
pouco eficiente.
• Requer certo grau de complexidade para ser operado: Pelo fato de usar uma lógica
digital não basta apenas ligar o motor de passo a uma fonte de energia que o mesmo
começará a girar sem parar. Sua complexidade reside no fato de ser necessário um
aparato para controlá-lo ativando sequencialmente seus solenóides. O “custo
computacional” e a complexidade do dispositivo de controle cresce a medida que o
número de passos aumenta, uma vez que mais passos requerem um maior número de
terminais (fios) a serem ativados e controlados.
• Ocorrência de ressonância por controle inadequado: Como todos os objetos que
existem, o motor de passo também tem uma frequência de ressonância. Caso as
revoluções do mesmo se dêem nesta frequência, este pode começar a oscilar, aquecer e
perder passos. Este problema pode ser contornado mudando-se o modo de operação do
motor: utilizando-se meio-passo ou o passo-completo (“full-step”) com as bobinas
energizadas duas a duas.

A tabela a seguir traz uma comparação do motor de passo com outros tipos de
motores comumente utilizados em robôs autônomos (motor CC e servo-motor).

Tabela 1 - Comparação do motor de passo com outros tipos de motores

15
Conectando o motor de passo ao Arduino

Alimentando o motor de passo com +5V e o GND provenientes do Arduino. Na


figura abaixo, pode-se conferir um esquema de ligação das bobinas e cores dos fios do
motor de passo.

Figura 17 - Esquema de ligação das bobinas e cores dos fios do motor de passo

Para utilizar o motor com o programa a ser mostrado, o mesmo foi conectado ao
Arduino na seguinte sequência:

● IN1 ao pino 8 do Arduino


● IN2 ao pino 9 do Arduino
● IN3 ao pino 10 do Arduino
● IN4 ao pino 11 do Arduino

O circuito de ligação do motor ao Arduino ficou como mostrado na figura que segue.

16
Figura 18 - Circuito de ligação motor-Arduino

Figura 19 - Datasheet 28BYJ-48

Para o controle dos motores de passos, foram utilizadas duas placas, sendo elas:
Para a roda direita: Módulo SBT0811

Figura 20 - Placa utilizada para a roda direita

Para a roda esquerda: Módulo L298N

17
Figura 21 - Placa utilizada para a roda esquerda

No que diz respeito à parte de motores, o código implementado pela equipe


ficou da seguinte forma:

Figura 22 - Parte do código implementado que diz respeito aos motores

Pode-se perceber que foi usada a biblioteca AccelStepper do arduino para


controlar o motor de passo, onde "#include Stepper.h" define que deve ser a biblioteca
do arduino. Na segunda linha, foi setado o número de passos por volta do motor que
estiver sendo usado. Em seguida, na linha três (motor direito) e quatro (motor
esquerdo), foi criado uma instância do Stepper definindo os pinos do Arduino que serão
conectados ao circuito do motor.

- Arduino Mega 2560: Foi escolhido como controlador por conseguir rodar tudo que
era necessário e ser acessível. A figura a seguir mostra seu datasheet.

18
Figura 23 - Datasheet do Arduino Mega 2560

Código

O código foi dividido em partes para pode simplificar a explicação do código.


As partes respectivas são: servo e ultrassom, motores (que já foi explicado
anteriormente) e o controlador Proporcional-Integral-Derivativo (PID). Em sua íntegra,
o código implementado está como anexo do presente relatório.

Servo e Ultrassom

Figura 24 - Parte do código relacionada aos servos e ao sensor ultrassônico

O acionamento dos servos pelo sensor ultrassônico é bem simples e intuitivo.


Primeiramente acionamos a biblioteca. Na segunda linha, configura o pino 13 do
Arduino para receber conexão do Echo do sonar. Na terceira linha, configura o pino 12
para gerar o Echo. Na quarta linha foi definida a variável servo. Agora, para as linha 5
e 6 é a parte mais interessante do sensor. Temos um vetor com dois valores, onde um

19
valor está associado a inclinação do servo, e o outro valor é a distância aferida a menor
distância captada pelo ultrassom.

PID

O controle PID é o algoritmo de controle mais utilizado na indústria e foi


universalmente no controle industrial. A popularidade dos controladores PID pode ser
atribuída em uma parte à sua performance robusta em uma grande variedade de
condições de operação e em outra parte à sua simplicidade de funcionamento e
implementação, permitindo que engenheiros utilizem esses controladores de uma
maneira simples e direta.
Como o nome sugere, o algoritmo PID consiste de três coeficientes básicos:
proporcional, integral e derivativo, que são variados de acordo com o sistema
controlado e com a resposta ótima desse sistema a ser obtida. O controle PID é
basicamente um algoritmo matemático, que tem o objetivo de promover o controle
preciso de uma ou mais variáveis em um sistema, permitindo ao mesmo operar de forma
estável e suave no ponto de ajuste desejado(set-point), mesmo ocorrendo variações ou
distúrbios naturais que afetariam sua estabilidade. Sua aplicação pode ser encontrada
em qualquer aplicação que necessite de controle de variáveis contínuas, como: rotação,
pressão, temperatura, etc.
PID = Kp*E + Ki* + Kp*KdS0
Equação do PID

● PID: Variável manipulada.


● Kp: Ganho proporcional.
● Ki: Ganho integral.
● Kd: Ganho derivativo.
● E: Erro ou desvio.
● S0: Saída inicial do controlador.

O erro ou desvio é a diferença entre o valor desejado (set-point) e o valor real da


variável manipulada.
No controlador PID existem 3 ações de controle básicas, onde cada uma dessas
exerce uma função específica no controle da variável de interesse. A ação proporcional
atua direta e fortemente no controlador de acordo com o erro obtido eliminando as
possíveis oscilações da variável, devolvendo o sistema para um estado estável, porém
sem garantir que o sistema retorne ao valor desejado (set-point). A ação proporcional
trabalha corrigindo o erro do sistema, multiplicando o ganho proporcional pelo erro,
dessa forma agindo com uma maior amplitude de correção a fim de manter a

20
estabilidade da variável. No carrinho, a ação proporcional envia um sinal às rodas
fazendo que o carro dê um giro brusco até que atinja um erro próximo de zero.
A ação integral atua para eliminar a diferença entre o estado atual e o set-point
fazendo com que a variável permaneça próximo ao valor desejado para o sistema
mesmo após uma oscilação, ou seja, a variável permanece próximo ao set-point mesmo
que ocorra uma variação brusca nas condições de operação. A ação integral realiza a
integração do erro no tempo, portanto quanto maior for o tempo de permanência do erro
no sistema, maior será a amplitude da ação integral. É importante salientar que se o
controlador for submetido à variações muito bruscas, existe o perigo de ocorrer
saturação do sinal de controle. Se ocorrer a saturação, o loop de malha fechada do
sistema de controle será quebrado causando que um erro seja integrado continuamente
tornando o termo integrativo muito grande. Esse fenômeno é denominado “windup”. A
ação integral se tornou necessária pois o controle proporcional sozinho não garante a
estabilização do sistema de maneira suave e precisa com o set-point. Então o integrador
vai somando os erros suavizando a resposta transitória do sistema até que o mesmo
atinja seu valor desejado, no caso atual, siga a linha.
A ação derivativa é então dita antecipatória ou preditiva e tende a fazer com
que o sistema reaja mais rapidamente. Este fato faz com que a ação derivativa seja
utilizada para a obtenção de respostas transitórias mais rápidas, ou seja, para a melhora
do comportamento dinâmico do sistema em malha fechada. Observe que no caso em
que, em regime permanente, o sinal de erro é constante a ação derivativa será igual a
zero, ou seja, esta ação atua apenas durante a resposta transitória. No carrinho, a ação
derivativa não foi incluída devido ao fato de que o Δt do arduíno ser muito pequeno,
muitas vezes próximo de zero, e dessa forma não estava retornando valores válidos para
o controle. Com isso, para evitar erros e um mau controle do carrinho foi preferido
assumir a constante de ganho derivativo com zero (Kd=0).
Como já foi dito anteriormente, o controlador PID tem um papel fundamental na
resposta transitória do sistema controlado. Para implementá-lo no arduíno é necessário
definir alguns parâmetros antes de rodar o programa. As variáveis double
setpointDireito e double setpointEsquerdo se referem as leituras dos sensores óticos
TCRT5000 instalados na parte inferior do carro que realizam a detecção das cores atuais
do caminho percorrido. Estas definem o set-point do PID que nesse caso é a cor branca,
para tal, antes de colocar o carrinho para funcionar é feita uma análise da superfície
onde o carro vai atuar para definir os valores lidos pelos sensores.
Essa parte do código ainda define algumas variáveis pertinentes para a
determinação do PID, que são as variáveis que armazenam a leitura atual de cada
sensor, a última leitura de cada sensor, o erro, a variação de tempo, o último instante de
tempo em que ocorreu uma leitura (para a ação integral), e algumas variáveis auxiliares
que servirão como contadores.

21
Figura 25 - Parte do código relacionada ao PID

A função double FuctPIDe define o PID para a roda esquerda e tem como
parâmetros de entrada: o set-point previamente determinado, a leitura em tempo real do
sensor, a última leitura feita pelo sensor, e o último instante de tempo em que foi feita
uma leitura. A função millis() informa ao arduíno quanto tempo ele esteve ligado em
funcionamento, com isso pode-se determinar a variação de tempo de cada leitura. Após
isso, o valor do erro é facilmente obtido e em consequência, o valor da constante
proporcional. Agora entramos na parte do controle integral, onde a variável auxiliar ae
funciona como um contador para controlar o campo de atuação do integrador e assim
mais preciso será sua atuação. O vetor Ie armazena a cada leitura o valor da constante
integrativa obtida, para que posteriormente, todos esses valores serem somados na
variável Sie que é de fato a “integral’ feita pelo código. No final, são retornados pela
função os valores de P, SIe, e D, somados.

Figura 26 - Parte do código relacionada ao PID, com a função FuctPIDe

22
A função FuctPIDd é utilizada para o PID da roda direita e é, em estrutura, igual
a função para o controle da roda esquerda. Foi decidido realizar o controle de cada roda
separadamente pois devido a inconsistências e divergências da linha a ser percorrida o
valor de erro do sensor mais à direita do carro vai, em alguns momentos, ser diferentes
do erro obtido pelo sensor mais à esquerda. Como resultado, os valores das constantes
proporcional e integrativa serão diferentes para cada sensor, justificando assim a escolha
pelo controle individual de cada roda. Essa escolha se mostrou ser muito proveitosa,
pois assim, o carro terá uma resposta transitória mais fiel e confiável, tornando o seu
controle mais eficiente e dinâmico. Outro ponto positivo é que com o uso de dois
sensores óticos (um para cada roda) fica limitado o campo de giro do carrinho
aumentando a velocidade com que o mesmo percorre o caminho, evitando que o
programador suponha um ângulo máximo de giro do carro.

Gastos e Divisão de Tarefas

Gastos

Os gastos do projeto totalizaram um valor de R$ 164,60, valor este que foi


dividido da seguinte forma:

Tabela 2 - Componentes adquiridos pela equipe

23
* Equipamentos já possuídos pela equipe

Tabela 3 - Componentes cedidos pela UFPE

Divisão de tarefas

As atividades de cada integrante do grupo foram divididas da seguinte forma:


● Washington: Líder do grupo e responsável pela elaboração do código;
● Matheus: Responsável pela elaboração do relatório e código;
● Walber: Responsável pela elaboração do relatório;
● Caio: Responsável pela compra de componentes extras e construção do robô;
● Henrique: Responsável pela compra de componentes extras e construção do
robô;
● Thales: Responsável pela elaboração do código;
● Ivan: Responsável pela elaboração do código e relatório;
● Lucas: Responsável pela elaboração do código.

Dificuldades Encontradas

24
Montagem e Disposição Espacial das peças no carro
A familiarização com a montagem do carro, a princípio, mostrou-se complicada,
pois o grupo teve que pensar as melhores formas de posicionar os componentes para um
melhor aproveitamento do espaço.

Posição dos sensores mais importantes


A posição para uma melhor captação da linha da pista foi um fator muito
importante, pois o sensor que estar no melhor local para que o robô identificasse todos
os obstáculos da pista, como por exemplo a detecção da cor verde no circuito.

Escolha de uma roda melhor


O grupo teve que mudar a roda, pois a roda que nos foi oferecida não estava
encaixando direito, haja visto que o diâmetro do eixo do motor de passo não era o
mesmo da roda e ficava deslizando na pista de teste. A nova roda utilizada tem uma
melhor aderência com a pista e encaixou bem no diâmetro do eixo do motor por conter
um parafuso prisioneiro que fixa melhor a roda.

Dificuldades com os motores


Desde o começo dos testes tivemos dificuldades com os motores; os que foram
cedidos ao grupo não tinha um controle ideal da rotação para o projeto. Ao constatar tal
fato, o grupo empreendeu uma série de pesquisas e percebeu-se que o motor de passo
serial o ideal para o que o grupo pretendia, como, por exemplo, controlar a rotação
quando necessário, como é o caso da rampa. Porém, ao colocar o motor para funcionar,
ainda observou-se uma série de problemas.

Bug do Serialprint
Antes de iniciar os testes, era necessário fazer um calibragem dos sensores
direito e esquerdo com a utilização da função serial.print. Essa função se não apagada
do código fazia com que o carro ficasse parado e consequentemente foi perdido um bom
tempo para o grupo perceber que era ela que estava gerando esse problema.

Bug da bateria com pouca carga


A bateria LiFe que utilizamos, ao ter a carga pela metade, fazia com que os
motores não funcionassem corretamente, um deles funcionava e o outro não tinha força
suficiente para movimentar o carro.

25
Funcionamento aleatório
Mesmo com carga da bateria 100%, ligamentos corretos, após alguns testes, o
motor não funcionava corretamente; foram várias as vezes que o grupo teve de retirar e
colocar de volta todos os jumpers para que o motor funcionasse corretamente.

Módulos utilizados
A condição perfeita para o robô móvel projetado pela equipe seria a existência
duas placas de ponte H para que os motores pudessem funcionar corretamente; como
apenas um foi disponibilizado e o grupo não conseguiu comprar outro a tempo, foi
utilizado outro módulo. Com isso, o grupo concluiu que tal disparidade nos módulos
utilizados pode ter influenciado nas dificuldades que tivemos com os motores, um
funcionando corretamente e outro não.

Falta de equipamentos necessários para o bom desempenho do carro


Com o surgimento inesperado e frequente de certos problemas (alguns já citados
mais acima), por falta de tempo não foi possível realizar a compra de novos
componentes via internet. Procurou-se contornar tal situação buscando os mesmos em
lojas físicas, mas não obtivemos sucesso.

Dificuldade em localizar o erro (jump solto, código, bateria, problemas nos


motores, sensor, placa, etc.)
Uma boa parte do tempo perdido pela equipe na execução do projeto consistiu
na dificuldade em localizar o erro (podendo ser de natureza física ou computacional).

Breve discussão dos resultados


Como dito acima, houveram vários problemas com o motor de passo. Reunindo
todos os resultados, o grupo constatou que tinha motores de baixa qualidade, obtidos em
locais com baixa qualidade; além disso, pelo fato de não termos mais outra ponte H para
a outra roda, notou-se que os controladores não tinham comportamentos iguais,
comprometendo os resultados, junto com os bugs do serialprint e bateria.
Sendo assim, o grupo se reuniu o final de semana antes da apresentação para
corrigir os erros, porém sem sucesso, no sábado pela manhã, antes de fazer os últimos
testes, ele estava funcionando corretamente, mas após a mudança do conjunto de rodas,
os motores não estavam mais funcionando. Nos reunimos no domingo numa última
tentativa, de novo sem sucesso, refizemos todas as ligações dos jumpers e sem sucesso.

26
Conclusão

O presente trabalho, que consistiu no projeto e construção de um robô móvel


autônomo de resgate, é de suma importância para um discente de engenharia, pois não
só faz com que o conteúdo teórico seja melhor absorvido e compreendido pelo mesmo,
mas também serve para o desenvolvimento de habilidades próprias dele e que lhe serão
de grande importância na sua carreira profissional.
Como exemplo, ao observar um comportamento indesejado do robô, a equipe
inteira teve de lidar com diversas variáveis que podem ter sido causadoras de tal
comportamento: seja a existência de um erro no programa do robô, seja um mal encaixe
de um jumper, ou a bateria do robô pode estar fraca, dentre tantas já previamente
citadas. Todas essas situações constroem uma gama de variáveis a serem ponderadas,
enumerando seus prós e contras, a fim de que a real causa do problema do robô seja
descoberta e, com isso, seja finalmente solucionada.
A equipe tem plena consciência de que esse projeto é similar aos realizados por
equipes de competição de robótica e que não é nada fácil projetar e montar um robô
seguidor de linha com os componentes aos quais se teve acesso; dito isso, não foi uma
tarefa nada fácil conseguir montar um robô móvel autônomo que atendesse os requisitos
e especificações inicialmente pretendidos. Variados problemas (alguns solucionados,
outros não) e a falta de componentes de qualidade - caso dos motores - foram pontos
fundamentais para que o projeto da equipe não ficasse plenamente concluído.
Entretanto, no âmbito da disciplina de Laboratório de Automação e Controle,
sabe-se que o desenvolvimento de tais tipos de robôs traz um grande poder de
fundamentar os conceitos teóricos na forma de verdadeiros laboratórios de engenharia e
de programação. Na ciência da computação e cursos afins (isto é, engenharia de
computação, automação e mecatrônica), esse tipo de disciplina tem o potencial de
trabalhar como complemento de outras matérias de programação avançada,
desenvolvendo projetos que solidifiquem os conceitos, bem como a criatividade, o
trabalho em grupo com limites de prazos e limite de recursos. Destaca-se, por fim, que
tais fatores são de fundamental importância para a futura carreira profissional de um
engenheiro, haja visto que tais fatores são os que são esperados de um engenheiro
sucedido e bom profissional em sua área de atuação.

Referências Bibliográficas

27
BARROS, L. N. Introdução à Inteligência Artificial – Agentes Inteligentes.
Disponível em: https://www.ime.usp.br/~leliane/IAcurso2006/slides/Aula2-agentes-
2006.pdf. Acesso em 15 dez. 2017.
BRITES, F. G.; SANTOS; V. P. A. Motor de Passo - PETele. Disponível em:
https://www.telecom.uff.br/pet/petws/downloads/tutoriais/stepmotor/
stepmotor2k81119.pdf. Acesso em 15 dez. 2017.
CHAVIS, J. The Importance of Robots. Disponível em:
https://www.techwalla.com/articles/the-importance-of-robots. Acesso em 15 dez. 2017.
GARCIA, P. Robôs Autônomos. Disponível em:
https://pedrogarcia12av1.wordpress.com/about/robos-autonomos/. Acesso em 15 dez.
2017.
HOBBYKING 1500mAHLiFe 3S 9.9V Transmitter Pack. Disponível em:
https://hobbyking.com/en_us/hobbyking-1500mah-life-3s-9-9v-transmitter-pack.html?
___store=en_us. Acesso em 15 dez. 2017.
KIATRONICS. 28BYJ-48 – 5V Stepper Motor. Disponível em:
http://img.filipeflop.com/files/download/Datasheet_28BYJ-48.pdf. Acesso em 15 dez.
2017.
SENSOR Óptico Reflexivo TCRT5000. Disponível em:
https://www.arduinoecia.com.br/2013/10/sensor-optico-reflexivo-tcrt5000.html. Acesso
em 15 dez. 2017.
SG90 9g Micro Servo. Disponível em:
http://akizukidenshi.com/download/ds/towerpro/SG90.pdf. Acesso em 15 dez. 2017.
THOMSEN, A. Motor DC com Driver Ponte H L298N. Disponível em:
https://www.filipeflop.com/blog/motor-dc-arduino-ponte-h-l298n/. Acesso em 15 dez.
2017.

Anexo

O código implementado pela equipe no sofware específico do Arduino para o


projeto está mostrado na sua integralidade como segue:

28
//--------------Servo e Ultrassom-----------------------------
#include <Servo.h>
#define echoPin 13 //Pino 13 recebe o pulso do echo
#define trigPin 12 //Pino 12 envia o pulso para gerar o echo
Servo myservo;
float AnguloDitancia[]={1000,1000};
float duration=0;
int pos=0;

//---------------Motores----------------------------------
#include <Stepper.h>
const int stepsPerRevolution=500;
Stepper MotorD(stepsPerRevolution, 2,3,4,5);
Stepper MotorE(stepsPerRevolution, 6,7,8,9);

// --------------------PID------------------------
int Velocidade = 70 ; //30 muito bom
const int InfraDireito =0;
const int InfraEsquerdo =1;

double setpointDireito=3;// definir


double LeituraDireita=0;
double UltimaLeituraDireita=0;
double PIDdir=0;

double setpointEsquerdo=3;// definir


double LeituraEsquerda=0;
double UltimaLeituraEsquerdo=0;
double PIDesq=0;

29
double erro=0;
float deltaT=0;
float UltimoT=0;

double P=0 , Ie[]={0,0,0,0},Id[]={0,0,0,0} , D=0 ;


double KP=0.8 , KI=1.2 , KD=0;
int ad=0;
int ae=0;
double SIe=0;
double SI=0;

//-------------------tcrt500----------
void setup() {
myservo.attach(9);
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
Serial.begin(9600);
}

void loop() {

LeituraDireita = map(analogRead(InfraDireito),0,1023,0,Velocidade);
LeituraEsquerda = map(analogRead(InfraEsquerdo),0,1023,0,Velocidade);

PIDdir= FuctPIDd(setpointDireito,LeituraDireita,UltimaLeituraDireita,UltimoT);
PIDesq =
FuctPIDe(setpointEsquerdo,LeituraEsquerda,UltimaLeituraEsquerdo,UltimoT);

30
UltimaLeituraDireita=LeituraDireita;
UltimaLeituraEsquerdo=LeituraEsquerda;

MotorD.setSpeed(Velocidade);
MotorD.step(1);

MotorE.setSpeed(Velocidade);
MotorE.step(-1);

/*if(-PIDdir<Velocidade){
MotorD.setSpeed(Velocidade+PIDdir);
MotorD.step(1);
}
if(-PIDesq<Velocidade){
MotorE.setSpeed(Velocidade+PIDesq);
MotorE.step(1);
}*/
}

float distancia(){
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
float duration = pulseIn(echoPin,HIGH);
float distancia = duration /58.2;
return(distancia);
}

31
double FuctPIDd(double setpoint , double leitura, double UltimaLeitura,double
Ultimot){
erro=setpoint-leitura;
deltaT=(millis()-UltimoT)/1000.0;
UltimoT=millis();
P = erro*KP;
if(ad==4)
{
ad=0;
}
Id[ad]=(erro*KI)*deltaT;
D = (UltimaLeitura-leitura)*KD/deltaT;
SI=Id[0]+Id[1]+Id[2]+Id[3];
ad++;
return(P+SI+D);
}
double FuctPIDe(double setpoint , double leitura, double UltimaLeitura,double
Ultimot){
erro=setpoint-leitura;
// deltaT=(millis()-UltimoT)/1000.0;
//UltimoT=millis();
P = erro*KP;
if(ae==4)
{
ae=0;
}
Ie[ae]=(erro*KI)*deltaT;
//D = (UltimaLeitura-leitura)*KD/deltaT;
SIe=Ie[0]+Ie[1]+Ie[2]+Ie[3];
ae++;
return(P+SIe+D);

32
}

33

Você também pode gostar