Haz una pregunta
  Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos » Arduino y Raspberry Pi
Foros Registrarse ¿Olvidaste tu contraseña?

Temas similares

29/09/2016 #1


Problemas con control de servos y motores
Hola.
Quiero controlar dos servos y cuatro motores, los servos mediante un joystick y los motores mediante cuatro potenciómetros.
Adjunto el código.
Código PHP:
#include <Servo.h>


/* entradas y descripcion de los motores
del robopingpong  27_07_2016 */

// Pin digital PWM que utilizaremos para alimentar el motor cadencia 
int motorcadencia 3;
// Pin analógico que utilizaremos como entrada de datos de cadencia
int entradacadencia A2;
// Variable que recogerá las lecturas de A2 motor cadencia bolas
int valorcadencia 0;

// Pin digital PWM que utilizaremos para alimentar el motor superior 
int motorsuperior ;
// Pin analógico que utilizaremos como entrada de datos de top spin motor superior
int entrada_mot_sup A3;
// Variable que recogerá las lecturas de A3 força efecte top spin
int valor_mot_sup 0;

 
// Pin digital PWM que utilizaremos para alimentar el motor inferior esquerra 
int motorinferioresquerra 6;
// Pin analógico que utilizaremos como entrada de datos de inferior esquerra
int entrada_mot_inf_esquerra A4;
// Variable que recogerá las lecturas de A4 força efecte esquerra
int valor_mot_inf_esquerra 0;

 
// Pin digital PWM que utilizaremos para alimentar el motor inferior dreta 
int motorinferiordreta 11;
// Pin analógico que utilizaremos como entrada de datos de motor inferior esquerra
int entrada_mot_inf_dreta A5;
// Variable que recogerá las lecturas de A5 força efecte dreta
int valor_mot_inf_dreta 0;
 
 
 
/* aqui configuramos los servos con el joystick  */
 
Servo panServo;//asignamos un eje a un servo y otro eje al otro servo      
Servo tiltServo;      

int servoPanPosition 90;//posición de referencia horizontal
int servoTiltPosition 90// posición de referencia verical
int joystickPanSpeed 0;
int joystickTiltSpeed 0;
int joystickPanPin A0//marcamos entradas analógicas que medirán el ángulo del joystick
int joystickTiltPin A1;
int servoPanPin ;//declaramos los pines digitales por donde le entrará la instrucción del joystick al servo.
int servoTiltPin 10;
// int boton = 8;
 
 
void setup()
{
  
// Configuramos los pines de los motores como salida, aunque no es necesario
  
pinMode(motorcadenciaOUTPUT);
  
pinMode(motorsuperiorOUTPUT);
  
pinMode(motorinferioresquerraOUTPUT);
  
pinMode(motorinferiordretaOUTPUT);
     
  
pinMode(servoPanPinOUTPUT);   //se declara igual que declarariamos un led
  
pinMode(servoTiltPinOUTPUT);  // se declara igual que declarariamos un led
  
panServo.attach(servoPanPin);   //hace mover al servo1
  
tiltServo.attach(servoTiltPin); //hace mover al servo2
}
 
