Coche RC más brazo robótico - Dudas

Buenas,

Sigo aprendiendo electrónica y Arduino y después de hacer algunos pequeños ejercicios quiero hacer mi primer proyecto. Pero tengo muchas dudas, sobre todo en hardware y cómo alimentar todos los componentes.

Es básicamente un coche a radiocontrol controlado por un mando de un PlayStation 2, para añadir algo más de dificultad me gustaría montarle también un brazo mecánico que controlaré también con el mando de la PS2.

Os pongo los componentes que tengo pensado usar, no sé si todos son necesarios o pondríais otros, estoy abierto a sugerencias ya que podéis comprobar ando muy perdido, jeje

He intentado buscar el consumo de cada componente, pero algunos como los servos no he conseguido ver bien cuál es su consumo. y no sé si habré buscado bien el del resto que he encontrado.

Componente Número Límite Consumo Consumo Total
Power supply module 1 máx 700 mA
Driver L293D 1
Motores CC 2 250 mA 500 mA
Motor paso a paso 28BYJ 1 55mA 55mA
Módulo ULN2003 1 máx 500 mA
Servomotor SG90 3
Arduino MEGA 1
Receptor mando PS2 1

Os pongo un dibujo de cómo querría montarlo, perdonad si no se ve muy bien, estoy intentando aprender a usar algún simulador web como TinkerCad pero no veo que estén todos los componentes. (no está dibujado en detalle todas los conexiones, solo los componentes que usaría y como los conectaría entre sí )

Mis dudas:

1- ¿Cómo calculáis la alimentación que necesitáis para vuestros proyectos? ¿Sumáis el amperaje de todos los componentes?

2- Tenía pensado usar un módulo "Power Supply" para los motores de DC de las ruedas, así me recomienda la kit de iniciación que compré y usar un módulo L293D para controlar los motores.
¿ Alimentar esto en una mini protoboard con una pila de 9V estaría bien?

3- Por otro lado necesito un motor paso a paso para controlar el giro del brazo robótico y luego 3
servos para las articulaciones del brazo. Creo que es mucho para alimentarlo con la otra pila,no? Así que he pensado utilizar otro proto y ponerlo todo ahí con otra pila a parte. No sé si con una de 9 V valdría o 4 de 1,5V en serie.

En caso de usar dos protos con alimentaciones por separado ¿Debería unir sus tierras y las del arduino?

4- El receptor de la PS2 usa como alimentación 3,3 V así que tenía pensado alimentarlo directamente desde el arduino.

5- ¿Cómo alimento el propio arduino? Necesito otra fuente a parte, o puedo usar alguna de las dos protoboards.

Bueno, como veis tengo un jaleo importante en la cabeza, se agradecería cualquier sugerencia antes de empezar a montar todo esto, si pensáis que es mejor montar todo de otra forma o sobra/falta algo decidme, por favor.

Gracias por adelantado.

A priori si.
Pero.. hay que tener en cuenta si todas las alimentaciones son iguales.
Es posible que uses una única alimentación de una tensión X (generalmente que te permita alimentar los dispositivos sin comprometerlos) y corriente tal que sea la suma de sus consumos.
En este sentido un Arduino como el MEGA con 7V esta bien alimentado.
Pero tienes servos y los servos no deben alimentarse desde el MEGA o el Arduino en general sino desde fuera.
Entonces una fuente que alimente el MEGA y sensores que consuman poco es una opción y de hecho la que mas recomendamos. Y otra fuente de 5 o 6V para los servos.
En este caso se comparte GND (el negativo) con el GND del MEGA y todo funcionará sin problemas. Esta fuente de los servos obviamente debe proveer la corriente que consuman los servos cuando estan a máxima carga. Señalo esto porque hay 3 consumos en un servo, el que tiene en reposo, el que tiene habitualmente moviendose y el que presenta cuando esta trabado.

No uses baterias de 9V porque son caras y mas allá que inicialmente funcionarán, luego su reemplazo dolerá a tu bolsillo. Ya que estas aprendiendo considera usar baterias LiPO de 7.4V que te daran mas autonomía de tu RC y podrás recargarlas siempre y cuando tengas algunas cosas en claro, basicamente no permitir que la bateria se descargue mas alla de cierto valor, algo que solo se puede respetar usando cargadores con protección.

