lunes, 29 de mayo de 2023

SDL - culebra (SNAKE) Versión 2

  Página principal

SDL
  culebra (SNAKE)

Versión 2

Vuelvo a programar SNAKE, méjoro los gráficos, cambio los vectores por matrices de estructuras el estilo de C.




Ahora es muy vistoso, la música de fondo, y el aumento de velocidad según pasa el tiempo lo hace adictivo.
Con F1 se pasa de modeo pantalla completa a modo ventana.
También está compilado para Windows.

Programa SDL
Programa SDL2

Librerías DLL_SDL Windows

Saludos.
Juan Galaz



Bibliografía:


martes, 23 de mayo de 2023

SDL culebra (SNAKE)

  Página principal

SDL
  culebra (SNAKE)


Navegando por la RED recale en un foro de SDL, y encontre el famoso programa SNAKE escrito en C y utilizando la biblioteca SDL.

https://foro.elhacker.net/programacion_cc/tutorial_snake_en_csdl-t396746.0.html;msg1878499


Es bastante simple, pero funciona bien.

Como yo no puedo estarme quieto, me dispuse a mejorarlo un poco.
Le añadí sonidos y algún gráfico, no demasiados, y quedo como sigue:


No es demasiado vistoso, pero la música de fondo, y el aumento de velocidad según pasa el tiempo lo hace adictivo.
Con F1 se pasa de modeo pantalla completa a modo ventana.
También está compilado para Windows.

Programa original.

Programa modificado



Saludos.
Juan Galaz



Bibliografía:

https://foro.elhacker.net/programacion_cc/tutorial_snake_en_csdl-t396746.0.html;msg1878499

https://motionarray.com/royalty-free-music/cowardly-harry-1573176/

jueves, 20 de abril de 2023

Tira de LEDS elk-bledom. Bluetooth Control desde Debian 11

  Página principal

Tira de LEDS
elk-bledom bluetooth
Control desde Debian 11



El otro día me compré una tira de LEDS por 2€, no esperaba mucho.

Para hacerla funcionar debías instalar una aplicación en el teléfono.
Instalada la aplicación y alimentada la tira a un cargador, funcionaba bien.
Lo que más me sorprende en estas aplicaciones es que des permisos de ubicación.
Y esto fue lo que me indujo a crear una aplicación en Linux.

Buscando por internet encontré esta página:
https://linuxthings.co.uk/blog/control-an-elk-bledom-bluetooth-led-strip

Explicaba como funcionaba la comunicación entre el ordenador y la tira de LEDS mediante el bluetooth.
Probando todas la instrucciones conseguí manejar la tira de LEDS.

Como quería automatizar un poco el encendido y apagado de los LEDS me dispuse hacer una aplicación mediante comandos bash .
El primer problema es que debemos ser roor para mandar los datos mediante bluetooth.
Para arreglar esto hago lo siguiente:

chown root:root luces5
chown root:root bscan

chmod u+rwx,g+rx,o+rx bscan
chmod u+rwx,g+rx,o+rx luces5
chmod u+rwx,g+rwx tiraLed.py


Lo que hago es dar permisos de ejecución, pero no de escritura, de esta forma queda seguro el sistema, y podemos manejar los LEDS.

En realidad son 2 aplicaciones:
 La primera es bscan, que se encarga de scanear los dispositivos bluetooth existentes, para luego almacenar la dirección de ELK-BLEDOM en un fichero llamado blue.dat .
 La segunda es luces5, que se encarga de mandar los valores RGB a la tira con la dirección almacenada en
blue.dat .
Ejemplo:
    ./luces 255 0 0       Enciende luz roja

    ./luces 0 0 255       Enciende luz azul

Como me parecía poco interactivo, he realizado un pequeño programa en python para manejar los colores.


Espero que os sirva este artículo para vuestros proyectos.

VIDEO


PROGRAMA


Saludos.
Juan Galaz



Bibliografía:

https://linuxthings.co.uk/blog/control-an-elk-bledom-bluetooth-led-strip

jueves, 6 de abril de 2023

ESP32 Emulador ZX SPECTRUM - Vídeo PAL

  Página principal

ESP32
Emulador
ZX SPECTRUM - PAL


Cada uno tiene mitificado el ordenador en el cual empezó, y el mio es el ZX SPECTRUM.
Otro circuito que encontré para hacer con el ESP32 es un emulador de Spectrum.
    https://github.com/sdima1357/spectrum128_esp32_usb_host_pal_tv
Existe otro emulador pero la salida es por VGA, es mucha de mejor su calidad de video, pero no se podría conectar a televisiones antiguas.
El entorno de desarrollo es MX21, es una distribución basada en Debian, pero bastante mas actualizada, recomiendo que la probéis.

