Go Down

Topic: Usando servo+motor DC - Problemas (Read 590 times) previous topic - next topic

cinema8mm

Amigos

Vou montar um carro fazendo o chassi com o Rasti (www.rasti.com.ar)

No kit tem caixa de transmissão, rodas, eixos (montei muitos modelos lá nos anos 80, é tipo Lego, mas mais barato e mais modular, já que são poucas peças básicas)

Tem no ML e um kit custa barato

No meu projeto, no entanto, vou acionar um motor DC, e um servo, que vai controlar o eixo dianteiro. Uma vez dominado essa parte, farei os sensores atuarem e alguma inteligência para superar obstáculos

Sei que é mais fácil usar dois motores e tração diferencial. Mas decidi montar esse esquema, e vou estudar até o fim

Enfim, montei o prototipo, controlando um motor DC com um potenciômetro, e o servo com outro potenciômetro. Em separado eles rodam bem, mas juntos o servo trava, e o motor não funciona

Já descobri que quando o servo atua, algumas saídas ficam fora do ar na função PWM. Até achei que era problema de como as rotinas eram executadas, que a rotina do servo travava o motor, e programei de diversas maneiras, mas o treco não vai...

Abaixo o código que estou usando:

/*
* Rodando motor e servo
*/

#include <Servo.h>

Servo myservo;                      //Create servo object to control a servo

int pinopotservo = A0;              //Define porta analogica de entrada do potenciometro de controle do servo
int val;                            //Armazena valor lido do potenciometro do servo

int pinomotor = 6;                 //Pino ligado a base do transistor
int pinopotmotor = A5;              //Define porta analogica de entrada do potenciometro de controle do motor
int valorpotmotor = 0;              //Armazena valor lido do potenciometro do motor, entre 0 e 1023
float rotacaomotor = 0;             //Valor de rotacao do motor

void setup()                   
{
  myservo.attach(3);               //Define a porta de saida para o sinal de controle do servo
 
  pinMode(pinomotor, OUTPUT);      //Define o pino do motor como saída
  pinMode(pinopotmotor, INPUT);    //Define o pino do potenciometro do motor como entrada
  pinMode(pinopotservo, INPUT);    //Define o pino do potenciometro do servo como entrada
}

int motor() {
  valorpotmotor = analogRead(pinopotmotor);             //Le o valor - analogico - do pino do potenciometro
  rotacaomotor = map(valorpotmotor, 0, 1023, 50, 255);  //Converte e atribui para a variavel "rotacao" o valor lido do potenciometro - detalhe que o valor minimo impede a parada do motor
  analogWrite(pinomotor, rotacaomotor);                 //Envia sinal analogico para a saída do motor, com rotacao variavel
}

int servo() {
  val = analogRead(pinopotservo);      //Le o valor do potenciometro (valores entre 0 e 1023)
  val = map(val, 0, 1023, 46, 134);     //Converte o valor pra ser usado no servo (valores entre 0 e 180) aqui se define quantos graus o servo se move para cada lado
  myservo.write(val);                  //Move o eixo do servo, de acordo com o angulo 
}

void loop()                           
{
  motor();
  servo();
}

Alguem tem alguma idéia do que ocorre? O motor esta ligado via BC 548, e fonte externa, e o servo nos 5 volts do Arduino

ViniciusTech

Nunca soube de nada em relação a biblioteca do servo "atrapalharem" as outras portas PWM, porem não gosto muito dessa lib pois ela usa o timer de 16 e atrapalha o virtualwire para usar junto ao contrario de algumas outras.

Acho que no seu código você não pode fazer isso :

Code: [Select]
int servo() {
  val = analogRead(pinopotservo);      //Le o valor do potenciometro (valores entre 0 e 1023)
  val = map([color=red]val[/color], 0, 1023, 46, 134);     //Converte o valor pra ser usado no servo (valores entre 0 e 180) aqui se define quantos graus o servo se move para cada lado
  myservo.write(val);                  //Move o eixo do servo, de acordo com o angulo 
}


como pode observar você atribui o map da variável val a própria variável val , ACHO que isso pode gerar algum erro.

Verifique se a corrente da sua fonte externa suporta o motor DC.
Cuidado com as portas PWM do arduino, no máximo 40ma
Arduino Duemilanove
Arduino Mega 2560  
Xbox 360

cinema8mm

Olá, obrigado pela dica

Peguei esse código do servo do próprio Arduino, faz parte dos exemplos. O duro é que sozinho ele funciona bem, se desconectar o motor, o o servo funciona 100%, e se desconectar o servo, o motor funciona 100% como quero

Vou alterar a variável e testar. Vou reportar o resultado

Go Up