Usando servo+motor DC - Problemas

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

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 :

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

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