Buenas a todos, ya está todo inventado y funcionando, la idea es portarlo y hacerlo funcional en OpenWRT.
También como objetivo es reautilizar todo lo posible, como en este caso que costó sólo 2 €, por lo que ya sólo falta mejorar el driver/software.
Hace 2 semanas hice esta "mini-impresora 2D con WiFi y sin necesidad de PC" con motores bipolares paso a paso "4 hilos" y un bolígrafo (aprovechando 2 mecanismos de unidades DVD de PC). Por suerte con todo el tiempo que llevaba pa lante y patrás con los motores paso a paso, los scripts hechos y demás, el script mini-driver básico que hice, montarlo todo y dejarlo funcionando en sus primeras fases no alcanzó a las 8 horas (madrugada del domingo). Así que quien quiera hacérselo, le ocupará muy poco tiempo.
De momento es 2D (sólo eje X e Y): tiene puesto un bolígrafo, aunque la idea principal es ponerle un láser para quemar superficies y hacer logos, dibujos, guías, etc...
Obviamente el siguiente pasó será hacerla 3D (X, Y, Z) para ponerle x ej: un taladro, fresas, un lápiz 3D, un Hotend, etc..
Vídeo -= Pincha Aquí para verlo =- (http://sendvid.com/jx6ue7ix)
(http://i68.tinypic.com/xlldv7.jpg) (http://i66.tinypic.com/xkx9a9.jpg)
Link de la imagen de las impresiones en HD --> http://i65.tinypic.com/161ants.jpg (http://i65.tinypic.com/161ants.jpg)
A continuación pongo el enlace con todos los scripts hechos para las figuras geométricas de prueba. Lo propio es poder realizar dibujos en cualquier programa de edición, exportarlos en el formato adecuado (G-CODE u otro) e importarlo por cable o wifi al router, y lanzarlo a imprimir. En esto último es donde reside el problema con el que llevo 2 semanas luchando, y que me gustaría resolver, a ver si entre todos podemos adaptar/crear un "driver" o la forma en que por ejemplo los G-CODE puedan ser interpretados y llevados a acabo, al menos de momento por los ejes X e Y.
Enlace con los scripts para las pruebas: https://goo.gl/SQaZmz (https://goo.gl/SQaZmz)
================
Materiales empleados:
================
- Driver L293D (1€/u = 2 €)
- Router con OpenWRT y GPIOs operativos (4 GPIOs por motor. Poniendo un transistor se reducen a la mitad. Se usó el HG556a Ver.C Atheros con la 14.07 RC3)
- Unidad de CD/DVD de un PC, portátil, reproductor, etc... (1 unidad por eje, en este caso 2)
- Base para fijar los ejes en la misma superficie (en este caso se reutilizó el metacrilato de una pantalla LCD despiezada)
- Tornillería
========
Software:
========
Arranque local --> Contenido de /etc/rc.local
# -------------------------------------------------------------------------------------------------------------------
# Configuración de GPIO's para motor paso a paso: 4, 5, 24, 25, 29 y 32 como salidas
# -------------------------------------------------------------------------------------------------------------------
echo 4 > /sys/class/gpio/export
echo "out" > /sys/class/gpio/gpio4/direction
echo 5 > /sys/class/gpio/export
echo "out" > /sys/class/gpio/gpio5/direction
echo 24 > /sys/class/gpio/export
echo "out" > /sys/class/gpio/gpio24/direction
echo 25 > /sys/class/gpio/export
echo "out" > /sys/class/gpio/gpio25/direction
echo 29 > /sys/class/gpio/export
echo "out" > /sys/class/gpio/gpio29/direction
echo 32 > /sys/class/gpio/export
echo "out" > /sys/class/gpio/gpio32/direction
# ---------------------------------------------------------------------------------------------------------------------
==============================
GPIO's usados para cada Eje (X e Y):
==============================
Motor eje X
LAN1="/sys/class/gpio/gpio24/value"
LAN2="/sys/class/gpio/gpio25/value"
LAN3="/sys/class/gpio/gpio29/value"
LAN4="/sys/class/gpio/gpio32/value"
Motor eje Y
LAN5="/sys/class/gpio/gpio4/value"
LAN6="/sys/class/gpio/gpio5/value"
LAN7="/sys/class/leds/HW556:red:hspa/brightness"
LAN8="/sys/class/leds/HW556:red:message/brightness"
============
Driver/software:
============
Para realizar el montaje y probar las funciones básicas de los motores de los ejes X e Y, están los scripts del enlace de arriba. Sin embargo me estoy viendo en la problemática desde hace 2 semanas de tratar de convertir los dibujos de cualquier programa que están en G-CODE a un formato que lo pueda interpretar para que lo imprima el router. He estado mirando como lo hace Arduino y usa la librería: "customstepper.h", pero me falta saber integrarla en todo esto más lo que hiciera falta.
Enlace de customstepper.h y algunos dibujos exportados https://goo.gl/SQaZmz (https://goo.gl/SQaZmz)
¿Les gustaría ayudar a llevar este proyecto adelante? Yo voy a seguir documentándome, pero la verdad que se me está haciendo cuesta arriba, llevo 2 semanas a saco empezando desde 0 y no conocía el mundo 3D.
Un saludo y muchas gracias a todos
===========
Modificaciones:
===========
Añadida foto de impresiones hasta la fecha (07/06/17 a la 1:34 am)
Raspberry Pi imprimiendo imágenes en GCODE (usando GPIO's para los drivers L293D)
Vídeo -= Pincha Aquí para verlo =- (http://sendvid.com/9s1wqwj6)
(http://i65.tinypic.com/hv2ps7.jpg)
El formato para guardar con GCodeTools del Inkscape es: *.ngc (Linux CNC GCode)
=========================================================================================
Autor del proyecto: Ian D. Miller --> iandouglas96
engravR --> Raspberry Pi Powered Laser Engraver (grabador láser) (2D)
piPrint ----> Raspberry Pi 3D Printer Firmware (impresora 3D) (3D)
Link al vídeo del proyecto original (https://www.youtube.com/watch?v=xxQ33cNIXxU)
Y aquí los códigos para cargar en la Raspberry Pi y poder usar los GCODE (a mi me funcionó con la Pi 3 y el Raspbian).
https://github.com/iandouglas96 (https://github.com/iandouglas96) (proyecto engravR)
=========================================================================================
OpenWRT imprimiendo imágenes exportadas a *.C y convertidas a scripts (usando GPIO's para los drivers L293D)
Vídeo -= Pincha Aquí para verlo =- (http://sendvid.com/iof4gnlz)
(http://i63.tinypic.com/r8ruky.jpg)
Haber encontrado este proyecto "engravR" supone la clave para tratar de portarlo a OpenWRT y hacerlo funcional.
El programa principal "laserengraver" nos da la opción de configurar los pines a usar por cada motor y para cada bobina, el pin para el laser, en nuestro caso el Servo (GPIO 14 x ej) controlado por PWM ó en el peor de los casos por el script que hice, que siempre se puede mejorar, aunque no consigo tiempos exactos ni sé su duración con los que crear un PWM bueno, y por último da la resolución, que es importante, tuve que poner 0.025 en ambos ejes, porque si no Bart salía en modo chapita pa la camisa (minúsculo).
MX=Bipolar_Stepper_Motor(22,18,24,26); #pin number for a1,a2,b1,b2. a1 and a2 form coil A; b1 and b2 form coil B
MY=Bipolar_Stepper_Motor(10,8,12,16);
Laser_switch=3;
dx=0.075; #resolution in x direction. Unit: mm
dy=0.075; #resolution in y direction. Unit: mm
El código está escrito en Python, así que instalé el Python en el router y me dispuse a ejecutar el programa del engraver, aunque ya suponía que no iba a funcionar con la misma. El programa se ejecuta pero obviamente, las librerías incluidas no coinciden con el sistema OpenWRT https://www.dropbox.com/sh/alc6mwpio8y5ab3/AAAJ8Ms8msGJBxoeJ6_YIE4Aa?dl=0
(https://www.dropbox.com/sh/alc6mwpio8y5ab3/AAAJ8Ms8msGJBxoeJ6_YIE4Aa?dl=0)
import RPi.GPIO as GPIO
import Motor_control
from Bipolar_Stepper_Motor_Class import Bipolar_Stepper_Motor
import time
from numpy import pi, sin, cos, sqrt, arccos, arcsin
import argparse
He visto los códigos de las librerías y dentro de lo que puedo llegar a entender de programación (que es poco), creo que se pueden sustituir muchos de ellos por scripts "en principio" y luego en python.
RPi.GPIO --> Me bajé esta librería y el código es bien largo (está en el enlace de arriba), con los scripts de arriba mejorados no habría problema, ya que una vez los GPIO's está exportados al igual que los leds que ni hay que exportarlos, los podemos usar con echo > 1 y echo > 0 como siempre, no hay que comprobar si están libres, etc, como me parece que hace esa librería.
import time --> Tengo una duda sobre esta librería y OpenWRT, ya instalé el sleep, pero cómo se usan los timer del sistema? Sleep no es constante en el tiempo, ....con los triggers del kernel como comentó danitool o se puede hacer de otra forma
from numpy import pi, sin, cos, sqrt, arccos, arcsin import argparse --> Estas desconozco si son del python ¿?¿?
Para el control de los motores están estos 2 scripts sencillos que hice (están en el 1º mensaje):
3_pasos_gpio_der_e_izq_X (faltaría mejorarlos para que guarden en que bobina/s está situado para cuando retome el movimiento)
3_pasos_gpio_der_e_izq_Y
El láser es sólo 1 pin para activar o desactivarlo, hay que sustituirlo por el servo y manejarlo por PWM, el cual conseguí semi-controlarlo, aunque no es fiable al 100% y a veces gira al revés. Por lo que buscando en el repositorio "PWM" encontré esto:
Install kmod-pwm 3.10.49-1 Kernel module that implement a generic PWM API
Install kmod-pwm-gpio 3.10.49-1 Kernel module to models a single-channel PWM device using a timer and a GPIO pin
https://wiki.openwrt.org/doc/hardware/port.gpio/pwm (https://wiki.openwrt.org/doc/hardware/port.gpio/pwm)
Sigo los pasos, instalo el "configfs":
Install kmod-fs-configfs 3.10.49-1 Kernel module for configfs support
Pero me da fallo y no aparece la carpeta pwm en SYS/CLASS/PWM
root@OpenWrt:/# mkdir /config
root@OpenWrt:/# mount -t configfs none /config
root@OpenWrt:/# mkdir /config/gpio_pwm/14
mkdir: can't create directory '/config/gpio_pwm/14': No such file or directory
root@OpenWrt:/# mkdir /config/gpio_pwm
mkdir: can't create directory '/config/gpio_pwm': Operation not permitted
El servo por lo que estoy mirando, al usar sólo 1 PIN y funcionar por PWM, se comporta así en función del movimiento que queramos:
(http://i66.tinypic.com/5lvuq8.jpg)
Lo que hice para el servo, fué un simulacro del PWM, que no sé que combinación hice al principio que estaba descontrolado pero se movía bastante y con fuerza, pero modificando el código perdí esa combinación y ya sólo consigo que suba tal como se ve en el vídeo (pocos grados y tuve que hacer un bucle de 3), y bajando si que siempre ha sido igual, más rápido o más lento pero no da un salto brusco, el ruido que se oye, es porque lo controlo con el GPIO 14 que va conectado al relé de ADSL y se pone a toda pastilla.
LAN4="/sys/class/gpio/gpio14/value"
echo 0 > $LAN4
VUELTAS=`expr $1`
TIME=`expr $2`
DIRECCION=`expr $3`
COUNTER=$VUELTAS
if [ $DIRECCION -eq 1 ]
then
# ========== BAJAR BOLÍGRAFO ================
until [ $COUNTER -lt 1 ]; do
#LAN4
echo 0 > $LAN4
sleep $TIME
echo 1 > $LAN4
sleep 0.0001
let COUNTER-=1
done
fi
# ========== FIN BAJAR BOLIGRAFO ================
if [ $DIRECCION -eq 0 ]
then
# ========== SUBIR BOLÍGRAFO ================
until [ $COUNTER -lt 1 ]; do
#LAN4
echo 1 > $LAN4
sleep $TIME
echo 0 > $LAN4
sleep 0.018
echo 1 > $LAN4
sleep 0.001
let COUNTER-=1
echo 0 > $LAN4
Por otra parte, siempre quedó en la PCB del HG556a el GPIO 14 un pin donde soldar, lo que trabaja a 5v (con un divisor de tensión listo) y no a 3,3 v que es lo típico de los GPIOs, y por lo que he visto el servo trabaja con el pin de señal a 5v (aunque me parece que tb lo hace a 3,3v o en la Raspi no hubiera funcionado si no)
Bueno de momento, esto es todo, si alguien puede dar luz a las sombras se lo agradecería
Sombras:
- Tratar de sustituir las librerías o aclarar la función de cada una, o si el python las tiene y no hay que añadirla (time,
from numpy import pi, sin, cos, sqrt, arccos, arcsin, import argparse)
- PWM en OpenWRT para controlar el servo. Actualmente uso la 14.07 RC3
- Saber usar el timer sin tener que recompilar el kernel, por si hicieran falta hacer retardos exactos para crear el PWM o por si el "time" importado al código de python no fuera correcto.
En la biblioteca que pones, sólo veo una actuación directa de los pines del arduino, sobre los polos del motor,
dependiente de una constante de tiempo, que es derivada del reloj del arduino.
No hay interpretación del código G-CODE, por lo que supongo que esta interpretación estará hecha, por algún
programa, que le mande los datos al arduino.
Si no me equivoco, hace tiempo miré algo de esto, y el programa que interpreta los G-CODE para arduino, se llama
GRBL.
Buenas, tienes razón en todo, me da que con el overbooking que tenía en mi cabeza no asimiliba más conceptos y el código se vuelve matrix para mi (vaya que no me entero ni de lo que tengo delante).