Foro MetalAficion

CNC => CNC - Software y Controladores => Mensaje iniciado por: Pablo20061 en 13 Octubre 2013, 01:32

Título: Como conectar LinuxCNC a Arduino
Publicado por: Pablo20061 en 13 Octubre 2013, 01:32
Hola,
Estoy intentando conectar LinuxCNC con Arduino para mover una fresadora con drivers Pololu. Hasta el momento he logrado ponerla en marcha con el programa TxapuCNC pero al intentarlo con LinuxCNC me pierdo, se que hay que utilizar cuatro ficheros:  un sketch que se carga en arduino llamado (halintf.pde), y (arduino.py), (arduino-vcp.hal) y (arduino-vcp.xml), estos tres último no termino de entender cómo funcionan, qué tengo que hacer con ellos, etc; en su momento lo explicó con detalle Jbecerra pero mis conocimientos de Linux son más que rudimentarios y no hago otra cosa que dar palos de ciego a la hora de organizar el sistema. Agradecería si alguien tiene la amabilidad de echarme una mano en este berenjenal.   
Título: Re:Como conectar LinuxCNC a Arduino
Publicado por: Jbecerra en 13 Octubre 2013, 11:37
Hola.

En breve quiero hacer un montaje donde ira el arduino conectado al linux, intentare explicar paso a paso los procedimientos que vaya haciendo.

Es para intentar unir en un solo experimento el control PID, la comunicacion arduino-cnc y el control en lazo cerrado para actuar sobre un servomotor.

Voy a usar el eje Y del amigo Michel que esta montado sobre patines y movido por un servomotor.

Un pendulo invertido en la mesa del eje que leera su posicion por medio de un vulgar potenciometro para realimentar a traves del arduino el PID que procesara el linux para mantenerlo en equilibrio.

Si tienes la paciencia necesaria podras leerlo en el foro.

Título: Re:Como conectar LinuxCNC a Arduino
Publicado por: DEVILHUNTER en 13 Octubre 2013, 19:22
Hay un HAL de arduino para LinuxCNC, pero los propios creadores no recomiendan usar el arduino para controlar los motores paso a paso por no tener suficiente capacidad de cálculo. Es más para obtener salidas y entradas extra para elementos auxiliares.

¿Vas a leer el potenciómetro con el arduino? La función de lectura analógica era bastante lenta también, ¿crees que será capaz de computarlo con suficiente velocidad?
Título: Re:Como conectar LinuxCNC a Arduino
Publicado por: tio_gil en 14 Octubre 2013, 10:18
Devilhunter, me lo puedes explicar? quien no tiene capacidad, un Arduino? el linuxCNC? por qué?
y que pasa si en vez de usar un arduino usas algo más, digamos, potente? (pej, el mismo arduino, pero pasando del soft y usar el micro como tal- aun que yo personalmente no pienso en ese...ni en "los más conocidos" 8) )
como suele "verlos" el linuxCNC (o como se deberían conectar para que todo vaya "como sobre patines de bolas engrasado") estos "inventos"?
Título: Re:Como conectar LinuxCNC a Arduino
Publicado por: DEVILHUNTER en 14 Octubre 2013, 11:23
El arduino, tio_gil. Según la sección de preguntas comunes, se puede usar para controlar los motores y los encoders, pero recomiendan usar el puerto paralelo por ser más fácil de programar y más rápido:

http://emc2arduino.wordpress.com/faq-2/faq-hal2arduino/
Título: Re:Como conectar LinuxCNC a Arduino
Publicado por: tio_gil en 14 Octubre 2013, 15:21
Pues si que tiene narices... Me da que cada vez los programadores (y lo siento si alguno se da por aludido siendo de esa profesion) no se quiebran los cuernos para hacer FW rápido, pequeño y eficiente.
Título: Re:Como conectar LinuxCNC a Arduino
Publicado por: Jbecerra en 14 Octubre 2013, 15:21
Hola.

En el montaje que quiero hacer se usaría al arduino como convertidor AD, leyendo el valor del potenciometro y enviándolo por usb al linux en digital.

El tiempo que tarde en hacer la conversión y el envió es lo que quiero saber, y si usando la programación que trae su ide me funciona ya habré avanzado algo.

Siempre queda tiempo para programarlo a mas bajo nivel, pero no es ese ahora mi problema.