$ python3 --version
Python 3.9.2

$ uname -a
Linux mx21 6.0.0-6mx-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.0.12-1~mx21+1 (2022-12-15) x86_64 GNU/Linux

El primer paso es instalar el entorno de desarrollo ESP, esto me dio mucho trabajo, hasta que descubrí que con la última versión la 5, producía errores en la compilación, por lo que tuve que instalar la versión 4.4.4

mkdir -p ~/esp
cd ~/esp
git clone -b v4.4.4 --recursive https://github.com/espressif/esp-idf.git
cd ~/esp/esp-idf
./install.sh esp32

cd esp-idf/
. ./export.sh

Este último paso ./export.sh configura el entorno del terminal, si se cierra el terminal deberemos volver a ejecutarlo.

Ahora nos toca bajar el emulador desde la página del proyecto.

cd ..
git clone https://github.com/sdima1357/spectrum128_esp32_usb_host_pal_tv

No metemos en el directorio del proyecto y lo compilamos y grabamos el ejecutable en la ESP32 .

cd spectrum128_esp32_usb_host_pal_tv-main/
idf.py -p /dev/ttyUSB0 flash

Si todo fue bien, después de un rato de compilación, grabará los ficheros *.bin en el ESP32, para luego reiniciarse.
....
....
Writing at 0x000665df... (100 %)
Wrote 368880 bytes (223758 compressed) at 0x00010000 in 5.2 seconds (effective 567.4 kbit/s)...
Hash of data verified.
Compressed 3072 bytes to 103...
Writing at 0x00008000... (100 %)
Wrote 3072 bytes (103 compressed) at 0x00008000 in 0.1 seconds (effective 377.3 kbit/s)...
Hash of data verified.

Leaving...
Hard resetting via RTS pin...
Done

Si tenemos conectado la salida de vídeo a un televisor, veremos que arranca el emulador de el Spectrum.
Aconsejo que no conectéis la tarjeta SD la primera vez, de esta forma entraremos en el menú de selección de tipo 48K/128K
Tal y como compilamos las fuentes originales, el brillo es muy bajo, por lo que decidí estudiar el código.
En el fichero smain.c debemos retocar un poco el código para aumentar los niveles de salida de video.
Existen 2 líneas una comentada y otra descomentada, cambiarlas de forma que queden así.

//#define IRE(_x)            ((uint32_t)(((_x)+40)*255/3.3/147.5) << 8)   // 3.3V DAC
#define IRE(_x)          ((uint32_t)(((_x)+40)*255*2/3.3/147.5) << 8)   // 3.3V DAC

Esto lo que hace es cambiar los niveles iniciales de la señal de vídeo.
Ahora el nivel de brillo es bastante mejor, y aún se podría poner mejor, pero no he querido retocar el código original.

Las ROMS de programas del Spectrum deberán grabarse dentro de un directorio z48 si son del modelo 48K y en un directorio z128 si son del modelo de 128K.
Todo esto está documentado en el fichero README.md que se encuentra en las fuentes.
En este mismo fichero se explica la conexiones del ESP32 al teclado y a la SD.

1 Analog color PAL-TV 50 Hz output: (GPIO25)
2 Two  (bitband) USB-HID controllers (DP/DM) GPIO16/ GPIO17 - USB 1 GPIO18/ GPIO19 - USB 2
3 Emulation  AY-3-8910 (GPIO27)
4 SDCard control (.tap .z80 .sna) read pins:
    PIN_NUM_MISO 2
    PIN_NUM_MOSI 15
    PIN_NUM_CLK 14
    PIN_NUM_CS 13
5 Screen width F4/F5
6 Tape speed normal/fast F11/F12


Esquema de conexión.


He utilizado la placa de mi anterior montaje.


Menú de selección de ROMS


Jugando al JET PAC.


Muestra de una línea de la señal PAL.

Ya puedo jugar a mi juego preferido en el ZX Spectrum   PENETRATOR
Como podemos observar, la calidad del video compuesto no es el mejor, y sobre todo si utilizamos las pantalla planas, pero se puede jugar perfectamente.

Gracias Samsonov Dima


Saludos.
Juan Galaz



Bibliografía:

https://github.com/sdima1357
https://github.com/sdima1357/spectrum128_esp32_usb_host_pal_tv




martes, 28 de marzo de 2023

ESP32 emulador de consolas

Página principal

ESP32
Emulador
esp_8_bit



Buscando montajes curiosos con la ESP32 encontré esp_8_bit ,un emulador de:

Atari 400/800, XL, XEGS, 5200
Sega Master System, Game Gear
Nintendo Entertainment System


