diciembre 01, 2016

ESP8266 Mini D1 con sensor de presión barométrica GY-BMP280-3.3

Para montar nuestra propia estación meteorológica es fundamental tener un sensor de presión, he estado probando el GY-BMP280, un sensor que vale menos de 2€ comprándolo en cualquier página china.


Se trata de una pequeña placa que trae el sensor de Bosch y los pines para conexion I2C y SPI. Por comodidad, y uso de pines he probado el protocolo I2C montado en una placa MiniD1. Una de las cosas poco claras es el tema del pinout, a que pins debe conectarse en la MiniD1 la señal de reloj (SCL) y la de datos (SDA), urgando un poco en la documentación del código hardware/esp8266com/esp8266/ vemos las declaraciones de pines del chip ESP8266 a la placa MiniD1:

#########################################################################
# variants/d1_mini/pins_arduino.h
#########################################################################
#define PIN_WIRE_SDA (4) // D2
#define PIN_WIRE_SCL (5) // D1
static const uint8_t SDA = PIN_WIRE_SDA;
static const uint8_t SCL = PIN_WIRE_SCL;
static const uint8_t LED_BUILTIN = 2;
static const uint8_t BUILTIN_LED = 2;
static const uint8_t D0   = 16;
static const uint8_t D1   = 5;
static const uint8_t D2   = 4;
static const uint8_t D3   = 0;
static const uint8_t D4   = 2;
static const uint8_t D5   = 14;
static const uint8_t D6   = 12;
static const uint8_t D7   = 13;
static const uint8_t D8   = 15;
static const uint8_t RX   = 3;
static const uint8_t TX   = 1;

Por defecto la librería Wire de Arduino se reemplaza con la TwoWire que define begin con los pines SDA y SCL:

#########################################################################
# ~/Arduino/hardware/esp8266com/esp8266/libraries/Wire/Wire.cpp
#########################################################################
static int default_sda_pin = SDA;
static int default_scl_pin = SCL;
// Constructors ////////////////////////////////////////////////////////////////
TwoWire::TwoWire(){}
// Public Methods //////////////////////////////////////////////////////////////
void TwoWire::begin(int sda, int scl){
  default_sda_pin = sda;
  default_scl_pin = scl;
  twi_init(sda, scl);
  flush();
}

Estos por defecto están mapeados a D1 y D2 (4, 5) según la tabla de traducción anterior, en la documentación se explica más o menos:

#########################################################################
~/Arduino/hardware/esp8266com/esp8266$ vi doc/libraries.md
## I2C (Wire library)
Wire library currently supports master mode up to approximately 450KHz.
Before using I2C, pins for SDA and SCL need to be set by calling
`Wire.begin(int sda, int scl)`, i.e. `Wire.begin(0, 2)` on ESP-01,
else they default to pins 4(SDA) and 5(SCL).
#########################################################################

Para testear los dispositivos i2c hay una libreria muy interesante, que scanea las direcciones en las que se pueden encontrar https://github.com/mcauser/i2cdetect . Con un poco de código el BMP280 aparece en la posición 0x76.


#########################################################################
#include
#include
void setup() {
  Wire.begin(0, 2); -> D3,D4
  //Wire.begin();
  Serial.begin(9600);
  Serial.println("i2cdetect example\n");
  Serial.print("Scanning address range 0x03-0x77\n\n");
}
void loop() {
  i2cdetect();  // default range from 0x03 to 0x77
  delay(2000);
}

     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- 76 --
############################################################################

Trás esto debemos hacer un par de cambios al código de prueba de Adafruit_BMP280:
- Antes de nada definimos los pines en los que tenemos el I2C: Wire.begin(D3,D4);
- Indicamos la dirección del I2C:
 Adafruit_BMP280 bme; // I2C
 bme.begin(0x76)

Ya deberíamos poder ver los resultados del sensor por el puerto serie:

Temperature = 21.09 *C
Pressure = 100162.88 Pa
Approx altitude = 97.21 m

Si queremos un ejemplo completo en: http://lazyzero.de/en/elektronik/esp8266/diy_weather/start podemos ver un sensor de humedad, temperatura y este mismo de presión con su código completo.

octubre 30, 2016

Convertir Matroska video to MP4 para televisiones Samsung

Hoy en día las televisiones soportan un amplio rango de formatos y casi todos se pueden emitir desde un servidor de videos sin problemas (Universal Media Server por ejemplo). Aunque de vez en cuando nos encontramos con el típico formato que falla o nuestra tele carece de software para reproducirlo. En estos casos tenemos dos opciones, configurar nuestro servidor para que realice la conversión al vuelo o reconvertirlos nosotros mismos, vamos a explorar esta opción con un software muy común como el VLC:

