jueves, 17 de noviembre de 2022

Mis Cámaras IP Cámaras de vigilancia

  Página principal

Mis Cámaras IP
Cámaras de vigilancia

Este es un recopilatorio de cámaras que me han dado, o cámaras que compro en un baratillo.
La mayoría son antiguas, por lo que sus características están desfasadas.


DCS-932LB1


Not shown: 998 closed ports
PORT    STATE SERVICE
80/tcp  open  http
443/tcp open  https

Este modelo es bastante viejo y su resolución ya está desfasada.
Tiene conector de red y wifi.
En los modelos nuevos sus características han mejorado mucho.




YI HOME 12CN

Not shown: 996 closed ports
PORT    STATE SERVICE
21/tcp  open  ftp
23/tcp  open  telnet
80/tcp  open  http
554/tcp open  rtsp

El modelo 12CN  (resolución 720) está anticuado y no permite muchas opciones que los nuevo modelos tiene. Su conexión es mediante WIFI.
Al ser una cámara del modelo antigua y además es el modelo chino, no funciona con la aplicación de la APP android,  debemos bajar una versión antigua para poder configurar la cámara. Dispone de ranura SD para la grabación, y detector de movimiento.
Tiene visión nocturna al disponer de diodos de infrarrojos, al ser este modelo antiguo no se pueden apagar desde la APP.

Foto de desconexión para este modelo de los diodos IR para la visión nocturna.
La calidad es buena tanto en modo nocturno como en modo normal, además me imagino que los modelos actuales sean mucho mejores.




TL-SC2020N


Not shown: 996 closed ports
PORT      STATE SERVICE
80/tcp    open  http
443/tcp   open  https
554/tcp   open  rtsp
49153/tcp open  unknown

Este modelo es bastante viejo y su resolución ya está desfasada.
Tiene conector de red y wifi.
En los modelos nuevos sus características han mejorado mucho.
A pesar de que el puerto 554 esta abierto, no he conseguido que funcione la transmisión directa de video en modo rtsp.



e-CamView IP Camera

PORT     STATE SERVICE
23/tcp   open  telnet
81/tcp   open  hosts2-ns
8600/tcp open  asterix

Este modelo es bastante viejo y su resolución ya está desfasada.
Tiene conector de red y wifi, además de estar motorizada.
En los modelos nuevos sus características han mejorado mucho.

Este modelo tiene una resolución de 640x480, los modelos nuevos la resolución es HD y disponen de ranura SD.
Se configura bien en la APP o mediante navegador WEB.
Me gusta el modelo, pero su resolución es baja.




anyka


Bus 004 Device 003: ID 0525:a4a5 Netchip Technology,
Inc. Pocketbook Pro 903 / Mobius 2 Action Cam

Incluyo esta cámara, aunque es una cámara espía, para que tengáis cuidado, es un peligro.
Es una especie de colgador que tiene una cámara con buena resolución, y dispone de ranura SD para grabación.
Se conecta mediante wifi, ya sea directo al teléfono móvil, o mediante router.
El problema que tuve con esta cámara comprada en el rastro fue código QR, estaba dañado, y me costó configurar.
Se configura mediante la APP SIPC en el móvil, y su calidad de vídeo el buena.



Saludos.
Juan Galaz




miércoles, 2 de noviembre de 2022

Debian 9 y 11. Radio por internet - Icecast - darkice - Mixxx - Butt

  Página principal


Debian 9 y 11
Radio por internet
Icecast - darkice - Mixxx - Butt
 


Debian 9 y Debian 11

Lo primero es instalar el servidor icecast que gestiona los flujos de audio que se transmiten a través de la red.
    apt-get install icecast2
En su instalación se nos pedirá el las contraseñas necesarias para la emisión, administración, repetidor, y source.
Si una vez instalado queremos cambiar algo en la configuración.
    sudo editor /etc/icecast2/icecast.xml
En mi caso estas son los principales puntos de mi configuración:

<clients>100</clients>
<hostname>localhost</hostname>
<port>8000</port>
<source-password>calamar</source-password>
<relay-password>calamar</relay-password>
<admin-password>calamaradmin</admin-password>


Para saber si el servicio icecast2 está funcionando, deberemos comprobarlo con:
    systemctl status icecast2
Si está funcionado no saldrá algo parecido a esto:

● icecast2.service - LSB: Icecast2 streaming media server
   Loaded: loaded (/etc/init.d/icecast2; generated; vendor preset: enabled)
   Active: active (running) since Wed 2022-11-02 11:39:13 CET; 1h 37min ago
     Docs: man:systemd-sysv-generator(8)
  Process: 584 ExecStart=/etc/init.d/icecast2 start (code=exited, status=0/SUCCESS)
    Tasks: 4 (limit: 4915)
   CGroup: /system.slice/icecast2.service
           └─610 /usr/bin/icecast2 -b -c /etc/icecast2/icecast.xml

Si no esta funcionando o queremos reiniciarlo debido a que hemos cambiado la configuración, arrancamos el servicio con:
    sudo /etc/init.d/icecast2 restart
También podemos arrancar icecast configurando el siguiente fichero
/etc/default/icecast2:
    sudo editor  /etc/default/icecast2
     y poner:
    ENABLED=true

Lo siguiente es instalar darkice.
    apt-get install darkice
Este programa captura todo lo que sale por nuestra tarjeta de audio y lo manda al servidor icecast.
Una vez instalado editamos su configuración.
El fichero de configuración lo vamos a crear en nuestro directorio de usuario. Yo lo hago con el editor pluma, vosotros podéis utilizar el que os guste.
   pluma
    ~/darkice.config