y los mas interesante es que genera video compuesto, tanto PAL o NTSC.
Generar video compuesto(color) con arduino era realmente difícil, pero con el ESP32 de doble núcleo es posible.

    -----------
    |         |
    |      25 |------------------> video out
    |         |
    |      18 |---/\/\/\/----|---> audio out
    |         |     1k       |
    |         |             ---
    |  ESP32  |             --- 10nf
    |         |              |
    |         |              v gnd
    |         |
    |         |     3.3v <--+-+   IR Receiver
    |         |      gnd <--|  )  TSOP4838 etc.
    |       0 |-------------+-+   (Optional)
    -----------

Al disponer el ESP32 de conexión bluetooth, he utilizado un viejo mando de la consola wii, que funciona perfectamente.

El entorno de trabajo y compilación fué Debian 11 y el IDE de arduino VER. 1.9.19 .
Una de las cosas que me llevo mas tiempo fue un error en la compilación bajo Debian 11, decía que no tenia instalado la librería serial de python.
Para instalar la librería serie para python se puede hacer de dos métodos:
   sudo pip3 install pyserial
  python3 -m pip install pyserial
y la respuesta era : Requirement already satisfied: pyserial in /usr/lib/python3/dist-packages (3.5b0)
En teoría ya las tenía instalada.
Después de muchas pruebas descubrí que en Debian 11 el enlace directo de python apunta al python2,  y debía apuntar a python3.
Muchas de estas cosas pasan con Debian, al ser en muchos casos demasiado conservador.
Para cambiar el enlace directo tecleamos desde root:
   rm /usr/bin/python
  ln -s /usr/bin/python3 /usr/bin/python

Para compilar nuestro emulador, debemos bajar las fuentes de: esp_8_bit
Descomprimimos en el directorio de compilación, en mi caso es Arduino.
Arrancamos la IDE de arduino y configuramos el tipo de emulador y el sistema de televisión (PAL o NTSC) en el fichero config.h.
Si todo fue bien nos saldrán el video compuesto por el pin25 y el audio por el pin18.

Existen unos cuantos incluidos en el emulador, pero si queremos incluir otros juegos debemos instalar una utilidad en la IDE de arduino, ESP32FS.
El ESP32 normal tiene 4Mbytes de memoria, de los cuales para nuestro proyecto utilizamos la mitad para el programa, y la otra mitad para una especie de disco con el formato SPIFSS.
Las ROMS de los juegos se almacenan en el disco SPIFF, y para subir ficheros a este disco utilizamos ESP32FS.
Para instalar la utilidad ESP32FS la descargamos y la descomprimimos en:
~/Arduino/tools/   quedando como    ~/Arduino/tools/ESP32FS/tool/esp32fs.jar  .

Cuando reiniciamos la IDE de arduino nos aparecerá en el menu de Herramientas/ESP32_Sketch_Data_Upload
Si ejecutamos esta opción del menú, los ficheros (ROMS) que se encuentran en el directorio de esp_8_bit/data se subirán a la memoria del ESP32.


En algún caso algunas entradas de video compuesto la impedancia es bastante baja y la salida del ESP32 no alcanza a dar la señal correcta.
Para estos casos he creado un pequeño circuito:

 
Como me funcionaba en la protoboard , lo he pasado a circuito impreso.


Como podemos observar, la calidad del video compuesto no es el mejor, y sobre todo si utilizamos las pantalla planas, pero se puede jugar perfectamente.
También he observado que con algunas ROMS se bloquea el emulador en algún momento.

Gracias Peter Barrett


Saludos.
Juan Galaz



Bibliografía:

https://github.com/rossumur/esp_8_bit
https://github.com/me-no-dev/arduino-esp32fs-plugin/releases/



 

jueves, 23 de febrero de 2023

Raspberry Pi Pico Interprete BASIC con VGA

  Página principal

Raspberry Pi Pico
Interprete BASIC
 con VGA



Buscando montaje curiosos con la Raspberry Pi Pico encontré la página https://geoffg.net/picomitevga.html.
En esta página habían instalado un interprete de Basic, mmBasic, en la Raspberry Pi Pico, y además habían programado una salida de VGA.
El MMBasic es un intérprete Basic libre para microcontroladores de 32 bits. https://mmbasic.com/
Existen intérpretes MMBasic  para DOS, Linux y PIC32.


En el montaje original tiene una SD para almacenar diferentes programas, en mi caso solo quiero que exista un programa, por lo que se la he quitado.

