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

Colgante CNC HID Personalizado con Arduino: Control DIY Económico

Componentes y Suministros

Sobre el Proyecto

Última actualización:

¿Por Qué Este Proyecto?

Puedes comprar un colgante para tu máquina CNC, pero yo construí mi máquina CNC de madera, ¿por qué no hacer mi propio colgante?

Además, un colgante normal para mi placa controladora costaría 100€ y tendría solo 2 botones y un volante. El mío tiene 23 botones con hasta 6 funciones por botón y un volante.

Un comentario podría ser: "¡es grande y pesado!" Pero en la práctica, resultó inesperadamente útil tener un colgante que se queda quieto al girar el volante...

Colgante CNC HID Personalizado con Arduino: Control DIY Económico
Colgante CNC HID Personalizado con Arduino: Control DIY Económico

¿Cómo Funciona?

La belleza del Arduino con chip 32u4 (no todos los modelos lo tienen) es la capacidad de emular teclado y/o ratón. Al conectar el Leonardo a un PC, este "ve" un teclado. ¡Genial!

Así que al programar el Arduino, añadir interruptores y conectarlo a un PC/Mac, puedes enviar pulsaciones de teclas/movimientos de ratón al ordenador al presionar un botón. Como mencioné, 23 botones × 6 funciones = muchas opciones.

Todo depende de usar la librería correcta para el sketch de Arduino. Tras horas de búsqueda encontré una gran librería que incluyo en esta página: ClickButton.

Con esta librería, obtienes estas posibilidades para cada botón (momentáneo):

También obtienes funcionalidad anti-rebote (debounce) en la librería ClickButton, que es importante.

Puedes ajustar los tiempos para cada botón, pero los estándar son ≥ 250ms para reconocer un click y ≥ 1000ms para reconocer mantener pulsado.

Ejemplo: Botón Eje X (tecla 13)

if (button[13].clicks != 0) {
  switch (button[13].clicks) {
    case 1:  // Click simple → Volante en X
      shortcut_HANDWHEEL_X(); break;
    case 2:  // Doble click → Poner X a cero
      shortcut_ZERO_X(); break;
    case 3:  // Triple click
      break;
    case -1: // Click simple y mantener → Macro usuario 18: Ir a cero pieza X
      press_ESC(); goto_MAIN_MENU(); user_MACRO_18(); break;
    case -2: // Doble click y mantener
      break;
    case -3: // Triple click y mantener
      break;
  }
}

La Carcasa

Elegí madera de caoba para la carcasa. Me encanta trabajar la madera y el aspecto y tacto son maravillosos. Además, así pude hacer una carcasa verdaderamente personalizada, no siempre posible con cajas ABS prefabricadas de 20-50€.

El diseño se hizo con software Vectric Cut2D. Me alegro de haber invertido en este paquete porque hizo la curva de aprendizaje del CNC mucho menos empinada y más divertida. También ayuda a diseñar trabajos a doble cara fácilmente.

Tras lijar un poco, la madera recibió muchas capas de barniz transparente.

Colgante CNC HID Personalizado con Arduino: Control DIY Económico

