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/