Mi configuración es la siguiente:

    [general]
    duration = 0 # duration of encoding, in seconds.
    bufferSecs = 2 # size of internal slip buffer, in seconds
    reconnect = yes # reconnect to the server(s) if disconnected
    realtime = yes # run the encoder with POSIX realtime priority
    rtprio = 3 # scheduling priority for the realtime threads

    [input]
    device = default
    sampleRate = 22050 # sample rate in Hz. try 11025, 22050 or 44100
    bitsPerSample = 16 # bits per sample. try 16
    channel = 2     # channels. 1 = mono, 2 = stereo

    [icecast2-0]
    bitrateMode = abr # average bit rate
    format = mp3 # format of the stream
    bitrate = 96 # bitrate of the stream sent to the server
    server = localhost
    port = 8000 # port of the IceCast2 server, usually 8000
    password = calamar # source password to the IceCast2 server
    mountPoint = radio # mount point of this stream on the IceCast2 server
    name = radio # name of the stream
    description = This is a streaming


Como usuario arrancamos darkice.
     darkice -c ~/darkice.config
Si queremos ver si funciona la radio, tecleamos en el navegador la siguiente dirección:
    http://localhost:8000/


Como yo he elegido en:
    device = default
En preferencias de sonido, en mi caso tengo:


El siguiente paso es instalar la mesa de mezclas mixxx.
    apt-get install mixxx
Desde la aplicación mixxx podemos transmitir nuestra radio.
En mi caso he añadido un micrófono USB y he tenido que hacer algún cambio en la configuración.
En dispositivo de salida Principal, elegimos default.
Debido a algunos problemas con la grabación del micrófono he tenido que cambiar algunas configuración, como por ejemplo Búffer de audio.


Intente configurar el micro de USB en las pestañas de Micrófono, pero funcionaba mal, o no funcionaba.
Después de bastantes pruebas, lo instalé en Auxiliar, ahora podía mezclar mi voz con la música.


Prueba con mi teléfono android, dentro de mi red, el funcionamiento de la radio.

Si queremos oir nuestra radio desde fuera de nuestra red local, deberemos configurar nuestro router y redireccionar el puerto 8000 hacia el ordenador servidor de la radio.




Debian 11

En Debian 11 existe un GUI para darkice llamado darksnow.
Se instala con:
   

apt-get install darksnow

Es bastante simple la configuración, y muy fácil de modificar.
Mi configuración es la siguiente:




butt
Los que no quieran utilizar darkice puede utilizar el programa
butt.
Se instala con:

apt-get install butt

Este programa funciona en modo gráfico y es fácil su configuración.









Después de todas las instrucciones para crear vuestra radio por internet, queda lo difícil, crear contenido.
Espero que os haya parecido interesante este artículo.



Saludos.
Juan Galaz



Bibliografía:

https://icecast.org/
http://www.darkice.org/
https://mixxx.org/
https://danielnoethen.de/butt/

https://www.sing-group.org/~lipido/blog/2012/01/10/hacer-streaming-de-spotify-en-ubuntu-1104-con-icecast2-darkice-y-pulseaudio/
https://federicosayd.wordpress.com/2007/10/12/una-radio-en-linux/
https://wiki.radioreference.com/index.php/Live_Audio/Ubuntu_Darkice

martes, 18 de octubre de 2022

Transistor Téster para Arduino Nano - Visualización en Android

  Página principal



Transistor Téster para Arduino Nano
Visualización en Android


En un montaje anterior había realizado un analizador de componentes llamado  TransistorTester, cuyo autor era  Karl-Heinz Kübbeler .
Según la configuración del programa se podía utilizar diferentes tipos de visualizadores, en mi caso había utilizado un OLED.
También posteriormente había realizado un programa en gambas y Visual Basic  para representar datos.
  12/12/2021 - Transistor Tester para Arduino Nano.representación en PC con Gambas (VB linux). GTESTER
Para los que deseen utilizar un dispositivo android a modo de presentación de resultados del téster, he programado una aplicación en android para representar los resultados.
Como el arduino no tiene conexión bluetooth, he añadido un módulo de bluetooth a serie HC-05.
Anteriormente había realizado :
  03/06/2021 - Balanza con XFW-HX711 - ESP32 - Bluetooth -Interface Android. ESP_Bluetooth
He utilizado parte del código de android y lo he modificado para este montaje.


El módulo HC-05 debemos conectarlo con 3 cables al arduino, GND-VCC- (TX.arduino->RX.hc05).
Si queremos cambiar el nombre y contraseña del dispositivo bluetooth  HC05, podéis ver el modo en ardisx.html.

Circuito montado.


Programa android.


PROGRAMAS ANDROID Y ARDUINO

VIDEO DEMOSTRATIVO

Saludos.
Juan Galaz



Bibliografía:

https://github.com/kr4fty/Ardutester
https://www.sysadminsdecuba.com/2020/08/ardutester-tester-de-componentes-con-arduino/
https://create.arduino.cc/projecthub/mircemk/diy-super-simple-electronic-component-tester-234752
https://create.arduino.cc/projecthub/plouc68000/ardutester-v1-13-the-arduino-uno-transistor-tester-dbafb4
12/12/2021 - Transistor Tester para Arduino Nano.representación en PC con Gambas (VB linux). GTESTER
03/06/2021 - Balanza con XFW-HX711 - ESP32 - Bluetooth -Interface Android. ESP_Bluetooth

miércoles, 12 de octubre de 2022

Raspberry pi pico - Programación C - Vídeo-tutorial.

 

Raspberry pi pico
Programación C
Vídeo-tutorial.



 

Es simplemente un video-tutorial de un montaje de sensores en la placa Raspberry pi pico.
Aunque veréis que se hace las conexiones con la alimentación puesta, yo recomiendo que se la quitéis.
Para mas detalle sobre las librerías, recomiendo ver mi anterior montaje. pidc.html

VÍDEO

PROGRAMAS



Saludos.

Juan Galaz

martes, 4 de octubre de 2022

Raspberry pi pico, Programación C, Sensores: LDR - DHT22 (AM2302) - BMP180 - 18B20 OLED DS1302

  Página principal

Raspberry pi pico
Programación C
Sensores:
LDR - DHT22 (AM2302) - BMP180 - 18B20
OLED DS1302


Anteriormente había realizado un visualizador de sensores con el ESP32.
Algún tiempo después lo hice en la Raspberry pi pico programándolo en
microPython - PICO4
En este artículo lo realizo con la Raspberry pi pico y programando en C.