También habría montajes mucho mas rápido para analizar el comportamiento del PID en un péndulo invertido, como por ejemplo usar un encoder directamente y leerlo por el puerto paralelo o poner un supermicro de los modernos que viene ya hasta con un linux pasando del arduino.

Es tan solo otro experimento mas para intentar comprender cada uno de los conceptos del PID e intentando usar los elementos mas asequibles.

He pensado (probablemente equivocado) en lo siguiente.

-A mas de 25 fotogramas por segundo el ojo humano falla y lo que falta se lo inventa.
-Casi cualquier humano es capaz de mantener una escoba invertida sobre la palma de mano en equilibrio.
-Como el humano utiliza la vision para mantener el equilibrio de la escoba, seria suficiente realimentar el PID a mas de 25 veces por segundo y a eso quizás pueda llegar el arduino usando su entorno ide.

Y despues de todo, no seria el primero que no me funciona, ni el segundo, ni el tercero,... Pero soy joven y puedo aprender ;)

Pablo, perdona pero te estamos vampirizando el post.


Título: Re:Como conectar LinuxCNC a Arduino
Publicado por: dedalo1111 en 14 Octubre 2013, 19:03
Hola, no te falta razón Tio Gil... el tema es que Arduino son plataformas "educativas" para acercar la informática a todo el mundo, lo que permite poner al alcance muchas cosas de otras formas imposible... pero obviamente, 16Mhz dá para lo que dá si encima lleva más capas que una cebolla.

Os cuento un poco como llevo yo este tema de conectar LinuxCNC a un controlador externo....

El tema es que necesitas leer los encoders (si los hay, caso de servos) y enviar la orden motor con una cadencia "exacta" de 1ms. Dispones de solo ese tiempo para hacer la tarea, si lo has de emplear en "interpretar código"... te pasas de tiempo a nada que no esté super-optimizado tu código y/o el Bus no sea rápido.

Esto hace que los requisitos ya se metan en niveles "serios" y las soluciones no pueden ser tan simples como en un proyecto "educacional".

.................

Como estos días he estado cotilleando por el mundo de las impresoras 3D, hay una aproximación que me ha parecido mucho más modular. Date un vistazo a RAMPS (http://reprap.org/wiki/RAMPS_1.4/es), lo que hacen con Arduino es embeber un pequeño intérprete de GCode (Marlin (http://reprap.org/wiki/Marlin) por ejemplo) y el generador de trayectorias... por apenas 15€ tienes una breakboard en eBay. El sistema lo completan unos pequeños drivers PaP (<2A), pero puedes usar los que te gusten (son pines)

Para conectar eso solo tendrías que enviar desde LinuxCNC los GCODE G0 G1 "tal cual" al Arduino por el USB y tirando... eso sí, la aceleración y demás LinuxCNC deja de tener el control y pasa a Marlín.

Un saludo y espero te sirva de ayuda.
Título: Re:Como conectar LinuxCNC a Arduino
Publicado por: juanpefrutos en 14 Octubre 2013, 21:04
¿Alguien se ha planteado utilizar el arduino due para estos menesteres?. Lo digo desde la mas profunda de las ignoracias, pero considerando que funciona a 84MHz frente a los 16MHz del arduino "normal" supongo que mayor capacidad para acometer tareas si tendra. Otro problema puede estar en la necesidad de adaptar los niveles de tensión puesto que trabaja a 3,3V lo cual supondría una placa intermedia.
Saludos
Título: Re:Como conectar LinuxCNC a Arduino
Publicado por: Pablo20061 en 15 Octubre 2013, 00:34
Gracias Jbecerra, esperaré impaciente; aunque me temo que tu proyecto anda por unos niveles poco asequibles para mí espero que me proporcione pistas.
He estado probando el Emc2arduino y las librerías digitalwritefast pero no me terminan de encajar las piezas. Subo el Emc2arduino al arduino UNO pero luego hay algunos pasos en los comentarios de los ficheros que no entiendo:
4. Edite el archivo custom.hal incluido, ajuste a sus necesidades.
5. Copie este archivo custom.hal incluidos en dicha carpeta "my-mill"/i].
En mi caso el archivo custom.hal solo tiene dos líneas y no veo qué ajustes puedo hacer ahí.
Por otra parte el arduino conecta con el puerto /ttyACMO  pero el "EMC2 Stepconf" no aparece dicho puerto (lo intento con /ttyUSB0 y sudo ln -s /dev/ttyACM0 /dev/ttyUSB0 en la terminal pero parece que no es la solución).
Gracias de nuevo.
 