Avance en el video: 2400 mm/min (~94"/min) a 40 mm/s (~1.57") con pasada de 3mm (1/8").

Los Interruptores

Son tipo momentáneo, excepto el que uso para encender/apagar los LEDs. Puedes poner una etiqueta detrás de la tapa transparente y, si quieres, iluminar el interruptor con su LED integrado.

Usé una resistencia de 1KΩ por interruptor, consumiendo 2mA a 5V.

Un inconveniente: necesitan una carcasa bastante gruesa. El grosor de la madera era 21mm para tapa Y base. Tras mecanizar, el grosor total es 36.5mm.

Conectar los interruptores es muy fácil... Uso las resistencias pull-up internas del Arduino, así que solo hay que conectar un lado de todos los interruptores a tierra y el otro a las entradas del Arduino.

Etiquetas de los Interruptores

Para etiquetar usé adhesivos de polivinilo de alta calidad para impresora láser a color (también hay para inyección de tinta). Imprimir en papel normal no servía porque se ve la textura del papel cuando se ilumina.

Quité las tapas transparentes de los interruptores y puse las etiquetas en el plástico debajo.

Los iconos son los mismos que usa el software Eding CNC (incluido con el hardware al comprarlo). Copié los iconos JPEG del directorio del software y modifiqué algunos en un programa gráfico para personalizarlos.

El Volante de Mano

Es un volante estándar de 60mm 100PPR 6 terminales. 100 pulsos por vuelta, en la mayoría de software CNC se puede editar este valor.

La Electrónica

Como dispositivo HID (Human Interface Device), usé un microcontrolador Arduino Leonardo.

Esta placa ha sido descatalogada pero se puede comprar en varias tiendas online. Como alternativa puedes usar el Arduino Micro que usa el mismo chip 32u4.

Colgante CNC HID Personalizado con Arduino: Control DIY Económico

Así pude emular pulsaciones de teclado y controlar muchas funciones del software de mecanizado CNC, en mi caso Eding CNC.

El Leonardo tiene 23 pines de entrada, más que suficiente. Como dije, puedes asignar 6 funciones por botón.

Consumo total: 150mA con LEDs de teclas encendidos.

Programación del Microcontrolador

Para programar el Arduino, deja el colgante conectado a la fuente del CNC y sube el nuevo sketch con Arduino IDE. (Ver nota abajo). Usas el mismo conector USB que se usa para emular el teclado.

Si quieres usar otro PC (portátil) para programar, simplemente enchufa el USB en el otro PC y programa el Arduino, dejando el colgante conectado y alimentado por la fuente del CNC.

¡Diviértete haciendo tu propio colgante!

Código

Código Principal del Colgante CNC

#include "ClickButton.h"
#include "Keyboard.h"

long int aux1_delay = 0;
const int buttons = 20;

// Pines de botones (pin0 es dummy para empezar en 1)
const int buttonPin0 = 0;
const int buttonPin1 = 0;  const int buttonPin2 = 1;
const int buttonPin3 = 2;  const int buttonPin4 = 3;
const int buttonPin5 = 4;  const int buttonPin6 = 5;
const int buttonPin7 = 6;  const int buttonPin8 = 7;
const int buttonPin9 = 8;  const int buttonPin10 = 9;
const int buttonPin11 = 10; const int buttonPin12 = 11;
const int buttonPin13 = 12; const int buttonPin14 = 13;
const int buttonPin15 = A0; const int buttonPin16 = A1;
const int buttonPin17 = A2; const int buttonPin18 = A3;
const int buttonPin19 = A4; const int buttonPin20 = A5;

ClickButton button[21] = {
  ClickButton(buttonPin0, LOW, CLICKBTN_PULLUP), // dummy
  ClickButton(buttonPin1, LOW, CLICKBTN_PULLUP),
  ClickButton(buttonPin2, LOW, CLICKBTN_PULLUP),
  // ... (hasta buttonPin20)
};

void setup() {
  for (int i = 1; i <= buttons; i++) {
    button[i].debounceTime = 20;
    button[i].multiclickTime = 250;
    button[i].longClickTime = 1000;
  }
}

void loop() {
  for (int i = 1; i <= buttons; i++) button[i].Update();
  
  // Botón 1: RESET (F1) / ESC / Apagar drivers (mantener)
  if (button[1].clicks != 0) { /* ... */ }
  
  // Botón 2: Menú principal (ESC)
  if (button[2].clicks != 0) { /* ... */ }
  
  // Botón 3: Home todos ejes (Ctrl+H) - mantener
  if (button[3].clicks != 0) { /* ... */ }
  
  // Botón 4: Toggle MDI (Ctrl+F6)
  if (button[4].clicks != 0) { /* ... */ }
  
  // Botón 5: Macro usuario 1 (Set Z height)
  if (button[5].clicks != 0) { /* ... */ }
  
  // Botón 6: Menú Auto (Alt+F4)
  if (button[6].clicks != 0) { /* ... */ }
  
  // Botón 7: Redibujar gráficos (F3)
  if (button[7].clicks != 0) { /* ... */ }
  
  // Botón 8: Cargar archivo (F2)
  if (button[8].clicks != 0) { /* ... */ }
  
  // Botón 9: Toggle AUX1 (Aspiradora) - con delay 1s
  if (button[9].clicks != 0) { /* ... */ }
  
  // Botón 10: Toggle MIST (Luz)
  if (button[10].clicks != 0) { /* ... */ }
  
  // Botón 11: Ir a P1 (G28) - Macro 16
  if (button[11].clicks != 0) { /* ... */ }
  
  // Botón 12: Ir a P2 (G30) - Macro 17
  if (button[12].clicks != 0) { /* ... */ }
  
  // Botón 13: Eje X - Volante / Zero X / Macro 18
  if (button[13].clicks != 0) { /* ... */ }
  
  // Botón 14: Eje Y - Volante / Zero Y / Macro 19
  if (button[14].clicks != 0) { /* ... */ }
  
  // Botón 15: Eje Z - Volante / Zero Z / Macro 20
  if (button[15].clicks != 0) { /* ... */ }
  
  // Botones 16-20: Eje A, Velocidad volante 1x/10x/100x, Toggle coordenadas
  if (button[16].clicks != 0) { /* ... */ }
  if (button[17].clicks != 0) { /* shortcut_HANDWHEEL_X1(); */ }
  if (button[18].clicks != 0) { /* shortcut_HANDWHEEL_X10(); */ }
  if (button[19].clicks != 0) { /* shortcut_HANDWHEEL_X100(); */ }
  if (button[20].clicks != 0) { /* shortcut_TOGGLE_MACHINE_COORDINATES(); */ }
}

// Funciones de teclado (ejemplos)
void press_RESET() { Keyboard.begin(); Keyboard.press(KEY_F1); delay(100); Keyboard.releaseAll(); }
void press_ESC() { Keyboard.begin(); Keyboard.press(KEY_ESC); delay(100); Keyboard.releaseAll(); }
void goto_MAIN_MENU() { Keyboard.begin(); Keyboard.press(KEY_LEFT_ALT); Keyboard.press(KEY_F1); delay(100); Keyboard.releaseAll(); }
void shortcut_HOME_ALL() { Keyboard.begin(); Keyboard.press(KEY_LEFT_CTRL); Keyboard.press('h'); delay(100); Keyboard.releaseAll(); }
void shortcut_ZERO_X() { Keyboard.begin(); Keyboard.press(KEY_LEFT_CTRL); Keyboard.press('1'); delay(100); Keyboard.releaseAll(); }
void shortcut_HANDWHEEL_X() { Keyboard.begin(); Keyboard.press(KEY_LEFT_CTRL); Keyboard.press(KEY_LEFT_SHIFT); Keyboard.press('x'); delay(100); Keyboard.releaseAll(); }
// ... resto de funciones shortcut_*

Nota: El archivo completo se ha truncado. Descárgalo para ver su contenido completo.

Piezas Personalizadas y Cajas

Esquemáticos

Colgante CNC HID Personalizado con Arduino: Control DIY Económico

Un esquemático no muy bueno pero cumple su función...

Proceso de manufactura

  1. El Botón: De Sujetador Ancestral a Innovación Moderna
  2. Control de Brillo LED con PWM mediante Pulsador en Arduino Mega
  3. Construye un Spybot controlado por Bluetooth con Arduino
  4. FlickMote: Mando IR por gestos para Smart Home
  5. TV‑B‑Gone DIY con Arduino: Mando universal para apagar cualquier TV
  6. Construye un Reloj Maestro LED Personalizado con Alarma – Visible desde 12 Metros
  7. Find Me: Localizador Inteligente de Objetos con Arduino y Bluetooth
  8. Crea un Botón de Teclado Personalizado y "Apuñalable" con Arduino: Guía Paso a Paso
  9. Soluciones de Alimentación Optimizadas para Proyectos Arduino
  10. Entendiendo el Botón Reset en Panel Operador CNC: Función y Uso
  11. Osai USA OPENwiTP: Pulsador de enseñanza inalámbrico para control CNC eficiente