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

miércoles, 13 de mayo de 2020

JAVA - PUZZLE


JAVA
PUZZLE

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.

PUZZLE netbeans             

PUZZLE_ejecutable

Saludos.
Juan Galaz


Bibliografía.

PUZZLE SDL
PUZZLE Gambas
https://www.baeldung.com/java-write-to-file

domingo, 10 de mayo de 2020

GAMBAS (VB Linux) PUZZLE


GAMBAS
(VB Linux)

PUZZLE

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


PUZZLE Source             

Saludos.
Juan Galaz


Bibliografía.

PUZZLE SDL

jueves, 7 de mayo de 2020

GAMBAS (VB Linux) - Localización de municipios en España - Mapa de Sevilla con precisión


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.

MapasSource             
MapasExe

Saludos.
Juan Galaz


Bibliografía.

https://www.google.es/maps
javmapa.html
javmub.html
javxmub.html