viernes, 19 de junio de 2020

Crear un circuito impreso con Ender 3

Página principal


Crear un circuito impreso con
Ender 3


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.
VIDEO

El entorno de trabajo ha sido Debian 10.


Saludos.
Juan Galaz

Bibliografía:

cncci.html
cnce.html
https://medium.com/@urish/how-to-turn-your-3d-printer-into-a-plotter-in-one-hour-d6fe14559f1a
https://ceadesc.org/article/how-to-turn-your-3d-printer-into-a-plotter-in-one-hour-5958c3/
https://www.youtube.com/watch?v=CuWZWAfBsm8
https://www.thingiverse.com/thing:3365530

martes, 16 de junio de 2020

Crear un circuito impreso con mecánica de Ender 3


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


Saludos.
Juan Galaz

Bibliografía:

cnce.html

viernes, 12 de junio de 2020

CNC Láser y dibujado con Ender 3

CNC
Láser y dibujado con 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.


En el siguiente vídeo explico la configuración he instalación del Plug-In en Inkscape.
https://youtu.be/R82LHou0MXo
Y como muestra de quemar goma-eva y dibujar muestro este otro vídeo.
https://youtu.be/H3ZqtLJVXoo

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.

Saludos.
Juan Galaz


Bibliografía:

https://jtechphotonics.com/?page_id=2012
http://lasergrbl.com/

https://www.youtube.com/watch?v=532k6vX6oyo
https://www.youtube.com/watch?v=K7X78C0qoxc
https://www.youtube.com/watch?v=djRRxGXyACY

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

jueves, 4 de junio de 2020

Microprocesador emulado. Arduino - 8bits - CORE CPU_S8 - 256 bytes de código.

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.

/ * 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


Ejemplo normal de la creación de una aplicación.

      ./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.




DOCUMENTACIÓN
PROGRAMAS
VIDEO

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.

Saludos.
Juan Galaz