Y si.. ya se esta volviendo un proyecto algo pretensioso pero es posible.
Olvidemos la LIPO tal vez y puedes considerar una bateria mas pesada de Gel. 12V 7Ah o una de 12V 4Ah. Esto vamos a ponerlo con un signo de pregunta por el peso, solo tiro ideas u opciones.

NO USES PROTOS y mira como lo escribo. No hagas nunca cosas con elementos en movimiento usando protoboards porque fallarán los contactos y estarás dias preguntando en este foro porque no me funciona si ayer lo hacía... y resulta que era un mal contacto.
Usa placas PCB para prototipos y suelda las conexiones.

El arduino solo provee 60mA (ahora los clones MEGA vienen con alimentaciones de 150mA en 3.3V) en sus 3.3V no se si es buena idea usarlo, si es un CLON tal vez lo sea, si es original no. No se cuanto consume el receptor. Ya responderemos esto.

Los arduinos (todos) tienen una entrada VIN donde puedes conectar la entrada positiva de una fuente.

Creo haber respondido todo.
Respecto de la bateria queda determinar de acuerdo al consumo global si usar una batería LiPO de 7.4V con mAh a determinar o una bateria mas pesada de GEL

Muchas gracias por responder. Voy a revisar lo que comentas y voy montando el proyecto, ya os pondré avances.

El Arduino es un clon de la empresa Elegoo.

Estoy viendo el tema de las baterías. Pero son muy pesadas, no?
Esta, por ejemplo, ¿valdría ?

Batería

Porque para este proyecto de aprendizaje/iniciación ¿No valdría con pilas recargables? Montar algo así como 4 de 1,5v en serie con otras 4 en paralelo para tener 6v y más mA ?

usaré las proto solo para pruebas y luego ya soldaré en las PCB, así estreno el soldador qué compré, a ver qué tal se me da.

Muchas gracias de nuevo, iré poniendo avances

Si esa bateria te valdria ,pero considera que necesitaras un cargador un poca mas especializado para ella, piensa en baterias lipo 18650 que como bien dices:

Logras tus propositos . y los cargadores son realmente baratos. Por ejemplo uno delos multiples que existen:
https://es.aliexpress.com/item/1005002369756124.html
Supongo que el motor paso a paso es para mover el brazo los 360º. ¿has considerado que ese movimiento ya lo tienes ), ese giro te lo dan los motores del coche, poniendo los de un lado marcha alante y los del otro lado marcha atras, el coche gira sobre su propio eje. yo cambiaria ese motor por otro servo, para el ajuste "fino" final del giro.
Nada que objetar a lo que dice @Surbyte en todo tiene razon, solo se le ha olvidado que la comunicacion entre el receptor de 3,3v y los 5v necesitara un adaptador de señal . Y no creo que el consumo de ese rececptor sea muy alto, en todo lo que he leido se conecta a la salida de3,3 del arduino, que parece ser suficiente . Mira un ejemplo:

Y esto es solo ua opinion personal, un coche con dos motores gira mal lo habitual es usar 4 para un giro perfecto , si vas a dos motores es mas normal usar un chasis de oruga tipo tanque.
Saludos

Hola, en realidad compré un pack de 4 ruedas y 4 motores, vi en algunos ejemplos que se usaban dos solo, por eso he puesto solo dos en mi idea.
Además usando 4 necesito otro puente H y más alimentación no?

Le daré una vuelta a lo que me ponéis, muchas gracias por la info.

Mas corriente si, otro puente en H no en principio, los dos motores de un lado van conectados en paralelo al mismo puente. Depende de lo que consuman tus motores quizas el l293d (600mA max.), no sea suficiente y tengas que usar otro el L298N por ejemplo.
saludos.

Bueno, primera parte "terminada".

Al final he usado una betería LiPo. La he pegado con velcro, no está demasiado bien sujeta, pero bueno, para este primer proyecto lo dejo así.

He usado un L298N en vez del L293D que tenía para usar los 4 motores en vez de dos como tenía pensado al principio.