Para la conexión del teclado el montaje original coloca una serie de transistores, yo los he eliminado conectando 4 resistencias.
Como dice el montaje original se puede eliminar la conexión del teclado a 5V y conectarlo a los 3.3V, la mayoría de los teclados funciona lo he probado personalmente.

En el montaje original de la segunda línea del color verde se conectan varias resistencias junto con una resistencia variable.
En mi montaje coloco 2 resistencias junto con un diodo. El ajuste fino del color blanco se ha eliminado.

He añadido dos diodos led, el primero a modo de test de alimentación, y otro de test colocado a GP5.

También he colocado un pulsador para la programación inicial de la Raspberry pi pico.

Se puede añadir una salida de audio, podéis ver la forma en la buena documentación proporcionada en la página web.


Esquema modificado.




Primer montaje.


Circuito montado.

' Colour Bars

Mode 2
CLS
Font 7
For y = 0 To 240 - 240/15 Step 240/16
  Read s$, c
  Text 0, y + 4, s$ + " = RGB(" + Str$(c>>16) + "," + Str$((c>>8) And &B11111111) + "," + Str$(c And &B11111111) + ")"
  Box 155, y, 320 - 155, 240/16, 1, c, c
Next y

Data "white", RGB(white)
Data "yellow", RGB(yellow)
Data "lilac", RGB(lilac)
Data "brown", RGB(brown)
Data "fuchsia", RGB(fuchsia)
Data "rust", RGB(rust)
Data "magenta", RGB(magenta)
Data "red", RGB(red)
Data "cyan", RGB(cyan)
Data "green", RGB(green)
Data "cerulean", RGB(cerulean)
Data "midgreen", RGB(midgreen)
Data "cobalt", RGB(cobalt)
Data "myrtle", RGB(myrtle)
Data "blue", RGB(blue)
Print @(0,y);

PLAY TONE 500, 500
PAUSE 2000
PLAY TONE 300, 300
PAUSE 5000
PLAY STOP



Visión en un televisor con entrada VGA.

Para subir los programas desde el PC a la placa Raspberry pi pico utilizo un par de programas: MMCC y MMEdit.

Terminal serie de programación y ejecución.


Programa de edición y subida a la placa.

El numero de colores máximos representados en la resolución de 320x240 es de 16 colores. En modo de 640x480 es monocromo.
En una de las pruebas he añadido un sensor de temperatura 18B20, para representar en pantalla la temperatura.
Recomiendo este montaje por su sencillez, y por la sensación de estar en los ordenadores de los años 80.

VIDEO

________________________________________________________




16/03/2023
Después de unos días probando la placa, descubrí que los módulos clónicos de esta tarjeta, no son iguales que la original.
Para que funcionase debía cambiar la toma de 5V para el teclado, desde el pin VSYS al pin VBUS.
También decidí colocar una tarjeta SD y el conector de audio.



Para configurar los pins donde esta conectada la tarjeta SD debemos ejecutar la siguiente orden:
     OPTION SDCARD GP13, GP10, GP11, GP12
La tarjeta SD esta en el disco B: por lo que si queremos trabajar en este disco deberemos ejecutar la orden:
     DRIVE "B:"
Para ver los fichero de este disco se teclea :
     FILES
Si queremos cargar un programa tecleamos:
     LOAD programa.bas
Si queremos cargar el programa tecleamos:
    LOAD programa.bas
    o
    RUN programa.bas
Existen muchas mas ordenes que vienen muy bien documentadas en el manual como:

 MKDIR dname$
Creates a sub directory in the current directory on the current drive.
 CHDIR dname$
Change into to the directory $dname. $dname can also be "." (dot dot) for up one directory or "\" for the
root directory. The starting point is the current directory on the current drive.
RMDIR dir$
Remove, or delete, the directory ‘dir$’ in the current directory on the current drive.
 SEEK #fnbr, pos
Will position the read/write pointer in a file that has been opened for RANDOM access to the 'pos' byte.
 RENAME fromname$ AS toname$
Will rename the file fromname$ to have the name toname$ in the current directory on the current drive
 COPY [mode] fromname$ TO toname$
Will copy the file fromname$ to have the file toname$. See the command reference for more details on the
optional mode.



En cuando a reproducir sonidos, lo primero es configurar los pin de salida:
    OPTION AUDIO GP6, GP7
y luego reproducir un fichero WAV con la orden.
    PLAY WAV demo.wav
Me sorprendió para bien la calidad del sonido reproducido, y probé con diferente tipos de muestreo.
Además se puede generar tonos con la orden:
    PLAY TONE left, right, duration, interrupt
    PLAY TONE 500, 500, 2000

 

Saludos.
Juan Galaz



Bibliografía:

https://geoffg.net/picomitevga.html
https://mmbasic.com/