Jump to content

programação de motor brushless


Recommended Posts


Estou programando com arduino um 4 ESC para controlar 4 motor brushless.

Sem os IF minha programação fuinciona corretamente, oque tem de errado no meu código?

o Código:

#define MINCOMMAND 1000

#define MAXCOMMAND 1400

#define DIRCOMMAND 1600

int motorPinL = 2; // onde L= Lefth , R= Right , U= Up, D= Down

int motorPinU = 4; // por causa de direita e dianteiro

int motorPinD = 6;

int motorPinR = 8;

void setup()

{

pinMode(motorPinL , OUTPUT);

pinMode(motorPinR , OUTPUT);

pinMode(motorPinU , OUTPUT);

pinMode(motorPinD , OUTPUT);

  arm();

}

void arm()

{

  analogWrite(motorPinL, MINCOMMAND / 8);

  analogWrite(motorPinR, MINCOMMAND / 8);

  analogWrite(motorPinU, MINCOMMAND / 8);

  analogWrite(motorPinD, MINCOMMAND / 8);

}

void loop()  {

  int a=0;

  int d=0;

  for(int motorCommand = MINCOMMAND ; motorCommand <= MAXCOMMAND; motorCommand +=5)

  {

    analogWrite(motorPinL, motorCommand / 8); 

    analogWrite(motorPinR, motorCommand / 8);

    analogWrite(motorPinU, motorCommand / 8);

    analogWrite(motorPinD, motorCommand / 8);

  }

  Serial.println(" Digite A,S,D,W"); //D para direita, E para esqueradr F para frente e T para traseira ");

  a=Serial.read();

  d=a+2;

  //delay(1000);

 

Serial.println(d);

  if (d==99)

  {

    for(int motorCommand = MAXCOMMAND ; motorCommand <= motorPinD ; motorCommand +=5)

    {

      analogWrite(motorPinL, motorCommand / 8); 

    }

  }

  if (d==117)

  {

    for(int motorCommand = MAXCOMMAND ; motorCommand <= motorPinD ; motorCommand +=10)

    {

      analogWrite(motorPinD, MINCOMMAND / 8);

    }

  }

  if (d==102)

  {

    for(int motorCommand = MAXCOMMAND ; motorCommand <= motorPinD ; motorCommand +=10)

    {

      analogWrite(motorPinR, motorCommand / 8);

    }

  }

  if (d==121)

  {

    for(int motorCommand = MAXCOMMAND ; motorCommand <= motorPinD ; motorCommand +=10)

    {

      analogWrite(motorPinU, motorCommand / 8);

    }

  }

}

Link to comment
Share on other sites

Antes de mais, sê bem-vindo.

Depois, deves usar tags para código C.

Depois, deves dar uma vista de olhos aqui -> asciitable.com


#define MINCOMMAND 1000
#define MAXCOMMAND 1400
#define DIRCOMMAND 1600


int motorPinL = 2; // onde L= Lefth , R= Right , U= Up, D= Down
int motorPinU = 4; // por causa de direita e dianteiro
int motorPinD = 6;
int motorPinR = 8;


void setup() 
{ 
pinMode(motorPinL , OUTPUT);
pinMode(motorPinR , OUTPUT);
pinMode(motorPinU , OUTPUT);
pinMode(motorPinD , OUTPUT); 
  arm();

} 
void arm()
{
  analogWrite(motorPinL, MINCOMMAND / 8);
  analogWrite(motorPinR, MINCOMMAND / 8);
  analogWrite(motorPinU, MINCOMMAND / 8);
  analogWrite(motorPinD, MINCOMMAND / 8);
}


void loop()  { 


  int a=0;
//  int d=0;//desnecessário

  for(int motorCommand = MINCOMMAND ; motorCommand <= MAXCOMMAND; motorCommand +=5)
  { 
    analogWrite(motorPinL, motorCommand / 8);  
    analogWrite(motorPinR, motorCommand / 8); 
    analogWrite(motorPinU, motorCommand / 8);
    analogWrite(motorPinD, motorCommand / 8); 
  }

  Serial.println(" Digite A,S,D,W"); //D para direita, E para esqueradr F para frente e T para traseira ");

  a=Serial.read();


  //d=a+2; //desnecessário (aqui pelo menos)

  //delay(1000);
  
Serial.println(a);

  if (a=='A') 
  {
    for(int motorCommand = MAXCOMMAND ; motorCommand <= motorPinD ; motorCommand +=5)
    { 
      analogWrite(motorPinL, motorCommand / 8);  

    }
  }

  if (a=='S') 
  {
    for(int motorCommand = MAXCOMMAND ; motorCommand <= motorPinD ; motorCommand +=10)
    { 
      analogWrite(motorPinD, MINCOMMAND / 8);

    }
  }

  if (a=='D')
  {
    for(int motorCommand = MAXCOMMAND ; motorCommand <= motorPinD ; motorCommand +=10)
    { 
      analogWrite(motorPinR, motorCommand / 8); 

    }
  }

  if (a=='W') 
  {
    for(int motorCommand = MAXCOMMAND ; motorCommand <= motorPinD ; motorCommand +=10)
    { 
      analogWrite(motorPinU, motorCommand / 8); 

    }
  }
} 

