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/

lunes, 13 de febrero de 2023

Arduino - LORA (LoRaWAN) SX1278 - Emisor GPS

  Página principal

Arduino
LORA (
LoRaWAN) SX1278
Emisor GPS


En este montaje conecto un receptor GPS que emite su posición a través del módulo LORA al receptor.


EMISOR GPS




Emisor GPS con OLED. No es obligatorio.



RECEPTOR GPS



Debido a que los 3.3V que proporciona el arduino nano tiene poca potencia, debemos colocar un condensador, en mi caso he colocado 330uF.


El formato de salida se puede copiar y pegar en Google Maps.

VIDEO

PROGRAMA Y LIBRERÍAS



Saludos.
Juan Galaz



Bibliografía:

https://how2electronics.com/interfacing-sx1278-lora-module-with-arduino/
https://www.electroschematics.com/rf-radio-frequency/
https://electronoobs.com/eng_arduino_tut97.php
https://cdn-shop.adafruit.com/product-files/3179/sx1276_77_78_79.pdf
https://www.semtech.com/products/wireless-rf/lora-connect/sx1278
https://oa.upm.es/44890/1/TFM_JOSE_DANIEL_RODRIGUEZ_MUNCA.pdf

https://github.com/adafruit/Adafruit_AHTX0
https://github.com/Longan-Labs/GROVE-ATH-RESOURCES

lunes, 30 de enero de 2023

Arduino - LORA (LoRaWAN) SX1278 - Comunicación bidireccional

  Página principal

Arduino
LORA (
LoRaWAN) SX1278
Comunicación bidireccional


Todos los montajes realizados hasta ahora eran comunicaciones en un solo sentido.
En este sentido la comunicación es bidireccional entre los dos módulos LORA.
En un módulo receptor existe un pulsado que manda una orden al módulo sensor pidiendo la temperatura.

*MODULO RECEPTOR manda  orden "PeticionNUM=" junto con un numero aleatorio. Ejemplo: PeticionNUM=437 .

*MODULO SENSOR, que siempre está escuchando, recibe la orden PeticionNUM=437 .
Almacena el número 437.
Lee del sensor la humedad y la temperatura.
Reenvía Num=437 Temperatura=20.35 Humedad=50.34 .

*MODULO RECEPTOR recibe los datos mandados.
Muestra en el OLED el valor de Temperatura y Humedad.
Comprueba que el numero de petición es el mismo al numero recibido. Si no hay error muestra un OK, de otra forma muestra ERROR.
También muestra el nivel de señal.


SENSOR TEMPERATURA






RECEPTOR TEMPERATURA




Debido a que los 3.3V que proporciona la placa nano del arduino tiene poca potencia, debemos colocar un condensador, en mi caso he colocado 330uF.

También he colocado una antena nueva, mejorando la señal.
Dependiendo del diámetro del hilo, puede variar la longitud de la antena.
Yo fui cortando poco a poco el hilo hasta conseguir la mayor señal.




VIDEO DEL FUNCIONAMIENTO

PROGRAMA Y LIBRERÍAS



Saludos.
Juan Galaz



Bibliografía:

https://how2electronics.com/interfacing-sx1278-lora-module-with-arduino/
https://www.electroschematics.com/rf-radio-frequency/
https://electronoobs.com/eng_arduino_tut97.php
https://cdn-shop.adafruit.com/product-files/3179/sx1276_77_78_79.pdf
https://www.semtech.com/products/wireless-rf/lora-connect/sx1278
https://oa.upm.es/44890/1/TFM_JOSE_DANIEL_RODRIGUEZ_MUNCA.pdf

https://github.com/adafruit/Adafruit_AHTX0
https://github.com/Longan-Labs/GROVE-ATH-RESOURCES

viernes, 27 de enero de 2023

Comunicación entre arduino y Raspberry pi pico con LORA

  Página principal

LORA (LoRaWAN) SX1278
Raspberry pi pico

IDE Arduino
Transmision temperatura desde ATMEGA a Raspberry pi pico
Módulo AHT20 - OLED


Tenía una raspberry pi pico, y mi idea era comunicar el arduino con la raspberry pi pico a través de LORA (LoRaWAN).
En primer lugar monto el transmisor con un arduino junto con el sensor de temperatura y humedad (AHT20).
En anteriores montajes ya había realizado varios montajes, en este lo junto todo.

EMISOR




El sensor AHT20 se comunica mediante el bus I2C, funciona a 5V.
Module AHT20 // Arduino UNO/NANO   
    A4->SDA
    A5->SDL
    GND->GND
    5V->VIN

El transmisor LORA SX1278 se comunica mediante el bus SPI, funciona a 3.3V .
Module SX1278 // Arduino UNO/NANO   
    GND         ->   GND
    Vcc         ->   3.3V
    MISO        ->   D12
    MOSI        ->   D11    
    SLCK        ->   D13
    Nss         ->   D10
    Di00        ->   D2
    RST         ->   D9    

