Escolar Documentos
Profissional Documentos
Cultura Documentos
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
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
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
7
Figura 3 - Servo Motor 9G - SG90
8
Figura 5 - Gráfico de Funcionamentos
9
Figura 7 - Esquema de um 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.
- 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.
11
Figura 12 - Datasheet HobbyKing
12
Figura 14 - Ponte H
- 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
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).
15
Conectando o motor de passo ao Arduino
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:
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
Para o controle dos motores de passos, foram utilizadas duas placas, sendo elas:
Para a roda direita: Módulo SBT0811
17
Figura 21 - Placa utilizada para a roda esquerda
- 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
Servo e Ultrassom
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
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.
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
23
* Equipamentos já possuídos pela equipe
Divisão de tarefas
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.
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.
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.
26
Conclusã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
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;
29
double erro=0;
float deltaT=0;
float UltimoT=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