El final del montaje queda de la siguiente forma:





sen_p1 y sen_p2
El primer paso es colocar un led a modo de piloto de alimentación, y hacer parpadear el led que viene en la placa.

#include <stdio.h>
#include <pico/stdlib.h>


#define OUTPUT 1
#define INPUT 0
#define HIGH 1
#define LOW 0

void pinMode(unsigned int port, char modo);
void digitalWrite(unsigned int port, char val);
void delay(long t);

#define MILED 25

int main()
{
    stdio_init_all();
    delay(1000);
    printf("-----------------------\n");
    printf("----Hola SENSORES------\n");
    pinMode(MILED, OUTPUT);
    while(1)
    {
      printf("Estado %d\n",0);
      digitalWrite(MILED, LOW);
      delay(1000);
      printf("Estado %d\n",1);
      digitalWrite(MILED, HIGH);
      delay(2000);
    }
}


//---------------I/O----------------
void pinMode(unsigned int port, char modo)
{
    gpio_init(port);
    if(modo==OUTPUT)
        gpio_set_dir(port, GPIO_OUT);
     else
        gpio_set_dir(port, GPIO_IN);
}

void digitalWrite(unsigned int port, char val)
{
    gpio_put(port, val);
}

void delay(long t)
{
    sleep_ms(t);
}

Como me parece más fácil el modo de configurar los puertos de la forma que loa hace arduino , he creado un par de funciones tipo arduino.
A partir de ahora, las funciones se meterán en un fichero ardu.h donde se incluirán las funciones.


sen_p3
En este paso colocamos un sensor de temperatura y humedad

El sensor es el DHT22 o su equivalente AM2302.


#include <stdio.h>
#include <pico/stdlib.h>

#include "ardu.h"

#define MILED 25

//----DHT-----------
#define PIN_DHT 15
unsigned int humedad,temperatura,control;
unsigned char dataSensor[5];
unsigned int ck;
void leerDHT(void);

int main()
{
    stdio_init_all();
    delay(1000);

    printf("----Hola SENSORES------\n");
    pinMode(MILED, OUTPUT);
    while(1)
    {
      leerDHT();
      printf("AM2302_H=%.1f%%   T=%.1f ºC   Control=%d\n",(float)humedad/10,(float)temperatura/10,control);
     
      digitalWrite(MILED, LOW);
      delay(1000);
      digitalWrite(MILED, HIGH);
      delay(2000);
      printf("-----------------------\n");
    }
}


//----------DHT--------------------
void leerDHT(void)
{
  unsigned char n,z,x;
  unsigned char contador1,contador0;
  unsigned char datos[45];
  control=temperatura=humedad=0;
 
  pinMode(PIN_DHT,OUTPUT);
  digitalWrite(PIN_DHT,LOW);
  delay(2);
  digitalWrite(PIN_DHT,HIGH);
  pinMode(PIN_DHT,INPUT);
 
  for(n=0;n<42;n++)
  {
    contador0=contador1=0;
    while(1==digitalRead(PIN_DHT))
    {
      delayMicroseconds(5);
      contador1++;
      if(contador1>250)goto salir;
    }
    while(0==digitalRead(PIN_DHT))
    {
      delayMicroseconds(5);
      contador0++;
      if(contador1>250)goto salir;     
    }
    datos[n]=contador1;   
  }

  z=0;
  x=0;
  for(n=2;n<42;n++)
    {
      dataSensor[z]<<=1;
      if(datos[n]>=contador0) { (dataSensor[z])|=1;}
      x++;
      if(x==8) { x=0;  z++;  }      
    }

  humedad=dataSensor[0];
  humedad<<=8;
  humedad|=dataSensor[1];
  temperatura=dataSensor[2];
  temperatura<<=8;
  temperatura|=dataSensor[3];
  control=dataSensor[4];
salir: 
;
}
//---------------------------------
En este caso he tenido que crear yo las funciones de lectura.
Primero la hice sobre arduino y luego trasladé el código a la Raspberry pi pico.
El paso de una placa a otra fue fácil, no tuve que hacer ningún cambio.



El protocolo
1-wire, es bastante sencillo de programar.

----Hola SENSORES------
AM2302_H=39.4%   T=22.5 ºC   Control=108
-----------------------
AM2302_H=40.7%   T=22.5 ºC   Control=121


sen_p4
En este paso ponemos un sensor de luz tipo LDR,
y leemos el valor mediante un conversor ADC.

...
#include "hardware/gpio.h"
#include "hardware/adc.h"
...

//---Voltios LDR---
uint16_t result;
...

main()
{
...
 //INIT --ADC-- 
    adc_init();
    adc_gpio_init(28);    // Select ADC input 0 (GPIO26)
    adc_select_input(2);
    const float conversion_factor = 3.3f / 4096;
...

while(1)
    {
....
      result = adc_read();
      printf("LDR-> RAW=%d, voltaje=%f V\n", result, result * conversion_factor);
...
    }
}
En este caso solo  muestro el código correspondiente a la conversión A/D.
Este código no tiene demasiado explicación, configuración pin 28, y lectura del valor.

----Hola SENSORES------
AM2302_H=38.8%   T=23.5 ºC   Control=112
LDR-> RAW=402, voltaje=0.323877 V
-----------------------
AM2302_H=40.1%   T=23.5 ºC   Control=125
LDR-> RAW=403, voltaje=0.324683 V
-----------------------


sen_p5
En este paso colocamos un sensor de presión que además dispone de un sensor de temperatura.

El sensor viene en un módulo BMP180, los datos se mandan mediante el bus I2C.


...
#include "pico/binary_info.h"
#include "hardware/i2c.h"

#include <math.h>
...

//----I2C-------
i2c_inst_t *XXi2c = i2c0;        //i2c1 para 26-27   12c0 para 0-1 ...
#define    SDA_PIN 0
#define    SCL_PIN 1
 
