Pages: [1]   Go Down
Author Topic: Usando servo+motor DC - Problemas  (Read 532 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 4
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

São Paulo
Offline Offline
Jr. Member
**
Karma: 2
Posts: 87
Open your mind .
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
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
Logged

Arduino Duemilanove
Arduino Mega 2560  
Xbox 360

Offline Offline
Newbie
*
Karma: 0
Posts: 4
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Pages: [1]   Go Up
Jump to: