Manufactura industrial
Internet industrial de las cosas | Materiales industriales | Mantenimiento y reparación de equipos | Programación industrial |
home  MfgRobots >> Manufactura industrial >  >> Manufacturing Technology >> Proceso de manufactura

Crea tu primer robot Arduino:¡la mejor guía para principiantes!

Componentes y suministros

Arduino UNO
× 1
Adafruit L293D Motor Shield
Es un dispositivo de bajo costo y fácil de usar. Es un escudo motor comúnmente disponible que no requiere ninguna habilidad previa. También se puede programar fácilmente usando la biblioteca Adafruit.
× 1
Sensor ultrasónico HC-SR4
× 1
Módulo Bluetooth HC-05
× 1
Motorreductor
× 2
Rueda
× 2
Rueda giratoria
× 2
batería de 9V (genérica)
× 3
Clip de batería de 9V
× 3
Cables de puente hembra / hembra
× 8
Caja de plástico
× 1

Herramientas y máquinas necesarias

Soldador (genérico)
Pistola de pegamento caliente (genérica)
Destornillador

Aplicaciones y servicios en línea

Electrónica Bluetooth
Arduino IDE
Biblioteca Adafruit-Motor-Shield

Acerca de este proyecto

Si eres un principiante en Arduino y tienes un plan para hacer tu primer robot, aquí tienes el tutorial. Mira las imágenes de lo que vas a construir hoy.

En este tutorial voy a mostrar cómo hacer un robot Arduino con diferentes funcionalidades. Podemos aprender el uso de diferentes programas para diferentes funciones, principalmente un robot controlado por teléfono inteligente con evitador de obstáculos, seguidor de paredes y solucionador de laberintos. O también puede hacerlo para una sola función.

Materiales y herramientas

Paso 2:hacer el chasis

Taladre dos orificios para el motor:

Conecte dos motores:

Haga tres orificios para la rueda giratoria:

Conecte la rueda giratoria:

Haga dos orificios a cada lado de la caja para conectar los motores y tres orificios en la parte inferior para conectar la rueda giratoria después de medir y marcar el diámetro correcto. Luego instale los motores y la rueda.

Baterías

Conectando las baterías.

Diagrama de conexión.

Pega las baterías dentro de la caja.

Monte dos baterías de 9 voltios dentro de la caja sobre la rueda. Luego, conéctelos en paralelo y conecte un interruptor como se muestra en el diagrama anterior.

Conectando Arduino y Motor Shield

Coloque el protector del motor sobre el Arduino.

Conecta los cables de la batería al PWR terminales del blindaje del motor.

Conecte los motores al blindaje del motor.

Retire el puente de este puerto.

Conecte el protector del motor sobre el Arduino y colóquelo sobre la batería. Luego, conecte los cables de los motores y la batería al blindaje del motor. Consulte el diagrama de conexión antes de realizar la conexión, ya que es muy importante.

Instrucciones de cableado:

  • Conecte el motor izquierdo a "M1" del blindaje del motor
  • Conecte el motor derecho a "M3" del blindaje del motor
  • Conecte el cable de la batería al "ext pwr" del blindaje del motor

Haz dos agujeros y enciende el Arduino

Marque el lugar para hacer agujeros.

Haz los agujeros.

Conecte el clip de la batería al conector macho de CC a la batería de 9V.

Coloque esta batería de 9 voltios dentro de la caja.

Haga dos agujeros para acceder al puerto USB y al puerto de entrada de CC del Arduino. Tome otra batería de 9 voltios y conecte un clip de batería a un adaptador de conector macho de CC, luego conecte el conector macho de CC al puerto de entrada de CC de Arduino para alimentar el Arduino. Luego coloque la batería entre los motores y Arduino dentro de la caja.

Conexión del módulo y el conmutador Bluetooth

Conecte el módulo Bluetooth al Arduino como se muestra en el diagrama de conexión y colóquelo dentro de la caja. Luego haga un orificio para montar el interruptor en la parte posterior de la caja y conecte el interruptor (aquí he cambiado el interruptor que se usó anteriormente debido a algún problema de soldadura).

Instrucciones de cableado del módulo Bluetooth:

  • "TX" del módulo Bluetooth va a "RX" de Arduino
  • "RX" del módulo Bluetooth va a "TX" de Arduino
  • "VCC" del módulo Bluetooth va a "5v" de Arduino
  • "GND" del módulo Bluetooth va a "GND" de Arduino
  • Los pines de estado y clave de los módulos BT se mantienen sin usar.

Diagrama de circuito general

Montaje ultrasónico del sensor

Tome el sensor ultrasónico y péguele una pequeña pieza de plástico en forma de 'L' y péguela en la parte superior de la caja de plástico (o si no tiene una barra de pegamento, use cinta adhesiva de doble cara). Luego, conecte los cables de puente como se muestra en el diagrama de circuito anterior.

Instrucciones de cableado del sensor ultrasónico:

  • "VCC" del sensor ultrasónico va a "+5" de Arduino
  • "GND" del sensor ultrasónico va a "GND" de Arduino
  • El pin "Trig" del sensor ultrasónico va al "Pin analógico 1" de Arduino
  • El pin "Echo" del sensor ultrasónico va al "Pin analógico 0" de Arduino

Ahora terminamos todas las conexiones y es hora de programar.

Último paso:edición de códigos Arduino y aplicaciones Bluetooth

Sube el " Boceto final "proporcionado en la sección de código. Si encuentra algún error, asegúrese de haber instalado la biblioteca AFmotor.

Ahora, aprendimos cómo programar un Arduino fácilmente. He mostrado aquí algunos programas para trabajar este robot como robot evitando obstáculos, seguidor de pared y controlado por Bluetooth. y por fin he combinado estas tres funciones. Vea el video para obtener más detalles e información

Introducción a la aplicación Bluetooth

Diviértete con el seguidor de muros y la evitación de obstáculos

Visite mi blog aquí:robotechmaker.com

Si tiene alguna pregunta o sugerencia, comente a continuación.

Código

  • Bosquejo de Bluetooth (robot controlado)
  • Bosquejo final (código final)
  • Bosquejo para evitar obstáculos
  • Boceto de seguidor de pared
Boceto de Bluetooth (robot controlado) Arduino
 / * Autor:Marcelo Moraes Este proyecto contiene código de dominio público. La modificación está permitida sin previo aviso. * /// Bibliotecas # incluyen  // ObjectsAF_DCMotor motorRight (1, MOTOR12_64KHZ); // crear motor # 1, 64KHz pwmAF_DCMotor motorLeft (3, MOTOR12_64KHZ); // crea motor # 3, 64KHz pwm // Constantes y variablechar dataIn ='S'; determinante char; det char; int vel =0; // Configuración de Bluetooth Stuffvoid () {Serial.begin (9600); // configurar la biblioteca serial a 9600 bps // Mensajes de inicialización Serial.println ("ArduinoBymyself - ROVERBot"); Serial.println ("¡Prueba de motor AF!"); // apaga los motores motorRight.setSpeed ​​(0); motorLeft.setSpeed ​​(0); motorRight.run (LIBERAR); motorLeft.run (LIBERAR); } bucle vacío () {det =comprobar (); // llamar check () subrotino para obtener el código de serie // interruptor de análisis de código de serie (det) {caso 'F':// F, avanzar motorRight.setSpeed ​​(vel); motorLeft.setSpeed ​​(vel); motorRight.run (ADELANTE); motorLeft.run (ADELANTE); det =comprobar (); descanso; caso 'B':// B, retroceder motorRight.setSpeed ​​(vel); motorLeft.setSpeed ​​(vel); motorRight.run (HACIA ATRÁS); motorLeft.run (HACIA ATRÁS); det =comprobar (); descanso; case 'L':// L, mueve las ruedas a la izquierda motorRight.setSpeed ​​(vel); motorLeft.setSpeed ​​(vel / 4); motorRight.run (ADELANTE); motorLeft.run (ADELANTE); det =comprobar (); descanso; case 'R':// R, mueve las ruedas a la derecha motorRight.setSpeed ​​(vel / 4); motorLeft.setSpeed ​​(vel); motorRight.run (ADELANTE); motorLeft.run (ADELANTE); det =comprobar (); descanso; case 'I':// I, giro a la derecha hacia adelante motorRight.setSpeed ​​(vel / 2); motorLeft.setSpeed ​​(vel); motorRight.run (ADELANTE); motorLeft.run (ADELANTE); det =comprobar (); descanso; case 'J':// J, girar a la derecha atrás motorRight.setSpeed ​​(vel / 2); motorLeft.setSpeed ​​(vel); motorRight.run (HACIA ATRÁS); motorLeft.run (HACIA ATRÁS); det =comprobar (); descanso; case 'G':// G, gire a la izquierda hacia adelante motorRight.setSpeed ​​(vel); motorLeft.setSpeed ​​(vel / 2); motorRight.run (ADELANTE); motorLeft.run (ADELANTE); det =comprobar (); descanso; case 'H':// H, girar a la izquierda atrás motorRight.setSpeed ​​(vel); motorLeft.setSpeed ​​(vel / 2); motorRight.run (HACIA ATRÁS); motorLeft.run (HACIA ATRÁS); det =comprobar (); descanso; caso 'S':// S, detener motorRight.setSpeed ​​(vel); motorLeft.setSpeed ​​(vel); motorRight.run (LIBERAR); motorLeft.run (LIBERAR); det =comprobar (); descanso; }} // obtener el código bluetooth recibido del puerto serial check () {if (Serial.available ()> 0) {// si hay datos válidos en el puerto serial dataIn =Serial.read (); // almacena datos en a varialbe // verifica el código if (dataIn =='F') {// Determinante directo ='F'; } else if (dataIn =='B') {// Determinante hacia atrás ='B'; } else if (dataIn =='L') {// Determinante izquierdo ='L'; } else if (dataIn =='R') {// Determinante derecho ='R'; } else if (dataIn =='I') {// Froward Right determinant ='I'; } else if (dataIn =='J') {// Determinante hacia atrás a la derecha ='J'; } else if (dataIn =='G') {// Determinante hacia adelante a la izquierda ='G'; } else if (dataIn =='H') {// Determinante hacia atrás a la izquierda ='H'; } else if (dataIn =='S') {// Detener determinante ='S'; } else if (dataIn =='0') {// Velocidad 0 vel =0; } else if (dataIn =='1') {// Velocidad 25 vel =25; } else if (dataIn =='2') {// Velocidad 50 vel =50; } else if (dataIn =='3') {// Velocidad 75 vel =75; } else if (dataIn =='4') {// Velocidad 100 vel =100; } else if (dataIn =='5') {// Velocidad 125 vel =125; } else if (dataIn =='6') {// Velocidad 150 vel =150; } else if (dataIn =='7') {// Velocidad 175 vel =175; } else if (dataIn =='8') {// Velocidad 200 vel =200; } else if (dataIn =='9') {// Velocidad 225 vel =225; } else if (dataIn =='q') {// Velocidad 255 vel =255; } else if (dataIn =='U') {// Luces traseras encendidas determinante ='U'; } else if (dataIn =='u') {// Luces traseras apagadas determinante ='u'; } else if (dataIn =='W') {// Luces delanteras encendidas determinante ='W'; } else if (dataIn =='w') {// Determinante de luces delanteras apagadas ='w'; } else if (dataIn =='V') {// Horn On determinante ='V'; } else if (dataIn =='v') {// Determinante de Horn Off ='v'; } else if (dataIn =='X') {// Extra sobre determinante ='X'; } else if (dataIn =='x') {// Extra Off determinant ='x'; }} devuelve determinante;} 
Bosquejo final (Código final) Arduino
 / * Autor:Muhammed Azharvisit - robotechmaker.com * / # include  #define trigPin 14 // define los pines de tu sensor # define echoPin 15 // ObjectsAF_DCMotor motorRight (1, MOTOR12_64KHZ); // crear motor # 1, 64KHz pwmAF_DCMotor motorLeft (3, MOTOR12_64KHZ); // crea motor # 3, 64KHz pwm // Constantes y variablechar dataIn ='S'; determinante char; det char; int vel =255; // Configuración de Bluetooth Stuffvoid () {Serial.begin (9600); // configurar la biblioteca serial a 9600 bps pinMode (trigPin, OUTPUT); // configurar el pin trig en salida (enviar ondas de sonido) pinMode (echoPin, INPUT); // configurar el pin de eco en entrada (recibir ondas de sonido) / / Mensajes de inicialización Serial.println ("Mr.robot"); Serial.println ("¡Reday para trabajar!"); // apaga los motores motorRight.setSpeed ​​(0); motorLeft.setSpeed ​​(0); motorRight.run (LIBERAR); motorLeft.run (RELEASE);} bucle vacío () {det =comprobar (); // llamar check () subrotino para obtener el código de serie // interruptor de análisis de código de serie (det) {caso 'F':// F, avanzar motorRight.setSpeed ​​(vel); motorLeft.setSpeed ​​(vel); motorRight.run (ADELANTE); motorLeft.run (ADELANTE); det =comprobar (); descanso; caso 'B':// B, retroceder motorRight.setSpeed ​​(vel); motorLeft.setSpeed ​​(vel); motorRight.run (HACIA ATRÁS); motorLeft.run (HACIA ATRÁS); det =comprobar (); descanso; case 'L':// L, mueve las ruedas a la izquierda motorRight.setSpeed ​​(vel); motorLeft.setSpeed ​​(vel / 4); motorRight.run (ADELANTE); motorLeft.run (ADELANTE); det =comprobar (); descanso; case 'R':// R, mueve las ruedas a la derecha motorRight.setSpeed ​​(vel / 4); motorLeft.setSpeed ​​(vel); motorRight.run (ADELANTE); motorLeft.run (ADELANTE); det =comprobar (); descanso; case 'I':// I, giro a la derecha hacia adelante motorRight.setSpeed ​​(vel / 2); motorLeft.setSpeed ​​(vel); motorRight.run (ADELANTE); motorLeft.run (ADELANTE); det =comprobar (); descanso; case 'J':// J, girar a la derecha atrás motorRight.setSpeed ​​(vel / 2); motorLeft.setSpeed ​​(vel); motorRight.run (HACIA ATRÁS); motorLeft.run (HACIA ATRÁS); det =comprobar (); descanso; case 'G':// G, gire a la izquierda hacia adelante motorRight.setSpeed ​​(vel); motorLeft.setSpeed ​​(vel / 2); motorRight.run (ADELANTE); motorLeft.run (ADELANTE); det =comprobar (); descanso; case 'H':// H, girar a la izquierda atrás motorRight.setSpeed ​​(vel); motorLeft.setSpeed ​​(vel / 2); motorRight.run (HACIA ATRÁS); motorLeft.run (HACIA ATRÁS); det =comprobar (); descanso; caso 'S':// S, detener motorRight.setSpeed ​​(vel); motorLeft.setSpeed ​​(vel); motorRight.run (LIBERAR); motorLeft.run (LIBERAR); det =comprobar (); descanso; case 'm':// para robot seguidor de pared. motorRight.setSpeed ​​(vel); // establece la velocidad de los motores, entre 0-255 motorLeft.setSpeed ​​(vel); larga duración, distancia; // inicia el escaneo digitalWrite (trigPin, LOW); delayMicroseconds (2); // Se requieren retrasos para que el sensor funcione correctamente. digitalWrite (trigPin, HIGH); delayMicroseconds (10); // ¡esta demora también es necesaria! digitalWrite (trigPin, BAJO); duración =pulseIn (echoPin, HIGH); distancia =(duración / 2) / 29.1; // convierte la distancia a centímetros. if (distancia <30) / * La distancia que debe mantenerse con la pared * / {Serial.println ("Wall is ditected!"); Serial.println ("Comenzó siguiendo la pared"); Serial.println (" ¡Girando! "); motorRight.setSpeed ​​(vel); motorLeft.setSpeed ​​(0); motorRight.run (ADELANTE); motorLeft.run (LIBERAR); retraso (500); // esperar un segundo} else {Serial.println ("No se detectó muro. girando"); retraso (15); motorRight.setSpeed ​​(0); motorLeft.setSpeed ​​(vel); motorRight.run (LIBERAR); motorLeft.run (ADELANTE); } descanso; case 'b':// robot evitador de obstáculos motorRight.setSpeed ​​(vel); // establece la velocidad de los motores, entre 0-255 motorLeft.setSpeed ​​(vel); larga adoración, distancia; // inicia el escaneo digitalWrite (trigPin, LOW); delayMicroseconds (2); // Se requieren retrasos para que el sensor funcione correctamente. digitalWrite (trigPin, HIGH); delayMicroseconds (10); // ¡esta demora también es necesaria! digitalWrite (trigPin, BAJO); Aduración =pulseIn (echoPin, HIGH); Distancia =(Aduración / 2) / 29.1; // convierte la distancia a centímetros. si (Distancia <25) / * si hay un obstáculo de 25 centímetros, adelante, haga lo siguiente:* / {Serial.println ("¡Cerrar obstáculo detectado!"); Serial.println ("Detalles del obstáculo:"); Serial.print ("La distancia desde el robot es"); Serial.print (Distancia); Serial.print ("CM!"); // imprimir la distancia en centímetros.Serial.println ("El obstáculo se declara una amenaza debido a la distancia cercana . "); Serial.println (" ¡Girando! "); motorRight.setSpeed ​​(vel); motorLeft.setSpeed ​​(vel); motorLeft.run (HACIA ATRÁS); // Gira siempre que haya un obstáculo por delante. motorRight.run (FORWARD);} else {Serial.println ("No se detectó ningún obstáculo. Adelante"); retraso (15); motorRight.setSpeed ​​(vel); motorLeft.setSpeed ​​(vel); motorRight.run (ADELANTE); // si no hay ningún obstáculo por delante, ¡Adelante! motorLeft.run (ADELANTE); } descanso; }} // obtener el código bluetooth recibido del puerto serial check () {if (Serial.available ()> 0) {// si hay datos válidos en el puerto serial dataIn =Serial.read (); // almacena datos en a varialbe // verifica el código if (dataIn =='F') {// Determinante directo ='F'; } else if (dataIn =='B') {// Determinante hacia atrás ='B'; } else if (dataIn =='L') {// Determinante izquierdo ='L'; } else if (dataIn =='R') {// Determinante derecho ='R'; } else if (dataIn =='I') {// Froward Right determinant ='I'; } else if (dataIn =='J') {// Determinante hacia atrás a la derecha ='J'; } else if (dataIn =='G') {// Determinante hacia adelante a la izquierda ='G'; } else if (dataIn =='H') {// Determinante hacia atrás a la izquierda ='H'; } else if (dataIn =='S') {// Detener determinante ='S'; } else if (dataIn =='0') {// Velocidad 0 vel =0; } else if (dataIn =='1') {// Velocidad 25 vel =25; } else if (dataIn =='2') {// Velocidad 50 vel =50; } else if (dataIn =='3') {// Velocidad 75 vel =75; } else if (dataIn =='4') {// Velocidad 100 vel =100; } else if (dataIn =='5') {// Velocidad 125 vel =125; } else if (dataIn =='6') {// Velocidad 150 vel =150; } else if (dataIn =='7') {// Velocidad 175 vel =175; } else if (dataIn =='8') {// Velocidad 200 vel =200; } else if (dataIn =='9') {// Velocidad 225 vel =225; } else if (dataIn =='b') {// Extra sobre determinante ='b'; } else if (dataIn =='m') {// Extra sobre determinante ='m'; }} devuelve determinante;} 