Isto resolve o teu problema dos ifs... no entanto, o teu problema não é nos ifs. É nas condições do ciclo for, repara:

Para motorCommand = 1400

Enquanto motorCommand (1400) <= motorPinD (6) //Isto é sempre negativo, logo o ciclo não executa

Passo: motorCommand+5 ou +10

O que pretendes fazer com o ciclo for? Uma rampa de aceleração até à velocidade máxima? Nota que mesmo assim a rampa é inexistente. O microcontrolador vai ser mais rápido que a inércia do motor e vais ver o motor a ir quase imediatamente para a velocidade máxima. A não ser, claro, que tenhas uma espécie de delay (ou imenso código) após ou antes destas instruções.

Edit:

Reparei agora no delay(1000). Tenta fazer este controlo de outra forma. Mete um timer a correr e apenas se o timer passar um certo tempo é que corres este código em vez de usares o delay. Isto apenas porque o delay vai estar a comer-te ciclos do processador.

Já agora, isto é para o Arduino... e o serial.read() se não me engano bloqueia.... que pode ser outro problema mais à frente.

include <ai se te avio>

Mãe () {

}

Link to comment
Share on other sites

me desculpa pelos erros sou novo no fórum, pretendo que com esse for controlar a potencia dos motores para que eu possa pelo menos por enquanto controlar a direção do quadricoptero (pelo teclado mesmo) e futuramente adaptar para a função DO.  ALguem tem alguma ideia de como fazer isso. Mudei a programação também agora está da seguinte maneira

int motorPin = 8;
int motor2Pin = 6;
int motor3Pin = 4;
int motor4Pin = 2;

#define MINCOMMAND 1000
#define MAXCOMMAND 1600
#define DIRCOMMAND 2000

void setup()  
{ 
Serial.begin(9600);

  pinMode(motorPin , OUTPUT);
pinMode(motor2Pin , OUTPUT);
pinMode(motor3Pin , OUTPUT);
pinMode(motor4Pin , OUTPUT); 
  arm();
} 


void arm()
{
    analogWrite(motorPin, MINCOMMAND / 8);
    analogWrite(motor2Pin, MINCOMMAND / 8);
    analogWrite(motor3Pin, MINCOMMAND / 8);
    analogWrite(motor4Pin, MINCOMMAND / 8);
}


void loop()  { 
  for(int MC = MINCOMMAND ; MC <= MAXCOMMAND; MC +=10) { 
    analogWrite(motorPin, MC / 8);  
   analogWrite(motor2Pin, MC / 8); 
  analogWrite(motor3Pin, MC / 8);
analogWrite(motor4Pin, MC / 8); 
  
     delay(500);              
  } 



int dir,a=10;


Serial.println(" D para direita, E para esquerda F para frente e W para traseira ");

dir=Serial.read();

Serial.println(a);
delay(1000);


if (dir = 'a') 
{
for(int MC = MAXCOMMAND ; MC <= DIRCOMMAND ; MC +=10)
  { 
   analogWrite(motorPin, MC / 8);  
  Serial.println(dir);
  }
}

if (dir = 's') 
{
for(int MC = MAXCOMMAND ; MC <= DIRCOMMAND ; MC +=10)
  { 
   analogWrite(motor2Pin, MC / 8);
      Serial.println(dir);
  }
}

if (dir = 'w')
{
for(int MC = MAXCOMMAND ; MC <= DIRCOMMAND ; MC +=10)
  { 
    analogWrite(motor3Pin, MC / 8); 
      Serial.println(dir);
  }
}

if (dir = 'd') 
{
for(int MC = MAXCOMMAND ; MC <= DIRCOMMAND ; MC +=10)
  { 
analogWrite(motor4Pin, MC / 8); 
     Serial.println(dir);
  }
}
  } 
Link to comment
Share on other sites

Que Arduino estás a usar?

Se for o Uno/2009 acho que vais ter de mudar algumas coisas... a comecar pelos pinos:

PWM: 3, 5, 6, 9, 10, and 11. Provide 8-bit PWM output with the analogWrite() function.

Que é que o programa não está a fazer?

include <ai se te avio>

Mãe () {

}

Link to comment
Share on other sites

Mesmo sem saber qual é o teu problema, aqui ficam algumas coisas:

Porque é que tens o controlo do motor de 1000 a 2000 e no entanto, divides por 8 antes de dar o comando? Porque não ter o controlo de 125 a 200? E fazeres uma curva de aceleração de 8 em 8 por exemplo... é menos um sítio para teres problemas.

Depois o PWM só vai ser de  bits, logo e apesar de saber que não deve ser esse o problema aqui, podias trocar a variável MC de int para unsigned char.

