En un artículo cnce.html
había realizado con la mecánica de la Ender 3 un quemador laser, y
una demostración de como dibujar con un rotulador.
En un artículo posterior había
realizado un circuito impreso con la mecánica de la Ender 3, pero
con un controlador aparte.
En esta ocasión utilizo solo la Ender 3 para dibujar con un
rotulador el circuito impreso.
El diseño electrónico está realizado con la aplicación KiCAD versión
5, así como el diseño del PCB.
Para ver todos los pasos de su creación ver el anterior
artículo.
Exportamos a formato svg para poder importarlo con InkScape.
En esta ocasión utilizamos el Plug-In GcodeTools para generar código
GCODE, es muy versátil, pero también bastante lioso de usar.
Se conecta mediante un cable USB el ordenador y la impresora Ender
3.
Y utilizamos el programa RepetierHost https://www.repetier.com/
La sujeción del rotulador se realiza mediante un imán y una goma, es
un diseño provisión, pero funciona bien.
Para mas detalles ver el vídeo.
A mi me gusta lo primero hacer una primera impresión con un
rotulador normal, y si todo funciona bien, cambiarlo por el
rotulador de tinta permanente que aguanta el ácido.
Dependiendo de la calidad del rotulador debemos dar varias pasadas,
en mi caso son 2 pasadas.
El resultado no es el mejor, pero resulta extremadamente rápido
además barato.
Quizá el método de transferencia térmica
con impresión en láser sea un método tan sencillo y barato.
Para ver todos los pasos con más detalle, he creado un vídeo con
todos los pasos bastante más explicados.
CNC Crear un circuito impreso con mecánica de Ender 3
En el anterior artículo cnce.html había realizado con la mecánica de la Ender 3 un quemador laser, y una demostración de como dibujar con un rotulador. Como había prometido, mi intención era realizar un circuito impreso con la mecánica de la Ender 3. El diseño electrónico está realizado con la aplicación KiCAD versión 5, a la que le han quitado el autorouter. Lo primero que debemos es crear el esquema. Una vez creado el esquema, traspasamos todos los elementos al circuito impreso. Los colocamos a nuestro gusto y creamos las pistas manualmente. Exportamos a formato svg para poder importarlo con InkScape. Un Plug-In bastante fácil de usar es Laser Tool Plug-In y se descarga de https://jtechphotonics.com/?page_id=2012 . Está hecho para manejar un láser, pero también se puede modificar para realizar dibujos. La colocación del rotulador es un tanto simple, una goma, lógicamente se puede colocar de otra forma bastante mejor, pero esto es una prueba rápida. Aprovechamos el eje Z para pintar. Se ajusta todo, y generamos el código gcode con el Plug-In Laser Tool Plug-In. Utilizando el programa Universal Gcode Sender leemos el fichero gcode generado, y lo mandamos al CNC. Dibujamos todo el circuito con el rotulador permanente. Dependiendo de la calidad del rotulador debemos dar varias pasadas, en mi caso son 2 pasadas. El resultado no es el mejor, pero resulta extremadamente rápido y barato su realización. Quizá el método de transferencia térmica con impresión en láser sea un método tan sencillo y barato.
Para ver todos los pasos con más detalle, he creado un vídeo con todos los pasos bastante más explicados. VIDEO El entorno de trabajo ha sido Debian 10. Próximamente realizaré un tutorial donde utilizaré solo el hardware que viene de serie en la Ender 3
Hace un par de años había realizado varios montajes de CNC con piezas de DVD recicladas cnca.html.
Había utilizado una placa controladora que en su momento me costó alrededor de 8€.
La tenía un poco retirada, pero en la mente para hacer otros montajes.
El año pasado había comprado una impresora 3D Ender 3, de la cual estoy bastante satisfecho.
En mi idea de realizar algo más que crear piezas de plástico con la impresora se me vino a la cabeza la placa controladora que tengo en el cajón.
Existe la posibilidad de utilizar la electrónica que tiene la Ender 3, pero requiere abrir la impresora y modificar el firmware, eso no me gusta. Además es mucho más flexible utilizar el programa controlador GRBL , el cual funciona bastante bien en la mayoría de los casos.
Existe un kit con láser para transformar la ender 3 en grabadora laser, este vídeo lo explica. https://www.youtube.com/watch?v=K7X78C0qoxc
Para la realización de está práctica solo es necesario conseguir los cables que conecte la placa controladora a los motores de la Ender 3.
Casualmente entre los muchos cables que poseo de piezas recicladas estaban dichos cables, son conectores de 6 pin, de los cuales se utilizan 4 para los motores.
En un principio conecté los cables según la configuración normal que aparece en todos los esquemas.
1-1 , 2-2 , 3-3 , 4-4 . Pero esto no funcionó, hacía como que se activaban los motores pero los motores no se movían.
Después de mirar con el polímetro descubrí que las bobinas de los motores de Ender 3 no correspondían con la conexión normal.
La conexión correcta es 1-1 , 2-3 , 3-2 , 4-4 . Con lo cual los motores giraba perfectamente.
Con el programa Universal Gcode Sender realizamos todas las pruebas.
El principal cambio que debemos hacer para adaptar nuestro CNC es (x, step/mm) y (y, step/mm). Para ver la configuración del GRBL que se almacena en la EEPROM del arduino debemos teclear la orden :$$
Para el caso de la Ender 3 el ajuste es el siguiente: $100=5 $101=5 $102=25 Las demás configuraciones debemos cambiarlas dependiendo el tipo de motor paso a paso que tengamos.
Normalmente funciona sin tocar nada mas, pero cambiando algún que otro parámetro veremos como aumenta la velocidad.
Como en mi CNC no voy a conectar los interruptores de fin de carrera, tengo que ajustar el CNC a la posición inicial X=0 y Y=0. Se puede hacer a mano y luego pulsar en del botón de Reset Zero en el programa del Universal Gcode Sender.
Unos de los motivos de no conectar los interrupciones de fin de carrera es que utilizamos el Limite de eje Z para la activación del láser.
El láser utilizado se compró en aliexpress LASER , es bastante barato y el kit incluye las gafas que no tengo.
Con la potencia de este láser no se puede pretender mucho, además no creo que llegue a 1W .
Las pruebas me dieron la razón, solo quemaba goma-eva o papel de seda, pero para las primeras experiencias me sirvió.
Conexión del láser a la placa CNC.
Existen varios programas para generar código GCODE desde una imagen o dibujo.
El más fácil es LaserGRBL solo funciona en Windows y es open source, se descarga de http://lasergrbl.com/. LaserGRBL funcionando
Resultado de las diferentes pruebas.
Como podemos observar el anclaje del láser se realiza mediante un imán, por lo cual el desmontaje es muy fácil.
En Inkscape tenemos el Plug-In GcodeTools para generar código GCODE, es muy versátil, pero también bastante lioso de usar.
Un Plug-In bastante más fácil de usar es Laser Tool Plug-In y se descarga de https://jtechphotonics.com/?page_id=2012 .
Está hecho para manejar un láser, pero también se puede modificar para realizar dibujos.
La colocación del rotulador es un tanto simple, una goma, lógicamente se puede colocar de otra forma bastante mejor, pero esto es una prueba rápida. Aprovechamos el eje Z para pintar.
Con este láser no se puede quemar mucho, es de poca potencia, pero el montaje es una referencia para colocar un láser de mayor potencia.
Para los que quieran saber lo que puede quemar un láser ver este vídeo. https://www.youtube.com/watch?v=djRRxGXyACY
En la próxima entrega realizaré un circuito impreso con la Ender 3.
El entorno de trabajo ha sido Debian 9, salvo en la utilización del programa LaserGRBL que solo funciona en Windows.
28/11/2018 - Arduino - Inkscape Laser Tool Plug-in, GRBL, Universal GcodeSender, PARTE 5. CNCE
19/11/2018 - Arduino - CNC con piezas de DVD recicladas. GRBL, Inkscape, Gcodetools, UniversalGcodeSender. Parte 4. CNCD
15/11/2018 - Arduino - CNC con piezas de DVD recicladas. Parte 3. Programa Benbox. CNCC
13/11/2018 - Arduino - CNC con piezas de DVD recicladas. Parte 2. Interface realizada con Gambas. CNCB
09/11/2018 - Arduino - CNC con piezas de DVD recicladas. Parte 1 .CNCA
Mi primer microprocesador emulado. arduino 8bits CORE CPU_S8
Desde el primer momento que vi emular el Spectrum en un PC 386, mi admiración empezó por estos tipos de programas. Siempre había pensado en hacer un microcontrolador emulado, el que yo conocía es el Z80, hace muchos años había creado un ensamblador del Z80 en el SBASIC del QL. Pero mi intención era que corriese en un arduino, y visto que el arduino tiene solo 2K de RAM, se hace difícil su eficacia en cuanto utilización y velocidad, aunque he visto alguno que se ha atrevido. Lo cierto es que me puse como reto crear un microprocesador de 8bits que solo tuviera un direccionamiento de 8bits (256 bytes). Mas pequeño imposible, tengo que meter el programa, las variables y la pila en 256bits.
CORE CPU_S8
La estructura del microprocesador es de los mas simple. 4 R0-R1-R2-R3 .Registros simples, que además se pueden utilizar como registros de direccionamiento de memoria. 1 PC - Registro de contador de programa. 1 SP - Registro de dirección de Pila. 1 RII - Registro de dirección de interrupción interna. No implementado 1 RIE - Registro de dirección de interrupción externa. No implementado 1 RS - Registro de estado. S-Signo Z- Cero C- Acarreo 1 RSI - Registro de estado de interrupciones. No implementado.
Una memoria RAM de 256 bytes donde se carga el programa a ejecutar. El programa se empieza a ejecutar en la posición de memoria 0. Lo normal es que el registro de pila se carga inicialmente con la dirección 255, pero se puede cambiar al gusto de cada uno.
Con estas premisas me plantee crear un juego de instrucciones, normalmente de un solo byte, pero hay unas cuantas de 2 bytes que son la que precisan de un dato inmediato.
Ejemplo de instrucciones de 1 byte
Ejemplo de instrucciones de 2 bytes
Para ver todo el juego de instrucciones que he implementado ver documento INSTRUCCIONES. El emulador está realizado en C , con lo cual se consigue una portabilidad casi inmediata desde el PC al arduino. En el PC el emulador funciona bastante rápido, en el arduino funciona bien, aunque la diferencia entre la velocidad de uno y del otro es abismal. El PC funciona a 2Ghz y el arduino a 16Mhz ese es el motivo fundamental. La decodificación de instrucciones se realiza mediante switch code , case 0....... . Aunque los compiladores realizan un buen trabajo en la búsquedas de opciones case: , el tener que buscar continuamente códigos, ralentiza mucho el emulador. En una próxima versión utilizaré tablas de funciones que son mucho mas rápido.
Aunque se pudiera pensar que la realización del emulador es difícil, no lo es tanto, es laboriosa, tienes que implementar una por una todas las instrucciones.
El problema de crear tu propio microprocesador virtual es que no tienes entorno de trabajo, no tienes ensamblador ni desensamblador. Tampoco tienes un programa que transfiera el código binario al arduino. Diría que del tiempo empleado en este proyecto, el 20% lo he utilizado en crear el emulador del microprocesador virtual. Entre el ensamblador, el preprocesador incluido en el ensamblador, el desensamblador, y el programa que transfiere el código al arduino me ha llevado el 80% del tiempo.
El formato utilizado en las instrucciones es: MOV RegistroOrigen , RegistroDestino El preprocesador pasa todo a mayúsculas, no hace diferencia entre mayúsculas y minúsculas. Debo decir que el ensamblador solo admite números en formato decimal, este será otro de los cambios a realizar.
Los puertos de entrada y salida están mapeados, es decir, el puerto 0 del microprocesador virtual esta mapeado para que apunte al puerto PORTB (0x05) de microcontrolador ATmega328.
./ensam blink.asm -o blink.bin //ensambla el fichero blink.asm ./core8 blink.bin -p2 //prueba en el emulador del PC ./sendData blink.bin /dev/ttyUSB0 //manda el programa al arduino par se ejecute ./disam blink.bin //desensamblador del fichero. Preprocesador y ensamblador core8 V_3_5 ======================================== / comentario $ variable # variable de salto Formato: $variable nemotécnico <- Dos espacios mínimo desde principio de linea Números solo en formato decimal. Desensamblador V_3_5 ====================== ./disam fichero.bin opciones: -pt Salida por pantalla -o nombre fichero.asm Core8 V3_5 =========== Antes de mandar el programa al arduino se puede probar en el emulador del core8 en el PC. ./core fichero.bin opciones: -t Tiempo entre operaciones -p1 Imprimir borrando pantalla -p2 Imprimir solo puertos sendData V3_5 ============== Manda el programa al arduino para que ejecute el emulador del core8 en el arduino. ./senData fichero.bin /dev/ttyUSB0
El primer programa que se suele hacer con microprocesadores es el hacer parpadear un LED. En este caso hacemos parpadear el LED que tiene el arduino en el pin D13.
/ blink / * MAPEO DE PUERTO EN ARDUINO / * 0 PORTB 0X05 / * 1 PORTC 0X08 / * 2 PORTD 0X0B / * 3 PINB 0X03 / * 4 PINC 0X06 / * 5 PIND 0X09 / * 6 DDRB 0X04 / * 7 DDRC 0X07 / * 8 DDRD 0X0A $retardo 250 $portb 0 $setportb 6 #setup mov 255,r0 /puerto b como salida out $setportb clear r0 mov $portb,r1 #volver mov 32 , r0 out r0,(r1) wait $retardo wait $retardo clear r0 out r0,(r1) wait $retardo wait $retardo jmp #volver stop end
A este programa blink.asm le he quitado los retardo y he conseguido una onda cuadrada de 60KHz, con esto deberíamos ver la velocidad de emulador.
Para que el arduino cargue el programa en RAM , debemos instalar el programa cargador en el arduino, se llama arduV3_5. El programa se instala en el arduino y después de 3 destellos, espera al código procedente del PC.
Con 240 bytes de código se puede hacer poco, pero era el reto que creo que he conseguido. Todo el proyecto ha sido bastante laborioso, es fruto del confinamiento por el COVI-19, hay que sacar algo positivo de todo esto. El entorno de trabajo fue Debian10 64bits.
Un puzzle parecido había realizado hace años para XWIN , también lo había portado a SDL , hace poco lo porté Gambas(VB Linux). Este puzzle tiene 3 niveles dependiendo del tamaño de la cuadrícula. Nivel 1. - 4x4 Nivel 2. - 6x6 Nivel 3. -10x10 Cada nivel tiene su propia tabla de puntos. Dependiendo del nivel empiezas con unos puntos que se irán disminuyendo según pasa el tiempo. Con el botón izquierdo del ratón se mueven las piezas.
Juego funcionando.
El juego es simple, pero maneja muchas rutinas para aprender a programar. Carga imágenes jpg, trocea imágenes, utiliza TIMER, carga sonidos, lee y escribe ficheros. Es un programa para aprender a programar Java.
Antes de nada hay que explicar que Java no es el mejor entorno para realizar juegos, por lo que portar el juego desde SDL no ha sido lo más placentero. En unas líneas explico mi principales problemas en el desarrollo.
Uno de lo que me volvió loco durante 2 horas fue esto: lienzo.drawImage (imagen1,xo,yo,xo+w,yo+h, xi,yi,xi+w,yi+h,jPanel1); Pensaréis ¿que problema puede tener esto?. El problema es la sobrecarga de operadores en Java. Dependiendo del tipo de argumentos que se la pasa a una función, interpreta realizar una función u otra. En mi caso interpretaba en la compilación la opción incorrecta y producía mal funcionamiento del programa. Después de muchas pruebas, decidí pasar los parámetros limpios, sin operaciones. int a,b,c,d; a=xi+w; b=yi+h; c=xo+w; d=yo+h; lienzo.drawImage (imagen1,xo,yo,c,d, xi,yi,a,b,jPanel1); Solucionado. :)
Tiempos de espera Wait(). Algunos os aconsejan utilizar: Thread.sleep(1); Esto produce muchos problemas en el tiempo de espera. Lo mejor es utilizar: System.currentTimeMillis(); La rutina empleada por mi es: void miWait(int z) { long Time0 = System.currentTimeMillis(); Time0+=z; while(Time0>System.currentTimeMillis()) { // System.out.println("WAIT2="+System.currentTimeMillis()); } }
El siguiente problema que me surgió es repaint() El repaint en Windows 7, Windows 10, WindowsXP y Linux funciona diferente de un sistema a otro. Al final he tenido que realizar mi propio repaint: public void paint (Graphics g) { super.paint(g); if(game==1) printPantaH(); else pantallaInit(); //System.out.println("REPINTAR"); }
Este punto no es un problema de Java, es digamos que no hace fácil como maneja ficheros sencillos. Para el manejo de ficheros en C las bibliotecas están muy estandarizadas. Si quieres mejorar la velocidad en la lectura/escritura de fichero puedes crear muchas rutinas útiles. En Java pueden utilizar muchas formas, visita la página https://www.baeldung.com/java-write-to-file . Para usar ficheros simples de puntuaciones he utilizado la forma más fácil que he encontrado. void load_puntos() { int z; String tmp; try { File myObj = new File(ficheroPuntos); Scanner myReader = new Scanner(myObj); for(z=0;z<5;z++) { nombresMax[z]=myReader.nextLine(); tmp=myReader.nextLine(); puntosMax[z]=Integer.valueOf(tmp); } myReader.close(); } catch (FileNotFoundException e) { System.out.println("An error occurred."); } }
Creo que en Java todo es bastante lioso, muchas clases y muchas funciones que hace complicado cosas simples. O tienes mucha memoria y mucha práctica en Java, o te ves mirando ayudas continuamente. Pero claro esto es una opinión de un programador de C , C++ y Basic.
Está desarrollado en Debian 10 con netbeans, y probado en Windows7.
Un puzzle parecido había realizado hace años para XWIN , también lo había portado a SDL , en está ocasión lo realizo en Gambas. Este puzzle tiene 3 niveles dependiendo del tamaño de la cuadrícula. Nivel 1. - 4x4 Nivel 2. - 6x6 Nivel 3. -10x10 Cada nivel tiene su propia tabla de puntos. Empiezas con 1500 segundos que se irán disminuyendo según pasa el tiempo. Con el botón izquierdo del ratón se mueven las piezas.
Juego funcionando.
El juego es simple, pero maneja muchas rutinas para aprender a programar. Carga imágenes jpg, trocea imágenes, utiliza TIMER, carga sonidos, lee y escribe ficheros. Es un programa para aprender a programar Gambas
GAMBAS (VB Linux) Localización de municipios en España Mapas de Sevilla con precisión
En mi aprendizaje de Java había realizado un localizador de municipios en un mapa. MapasJava Como yo soy muy partidario del Basic, se me ocurrió portar los programas a Gambas (VB Linux). El magnífico IDE que tiene Gambas lo hace muy fácil trabajar con las variables, ¡Ya les gustaría a muchos IDE de programación ser como el de Gambas!. He creado 3 programas, uno general de España, otro general de España pero con escala de 1:2.000.000 , y el tercero más preciso de la provincia de Sevilla.
En mapa general de España, la precisión no era demasiado exacta. Programa localizador municipio general de España.
En esta ocasión utilizo un mapa con una escala de 1 : 2.000.000 . Programa localizador de municipios de España.
Como aún no estaba contento con la precisión, me puse manos a la obra, y capture de Google Maps los mapas de Sevilla como práctica. Es bastante tedioso el copiar muchas fotos de planos de Google Maps y juntarlas en una, pero me lo tomé como reto.
Programa localizador de municipios de la provincia de Sevilla.
En este caso es muy preciso al tener una gran exactitud los mapas de Google. El que quiera puede hacer su propio mapa, lo más difícil es digitalizar el mapa.