Abrimos el VLC y elegimos convertir/guardar:

Añadimos el archivo que queremos convertir:

Cliqueamos convertir y editamos el perfil:

Para la encapsulación MP4/MOV:

En principio no hará falta convertir el video, pero si quisieramos un formato bastante compatible es H264.

Para el audio en caso de no poder mantener el original una buena opción es el más básico:

Ya solo queda guardar el nuevo archivo, en caso de que haya conversión de formato de por medio será un poco mas lento:

abril 06, 2015

IO error montando raid

En este caso md3 se trata de un raid 1 que no es capaz de montar por errores en el segundo disco, lanzando los siguientes comandos observamos los siguientes errores:
# mount /dev/md3 /mnt/home/
mount: wrong fs type, bad option, bad superblock on /dev/md3,
       missing codepage or helper program, or other error
       In some cases useful info is found in syslog - try
       dmesg | tail  or so
# smartctl -a /dev/sdb
SMART Attributes Data Structure revision number: 16
Vendor Specific SMART Attributes with Thresholds:
ID# ATTRIBUTE_NAME          FLAG     VALUE WORST THRESH TYPE      UPDATED  WHEN_FAILED RAW_VALUE
  1 Raw_Read_Error_Rate     0x000b   077   077   016    Pre-fail  Always       -       11928801
  2 Throughput_Performance  0x0005   139   139   054    Pre-fail  Offline      -       70
  3 Spin_Up_Time            0x0007   131   131   024    Pre-fail  Always       -       282 (Average 294)
  4 Start_Stop_Count        0x0012   100   100   000    Old_age   Always       -       22
  5 Reallocated_Sector_Ct   0x0033   001   001   005    Pre-fail  Always   FAILING_NOW 639
  7 Seek_Error_Rate         0x000b   099   099   067    Pre-fail  Always       -       1
  8 Seek_Time_Performance   0x0005   124   124   020    Pre-fail  Offline      -       33
  9 Power_On_Hours          0x0012   099   099   000    Old_age   Always       -       13406
 10 Spin_Retry_Count        0x0013   100   100   060    Pre-fail  Always       -       0
 12 Power_Cycle_Count       0x0032   100   100   000    Old_age   Always       -       22
192 Power-Off_Retract_Count 0x0032   100   100   000    Old_age   Always       -       35
193 Load_Cycle_Count        0x0012   100   100   000    Old_age   Always       -       35
194 Temperature_Celsius     0x0002   187   187   000    Old_age   Always       -       32 (Min/Max 24/44)
196 Reallocated_Event_Count 0x0032   024   024   000    Old_age   Always       -       1528
197 Current_Pending_Sector  0x0022   001   001   000    Old_age   Always       -       11248
198 Offline_Uncorrectable   0x0008   100   100   000    Old_age   Offline      -       28
199 UDMA_CRC_Error_Count    0x000a   200   200   000    Old_age   Always       -       0
# dmesg
ata2.00: exception Emask 0x0 SAct 0x7fe0001f SErr 0x0 action 0x0
ata2.00: irq_stat 0x40000008
ata2.00: failed command: READ FPDMA QUEUED
ata2.00: cmd 60/08:a8:e8:0c:b7/00:00:9f:00:00/40 tag 21 ncq 4096 in
         res 51/40:08:e8:0c:b7/00:00:9f:00:00/40 Emask 0x409 (media error)
ata2.00: status: { DRDY ERR }
ata2.00: error: { UNC }
ata2.00: configured for UDMA/133
sd 1:0:0:0: [sdb] Unhandled sense code
sd 1:0:0:0: [sdb]  
Result: hostbyte=DID_OK driverbyte=DRIVER_SENSE
sd 1:0:0:0: [sdb]  
Sense Key : Medium Error [current] [descriptor]
Descriptor sense data with sense descriptors (in hex):
        72 03 11 04 00 00 00 0c 00 0a 80 00 00 00 00 00 
        9f b7 0c e8 
sd 1:0:0:0: [sdb]  
Add. Sense: Unrecovered read error - auto reallocate failed
sd 1:0:0:0: [sdb] CDB: 
Read(10): 28 00 9f b7 0c e8 00 00 08 00
end_request: I/O error, dev sdb, sector 2679573736
ata2: EH complete
El problema se debe a que está intentando escribir el journal que tenía pendiente, la solución es montarlo sin que lo escriba, perderemos los últimos datos pero posiblemente tengamos acceso a gran parte del disco.
# mount -o ro,noload /dev/md3 /mnt/home/