Outra coisa, podias livrar-te do delay(1000); e veres se existe algum caracter disponível para ser lido pela porta série.

//inicializas a velocidade dos motores. 

if (Serial.available() >0) { //existem caracteres para ler

    dir=Serial.read();

    Serial.println(a);
    //altera a velocidade consoante o caracter. 
}

Fica muito mais eficiente para o microcontrolador e mais rápido a responder ao teu comando.

Por último, o teu código não está a testar se o caracter recebido é 'a', 's', 'w' e 'd'. Está a dar esses valores à variável dir.

if (dir = 'a') 
...
if (dir = 's') 
...
if (dir = 'w')
...
if (dir = 'd') 
//devia ser 

if (dir == 'a') 
...
if (dir == 's') 
...
if (dir == 'w')
...
if (dir == 'd') 


Isto resolve o teu problema? Se fores mais específico relativamente ao que está a acontecer, é muito mais simples de ajudar-te. Assim estou só a tentar adivinhar o que pode estar mal.

include <ai se te avio>

Mãe () {

}

Link to comment
Share on other sites

Vou contarei projeto completo: quadricoptero com vôo programado, com sensores acelerômetro , giroscopio, sonar ultrassonico.  Minha idéia e programar um vôo e os sensores fazer ajustes no vôo

Eu já percebi isso. Mas o que é que aquele pedaço de código que meteste aqui não faz?

include <ai se te avio>

Mãe () {

}

Link to comment
Share on other sites

olhando mais atentamente essa parte aqui tem que ser fora do if correto ?

/inicializas a velocidade dos motores. 

if (Serial.available() >0) { //existem caracteres para ler

    dir=Serial.read();

    Serial.println(a);
    //altera a velocidade consoante o caracter. 
}
Link to comment
Share on other sites

Ok... já experimentaste com LEDs?

Já experimentaste sem usares a porta série para escrever valores de PWM?

Só com um pouco de código e um site que não tem um esquema de ligações, a ajuda que consigo dar não é muita...

Experimenta o que escrevi em cima e posta aqui o resultado.

include <ai se te avio>

Mãe () {

}

Link to comment
Share on other sites

as vezes agente está dentro de um problema e não consegue ver as soluções. Bem acabei de testar com os LED´s, todos eles ficavam ligados, olhei a programação de novo e percebi que no loop eu encerrava ele com um } antes de entrar nos if. Modifiquei isso e com os LED´s obtive o seguinte resultado. A letra que eu aperto faz o led piscar mais forte.

Vou testar agora com os motores. a programação ficou desse jeito.

int motorPin = 8;
int motor2Pin = 6;
int motor3Pin = 4;
int motor4Pin = 2;

#define MINCOMMAND 1000
#define MAXCOMMAND 1600
#define DIRCOMMAND 2000

void setup()  
{ 
Serial.begin(9600);

  pinMode(motorPin , OUTPUT);
pinMode(motor2Pin , OUTPUT);
pinMode(motor3Pin , OUTPUT);
pinMode(motor4Pin , OUTPUT); 
  arm();
} 


void arm()
{
    analogWrite(motorPin, MINCOMMAND / 8);
    analogWrite(motor2Pin, MINCOMMAND / 8);
    analogWrite(motor3Pin, MINCOMMAND / 8);
    analogWrite(motor4Pin, MINCOMMAND / 8);
}


void loop()  { 
  
  for(int MC = MINCOMMAND ; MC <= MAXCOMMAND; MC +=10) { 
    analogWrite(motorPin, MC / 8);  
   analogWrite(motor2Pin, MC / 8); 
  analogWrite(motor3Pin, MC / 8);
analogWrite(motor4Pin, MC / 8); 
  
     delay(500);              

//tirei o } daqui



int dir;


Serial.println(" D para direita, E para esquerda F para frente e W para traseira ");

if (Serial.available() >0) { //existem caracteres para ler

    dir=Serial.read();

    Serial.println(dir);
    //altera a velocidade consoante o caracter. 
}


if (dir == 'a') 
{
for(int MC = MAXCOMMAND ; MC <= DIRCOMMAND ; MC +=10)
  { 
   analogWrite(motorPin, MC / 8);  
  Serial.println(dir);
  }
}

if (dir == 's') 
{
for(int MC = MAXCOMMAND ; MC <= DIRCOMMAND ; MC +=10)
  { 
   analogWrite(motor2Pin, MC / 8);
      Serial.println(dir);
  }
}

if (dir == 'w')
{
for(int MC = MAXCOMMAND ; MC <= DIRCOMMAND ; MC +=10)
  { 
    analogWrite(motor3Pin, MC / 8); 
      Serial.println(dir);
  }
}

if (dir == 'd') 
{
for(int MC = MAXCOMMAND ; MC <= DIRCOMMAND ; MC +=10)
  { 
analogWrite(motor4Pin, MC / 8); 
     Serial.println(dir); 
  }
}
  } } //inseri ele aqui


Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.