|
|
Linha 39: |
Linha 39: |
|
| |
|
| ;[[Seguidor de Linha com controle PID]]: Página Wiki com resumo da '''Teoria de Controle PID''' e de uma forma de implementação deste tipo de controle em um '''Robô Seguidor de Linha'''. | | ;[[Seguidor de Linha com controle PID]]: Página Wiki com resumo da '''Teoria de Controle PID''' e de uma forma de implementação deste tipo de controle em um '''Robô Seguidor de Linha'''. |
|
| |
| ==Programas Exemplo==
| |
| ===Teste do sensor Infra Vermelho===
| |
| <source lang="c">
| |
| //Arduino Sensor Infra Red
| |
| int sensor = 0;
| |
| int leitura = 0;
| |
|
| |
| void setup()
| |
| {
| |
| pinMode(sensor, INPUT);
| |
| Serial.begin(9600);
| |
| }
| |
|
| |
| void loop()
| |
| {
| |
| leitura1 = analogRead(sensor);
| |
| Serial.print("Leitura: ");
| |
| Serial.println(leitura);
| |
| Serial.println();
| |
| delay(1000);
| |
| }
| |
| </source>
| |
|
| |
| ===Teste dos motores com módulo Ponte H L298===
| |
|
| |
| [[Arquivo:PonteH_L298N.jpg|250px]] <ref NAME=FelipeFlop> FelipeFlop. Motor DC com Driver Ponte H L298N, 2013. https://www.filipeflop.com/blog/motor-dc-arduino-ponte-h-l298n/</ref>
| |
|
| |
| <source lang="c">
| |
| //Programa para teste do motor CC com o L293D
| |
|
| |
| //Definicoes pinos Arduino ligados a entrada da Ponte H
| |
| int IN1 = 2;
| |
| int IN2 = 4;
| |
| int IN3 = 7;
| |
| int IN4 = 8;
| |
| int MA = 5;
| |
| int MB = 6;
| |
|
| |
| int velocidade = 200; //Velocidade do motor (0? a 255)
| |
| //Testar velocidade mínima para vencer inércia dos motores
| |
|
| |
| void setup()
| |
| {
| |
| //Define os pinos como saida
| |
| pinMode(IN1, OUTPUT);
| |
| pinMode(IN2, OUTPUT);
| |
| pinMode(IN3, OUTPUT);
| |
| pinMode(IN4, OUTPUT);
| |
| pinMode(MA, OUTPUT);
| |
| pinMode(MB, OUTPUT);
| |
|
| |
| }
| |
|
| |
| void loop()
| |
| {
| |
| //Configura velocidade dos motores
| |
| analogWrite(MA, velocidade);
| |
| analogWrite(MB, velocidade);
| |
| //Aciona o motores
| |
| digitalWrite(IN1, LOW); //A
| |
| digitalWrite(IN2, HIGH); //A
| |
| digitalWrite(IN3, LOW); //B
| |
| digitalWrite(IN4, HIGH); //B
| |
| delay(1000);
| |
| //Pára motores
| |
| digitalWrite(IN1, HIGH);
| |
| digitalWrite(IN2, HIGH);
| |
| digitalWrite(IN3, HIGH);
| |
| digitalWrite(IN4, HIGH);
| |
| delay(1000);
| |
| //Aciona o motores no sentido inverso
| |
| digitalWrite(IN1, HIGH); //A
| |
| digitalWrite(IN2, LOW); //A
| |
| digitalWrite(IN3, HIGH); //B
| |
| digitalWrite(IN4, LOW); //B
| |
| delay(1000);
| |
| //Pára motores
| |
| digitalWrite(IN1, HIGH);
| |
| digitalWrite(IN2, HIGH);
| |
| digitalWrite(IN3, HIGH);
| |
| digitalWrite(IN4, HIGH);
| |
| delay(1000);
| |
| }
| |
| </source>
| |
|
| |
| <!--
| |
| ===Teste do Motor Shield DFrobotic===
| |
| <source lang="c">
| |
| //Arduino Shield DFrobotic
| |
| //PWM Speed Control
| |
|
| |
| int E1 = 5;
| |
| int M1 = 4;
| |
| int E2 = 6;
| |
| int M2 = 7;
| |
|
| |
| void setup()
| |
| {
| |
| pinMode(M1, OUTPUT);
| |
| pinMode(M2, OUTPUT);
| |
| }
| |
|
| |
| void loop()
| |
| {
| |
| int value;
| |
| for(value = 150 ; value <= 250; value+=10)
| |
| {
| |
| digitalWrite(M1,HIGH);
| |
| digitalWrite(M2, HIGH);
| |
| analogWrite(E1, value); //PWM Speed Control
| |
| analogWrite(E2, value); //PWM Speed Control
| |
| delay(30);
| |
| }
| |
| }
| |
| </source>
| |
|
| |
| ===Teste do Motor Shield DKelectronics===
| |
| <source lang="c">
| |
| //Programa : Teste de motor DC12V com motor shield ponte H
| |
| //Autor : Equipe FILIPEFLOP
| |
|
| |
| #include <AFMotor.h>
| |
|
| |
| AF_DCMotor motor1(1); //Seleciona o motor 1
| |
| AF_DCMotor motor2(2); //Seleciona o motor 2
| |
|
| |
| void setup()
| |
| {}
| |
|
| |
| void loop()
| |
| {
| |
| motor1.setSpeed(255); //Define a velocidade maxima
| |
| motor2.setSpeed(255); //Define a velocidade maxima
| |
| motor1.run(FORWARD); //Gira o motor sentido horario
| |
| motor2.run(FORWARD); //Gira o motor sentido horario
| |
|
| |
| delay(5000);
| |
| motor1.setSpeed(0);
| |
| motor2.setSpeed(0);
| |
| motor1.run(RELEASE); //Desliga o motor
| |
| motor2.run(RELEASE); //Desliga o motor
| |
|
| |
| delay(5000);
| |
| motor1.setSpeed(150); //Define velocidade baixa
| |
| motor2.setSpeed(150); //Define velocidade baixa
| |
| motor1.run(BACKWARD); //Gira o motor sentido anti-horario
| |
| motor2.run(BACKWARD); //Gira o motor sentido anti-horario
| |
|
| |
| delay(5000);
| |
| motor1.setSpeed(0);
| |
| motor2.setSpeed(0);
| |
| motor1.run(RELEASE); //Desliga o motor
| |
| motor2.run(RELEASE); //Desliga o motor
| |
|
| |
| delay(5000); //Aguarda 5 segundos e repete o processo
| |
| }
| |
| </source>
| |
| -->
| |
|
| |
| ===Programa Seguidor de Linha 2022===
| |
|
| |
| ;Ponte H: Módulo L298D
| |
|
| |
| <source lang="c">
| |
| //Componentes: Ponte H L298D e sensor InfraRed
| |
| //Programador: Evandro Cantu
| |
|
| |
| //Veriáveis utilizadas
| |
| int sensorEsq, sensorLinha, sensorDir;
| |
| //int sensorFim;
| |
| int velMin = 120, velMed = 180, velMax = 240; //Velocidades dos motores
| |
| int limiar = 400; //limiar do sensor de luz
| |
|
| |
| //Definicoes pinos Arduino ligados a entrada da Ponte H
| |
| int IN1 = 2;
| |
| int IN2 = 4;
| |
| int IN3 = 7;
| |
| int IN4 = 8;
| |
| int MA = 5; //Motor direito
| |
| int MB = 6; //Motor esquerdo
| |
|
| |
| void setup(){
| |
|
| |
| //Define os pinos como saida
| |
| pinMode(IN1, OUTPUT);
| |
| pinMode(IN2, OUTPUT);
| |
| pinMode(IN3, OUTPUT);
| |
| pinMode(IN4, OUTPUT);
| |
| pinMode(MA, OUTPUT);
| |
| pinMode(MB, OUTPUT);
| |
|
| |
| }
| |
|
| |
| void para_frente(int vel) {
| |
| //Configura velocidade dos motores
| |
| analogWrite(MA, vel);
| |
| analogWrite(MB, vel);
| |
| //Aciona o motores
| |
| digitalWrite(IN1, LOW); //A
| |
| digitalWrite(IN2, HIGH); //A
| |
| digitalWrite(IN3, LOW); //B
| |
| digitalWrite(IN4, HIGH); //B
| |
| }
| |
|
| |
| void vira_esquerda(int vel) {
| |
| //MotorA_frente
| |
| analogWrite(MA, vel);
| |
| digitalWrite(IN1, LOW); //A
| |
| digitalWrite(IN2, HIGH); //A
| |
| //MotorB_tras
| |
| analogWrite(MB, vel);
| |
| digitalWrite(IN3, HIGH); //B
| |
| digitalWrite(IN4, LOW); //B
| |
| }
| |
|
| |
| void vira_direita(int vel) {
| |
| //MotorA_tras
| |
| analogWrite(MA, vel);
| |
| digitalWrite(IN1, HIGH); //A
| |
| digitalWrite(IN2, LOW); //A
| |
| //MotorB_frente
| |
| analogWrite(MB, vel);
| |
| digitalWrite(IN3, LOW); //B
| |
| digitalWrite(IN4, HIGH); //B
| |
| }
| |
|
| |
| void segueLinha(){
| |
|
| |
| //le os sensores
| |
| sensorDir = analogRead(2);
| |
| sensorLinha = analogRead(1);
| |
| sensorEsq = analogRead(0);
| |
| //sensorFim = analogRead(3);
| |
|
| |
| //Se estiver na linha segue em frente
| |
| if (sensorLinha < limiar){
| |
| para_frente(velMax);
| |
| }
| |
|
| |
| //Se sensorDir acha linha vire para a direita
| |
| if (sensorDir < limiar && sensorLinha > limiar){
| |
| vira_direita(velMed);
| |
| }
| |
|
| |
| //Se sensorEsq acha linha vire para a esquerda
| |
| if (sensorEsq < limiar && sensorLinha > limiar){
| |
| vira_esquerda(velMed);
| |
| }
| |
|
| |
| }
| |
|
| |
| void loop(){
| |
|
| |
| segueLinha();
| |
|
| |
| }
| |
| </source>
| |
|
| |
| ===Programa Seguidor de Linha V7 2017===
| |
|
| |
| ;Motor Shield: DK Electronics
| |
|
| |
| <source lang="c">
| |
| //Componentes: Motor Shield DKelectronics e sensor InfraRed
| |
| //Programadores: Eduardo Alexandre; Joabe Oliveira; Evandro Cantu
| |
|
| |
| #include <AFMotor.h>
| |
|
| |
| AF_DCMotor motorEsq(2); //Seleciona o motor esquerdo
| |
| AF_DCMotor motorDir(1); //Seleciona o motor direito
| |
|
| |
| int sensorEsq, sensorLinha, sensorDir, sensorFim;
| |
| int contFim = 4; //Conta marcas de início, fim e cruzamentos
| |
| boolean flag = false;
| |
| long tempoTotal; //Tempo total da volta
| |
| int tempoExtra = 2000; //Tempo extra após fim de pista
| |
| int velMin = 80, velMed = 120, velMax = 255; //Velocidades dos motores
| |
| int limiar = 500; //limiar do sensor de cor
| |
|
| |
| void segueLinha(){
| |
|
| |
| //le os sensores
| |
| sensorEsq = analogRead(5);
| |
| sensorLinha = analogRead(4);
| |
| sensorDir = analogRead(3);
| |
| sensorFim = analogRead(1);
| |
|
| |
| //Se estiver na linha segue em frente
| |
| if (sensorLinha < limiar){
| |
| motorEsq.setSpeed(velMax);
| |
| motorEsq.run(FORWARD);
| |
| motorDir.setSpeed(velMax);
| |
| motorDir.run(FORWARD);
| |
| }
| |
|
| |
| //Se sensorDir acha linha vire para a direita
| |
| if (sensorDir < limiar && sensorLinha > limiar){
| |
| motorEsq.setSpeed(velMed);
| |
| motorEsq.run(FORWARD);
| |
| motorDir.setSpeed(velMin);
| |
| motorDir.run(BACKWARD);
| |
| }
| |
|
| |
| //Se sensorEsq acha linha vire para a esquerda
| |
| if (sensorEsq < limiar && sensorLinha > limiar){
| |
| motorDir.setSpeed(velMed);
| |
| motorDir.run(FORWARD);
| |
| motorEsq.setSpeed(velMin);
| |
| motorEsq.run(BACKWARD);
| |
| }
| |
| }
| |
|
| |
| void setup(){
| |
| }
| |
|
| |
| void loop(){
| |
|
| |
| //Segue linha até encontrar marca de fim de pista
| |
| while(contFim > 0){
| |
| segueLinha();
| |
| if (sensorFim < limiar)
| |
| flag = true;
| |
| if (sensorFim > limiar && flag == true){
| |
| flag=false;
| |
| contFim--;
| |
| }
| |
| }
| |
|
| |
| //Segue linha por mais 2 segundos antes de parar
| |
| tempoTotal = millis();
| |
| while((millis() - tempoTotal) < tempoExtra)
| |
| segueLinha();
| |
|
| |
| //Pára motores
| |
| motorDir.run(RELEASE);
| |
| motorEsq.run(RELEASE);
| |
|
| |
| //Espera 10s
| |
| delay(10000);
| |
|
| |
| while(true);
| |
| }
| |
| </source>
| |
|
| |
|
| ==Referências== | | ==Referências== |