#define  BMP180_ADDR 0x77 // 7-bit address
#define  BMP180_WRITE_MODE _u(0xFE)
#define  BMP180_READ_MODE _u(0xFF)
#define     BMP180_REG_CONTROL 0xF4
#define     BMP180_REG_RESULT 0xF6
#define     BMP180_COMMAND_TEMPERATURE 0x2E

void bmpGetData(void);
void bmpComand(uint8_t cmd);
int bmpInput(char address);
void getVarBMP(void);
void scanI2C(void);

long Temperatura, Presion, PresionBase;
...

main()
{
...
//INIT --I2C--
    printf("SDA=%d  SDL=%d \n", SDA_PIN, SCL_PIN);
    i2c_init(i2c_default, 100000);
    gpio_set_function( SDA_PIN, GPIO_FUNC_I2C);
    gpio_set_function( SCL_PIN, GPIO_FUNC_I2C);
    gpio_pull_up( SDA_PIN);
    gpio_pull_up( SCL_PIN);
    bi_decl(bi_2pins_with_func( SDA_PIN,  SCL_PIN, GPIO_FUNC_I2C));
   
    scanI2C();  
    getVarBMP();
    delay(50);
    bmpGetData();    //Calcula la presión base......
    PresionBase=Presion;
...

while(1)
    {
....
     bmpGetData();
     printf("BMP_TempGRADOS=%0.2f ºC\n",(float)Temperatura/100);
     printf("BMP_Presion=%0.2f bares\n",(float)Presion/100); 
...
    }
}


Solo muestro el código correspondiente a la comunicación I2C y al cálculo de la presión.
En este caso el código del arduino es totalmente diferente al de la Raspberry.
Me costó mucho tiempo y trabajo el descubrir la diferencia entre los tipos de enteros.
En arduino el tamaño de int es de 16bit, en la raspberry es de 32bit.
Y se me ocurrió utilizar el tipo sort, y resulto erroneo su tamaño, por lo que lo mejor es utilizar int16_t o uint16_t.
Hay que tener en presente que existen varios I2C en la raspberry y debemos especificar el que usamos.
Por ejemplo: i2c1 para 26-27  e  12c0 para 0-1 .........
Aunque la librería es mia, he utilizado algún código de otros, en bibliografía  pongo las fuentes.
-----------------------
AM2302_H=41.0%   T=23.7 ºC   Control=136
LDR-> RAW=915, voltaje=0.737183 V
BMP_TempGRADOS=22.21 ºC
BMP_Presion=934.37 bares
-----------------------

Señales del bus I2C cuando lee datos, funcion void bmpGetData(void)

sen_p6
En este paso colocamos un sensor de temperatura 18B20.

Este chip se comunica mediante una sola línea de datos, y si se quiere se puede utilizar solo dos lineas para hacer funcionar el sensor.
Además se pueden colocar varios chip en paralelo, que se podrán leer sus temperaturas independientemente.


//----DS18B20------
#define ONE_WIRE_PIN 22
void onewire_reset();
void onewire_write(unsigned char data);
int onewire_read();
int ds1820_read();

float temp18B;
...

main()
{

while(1)
    {
....
      temp18B=ds1820_read();
      printf("DS18b20_Temp=%0.2f ºC\n",temp18B/10);
...
    }
}


//-------------ONEWIRE-------------
void onewire_reset()
{
    pinMode(ONE_WIRE_PIN,OUTPUT); digitalWrite(ONE_WIRE_PIN,LOW);  
    delayMicroseconds(500);
    digitalWrite(ONE_WIRE_PIN,HIGH);  pinMode(ONE_WIRE_PIN,INPUT);
    delayMicroseconds(500);                
    digitalWrite(ONE_WIRE_PIN,HIGH);  pinMode(ONE_WIRE_PIN,INPUT);
}


void onewire_write(unsigned char data)
{
    unsigned char count;
    for(count = 0; count < 8; ++count)
    {
        pinMode(ONE_WIRE_PIN,OUTPUT); digitalWrite(ONE_WIRE_PIN,LOW);
        delayMicroseconds(2);              
        if(data & 1)
          {  digitalWrite(ONE_WIRE_PIN,HIGH);  }
          else
          {  digitalWrite(ONE_WIRE_PIN,LOW);   }
        data>>=1;

        delayMicroseconds(60);               
        digitalWrite(ONE_WIRE_PIN,HIGH);  pinMode(ONE_WIRE_PIN,INPUT);
        delayMicroseconds(2);                // for more than 1us minimum.
    }
}


int onewire_read()
{
    unsigned char count;
    unsigned char data;
    for(count = 0; count < 8; ++count)
    {
        data>>=1;
        pinMode(ONE_WIRE_PIN,OUTPUT);
        digitalWrite(ONE_WIRE_PIN,LOW);
        delayMicroseconds(2);             
        pinMode(ONE_WIRE_PIN,INPUT);
        delayMicroseconds(10);              
        if(digitalRead(ONE_WIRE_PIN)&1 )  {  data|=128;  }
        delayMicroseconds(50); 
    }
    delayMicroseconds(100);
    return data;
}

int ds1820_read()
{
    unsigned char busy=0, tempL, tempH; 
    long  temp;
   
    onewire_reset();
    onewire_write(0xCC);              
    onewire_write(0x44);  
    delay(10);
    onewire_reset();
    onewire_write(0xCC);           
    onewire_write(0xBE);           
   
    tempL = onewire_read();
    tempH = onewire_read();
 
    temp=tempH; temp<<=8; temp|=tempL;
    //Serial.print(" HEX ");Serial.print(temp,HEX);
    temp=(temp*625)/1000;
  return(temp); 
}

1-Wire es un protocolo de comunicaciones en serie diseñado por Dallas Semiconductor.
Está basado en un bus, un maestro y varios esclavos de una sola línea de datos en la que se alimentan.
En este protocolo se pueden colocar varios 18B20 en paralelo, por lo cual debería colocar una función de detección de elementos.
Otra forma es saber la identificación en ROM de cada elemento.
En mi caso uno de los 18B20 tiene la siguiente dirección:  byte addr[8]={0x28,0xDC,0x5C,0x16,0xA8,1,0x3C,0x28};
Esto me hubiese costado mucho, además solo voy a colocar un 18B20, por lo que utilizo un modo de lectura diferente.