Los datos de temperatura y humedad se envían cada 1500 mS.
El formato es:
Num=23  Temperatura=20.34  Humedad=50.34


RECEPTOR





El OLED se comunica mediante el bus I2C.
OLED ->  PICO
    SLC->1
    SDA->0
    VCC->3V3
    GND->GND

Como en la Raspberry pi pico se pueden utilizar diferentes PINS para el bus I2C, debemos indicar que PINS se deben utilizar.
Esto se realiza en la configuración con:
    Wire.setSDA(0);
    Wire.setSCL(1);
    Wire.begin();
 
Nos falta conectar el receptor LORA SX1278 al raspberry mediante el bus SPI.
Module SX1278 // Raspberry pico pi
    GND         ->   GND
    Vcc         ->   3.3V
    MISO        ->   16
    MOSI        ->   19
    SLCK        ->   18
    Nss         ->   17
La configuración en la parte del programa fue difícil, es lo que mas me costó.
#define M_MISO  16
#define M_CS  17
#define M_SCK 18
#define M_MOSI  19

const uint8_t SPI_MISO = M_MISO;
const uint8_t SPI_CS = M_CS;
const uint8_t SPI_SCK = M_SCK;
const uint8_t SPI_MOSI = M_MOSI;

 LoRa.setPins(M_CS);

La conexión del pin de interrupción DIO0 no se hace debido a que no está implementada en la librería, además tampoco se utiliza el pin de RESET.

He creado una función que lee la cadena recibida y extrae el valor de una cadena pedida.
Esta función es muy útil para cualquier otro montaje.
/* busca en una cadena (*in), una cadena (*busqueda), y devuelve el valor en (*valor) */
int busqueda(char* in, char* busqueda, char* valor)

Ejemplo:
    if (1 == busqueda(buffer, (char*)"Num=", bufferS))
        {
            Serial.print(" valorNum=");
            Serial.println(bufferS);
            nums=atoi(bufferS);
        }


VIDEO DEL FUNCIONAMIENTO

PROGRAMA Y LIBRERÍAS



Saludos.
Juan Galaz



Bibliografía:

https://how2electronics.com/interfacing-sx1278-lora-module-with-arduino/
https://www.electroschematics.com/rf-radio-frequency/
https://electronoobs.com/eng_arduino_tut97.php
https://cdn-shop.adafruit.com/product-files/3179/sx1276_77_78_79.pdf
https://www.semtech.com/products/wireless-rf/lora-connect/sx1278
https://oa.upm.es/44890/1/TFM_JOSE_DANIEL_RODRIGUEZ_MUNCA.pdf
https://www.2cigroup.com/es/conceptos-de-actualidad-lora-y-lorawan/


https://github.com/adafruit/Adafruit_AHTX0
https://github.com/Longan-Labs/GROVE-ATH-RESOURCES

viernes, 20 de enero de 2023

Raspberry pi pico - IDE Arduino - Módulo AHT20

  Página principal


Raspberry pi pico
IDE Arduino
Módulo AHT20

Había realizado algunos proyectos con la Raspberry pi pico programando en C, ahora lo realizo con la IDE de Arduino.
En un anterior artículo explico como configurar la IDE de arduino para programar la Raspberry pi pico.

En este montaje utilizo el sensor de temperatura y humedad AHT20, para luego representarlo en el OLED SSD1306Z.
Al utilizar la comunicación en ambos casos el bus I2C , el montaje es muy sencillo.





El código utilizado es el mismo utilizado para la versión de ATMEGA salvo la configuración de los PINS utilizados para el bus I2C.
Como en la Raspberry pi pico se pueden utilizar diferentes PINS para el bus I2C, debemos indicar que PINS se deben utilizar.
Esto se realiza en la configuración con:

      Wire.setSDA(0);
    Wire.setSCL(1);
    Wire.begin(); // Wire communication begin


Este montaje es fácil y rápido de hacer, manos a la obra.

PROGRAMA Y LIBRERÍAS


Saludos.
Juan Galaz


Bibliografía:



jueves, 19 de enero de 2023

Arduino - Comunicacion con wxpython

  Página principal

Arduino
Comunicacion con wxpython

En un anterior artículo había realizado una comunicación con el arduino empleando python en consola.
Ahora utilizo wxpython como inteface gráfica.


Para que se ejecute debemos tener instalado algunos paquetes:
apt-get install python3-wxgtk4.0 python3-serial

y añadir nuestro usuario a dialout
/sbin/usermod -a -G dialout usuario




El programa de arduino es sencillo.
// * seta43.duckdns.org

#include <Wire.h>
#include "ATH20.h"

ATH20 ATH;

int contador;

void setup()
{
  Serial.begin(9600); 
  while (!Serial); 
  Serial.println("ATH20 DEMO");
  ATH.begin();
}


void loop()
{
 float humi, temp;

  Serial.print(contador); 
 
  int ret = ATH.getSensor(&humi, &temp);
  if(ret)     // GET DATA OK
    {
        Serial.print(" - Humedad= ");
        Serial.print(humi*100);
        Serial.print(" %  Temperatura= ");
        Serial.print(temp); Serial.println("ºC");
    }
    else        // GET DATA FAIL
    {
        Serial.println("GET DATA FROM ATH20 FAIL");
    }
 
  delay(1500);

  contador++;
}