Los cables de la batería los tenía puestos antes directamente al L298N y de ahí sacaba uno al VIN del arduino. Ahora he puesto una mino proto, porque tengo pensado conectar desde aquí los Servos del brazo mecánico cuando lo ponga.

Si veis que algo está mal hecho o podría mejorarse de otra manera decidme, que esto es para aprender!

¿Sería bueno haber puesto un fusible en el cable de la batería?

Bueno, cuando tenga hecha la segunda parte del proyecto con el brazo mecánico lo subo.

Os pego el código, no está muy bien hecho porque el mando que compré en Aliexpress no va muy allá. Detecta botones pulsados cuando no he pulsado nada ni tampoco detecta bien la lectura analógica para saber cuánto tiempo se tiene pulsado un botón para según eso dar más potencia o no a los motores.
Quería controlar el coche usando solo el joystick, sin pulsar ningún botón, pero no lee bien del todo el joystick tampoco... :confused: así que nada os pego el código un poco hecho de aquella manera.

#include <PS2X_lib.h>

PS2X ps2x;
int error = 0; 
//byte type = 0;
byte vibrate = 0;

int IN1 = 7;
int IN2 = 8;
int IN3 = 12;
int IN4 = 13;
int ENA = 6;
int ENB = 11;

void motores(int v,int m1,int m2);

void setup() 
{
  pinMode(IN1,OUTPUT);
  pinMode(IN2,OUTPUT);
  pinMode(IN3,OUTPUT);
  pinMode(IN4,OUTPUT);
  pinMode(ENA,OUTPUT);
  pinMode(ENB,OUTPUT);

   Serial.begin(9600);
  
   delay(300); // se añade algo de tiempo para dejar que se conecte el mando inalámbrico antes de configurarlo
   error = ps2x.config_gamepad(41,31,37,29, false, false);  //(clock, command, attention, data)
    
   if(error == 0){
    Serial.println("Mando encontrado y configurado correctamente"); }
   else Serial.println("Mando no encontrado");
    
}