SKIP ROM [CCh] Este comando puede ahorrar tiempo en un sistema de bus de caída única al permitir que el bus maestro acceda al funciones de memoria sin proporcionar el código ROM de 64 bits. Si hay más de un esclavo presente en el bus y se emite un comando de lectura después del comando Saltar ROM, se producirá una colisión de datos en el bus como múltiples esclavos transmiten simultáneamente (los pulldowns de drenaje abierto producirán un resultado AND cableado). www.dalsemi.com

-----------------------

AM2302_H=42.3%   T=24.7 ºC   Control=159

LDR-> RAW=236, voltaje=0.190137 V
BMP_TempGRADOS=23.30 ºC
BMP_Presion=933.90 bares
-----------------------


sen_p7
Por último colocamos un visualizardor tipo OLED
, el modelo SSD1306.
Lo bueno de colocar este modelo es que se conecta en el bus I2C, lo que resulta muy práctico y sencillo.

...
#include "ole.h"
char miBuffer[40];
...
main()
{
...
while(1)
    {
...
      xclearDisplay();
      StringAT(0,0,"--SETA43--");
     
      sprintf(miBuffer,"LDR=%d  %0.3fV",result,result * conversion_factor);
      StringAT(0,1,miBuffer);
     
      sprintf(miBuffer,"DHT_Hum. %.1f %c",(float)humedad/10,37);
      StringAT(0,2,miBuffer);
     
      sprintf(miBuffer,"DHT_Temp. %.1f %cC",(float)temperatura/10,127);
      StringAT(0,3,miBuffer);
     
      sprintf(miBuffer,"DS18b20_=%0.2f %cC",temp18B/10,127);
      StringAT(0,4,miBuffer);
     
      sprintf(miBuffer,"BMP_Pres.=%0.1f b ",(float)Presion/100);
      StringAT(0,5,miBuffer);
      sprintf(miBuffer,"BMP_Temp.=%0.1f %cC",(float)Temperatura/100,127);
      StringAT(0,6,miBuffer);
...
    }
}
Para utilizar el OLED, he empleado una biblioteca mía que realicé en arduino hace años.
Es simple de utilizar, solo hay que añadir el fichero ole.h , no tiene muchas funciones, pero hace su trabajo.

Cuando empecé a programar la raspberry pi pico, pensé que la transición sería más fácil, pero no fue así.
La cantidad de bibliotecas que existe en arduino no existen en raspberry.
El paso de programas entre arduino y rasberry no es inmediata, y muchos de los programas y biblitecas no funcionan,
Debemos pensar que los int en arduino son de 16bit, y en raspberry es de 32bit, esto genera muchos problemas.
Si queremos utilizar enteror de 16bit en raspberry, se debe utilizar
int16_t o uint16_t.

PROGRAMAS

Espero que este montaje os haya parecido interesante.

Saludos.

Juan Galaz



Bibliografía:

https://datasheets.raspberrypi.com/pico/raspberry-pi-pico-c-sdk.pdf
https://datasheets.raspberrypi.com/pico/getting-started-with-pico.pdf
https://www.puntoflotante.net/termometro.htm
espgrs.html

28/02/2016 - Arduino - Predicción del tiempo. GY-68 - BMP-180.  Predicción
21/02/2016 - Arduino power low - Termómetro máximos y mínimos con gráfica - DS18B20 LCD Nokia PCD8544. Tempe
09/02/2016 - Arduino -Barómetro - Termómetro. GY-68 -  BMP-180. Parte 2 (librería propia). ArduBer
03/02/2016 - Arduino -Barómetro - Termómetro. GY-68 -  BMP-180. Parte 1.  ArduBar

sábado, 17 de septiembre de 2022

X96mini Instalar Linux + Servidor WEB

  Página principal

X96mini
Instalar Linux + Servidor WEB



Anteriormente:

01/11/2021 -  Instalar en la raspberry Pi servidores. RaspServer
11/04/2019 - Servidor WEB con Orange PI (raspberry pi) y NGINX - SERVIDOR_Orangepi
28/03/2019 - Servidor DELL R200. SERVIDOR

Ahora instalo el servidor en un TV-BOX modelo X96mini, con la distribución ARMBIAN.
Los primeros pasos son los particulares de X96mini.
La instalación de los servidores WEB, FTP, VNC, SSH estan explicados mejor en los anteriores artículos.

Descargar Armbian de:
        https://users.armbian.com/balbes150/arm-64/
    La imagen utilizada es:
        Armbian_20.10_Arm-64_bullseye_current_5.9.0_desktop.img.xz  
    Ejecutar balena grabador o grabador de imagenes de disco en Linux.
       
       
        En mi caso el programa balena era mucho más rápido en Windows.
    Grabar imagen de Armbian en tarjeta microSD
    Retire la microSD de forma segura y vuelva a insertarla

Configurar la tarjeta MicroSD para Armbian

    Abra la partición legible de la tarjeta microSD en Explorer
    Cambie el nombre del archivo apropiado de abajo a u-boot.ext en la raíz de la tarjeta SD

    u-boot-s905 (para s905)
    u-boot-s905x-s912 (para s905x y s912)
    u-boot-s905x2-s922 (para s905x2 y s922)

    En mi caso hago una copia de u-boot-s905x-s912 (para s905x y s912) y lo renombro a u-boot.ext.
   
    Edite /extlinux/extlinux.conf en un editor de texto
        Comente las líneas rk-3399 agregando #
        Descomente las líneas aml s9xx FDT y APPEND eliminando #
        Actualice la línea FDT para que apunte a un archivo .dtb que funcione para su dispositivo
    Para el X96mini:
        # aml s9xxx
        #FDT /dtb/amlogic/meson-g12a-x96-max-no-cvbs.dtb
        #FDT /dtb/amlogic/meson-g12b-ugoos-am6-no-cvbs.dtb
        #FDT /dtb/amlogic/meson-g12b-odroid-n2.dtb
        FDT /dtb/amlogic/meson-gxl-s905w-p281.dtb
        APPEND=root=LABEL=ROOTFS rootflags=data=writeback rw console=ttyAML0,115200n8 console=tty0 no_console_suspend consoleblank=0 fsck.fix=yes fsck.repair=yes net.ifnames=0

    Salvar y expulsar de forma segura
 
