collapse

* Links de Robótica

* Posts Recentes

Ligar Células de Lithium por Hugu
[Hoje às 02:00]


Encomenda Colectiva N3-2016[@Mouser - Aberta a pedidos!] por Hugu
[Hoje às 01:53]


Printer 3D barata por xmatias
[Ontem às 03:56]


Servidor por almamater
[09 de Dezembro de 2016, 21:39]


mysql server error por andre_f_carvalho
[09 de Dezembro de 2016, 18:56]


Cortar plástico ABS por msr
[05 de Dezembro de 2016, 17:27]


MOVIDO: FPV Drone Racing? por metRo_
[05 de Dezembro de 2016, 10:49]


Módulo gsm por dio123
[04 de Dezembro de 2016, 23:06]


Procuro resistências 220 Ohm de 1% por brunus
[02 de Dezembro de 2016, 15:50]


Package de cond 10uF 35V smd? por KammutierSpule
[02 de Dezembro de 2016, 11:19]

Autor Tópico: Código seguidor de linha  (Lida 1004 vezes)

0 Membros e 1 Visitante estão a ver este tópico.

Offline henriquecm7

  • Mini Robot
  • *
  • Mensagens: 75
Código seguidor de linha
« em: 04 de Junho de 2013, 21:30 »
Boas pessoal.
Estou com um probleminha, tenho um robô que tem que seguir linha, porém ele está com um problema. Ele ameaça seguir linha, mas segue reto antes de completar a curva. Vou deixar abaixo o código para vocês me ajudarem.

Os sensores de linha são 2, um de cada lado da linha preta.
No branco, o valor da em média 124, e no preto da em média 650.

Código: [Seleccione]
#include <QTRSensors.h>
 
#define NUM_SENSORS   4     
#define TIMEOUT       2500 
#define EMITTER_PIN   2   

QTRSensorsRC qtrrc((unsigned char[]) {49, 51,47,53}, NUM_SENSORS, TIMEOUT, EMITTER_PIN);

unsigned int sensorValues[NUM_SENSORS];
int calibrateValue;

// PID STUFF
int mSpeed0 = 45;
int mSpeed1 = 47;
int m0Speed;
int m1Speed;

 // por segurança, variável separada da velocidade que atualmente está nos motores
int m1spd = 0,m2spd = 0;

// variavel que controla a direção pra onde o robô vai (frente-trás)
int m1dir = 1,m2dir = 1;

// pinos dos motores
const int m1fpin = 42,m2fpin = 40,m1bpin =43 ,m2bpin = 41,m1pwm = 4,m2pwm = 3;
float Kp = 0.05;
float Kd = 5;

int error;
int last_error;

void setup()
{
  Serial.begin(9600);
  Calibrate();
  setMotors();
  setVelocity(mSpeed0,mSpeed1);
}


void loop()
{
  int posicao = (int)(Position() + 0.5);
 
  int prop = Kp * posicao;
  int turn = prop + integral;
 
  m1spd = mSpeed1 + turn;
  m2spd = mSpeed2 - turn;
 
  Run();
}

float Position()
{
  qtrrc.read(sensorValues);
  int position_value;
 
  int percentual = ((650 - calibrateValue) / 100);
 
  if(sensorValues[0] < calibrateValue)
    sensorValues[0] = calibrateValue;
   
  if(sensorValues[1] < calibrateValue)
  sensorValues[1] = calibrateValue;
 
  int porcentagem_left = (sensorValues[0] - calibrateValue) / percentual;
  int porcentagem_right = (sensorValues[1] - calibrateValue) / percentual;

  int position_left = -1000 - 10 * porcentagem_left;
  int position_right = 1000 + 10 * porcentagem_right;

  position_value = position_left + position_right;
 
  if (position_value > 1000)
    position_value = 1000;
   
  if (position_value < -1000)
    position_value = -1000;
 
  return position_value;
}

void Calibrate()
{
  qtrrc.read(sensorValues);
 
  float length;
  float value;

  delay(1000);
   
  pinMode(13, OUTPUT);
  digitalWrite(13, HIGH);
   
  while(millis() < 4000)
  {
    for(int i = 0; i < 2; i++ )
    {
      Serial.println(sensorValues[i]);
      value = value + sensorValues[i];
      length++;
    }
  } 
  digitalWrite(13, LOW);
 
  calibrateValue = value / length;
}

void setMotors() {
  pinMode(m1fpin,OUTPUT);
  pinMode(m2fpin,OUTPUT);
  pinMode(m1bpin,OUTPUT);
  pinMode(m2bpin,OUTPUT);
  digitalWrite(m1fpin,HIGH);
  digitalWrite(m2fpin,HIGH);
  digitalWrite(m1bpin,LOW);
  digitalWrite(m2bpin,LOW);
}

void setVelocity(int v1, int v2)
{
  m1spd = v1;
  m2spd = v2;
}

void Run () {
  analogWrite(m1pwm,map(m1spd, 0, 140, 0, 255));
  analogWrite(m2pwm,map(m2spd, 0, 140, 0, 255));
  Serial.println(m1spd);
}

Offline henriquecm7

  • Mini Robot
  • *
  • Mensagens: 75
Re: Código seguidor de linha
« Responder #1 em: 05 de Junho de 2013, 01:22 »
Ajudem-me, o que pode estar causando o problema?