Título: Re:Como conectar LinuxCNC a Arduino
Publicado por: Pablo20061 en 15 Octubre 2013, 00:52
Gracias dedalo, RAMPS y REPRAP está en mis intereses cercano, ya lo he estado estudiando, pero quería explorar y comprender antes esta otra alternativa.
Dices enviar desde LinuxCNC GCODE G0 G1 "tal cual" al arduino, ¿éso como se hace? (perdona mi ignorancia), en linuxCNC, como comentaba, no me aparece el puerto ttyACMO con el que conecta arduino.
Título: Re:Como conectar LinuxCNC a Arduino
Publicado por: tio_gil en 15 Octubre 2013, 08:51
Dedalo1111: Guardaré los link para echarles un vistazo con paciencia, que es lo que me fata estos días.

Juanpefrutos: es más o menos a eso lo que me refería. Que la gente dice: ah!no me llega con 16MHz (o la que quieras poner), pues más !!. Ah! que no me llega la memoria, pues más (típico en los PC's) !! Oiga OP-TI-MI-CE... o haga las cosas como hay que hacerlas (Juanpe, que no te estoy echando la bulla, es que son de las cosas que me encienden). Como dice Dedalo1111, son plataformas educativas.
Ya lo he dicho otras veces: quieres estrujar a lo bestia? usa la plataforma hardware Arduino (que está muy bien y sale muy barata) y usa el micro tal cual.
En lo que trabajo, hace ya años, se les ocurrió sacar un entorno de desarrollo "para los que no saben programar". Iba bien, pero la gente empezó a usarla para lo que no es (es decir, estrujar) y al final hubo que quitarla, porque daba más problemas que otra cosa (es decir, el soporte que había que dar era enorme y la rentabilidad poca y ya se sabe como funcionan los americanos)

Siento el rollo (y salirnos del hilo un pelo)

P.S.: Por lo que veo, el micro va a 16Mhz y si el micro es de 1MIPS/MHz (creo no equivocarme de PN), eso da 16MIPS, es decir 16 millones de instrucciones por segundo = 16000 instrucciones por milisegundo). Si vas "a pelo" controlando el micro (no hablo de asembler), un 1ms da para mucho. Si hay una capa por encima (pej, en un PC, el sistema operativo), esto cae en picado. Un micro (con un solo core), por muuuuuuuy rápido que vaya, ejecuta una instrucción detrás de otra, no en paralelo.
Título: Re:Como conectar LinuxCNC a Arduino
Publicado por: jordi3sk97 en 15 Octubre 2013, 09:30
../..
En el montaje que quiero hacer se usaría al arduino como convertidor AD, leyendo el valor del
potenciometro y enviándolo por usb al linux en digital.

Y algo así no seria mucho mejor que leer un potenciometro ?

http://www.renishaw.es/es/nuevo-chip-de-encoder-magnetico-de-12-bits-am4096--10829