Inserte la tarjeta microSD en la caja de Android TV
   
Arrancando a Armbian por primera vez:
     Con un palillo o similar, se introduce en la conexión AV y se pulsa un botón interior.
     A la vez se conecta el adaptador de corriente a la caja de Android TV.
       
     Esto solo hay que hacerlo la primera vez que arranca Armbian.


Configurando los servidores.
apt-get update
apt-get install console-data console-setup  keyboard-configuration
/sbin/dpkg-reconfigure  keyboard-configuration
/sbin/dpkg-reconfigure  locales

apt-get install mc xfe x11vnc vsftpd nginx ssh dillo

-----------------SERVIDOR WEB----------------------------
mkdir  /var/www
chown -R seta:seta   /var/www/html
chmod  ugo+rx    /var/www/html
geany /etc/vsftpd.conf

----------------IP FIJA----------------------------------

geany /etc/network/interfaces

auto lo
iface lo inet loopback

auto eth0
iface eth0 inet static
  address 192.168.1.50
  netmask 255.255.255.0
  gateway 192.168.1.1
dns-nameservers 8.8.8.8
post-up echo "Interface eth0 levantada con exito"
post-down echo "Interface eth0 bajada con exito"

-----------------SERVIDOR FTP-----------------------------

Editar:
    geany /etc/vsftpd.conf
Cambiar a:
    anonymous_enable=NO
    local_enable=YES
    write_enable=YES


----------SERVIDOR VNC---------------------
--ESTO SE HACE COMO USUARIO NORMAL--

CONTRASEÑA
     x11vnc -storepasswd

En Xfce añadir un arraque automático:
   

Exec=x11vnc -forever -usepw -display :0 -ultrafilexfer


VÍDEO



Revisión 1

Características:
TV Box Status Information Template Version 1.0
TV Box Name (example: TX3 mini): X96 mini
CPU (example: amlogic s905w): amlogic s905w
Armbian build file name: Armbian_20.10_Arm-64_focal_current_5.9.0_desktop.img.xz
DTB file used: meson-gxl-s905w-gxl-s905w-p281.dtb
Kernel Version: 5.9.0
Distribution Installed (focal, buster, etc): focal
Working Ethernet (Yes/No): Yes
Max Ethernet Speed that works (100/1000): 100
Does wifi work (Yes/No): No
Does bluetooth work (Yes/No): No
Does HDMI audio work (Yes/No): No
Additional Comments (provide any additional information you feel is important): HDMI was unstable during boot and when connected to a 4K monitor.  Once I connected to a 1080p monitor the display was stable after booting, still had issues during the boot. Como vemos no funciona el audio por HDMI. Lo soluciono con un convertidor de USB a audio, son baratos 2€
La tarjeta wifi interna no funciona. Puedes colocar una mediante USB , antes tienes que añadir el firmware, la mayoría funciona.

Tarjeta Bluetooth y Wifi tipo USB funcionando.


Para cambiar la resolución cuando arranca ARMBIAN hay que hacer algunos cambios en /extlinux/extlinux.conf.
1024x768
LABEL Armbian
LINUX /zImage
INITRD /uInitrd

# aml s9xxx
#FDT /dtb/amlogic/meson-gxbb-p200.dtb
#FDT /dtb/amlogic/meson-gxl-s905x-p212.dtb
#FDT /dtb/amlogic/meson-gxm-q200.dtb
#FDT /dtb/amlogic/meson-g12a-x96-max.dtb
#FDT /dtb/amlogic/meson-g12b-odroid-n2.dtb
FDT /dtb/amlogic/meson-gxl-s905w-p281.dtb
APPEND root=LABEL=ROOTFS rootflags=data=writeback rw console=ttyAML0,115200n8 console=tty0 no_console_suspend consoleblank=0 fsck.fix=yes fsck.repair=yes net.ifnames=0 drm_kms_helper.edid_firmware=HDMI-A-1:edid/1024x768.bin video=HDMI-A-1:1024x768@60

1280x720 (HD)
LABEL Armbian
LINUX /zImage
INITRD /uInitrd

# aml s9xxx
#FDT /dtb/amlogic/meson-gxbb-p200.dtb
#FDT /dtb/amlogic/meson-gxl-s905x-p212.dtb
#FDT /dtb/amlogic/meson-gxm-q200.dtb
#FDT /dtb/amlogic/meson-g12a-x96-max.dtb
#FDT /dtb/amlogic/meson-g12b-odroid-n2.dtb
FDT /dtb/amlogic/meson-gxl-s905w-p281.dtb
APPEND root=LABEL=ROOTFS rootflags=data=writeback rw console=ttyAML0,115200n8 console=tty0 no_console_suspend consoleblank=0 fsck.fix=yes fsck.repair=yes net.ifnames=0 drm_kms_helper.edid_firmware=HDMI-A-1:edid/1280x720.bin video=HDMI-A-1:1280x720@60

Si entramos en modo remoto , y no hemos conectado ningún monitor HDMI, veremos que la resolución es del tipo PAL.
Esta resolución es baja 720x576, en algún caso es difícil manejar el entorno gráfico.
Si estamos empeñados en utilizar el modo remoto en modo gráfico, deberemos comprar una especie de adaptador HDMI que engaña y hace ver que tenemos al PC-BOX un monitor HDMI enchufado.
En algún artículo he visto que existe la forma de mediante configuraciones hacer creer que está enchufado un HDMI, yo no lo he conseguido.