Boceto para evitar obstáculos Arduino
 / * Autor:Muhammed Azharvisit - robotechmaker.com * / # include  #define trigPin 14 // define los pines de tu sensor # define echoPin 15 int vel =255; // Velocidad del robot // ObjectsAF_DCMotor motorRight (1, MOTOR12_64KHZ); // crear motor # 1, 64KHz pwmAF_DCMotor motorLeft (3, MOTOR12_64KHZ); // crea el motor # 3, 64KHz pwmvoid setup () {Serial.begin (9600); // configurar la biblioteca serial a 9600 bps pinMode (trigPin, OUTPUT); // configurar el pin trig en salida (enviar ondas de sonido) pinMode (echoPin, INPUT); // configurar el pin de eco en entrada (recibir ondas de sonido) / / Mensajes de inicialización Serial.println ("Mr.robot"); Serial.println ("¡Reday para trabajar!"); // apaga los motores motorRight.setSpeed ​​(0); motorLeft.setSpeed ​​(0); motorRight.run (LIBERAR); motorLeft.run (RELEASE);} void loop () {// robot evitador de obstáculos motorRight.setSpeed ​​(vel); // establece la velocidad de los motores, entre 0-255 motorLeft.setSpeed ​​(vel); larga duración, distancia; // inicia el escaneo digitalWrite (trigPin, LOW); delayMicroseconds (2); // Se requieren retrasos para que el sensor funcione correctamente. digitalWrite (trigPin, HIGH); delayMicroseconds (10); // ¡esta demora también es necesaria! digitalWrite (trigPin, BAJO); duración =pulseIn (echoPin, HIGH); distancia =(duración / 2) / 29.1; // convierte la distancia a centímetros. si (distancia <25) / * si hay un obstáculo de 25 centímetros, adelante, haga lo siguiente:* / {Serial.println ("¡Cerrar obstáculo detectado!"); Serial.println ("Detalles del obstáculo:"); Serial.print ("La distancia desde el robot es"); Serial.print (distancia); Serial.print ("CM!"); // imprimir la distancia en centímetros.Serial.println ("El obstáculo se declara una amenaza debido a la distancia cercana . "); Serial.println (" ¡Girando! "); motorRight.setSpeed ​​(vel); motorLeft.setSpeed ​​(vel); motorLeft.run (HACIA ATRÁS); // Gira siempre que haya un obstáculo por delante. motorRight.run (FORWARD);} else {Serial.println ("No se detectó ningún obstáculo. Adelante"); retraso (15); motorRight.setSpeed ​​(vel); motorLeft.setSpeed ​​(vel); motorRight.run (ADELANTE); // si no hay ningún obstáculo por delante, ¡Adelante! motorLeft.run (ADELANTE); }} 