Estás seguro de la linealidad de un potenciometro para esto ?
Título: Re:Como conectar LinuxCNC a Arduino
Publicado por: fleming en 15 Octubre 2013, 09:58
Buenas,
Ayer escribí un post pero debí cerrar antes de mandarlo... venía a decir algo así:
Pues si que tiene narices... Me da que cada vez los programadores (y lo siento si alguno se da por aludido siendo de esa profesión) no se quiebran los cuernos para hacer FW rápido, pequeño y eficiente.
Noi escupas "para arriba" que tu también eres programador!!!
Por lo que he entendido del post de wordpress, lo que hace es consultar y actualizar todas las entradas y salidas del arduino, por eso no es apropiado para controlar motores, no está optimizado para este menester (es como si a Usain bolt le haces correr los 100m lisos con un saco de 25 kilos ala espalda...), faltaría desarrollar un firmware para el arduino (y si me apuras para el ATMEGA en Assembler) específico para mover tres o 4 ejes.
En las reprap, el soft manda comando Gcode por el puerto serie a 115200 y las impresoras se mueven realmente rápido (más que cualquier CNC que he visto), así que el cuello de botella no estaría ahí.
La RAMPS no es más que un Breakout Board, para poder conectar el Arduino y los drivers, los stepstick (http://reprap.org/wiki/StepStick) y su clones que están basados en el A4988 (http://www.allegromicro.com/Products/Motor-Driver-And-Interface-ICs/Bipolar-Stepper-Motor-Drivers/A4988.aspx)de allegro micro, que dan hasta dos amperios... pero si le pides 1A... empiezan a calentarse de lo lindo (hay que meterle disipador y ventilación forzada)


Dices enviar desde LinuxCNC GCODE G0 G1 "tal cual" al arduino, ¿éso como se hace? (perdona mi ignorancia), en linuxCNC, como comentaba, no me aparece el puerto ttyACMO con el que conecta arduino.

Si cargas en el Arduino el firmaware adecuado, lo único que tienes que hacer es mandar los comandos GCODE por el puerto serie, Putty, hyperterminal o con un pulsador morser (si eres capaz de hacerlos a 115200bps jejejeje), en el arduino lo que está cargado es un interprete GCODE, que traducirá en movimientos en lo motores pap.
Firmwares:
-GRBL (https://github.com/grbl/grbl): Está desarrollado para máquinas CNC, aqui la lista de GCODES soportados (https://github.com/grbl/grbl/wiki)
-Marlin  (https://github.com/ErikZalm/Marlin)y Sprinter (https://github.com/kliment/Sprinter): basado en el anterior, si te fijas han implementado muchos comandos para impresoras 3D (por ejemplo los comandos M y N), pero verás que sigue habiendo muchos GCODES para CNC... (http://reprap.org/wiki/G-code)

Perdón por el chorreo de links y dar tanto la barrila, pero es que veo tan evidente que se podría hacer una CNC basada en arduino+firmaware de reprap... que me da pena que nadie se ponga a ello... Ya me gustaría a mi tener tiempo para ponerme (me pondré, pero dentro de mucho). El único inconveniente es que los softwares de referencia, no tienen implementado la posibilidad de mandar los comandos Gcode's a otro intérprete... bueno, la realidad es que tanto Mach3 como EMC2 son dos intérpretes de GCODE basados en pc para controlar directamente los drivers... El arduino hace exactamente eso... y con velocidades de 200mm/s (yo mi impresora la he puesto a 300mm/s) que para una CNC casera es más que suficiente... es más en ese escenario el cuello de botella estaría en el harware (fresadora, motores, drivers), más que en el software.

Perdón por el offtopic, que esto daría para otro hilo, que aunque es arduino y CNC... mi comenario es más sobre el firm de reprap, y no sobre como conectar el arduino al linuxCNC
Título: Re:Como conectar LinuxCNC a Arduino
Publicado por: dedalo1111 en 15 Octubre 2013, 10:25
Jejejeje, Tio Gil programa... pero le tiran más los voltios  :P :P

Yo cuando empecé a ver como se lo habían montado es RepRap pensé lo mismo "ostia, esto es una CNC básica"... pero remarco lo de básica, entre las mejoras de Marlin es que "ahora" controla la aceleración (cosa básica en LinuxCNC) y el planificador de trayectorias es 2D (xy) y ni de lejos hables de Kinemática, movimientos coordinados en 4 ejes, cambios de herramientas o compensaciones.

Lo que me gustó con diferencia, es la división de "funciones" entre la consola de trabajo, el driver y el firmware... puedes intercambiar "con pocos cambios" entre unos proyectos u otro si algo mejor.

Hay otra aproximación por ahí "rulando" que es embeber el LinuxCNC en otras placas más potentes (Olimex).... pero eso es otro post como bien dices.

............

Pablo, mira este enlace que pusieron a HAL2Arduino (http://emc2arduino.wordpress.com/) esa sería una forma simple de empezar (que se puede mejorar), solo que tu programa no necesita "cocinar" las coordenadas de 6 ejes, sino directamente enviar en formato GCode al puerto serie como dice Flemming.

Salu2
Título: Re:Como conectar LinuxCNC a Arduino
Publicado por: tio_gil en 15 Octubre 2013, 12:12
sois unos cachondos.  ;D ;D
Lo máximo en el PC es en MSdos (pero claro yo ahí controlo la máquina, no ella a mí, com en un Windows. En Linux no opino porque no se)
Los micros desde asembler a C (pero con la cabeza en assembler), así que miro bits, no palabras de 32 o 64 bits;
Así que deformación profesional de los años, cuando una memoria de 8Kx8 costaba 2000 pts y era ya la leche.

Flemming: EL TIEMPO, eso que siempre falta...  ;D

Me voy al TRAFIC para relajarme un poco, aver si veo algún colega y arreglamos el mundo  ;D
Título: Re:Como conectar LinuxCNC a Arduino
Publicado por: fleming en 15 Octubre 2013, 12:24
... y ni de lejos hables de Kinemática, movimientos coordinados en 4 ejes, cambios de herramientas o compensaciones.

Pisa el freno, moreno!!! jajajaja
Yo estaba pensando en cosas más sencillas, máquinas estilo la BF20 (al nivel de CNCeado que hace aquí como las de Jmllosa), incluso el 4º eje del team rural (http://foro.metalaficion.com/index.php?topic=11797.msg164838#msg164838), la de montoro (http://foro.metalaficion.com/index.php?topic=13468.0), la de Argarrobo (http://foro.metalaficion.com/index.php?topic=11915.msg165071#msg165071)... y tantas otras sencillas... nada de cosas exóticas... incluso el cnceado de tornos como el de delichon (http://foro.metalaficion.com/index.php?topic=13958.msg166075#msg166075)


Saludo
Título: Re:Como conectar LinuxCNC a Arduino
Publicado por: dedalo1111 en 15 Octubre 2013, 12:31
Ni aún cosas sencillas en su estado actual, piensa en una simple compensación de herramientas (los GCode que interpretan se limitan a G0 y G1) o una trayectoria 3D (incluyendo a Z, el planificador es un algoritmo "Bresenham" para trazar líneas 2D, Z para ellos es solo la altura de cada capa y no se calcula como trayectoria... es un movimiento independiente).

Bueno, muy sencillas muy sencillas si... cosas en 2D, plan router.

Salu2
Título: Re:Como conectar LinuxCNC a Arduino
Publicado por: Jbecerra en 15 Octubre 2013, 15:19
Hola.

Parece que ya casi tengo terminado el eje Y donde pondre encima el pendulo invertido.

Intentare llevar a cabo la idea que empece en este post http://foro.metalaficion.com/index.php?topic=4842.msg57176#msg57176 (http://foro.metalaficion.com/index.php?topic=4842.msg57176#msg57176), todavia se llamaba EMC.

Espero usar el mismo codigo que hay el post y claro, que el pendulo se quede arriba y no abajo como tuve que resignarme anteriormente.

Me esta costando lo suyo conseguir que el eje quede "bien" sin ningun tipo de durezas al girar y que en todo el recorrido tenga la misma resistencia.

Que dificil me resulta mecanizar y centrar un simple casquillo  :'(


Título: Re:Como conectar LinuxCNC a Arduino
Publicado por: Pablo20061 en 29 Octubre 2013, 19:24
Muchas gracias por las orientaciones, la verdad es que con LinuxCNC no lo he logrado aún, intento seguir los pasos indicados en HAL2Arduino pero necesitaría unas pautas más detalladas porque me pierdo. Para resarcirme de la frustración he explorado el software de REPRAP y siguiendo un tutorial de instalación de Pronterface+Skeinforge en Windows 7 y reprap_new_firmware específico para arduino UNO los tres motores parece que funcionan bien.
Título: Re:Como conectar LinuxCNC a Arduino
Publicado por: Jbecerra en 31 Octubre 2013, 09:04
Hola.

Sigo haciendo las piezas del puzzle para el montaje del péndulo invertido aunque he cambiado algunos detalles.

No acababa de convencerme que fuera un potenciómetro el encargado de leer la posición del péndulo, lo he cambiado por un encoder de 500 pulsos.

(https://lh3.googleusercontent.com/-Ck65H15TVd8/UnK_IX4JT4I/AAAAAAAAFKg/6ALrtKVmwtk/w783-h522-no/IMG_4940.JPG)

Vista del péndulo:
(https://lh5.googleusercontent.com/-wH9WBclMFeY/UnK_1OZlk6I/AAAAAAAAFLE/sXyzAPHgqnQ/w348-h522-no/IMG_4944.JPG)

Usare el arduino para leer desde 3 potenciómetros los valores que quiero asignar a los parámetros PID y así tener mas facilidad para "tunearlo"

He montado 3 potenciómetros de 10k en un panel, el cableado es fácil, consideramos que cada potenciómetro tiene los terminales positivo, señal y negativo, unir todos los positivos y llevarlo a +5 del arduino, igual con los negativos y nos quedan 3 cables que pongo en las 3 primeras entradas analógicas.

(https://lh5.googleusercontent.com/-FuKdeZ9KZmA/UnIfDcuW_iI/AAAAAAAAFJY/YJoGi0_iXug/w608-h673-no/DSC08393.JPG)

(https://lh6.googleusercontent.com/-a3tb1HHSokY/UnIfQoXGxlI/AAAAAAAAFJ4/MW-jyX8xiT0/w505-h673-no/DSC08389.JPG)

Un programa en el arduino lee las 3 señales y crea una palabra de las 3 lecturas poniéndole delante de cada lectura una P,D e I. ( ya esta hecho, no tiene porque ser asi,pero es que en esto de programar también estoy pegado ).

Código del programa en arduino:

/* Entradas analogicas, salidas serie. */

const int PinEntradaValorProporcional = A0;
const int PinEntradaValorIntegral = A1;
const int PinEntradaValorDerivativo = A2;


float ValorProporcional = 0;
float ValorIntegral = 0;
float ValorDerivativo = 0;

void setup() {
 
  Serial.begin(9600);
}

void loop()
{
  ValorProporcional = analogRead(PinEntradaValorProporcional); 
  ValorIntegral = analogRead(PinEntradaValorIntegral); 
  ValorDerivativo = analogRead(PinEntradaValorDerivativo); 
 

  Serial.print("P");
  Serial.print(ValorProporcional,0);
 
  Serial.print("I"); 
  Serial.print(ValorIntegral,0);
 
  Serial.print("D");
  Serial.println(ValorDerivativo,0);   

  delay(2);   
 
}


Después de cargar el programa en el arduino, este se queda en ejecución enviando por su puerto serie la palabra con los datos.

Ahora le toca el turno a un programa en python que sera llamado por el linuxcnc y leerá estos datos por el puerto serie. Hay que guardarlo en un directorio que este en el PATH del usuario, recomiendan usr/local/bin. y darle permiso de ejecución.

Pido perdón a los "pica-teclas" ;) y aviso a los incautos de que estos programas no son ejemplos a seguir ya que soy un "lacuentadelavieja"  y nunca aprobé esta dichosa asignatura.

Código en python para leer del puerto serie y pasar valores al HAL

#!/usr/bin/python
import hal, time, serial

h = hal.component("PID_Arduino")
h.newpin("P", hal.HAL_FLOAT, hal.HAL_OUT)
h.newpin("I", hal.HAL_FLOAT, hal.HAL_OUT)
h.newpin("D", hal.HAL_FLOAT, hal.HAL_OUT)
h.ready()

cadena = ""
pos_P = 0
pos_I = 0
pos_D = 0

val_P = 0
val_I = 0
val_D = 0

ser = serial.Serial('/dev/ttyACM0', 9600, bytesize=8, parity='N', stopbits=1, timeout=0, xonxoff=0, rtscts=0)

try:
   while 1:
      time.sleep(0.5)

      cadena = ser.readline()
      cadena = ser.readline()

      pos_P = cadena.find("P")
      pos_I = cadena.find("I")
      pos_D = cadena.find("D")

      val_P = int(cadena[1:(pos_I)])
      h['P']=val_P
      val_I = int(cadena[(pos_I+1):(pos_D)])
      h['I']=val_I
      val_D = int(cadena[(pos_D+1):])
      h['D']=val_D

      ser.flushInput()

except KeyboardInterrupt:
   raise SystemExit


Este programa al ser llamado desde el linuxcnc nos crea 3 pines para usarlos con el HAL que son "P", "I" y "D".

Desde el linuxcnc tan solo hay que cargarlo con la instrucción loadusr nombredelphyton y ya se puede usar sus pines.

Ahora le toca el turno al panel de control que se crea con un fichero .xml y donde aparecerán los valores leídos por el arduino para usarlos como parámetros del PID.