El consumo del X96mini es de entre 1.7W y 2.7W dependiendo de los aparatos que tengamos conectados al USB.
También varía el consumo dependiendo de la velocidad que pongamos en los procesadores, además también variara el calor desprendido.



Con el emulador DOSBOX ejecutando el antiguo Windows 3.1


Ejecutando un decodificador de SDR (radio definida por software) ávido de recursos.


VIDEO2 en resolución de 1024x768

viernes, 2 de septiembre de 2022

Raspberry pi pico - Programación microPython - Sensores

  Página principal

Raspberry pi pico
Programación microPython
Sensores:
LDR
DHT22 (AM2302)
BMP180
18B20
OLED DS1302



Anteriormente había realizado un visualizador de sensores con el ESP32.
En este artículo lo realizo con la Raspberry pi pico y programando en microPython.
Todo el montaje lo realizo en pasos, y grabado en vídeo, paso a paso.

El final del montaje queda de la siguiente forma:



El primer paso es colocar un led a modo de piloto de alimentación, y hacer parpadear el led que viene en la placa.

# SETA43
# seta43.duckdns.org
# seta43.blogspot.com
# Palencia / España
# 31-08-2022

import machine
import utime

led = machine.Pin(25, machine.Pin.OUT)

while True:
    led.value(0)
    utime.sleep(0.5)
    led.value(1)
    utime.sleep(0.5)


En este paso colocamos un sensor de temperatura y humedad
El sensor es el DHT22 o su equivalente AM2302.

# SETA43
# seta43.duckdns.org
# seta43.blogspot.com
# Palencia / España
# 31-08-2022

import machine
import utime

led = machine.Pin(25, machine.Pin.OUT)

from DHT22 import DHT22
from machine import Pin

dht_sensor=DHT22(Pin(15),dht11=False)

while True:
    #--DHT22--------------------------------------------   
    T, H = dht_sensor.read()
    if T is None:
        print("Error en el sensor!")
    else:
        print("Sensor DHT22->","{}ºC  {}%".format(T,H))

    led.value(0)
    utime.sleep(0.5)
    led.value(1)
    utime.sleep(0.5)


En este paso ponemos un sensor de luz tipo LDR, y leemos el valor mediante un conversor ADC.

# SETA43
# seta43.duckdns.org
# seta43.blogspot.com
# Palencia / España
# 31-08-2022

import machine
import utime

led = machine.Pin(25, machine.Pin.OUT)

from DHT22 import DHT22
from machine import Pin

dht_sensor=DHT22(Pin(15),dht11=False)

analog_value = machine.ADC(28)


while True:
    #--DHT22--------------------------------------------   
    T, H = dht_sensor.read()
    if T is None:
        print("Error en el sensor!")
    else:
        print("Sensor DHT22->","{}ºC  {}%".format(T,H))
       
    #--LDR--------------------------------------------
    reading = analog_value.read_u16()    
    print("LDR-> ADC: ",reading)   

    led.value(0)
    utime.sleep(0.5)
    led.value(1)
    utime.sleep(0.5)


En este paso colocamos un sensor de presión que además dispone de un sensor de temperatura.
El sensor viene en un módulo BMP180, los datos se mandan mediante el bus I2C.
Con este sensor se puede calcular la altura.

# SETA43
# seta43.duckdns.org
# seta43.blogspot.com
# Palencia / España
# 31-08-2022

import machine
import utime
from bmp180 import BMP180
from machine import I2C, Pin

led = machine.Pin(25, machine.Pin.OUT)

from DHT22 import DHT22
from machine import Pin

dht_sensor=DHT22(Pin(15),dht11=False)

analog_value = machine.ADC(28)

i2c = I2C(0, scl=Pin(1), sda=Pin(0), freq=200000) 
bmp180 = BMP180(i2c)
bmp180.oversample_sett = 2
baseline = bmp180.pressure/100
ALTURA = 790

print ("Doble sensor DHT22 y DS18x20")
#Write in cmd found addresses

i2cScan = i2c.scan()
counter = 0
for i in i2cScan:
    print('I2C Address ' + str(counter) + '      : '+hex(i).upper())
print ("**************************")
#---------------


while True:
    #--DHT22--------------------------------------------   
    T, H = dht_sensor.read()
    if T is None:
        print("Error en el sensor!")
    else:
        print("Sensor DHT22->","{}ºC  {}%".format(T,H))
       
    #--LDR--------------------------------------------
    reading = analog_value.read_u16()    
    print("LDR-> ADC: ",reading)
   
    #..BMP180---------------------------------------------   
    temperatura = bmp180.temperature
    presion = bmp180.pressure/100
    alt2=44330.0* (1-pow(presion/baseline,1/5.255) )   
    alt2=ALTURA+alt2
       
    alt2=round(alt2)
    temperatura=round(temperatura,1)
    presion=round(presion)
           
    print("Tem_BMP180=",temperatura,"ºC Presion=", presion," ALTITUD=",alt2)

    led.value(0)
    utime.sleep(0.5)
    led.value(1)
    utime.sleep(0.5)


En este paso colocamos un sensor de temperatura 18B20.
Este chip se comunica mediante una sola línea de datos, y si se quiere se puede utilizar solo dos lineas, para hacer funcionar el sensor.
Además se pueden colocar varios chip en paralelo, que se podrán leer sus temperaturas independientemente.
El esquema solo utilizo un sensor, en la practica utilizo 2 chip con sus respectivas lecturas.

# SETA43
# seta43.duckdns.org
# seta43.blogspot.com
# Palencia / España
# 31-08-2022

import machine
import utime
from bmp180 import BMP180
from machine import I2C, Pin
import onewire, ds18x20, time

led = machine.Pin(25, machine.Pin.OUT)

from DHT22 import DHT22
from machine import Pin

dht_sensor=DHT22(Pin(15),dht11=False)

analog_value = machine.ADC(28)

i2c = I2C(0, scl=Pin(1), sda=Pin(0), freq=200000) 
bmp180 = BMP180(i2c)
bmp180.oversample_sett = 2
baseline = bmp180.pressure/100
ALTURA = 790