Boceto de seguidor de pared Arduino
 / * Autor:Muhammed Azharvisit - robotechmaker.com * / # include  #define trigPin 14 // define los pines de tu sensor # define echoPin 15 int vel =255; // Velocidad del robot // ObjectsAF_DCMotor motorRight (1, MOTOR12_64KHZ); // crear motor # 1, 64KHz pwmAF_DCMotor motorLeft (3, MOTOR12_64KHZ); // crea el motor # 3, 64KHz pwmvoid setup () {Serial.begin (9600); // configurar la biblioteca serial a 9600 bps pinMode (trigPin, OUTPUT); // configurar el pin trig en salida (enviar ondas de sonido) pinMode (echoPin, INPUT); // configurar el pin de eco en entrada (recibir ondas de sonido) / / Mensajes de inicialización Serial.println ("Mr.robot"); Serial.println ("¡Reday para trabajar!"); // apaga los motores motorRight.setSpeed ​​(0); motorLeft.setSpeed ​​(0); motorRight.run (LIBERAR); motorLeft.run (RELEASE);} void loop () {// para robot seguidor de pared. motorRight.setSpeed ​​(vel); // establece la velocidad de los motores, entre 0-255 motorLeft.setSpeed ​​(vel); larga duración, distancia; // inicia el escaneo digitalWrite (trigPin, LOW); delayMicroseconds (2); // Se requieren retrasos para que el sensor funcione correctamente. digitalWrite (trigPin, HIGH); delayMicroseconds (10); // ¡esta demora también es necesaria! digitalWrite (trigPin, BAJO); duración =pulseIn (echoPin, HIGH); distancia =(duración / 2) / 29.1; // convierte la distancia a centímetros. if (distancia <30) / * La distancia que debe mantenerse con la pared * / {Serial.println ("Wall is ditected!"); Serial.println ("Comenzó siguiendo el muro"); Serial.println ("¡Girando!"); motorRight.setSpeed ​​(vel); motorLeft.setSpeed ​​(0); motorRight.run (ADELANTE); motorLeft.run (LIBERAR); retraso (500); // esperar un segundo} else {Serial.println ("No se detectó muro. girando"); retraso (15); motorRight.setSpeed ​​(0); motorLeft.setSpeed ​​(vel); motorRight.run (LIBERAR); motorLeft.run (ADELANTE); }} 

Esquemas


Proceso de manufactura

  1. Los mejores accesorios para tu Raspberry Pi
  2. Mejores prácticas de seguimiento de activos:cómo aprovechar al máximo los datos de activos que tanto le costó ganar
  3. Cómo aprovechar al máximo su cadena de suministro ahora mismo
  4. Robot para navegación interior supercogedora
  5. Montajes de motor 101:la guía para elegir el mejor material de montaje de motor
  6. Tu guía definitiva sobre los mejores productos agrícolas industriales
  7. Su guía de las mejores marcas de grúas
  8. La mejor guía de compra de impresoras 3D para su taller mecánico
  9. La mejor manera de construir su prototipo de IoT
  10. Electroerosión por hilo CNC:su mejor amigo en el taller
  11. Elija el mejor taladro de fresado para su trabajo