void loop() 
{
  
  
// Leemos el valor en la entrada analógica A2 y se lo asignamos a valorcadencia
  
valorcadencia analogRead(entradacadencia);
  
//hacemos un mapeo de la señal, el valor de la entrada analogica de 0 a 1023 lo transformamos de 0 a 255 señal PWM
  
valorcadencia map(valorcadencia0,1023,0,255); //redondea el resultado entre 0 y 255
  // Determinamos el nivel de salida 
  
analogWrite(motorcadenciavalorcadencia);
  
  
// Leemos el valor en la entrada analógica A3 y se lo asignamos a valor_mot_sup
  
valor_mot_sup analogRead(entrada_mot_sup);
  
//hacemos un mapeo de la señal, el valor de la entrada analogica de 0 a 1023 lo transformamos de 0 a 255 señal PWM
  
valor_mot_sup map(valor_mot_sup0,1023,0,255); //redondea el resultado entre 0 y 255
  // Determinamos el nivel de salida 
  
analogWrite(motorsuperiorvalor_mot_sup);
  
  
// Leemos el valor en la entrada analógica A4 y se lo asignamos a valor_mot_inf_esquerra
  
valor_mot_inf_esquerra analogRead(entrada_mot_inf_esquerra);
  
//hacemos un mapeo de la señal, el valor de la entrada analogica de 0 a 1023 lo transformamos de 0 a 255 señal PWM
  
valor_mot_inf_esquerra map(valor_mot_inf_esquerra0,1023,0,255); //redondea el resultado entre 0 y 255
  // Determinamos el nivel de salida 
  
analogWrite(motorinferioresquerra valor_mot_inf_esquerra);
  
  
// Leemos el valor en la entrada analógica A5 y se lo asignamos a valor_mot_inf_dreta
  
valor_mot_inf_dreta analogRead(entrada_mot_inf_dreta);
  
//hacemos un mapeo de la señal, el valor de la entrada analogica de 0 a 1023 lo transformamos de 0 a 255 señal PWM
  
valor_mot_inf_dreta map(valor_mot_inf_dreta0,1023,0,255); //redondea el resultado entre 0 y 255
  // Determinamos el nivel de salida 
  
analogWrite(motorinferiordretavalor_mot_inf_dreta);
  
  
  
  
joystickPanSpeed = (analogRead(joystickPanPin) - 512) / 100;
    
//  -512 Para proporcionar igualdad de +/- números
  
joystickTiltSpeed = (analogRead(joystickTiltPin) - 512) / -100;
    
// Negativo 50 a la dirección contraria

  
servoPanPosition constrain((servoPanPosition joystickPanSpeed), 50130);
  
servoTiltPosition constrain((servoTiltPosition joystickTiltSpeed), 1179);
    
//  constrarin función para no exceder los límites de servo

  
panServo.write(servoPanPosition);
  
tiltServo.write(servoTiltPosition);

  
delay(80);  // para ajustar la velocidad general del movimiento de los servos  
  

En principio el código es muy simple, leo la lectura de los potenciómetros, hago un map de los valores que dan los potenciómetros en las entradas analógicas y los adapto para que su valor sea de 0 a 255 y el valor los saco por los pines PWM del arduino UNO.

El problema que tengo, yo diría que ruido, (ahora veréis el vídeo), igual estoy controlando un motor y se mueve algún servo, regulo otro motor hasta pararlo y si había alguno con un pwm muy bajo también se para, etc. En el vídeo se puede ver.

los servos los alimento cada uno por separado, con un regulador DC-DC.
Los motores ya que son pequeños los alimento con otro regulador DC-DC, y unos transistores.

¿Alguien me puede ayudar para ver qué pasa y cómo solucionarlo?


Gracias.
30/09/2016 #2


Gracias por poner el código, aun así sin esquemático eléctrico esta difícil buscar mas fallos.
por programa no tengo mirada la librería de servos, pero si que haría la lectura y escritura de las analógicas así:
analogWrite(motorcadencia, analogRead(entradacadencia)/4);

supongo que las salidas irán a transistores que controlaran los motores, y los motores con un diodo en anti-paralelo. Condensadores electrolíticos en la fuente, y algún cerámico cerca del arduino. De todas formas y como te dije antes, sin esquemático imposible
01/10/2016 #3


Si estan los diodos de los anti- paralelo, efectivamente los transistores alimentan los motores los transistores son bd139.
He puesto capacitores de 100nf en alimentaciones, i de 470uF.
Tengo alimentado con 3 reguladores dc-dc, uno para cada servo ya que consumen bastante, y el otro regulador para los 4 motores.
Los cables de los motores están trenzados
Me falta probar poner condensadores de 100nf en los bornes de los motores
El esquema no lo tengo ahora, esta todo montado en una placa de estas perforadas, supongo que esta placa no ayuda para el tema de interferencias
02/10/2016 #4


este es el esquema que he hecho en un principio, ivan dos pulsadores y un buzzer.
El buzzer lo he quitado porque hacia un zumbido raro todo el rato, incluso cuando no había señal en el buzzer.
en el esquema solo ha dos potenciometros (serian los del joystick para controlar los servos)
en el montage real no estan los pulsadores y he añadido 4 potencimetros conectados A2, A3, A4, A5, cada potenciometo controla un motor.
Archivos Adjuntos
Tipo de Archivo: pdf esquema robotpong_V2.PDF (29,8 KB (Kilobytes), 11 visitas)
02/10/2016 #5


pues si, se ve bien el asunto, asi que solo se me ocurre poner un timer entre lecturas analogicas por si te las esta mezclando(no me acuerdo exactamente donde era recomndable ponerlo), o que la fuente de alimentacion no llegue a dar todo lo que tiene que dar, o que los reguladores de tension no lleguen.
02/10/2016 #6


Acabo de probar con condensadores en los motores y ferritas y ahora parece que funciona bien, los servos no se vuelven locos
03/10/2016 #7


¿Por-qué los condensadores electrolíticos en la fuente, qué función tienen?
05/10/2016 #8


La verdad los condensadores electrolíticos creo que su función es que no haga fluctuar la alimentación. Los cerámicos es para colgar el ruido.
No tengo claro si los electrolíticos hubiesen hecho falta.

Enviado desde mi Edison 3 mediante Tapatalk
Respuesta
¿Tienes una mejor respuesta a este tema? ¿Quieres hacerle una pregunta a nuestra comunidad y sus expertos? Registrate

Buscar más temas sobre:
Lupa Arduino y Raspberry Pi

Cerrar
Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos » Arduino y Raspberry Pi

Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO ©2011, Crawlability, Inc.