print ("Doble sensor DHT22 y DS18x20")
#Write in cmd found addresses

i2cScan = i2c.scan()
counter = 0
for i in i2cScan:
    print('I2C Address ' + str(counter) + '      : '+hex(i).upper())
print ("**************************")
#---------------

ds_pin = machine.Pin(22)
ds_sensor = ds18x20.DS18X20(onewire.OneWire(ds_pin))
roms = ds_sensor.scan()

while True:
    #--DHT22--------------------------------------------   
    T, H = dht_sensor.read()
    if T is None:
        print("Error en el sensor!")
    else:
        print("Sensor DHT22->","{}ºC  {}%".format(T,H))
       
    #--LDR--------------------------------------------
    reading = analog_value.read_u16()    
    print("LDR-> ADC: ",reading)
   
    #..BMP180---------------------------------------------   
    temperatura = bmp180.temperature
    presion = bmp180.pressure/100
    alt2=44330.0* (1-pow(presion/baseline,1/5.255) )   
    alt2=ALTURA+alt2
       
    alt2=round(alt2)
    temperatura=round(temperatura,1)
    presion=round(presion)
           
    print("Tem_BMP180=",temperatura,"ºC Presion=", presion," ALTITUD=",alt2)
   
    #--DS18B20--------------------------------------------
    ds_sensor.convert_temp()
    time.sleep_ms(750)
    x=0
    for rom in roms:
        #print ("Sensor=",x,"  ",rom,"  Temperatura=",ds_sensor.read_temp(rom))
        print ("Sensor_DS18B20_nº",x,"  ","  Temperatura=",ds_sensor.read_temp(rom))
        x=x+1
   
    print("---------------------")
    led.value(0)
    utime.sleep(0.5)
    led.value(1)
    utime.sleep(0.5)


Por último colocamos un visualizardor tipo OLED , el modelo SSD1306.
Lo bueno de colocar este modelo es que se conecta en el bus I2C, lo que resulta muy práctico y sencillo.

# SETA43
# seta43.duckdns.org
# seta43.blogspot.com
# Palencia / España
# 31-08-2022

import machine
import utime
from bmp180 import BMP180
from machine import I2C, Pin
import onewire, ds18x20, time

from DHT22 import DHT22
from machine import Pin
from ssd1306 import SSD1306_I2C

led = machine.Pin(25, machine.Pin.OUT)

dht_sensor=DHT22(Pin(15),dht11=False)

analog_value = machine.ADC(28)

i2c = I2C(0, scl=Pin(1), sda=Pin(0), freq=200000) 
bmp180 = BMP180(i2c)
bmp180.oversample_sett = 2
baseline = bmp180.pressure/100
ALTURA = 790

WIDTH  = 128                                            # oled display width
HEIGHT = 64
oled = SSD1306_I2C(WIDTH, HEIGHT, i2c)

print ("Doble sensor DHT22 y DS18x20")
#Write in cmd found addresses

i2cScan = i2c.scan()
counter = 0
for i in i2cScan:
    print('I2C Address ' + str(counter) + '      : '+hex(i).upper())
print ("**************************")
#---------------

ds_pin = machine.Pin(22)
ds_sensor = ds18x20.DS18X20(onewire.OneWire(ds_pin))
roms = ds_sensor.scan()

while True:
    #--DHT22--------------------------------------------   
    T, H = dht_sensor.read()
    if T is None:
        print("Error en el sensor!")
    else:
        print("Sensor DHT22->","{}ºC  {}%".format(T,H))
       
    #--LDR--------------------------------------------
    reading = analog_value.read_u16()    
    print("LDR-> ADC: ",reading)
   
    #..BMP180---------------------------------------------   
    temperatura = bmp180.temperature
    presion = bmp180.pressure/100
    alt2=44330.0* (1-pow(presion/baseline,1/5.255) )   
    alt2=ALTURA+alt2
       
    alt2=round(alt2)
    temperatura=round(temperatura,1)
    presion=round(presion)
           
    print("Tem_BMP180=",temperatura,"ºC Presion=", presion," ALTITUD=",alt2)
   
    #--DS18B20--------------------------------------------
    ds_sensor.convert_temp()
    time.sleep_ms(750)
    x=0
    for rom in roms:
        #print ("Sensor=",x,"  ",rom,"  Temperatura=",ds_sensor.read_temp(rom))
        print ("Sensor_DS18B20_nº",x,"  ","  Temperatura=",ds_sensor.read_temp(rom))
        x=x+1
   
    oled.fill(0)
    oled.text("-Seta43- ",0,8)
    tmp=str(T)+" C  DHT22"
    oled.text(tmp,0,16)
    tmp=str(H)+" %  DHT22"
    oled.text(tmp,0,24)
    tmp=str(presion)+" mBa BMP180"
    oled.text(tmp,0,32)
    tmp=str(alt2)+   " m   BMP180"
    oled.text(tmp,0,40)
    tmp=str(reading)+" luz LDR"
    oled.text(tmp,0,48)
    oled.show()

   
    print("---------------------")
    led.value(0)
    utime.sleep(0.5)
    led.value(1)
    utime.sleep(0.5)


Como se puede entender, para el funcionamiento de todo, se hace uso de varias librerías.
Para que funcione las librerías deben ser copiadas a la raspberry pi pico.

 

PROGRAMAS Y LIBRERÍAS

VÍDEO


Espero que este montaje os haya parecido interesante.

Saludos.

Juan Galaz



Bibliografía:

https://datasheets.raspberrypi.com/pico/raspberry-pi-pico-c-sdk.pdf
https://datasheets.raspberrypi.com/pico/getting-started-with-pico.pdf
seta_PIB
seta_PIA
https://lindevs.com/set-up-raspberry-pi-pico-sdk-on-ubuntu
https://www.electroniclinic.com/raspberry-pi-pico-rp2040-programming-in-micropython-with-examples/
https://www.youtube.com/watch?v=2gihPgEkvL8
https://picockpit.com/raspberry-pi/es/todo-sobre-la-frambuesa-pi-pico/