void loop() 
{

  int  ruedas_izq_ena;
  int  ruedas_dcha_enb;
  

 // Si hubo error al detectar el mando no entramos en el bucle
   if (error!=0) return;

    //Leemos teclas pulsadas
    ps2x.read_gamepad(false, vibrate); 
      
// -------------------------------------------------------------------------------------
// -------------------------------------------------------------------------------------
 // Motores
// -------------------------------------------------------------------------------------
// ------------------------------------------------------------------------------------- 
 // Comprobamos si se ha pulsado alguna de las teclas que controla los motores
 // concatenamos IF para dar prioridad a los primeros botones que se pongams en este código:

 // -------------------------------------------------------------------------------------
    if(ps2x.Button(PSB_PAD_UP)){
      
       Serial.println("has pulsado flecha arriba");
       //Giramos el coche
          digitalWrite(IN1,HIGH);
          digitalWrite(IN2,LOW);
          digitalWrite(IN3,HIGH);
          digitalWrite(IN4,LOW);
          //Potencia de ruedas
          analogWrite(ENA,200);
          analogWrite(ENB,200);
      }
// -------------------------------------------------------------------------------------      
    else if(ps2x.Button(PSB_PAD_DOWN)){
      
       Serial.println("has pulsado flecha abajo");
         //Giramos el coche en el otro sentido
          digitalWrite(IN1,LOW);
          digitalWrite(IN2,HIGH);
          digitalWrite(IN3,LOW);
          digitalWrite(IN4,HIGH);
          //Potencia de ruedas
          analogWrite(ENA,200);
          analogWrite(ENB,200);
       
      }
// -------------------------------------------------------------------------------------      
    else if(ps2x.Button(PSB_BLUE)){
       Serial.println("has pulsado X, nos movemos hacia adelante");

      //Con X pulsado el coche anda hacia adelante
        digitalWrite(IN1,HIGH);
        digitalWrite(IN2,LOW);
        digitalWrite(IN3,LOW);
        digitalWrite(IN4,HIGH);
                
      // lo ideal sería ver cuánto tiempo se ha pulsado X para dar más o menos potencia
      // con una sentencia tal que así: tiempo = ps2x.Analog(PSAB_BLUE),DEC;
      // pero este mando de Aliexpress no funciona muy bien y no detecta el PSAB_BLUE
      // Así que damos potencia máxima siempre...
        ruedas_izq_ena = ruedas_dcha_enb = 255;

      //Comprobar si mientras tenemos X pulsado vamos a la izq o derecha
      //Para disminuir la potencia de esas ruedas y que gire
      if(ps2x.Button(PSB_PAD_RIGHT)) ruedas_dcha_enb = 50;
      else if(ps2x.Button(PSB_PAD_LEFT)) ruedas_izq_ena = 50;
      
      //Potencia de ruedas
      analogWrite(ENA,ruedas_izq_ena);
      analogWrite(ENB,ruedas_dcha_enb);
       
      }
// -------------------------------------------------------------------------------------      
    else if(ps2x.Button(PSB_RED)){
       Serial.println("has pulsado círculo, nos movemos hacia atrás");

        digitalWrite(IN1,LOW);
        digitalWrite(IN2,HIGH);
        digitalWrite(IN3,HIGH);
        digitalWrite(IN4,LOW);
        
      if(ps2x.Button(PSB_PAD_RIGHT)) ruedas_izq_ena = 200;
      else if(ps2x.Button(PSB_PAD_LEFT)) ruedas_dcha_enb = 200;
      
      //Potencia de ruedas
      analogWrite(ENA,ruedas_izq_ena);
      analogWrite(ENB,ruedas_dcha_enb);       
       
      }
// -------------------------------------------------------------------------------------      
    else {
      // Serial.println("No has pulsado ningún botón para controlar los motores; los apagamos");
        digitalWrite(IN1,LOW);
        digitalWrite(IN2,LOW);
        digitalWrite(IN3,LOW);
        digitalWrite(IN4,LOW);
        analogWrite(ENA,0);
        analogWrite(ENB,0);       
      }

// -------------------------------------------------------------------------------------
// -------------------------------------------------------------------------------------
// Brazo mecánico
// -------------------------------------------------------------------------------------
// -------------------------------------------------------------------------------------
        //PENDIENTE de hace esta parte !!!
        

// -------------------------------------------------------------------------------------

    delay(50); //Dar algo de tiempo en cada vuelta...
    
}
  • No le has puestos conversores de nivel . Recuerda que el receptor va a 3,3 y el mega a 5V, lo mismo es por eso.
  • Por lo huecos que has dejado imagino donde va ha ir el brazo robot. en esa posicion cuando intentes extenderlo y coger un peso te va a levantar la rueda posterior izquierda. Su lugar ideal es el centro de apoyo del conjunto, mas o menos donde tienes el chip del mega. Yo antes de sguir me replantearia bien la disposicion de los componentes.

Saludos.

Gracias por comentar.

No sabía que necesitaba un conversor de nivel, estoy alimentando el receptor desde la salida de 3.3v del Arduino ¿Con eso no vale?

En cuanto al brazo mecánico tienes razón, estaba pensando dónde ponerlo y solo me queda ese hueco y también he pensado que no es la mejor posición por lo que dices del peso.
Así que estaba pensando en poner otra tabla como en otro nivel superior con el brazo, ya veré cómo lo planteo, este es un primer proyecto de aprendizaje y lo estoy haciendo un poco a base de prueba y error.

Ya iré subiendo dudas o actualizaciones cuando vaya avanzando.

Gracias por adelantado por cualquier consejo que me deis.

No, no vale ,Leete el link que te puse en el post #4 alli lo explica.
Bueno como principio tiene muy buena pinta...¿ tienes un link al brazo que le vas a poner?.

Ok, le echaré un vistazo al link.
No tengo claro que brazo robótico usaré, estoy buscando info, usaré 4 servos.
La parte de la pinza es la que tengo más dudas, buscaré vídeos a ver cómo lo han hecho otras personas

Estoy leyendo el link y entiendo la lógica de usar ese convertidor de señal, pero veo que en la gran mayoría de ejemplos que busco en Google de uso de mandos de ps2 y Arduino lo conectan directamente al pin de 3,3v
¿Podrías explicarme, así groso modo, qué diferencia hay? ¿Por qué no debería usar el pin de 3,3?