En la parte del ordenador con la librería wxpython, se complica un poco.
He utilizado dos formas de leer desde el puerto serie: mediante Timer e Hilos.
Mediante Timer la aplicación lee cada 200mS el puerto serie, y lo muestra en pantalla.
Para el segundo caso utilizamos Hilos (Thread), segundo programa en paralelo.
En un principio había representado directamente los datos desde el segundo hilo a la interface gráfica del primer hilo. Pero después de algunas prueba, y de aleatorias lecturas, algo fallaba y se bloqueaba el primer hilo. Al final utilicé un timer en el primer hilo para representar los datos que mandaba el segundo hilo.

Podría haber realizado un buscador automático de la puerto donde está el arduino, pero he preferido realizarlo manualmente para practicar con wxpython.


Espero que este ejemplo os sirva en vuestros proyectos.

PROGRAMA Y LIBRERÍAS


Saludos.
Juan Galaz


Bibliografía:


../pyleca/pyleca.html


domingo, 15 de enero de 2023

Arduino - Módulo XL-1278 - chip SX1278

  Página principal

Arduino
Módulo XL-1278
chip SX1278


Había leído sobre el chip SX1278 que con poca potencia podía alcanzar distancias de comunicación largas.




Cuando me llegaron los 2 módulos de comunicaciones XL-1278 monte uno como emisor y otro como receptor y me puse hacer pruebas.
Después de varías pruebas me di cuenta que no era como decían, la distancia de comunicación no llegaba a los 300m.
Algo había hecho mal, y me dispuse a estudiar los montajes.
Junto con el módulo venía una antena para soldar al módulo, y después de varías comprobaciones me di cuenta que la antena no correspondía a la frecuencia usada por el módulo 433MHz.
Yo tenía alguna antena de otros módulos que trabajaban a la frecuencia de 433MHz, y la cambie en el módulo XL-1278.
Al momento la señal recibida aumento bastante. Como solo tenía una sola antena, me he construido otra.



El primer montaje que he realizado es mandar un numero del 0 al 255 continuamente en el emisor.

En el lado del receptor he colocado un LED que cambia su intensidad dependiendo el numero que le llegue.


Como me era difícil estar mirando en el receptor los datos llegados he realizado un segundo montaje.
En el lado emisor he colocado un sensor AHT20. El modelo AHT2X dispone de sensor de humedad y temperatura.
Usa el bus I2C para la comunicación de datos con el arduino.
A4->SDA
A5->SDL
GND->GND
5V->VIN

Los datos de humedad y temperatura se leen y se mandan cada 1500mS, junto con una cabecera llamada SETA43, y un número de orden.


Como podemos observar el módulo AHT20 se alimenta a 5V, y el módulo emisor XL-1278 se alimenta a 3.3V.
Para evitar algún que otro problema en la alimentación del módulo emisor, he colocado un condensador de 100uF 5V.

En el circuito receptor he añadido un zumbador piezoeléctricos para emitir un sonido cada vez que recibe una señal.
Si los datos recibidos son buenos, (debe existe una cadena llamada SETA43), emite un tono de 1000Hz, de otro modo emitirá una señal de 500Hz a modo de error.



En la parte del receptor, además del sonido de llegada de datos correctos, he conectado un móvil donde tengo una aplicación tipo terminal, donde puedo ver los datos recibidos.


Después de montados los dos circuito, emisor y receptor, me fui a andar.
Dejando el emisor en la ventana y con visión directa, pude comprobar que la distancia de recepción superaba los 900m.
Me sorprendió que con la poca potencia que utilizaba el emisor, podía llegar tan lejos la señal, desde luego es un logro.

Hay que señalar que el módulo que:
1. La frecuencia del módulo inalámbrico SX1278 es de 433 MHz y 470 MHz, principalmente para China, el sudeste asiático, América del Sur y Europa del Este.
2. La frecuencia del módulo inalámbrico SX1276 es 868MHz y 915MHz, principalmente para Europa y América del Norte.

En un próximo montaje realizaré una comunicación bidireccional entre los dos módulos.


PROGRAMA Y LIBRERÍAS


Saludos.
Juan Galaz


Bibliografía:

https://how2electronics.com/interfacing-sx1278-lora-module-with-arduino/
https://www.electroschematics.com/rf-radio-frequency/
https://electronoobs.com/eng_arduino_tut97.php
https://cdn-shop.adafruit.com/product-files/3179/sx1276_77_78_79.pdf
https://www.semtech.com/products/wireless-rf/lora-connect/sx1278
https://oa.upm.es/44890/1/TFM_JOSE_DANIEL_RODRIGUEZ_MUNCA.pdf

https://github.com/adafruit/Adafruit_AHTX0
https://github.com/Longan-Labs/GROVE-ATH-RESOURCES