Entiendo que es porque con el pin de Arduino solo estás usando esa alimentación de 3,3v pero con el convertidor adaptas no solo la señal de voltaje si no el resto se señales de los otros pines, que podrían verse alteradas con la otra entrada, o algo así no?

Muchas gracias

Hola @ricrom, aunque ya he visto que has descartado poner pilas en paralelo solo comentarte que si en algun momento pones pilas en paralelo debes protegerlas para que no se descargen una sobre la otra, una opcion es ponerles un diodo en serie en el positivo aunque el diodo te producira una caida de tension de unos 0,7V, y la otra opcion es independizarlas con un interruptor de dos posiciones y dos circuitos.
imagen

En cuanto a esos motores yo he tenido algunas experiencias desagradables por las interferencias que pueden producir sobre el arduino, lo aconsejable es ponerles en las mismas bornas de cada motor al menos un condensador de 100nF, yo que soy muy exagerado ademas les pongo otro condensador de 100nF entre cada borna y la carcasa del motor.
imagen

Conectas al pin 3.3V para darle alimentación al módulo, eso está bien, el problema es que las 4 señales que necesitas, del lado del arduino son de 5V y por eso necesita los conversores, para no dañar las entradas del módulo que trabaja a 3.3V.

Saludos

Internet esta lleno de personas que publican cosas solo por hacerlo y no tienen idea de electrónica.
No usan conversores porque se plagian entre ellos y hasta copian los errores.
La gente en Youtube quiere tener seguidores y no importa cómo.
Si sigues a alguien en particular y yo lo hago como todos, verás como el mismo tema se repite en muchas otras personas.
Presta atención a los consejos que te damos en este foro porque son para tu beneficio.

El receptor PS2 requiere el conversor de nivel SI O SI.

El pin de 3.3V del Arduino es para algún sensor y nada más. Si excedes la corriente que puede sumiistrar te quedas sin conversor USB a Serie y entonces tendrás que comprar otro Arduino o usar otro método para subirle códigos y no te va a gustar.
En algunos casos suministra 60 mA (viejos Arduinos originales) y en otros 150mA (clones)

En este tutorial de Luis Llamas se ve como hacerlo debidamente, recomiendo su lectura.

Y se agradecen, os haré caso, claro, por eso estoy aquí, para aprender! Os pido paciencia, porque aunque intentaré buscar info antes de preguntar muchas de las cosas que pregunte serán algo básicas seguro...

Ya os iré preguntando más y cualquier consejo o crítica constructiva es más que bienvenida !

Ya he comprado unos conversores de nivel de estos. Voy a rediseñar el coche para poner un poco todo en orden. Ya iré subiendo avances.

Entonces, para aclararme del todo, el conversor de nivel se usa para: convertir entre señales de 5 y 3,3v, además, protege el Arduino por si no puede suministrar todo la corriente que pide el receptor y el receptor para no entregarle más voltaje del necesario.
Entiendo que, Arduino trabaja con señales digitales 0v ->LOW y 5v ->HIGH y el receptor 0-LOW y 3,3 ->HIGH y convierte unas en otras para el correcto funcionamiento por ambos lados, no?

Vale,acabo encontrar otro tutorial de Luis llamas explicando lo de los conversores de nivel.
Voy a buscar algo más de info para no daros muchos la tabarra y preguntar solo lo importante.

Señal no es alimentación. En el ejemplo de Luis Llamas ese dispositivo tenia algo extra o permitía usarlo para alimentar pero es un caso particular.
Señal es para las entradas/salidas digitales.
Y siempre ten respeto por los 3.3V disponibles en el Arduino.
No he podido encontrar cuanto consume el receptor PS2. Debe ser poco asi que tal vez exageremos en cuanto a su consumo y sea posible alimentarlo con alguna alimentación del arduino.
Repito, no se cuánto consume!!
Habría que medirlo.
Tester en modo amperímetro o sea en serie y puedes ver los mA que consume.

Recien medidos, ese chisme consume 23 mA intentando hacer la conexion con el mando, que caen a 12mA una vez hecha. unos 30 mA tirando muy alto conectando los puertos de comunicaciones.

Bueno, ese consumo puede ser soportado tranquilamente por el Arduino.