Añadir bluetooth a un amplificador Yamaha RX-V461

Estoy muy contento con mi amplificador Yamaha RX-V461, con el que escucho música en el salón y al que tengo conectado el Blu-Ray, la televisión, ordenador, etc.

Amplificador Yamaha RX-V461

Lo compré hace más de 10 años y solo le pongo dos pegas:

  1. Que ya le fallan algunos botones del mando a distancia, entre ellos los dos botones de volumen, que lo hacen casi inservible…
  2. Que no tiene bluetooth

La primera de las pegas, el que le fallen los botones del mando tiene fácil solución, y la contaré en otra entrada más adelante.

Hoy voy a contar cómo resolví anoche en apenas una hora la segunda de las pegas, el que no tenga bluetooth y por tanto no pueda reproducir música desde el móvil, por ejemplo.

Es de estos proyectos sencillos (bueno, requiere su técnica), pero muy gratificantes, como el de cuando transformé un altavoz Bose SoundDock con el conector de iPod roto y le añadí bluetooth, una entrada de línea y control de volumen (ver esta entrada).

Voy a introducirle un módulo de bluetooth VHM-314, que es muy común y barato (compré este, por poco más de 5€):

VHM-314 bluetooth audio receiver board bluetooth 4.1mp3 lossless ...
Módulo bluetooth VHM-314

Es muy pequeño, de unos 3 cm x 3 cm.

Buscaré dentro del amplificador algún punto de 5V, y buscaré también una entrada adecuada de audio al que dejarlo conectado.

Quito la tapa del aparato y me pongo a buscar dónde robar 5V… Tras descartar varias alternativas me decanto por la entrada de USB, que se alimenta con 5V. Sigo la conexión de USB y llego a la placa de la que parte. Ahí está muy bien indicada la alimentación. Mido por si acaso con el polímetro y son 5.0V clavados.

Decidir a qué entrada de audio conectarlo es más difícil. Primero, no quiero condenar ninguna entrada que ya use o que pueda usar en el futuro. Al principio barajé poner un interruptor para poder desactivarlo si quisiese, y así podría usar cualquier entrada para su uso original, pero al final lo descarté. Y en segundo lugar, prefiero que sea una entrada accesible para soldar sin muchos problemas y no tener que desmontar demasiado.

Al final me decanto por la entrada de audio de la grabadora de MiniDisc/CD, que ni he usado en mi vida, ni tengo el aparato, ni creo que nadie use nunca más. Pero el motivo principal es que es la entrada más accesible, y solo tengo que desmontar dos plaquitas que me estorban un poco (la caja de la antena, y el bloque de conectores de los altavoces).

Entrada de audio de grabadora de MiniDisc / CD, a la que conectaré por dentro el bluetooth

Desmonto la cajita de la antena y echo un vistazo. Con el polímetro identifico qué pertenece a audio izquierdo, derecho y tierra.

Entrada de audio por dentro, con la cajita de antena que estaba encima ya desmontada.

Desmonto también la placa de conectores de altavoces.

Entrada de audio a la que voy a conectar el bluetooth, ya con la placa de altavoces quitada para facilitar acceso

Y con mucha paciencia y pulso, sueldo los cables de audio izq, der y tierra.

Sueldo los otros extremos de estos tres cables al módulo de bluetooth, y me lo llevo todo a la zona donde voy a conectarlo a los 5V. Ahí conecto a VCC y GND los dos cables de alimentación del módulo y listo. Me dejo cable suelto por si algún día le pongo un interruptor.

Enchufo el amplificador y lo enciendo, a ver si funciona. Se enciende un led azul, así que parece que todo en orden. Vuelvo a conectar la caja de conectores de altavoces y la de la antena, y conecto un altavoz, para ver si funciona.

Con el móvil busco dispositivos bluetooth, y encuentro uno llamado VHM-314 (es una pena que no se pueda cambiar el nombre). Me conecto a él, pongo una canción, juego en la cadena a encontrar el modo de audio adecuado, subo el volumen y ¡voilá! ¡funciona! Subo el volumen bastante alto (sin pasarme, que era de noche) y se oye muy bien.

Con un poco de cinta de doble cara pego el módulo a una placa que está ahí muy a mano.

Cierro la tapa, y ya está, como nuevo, pero ahora con bluetooth.

Referencias

«Botón sin contacto» con sensor ultrasónico HC-SR04 en tiempos de COVID-19

En una entrada de hace un par de semanas describía cómo construir un «botón sin contacto», por medio de una célula fotoeléctrica, en previsión que este tipo de interruptores van a utilizarse mucho más a partir de ahora, en este nuevo mundo durante y tras COVID-19…

Cuento ahora otro botón «sin contacto» también muy sencillo, empleando el sensor ultrasónico HC-SR04.

El concepto detrás de este sensor es muy sencillo: se emite un pulso de alta frecuencia que tras rebotar en un objeto es captado de vuelta por un micrófono. Midiendo el tiempo entre la señal emitida y la recepción de su rebote se puede calcular la distancia a la que se encuentra el objeto en cuestión.

HC-SR04
Sensor ultrasonidos HC-SR04
HC-SR04 frontal
HC-SR04 frontal
HC-SR04 parte trasera
HC-SR04 parte trasera

Según la hoja de especificaciones, se alimenta de 5V y su rango de medida está entre 2 cm y 400 cm, con un ángulo de 15º. Es un sensor muy típico y barato (menos de 2€).

Instalo la librería NewPing desde el IDE de Arduino, y conecto de la siguiente forma:

HC-SR04 -> Arduino Pro Micro (Leonardo):
Vcc -> VCC
Trig -> 5
Echo -> 5
Gnd -> GND

Puede conectarse «Trig» y «Echo» a pines diferentes, pero con la librería «NewPing», que se puede instalar directamente desde el IDE de Arduino, se puede emplear un mismo pin, en mi caso el 5. A fin de cuentas, cuando se está emitiendo la señal no se está esperando la respuesta, por lo que se puede emplear el mismo pin para los dos propósitos.

Conecto también un led (con su resistencia correspondiente), de forma que me queda conectado así:

Arudino + HC-SR04 + led
Arduino + HC-SR04 + led

Y cargo el siguiente código:

<code>#include &lt;NewPing.h>

// HC-SR04 -> Arduino Pro Micro (Leonardo):
// Vcc -> VCC
// Trig -> 5
// Echo -> 5
// Gnd -> GND

const int UltrasonicPin = 5;  // Pin al que se envía y recibe la señal del HC-SR04
const int MaxDistance = 200;
const int ledPin = 9;         // Pin al que está conectado el LED
const int distSens = 11;   // Distancia por debajo de la cual se enciende el led

int dist;

NewPing sonar(UltrasonicPin, UltrasonicPin, MaxDistance);
 
void setup() {
  Serial.begin(9600);
}
 
void loop() {
  delay(50);                      // esperar 50ms entre pings (29 ms como mínimo)
  dist=sonar.ping_cm();
  Serial.print(dist);
  Serial.println("cm");

  if (dist &lt; distSens)
  {
    Serial.println("Enciendo");  
    digitalWrite(ledPin, HIGH);
    delay(50);
    Serial.println("Apago");  
    digitalWrite(ledPin, LOW); 
  }
  
}</code>

En el vídeo del principio puede verse en funcionamiento.

Referencias

«Botón sin contacto» con célula fotoléctrica en tiempos de COVID-19

En los tiempos que nos ha tocado vivir con la crisis del COVID-19 previsiblemente vamos a tener que habituarnos a un nuevo escenario vital, en el que deberemos cambiar ciertos hábitos y formas de relacionarnos entre las personas y de interactuar con los objetos, al menos por un tiempo.

Entre otras cosas, es de esperar que cada vez más se evite en la medida de lo posible tocar cosas que tocan otras muchas personas, como interruptores, por lo que seguramente se tenderá a interruptores sin contacto.

Describo aquí uno de esos tipos de botones, que pretendo emplear en un próximo proyecto (un termómetro infrarrojo sin contacto, para que por ejemplo las personas de una oficina puedan tomarse la temperatura de forma inmediata y sin contacto, estando colocado el aparatito en una zona común, como puede ser el baño…)

La verdad es que es uno de los proyectos más simples que puede haber: tomar lecturas de una célula fotoeléctrica y si se cumple cierto criterio (que baja la intensidad en un breve tiempo para luego recuperarse, que es lo que ocurre al pasar la mano por delante «a lo Jedi») enciende un LED.

En el fondo, es el mismo tipo de interruptor de los grifos automáticos:

Grifo Automatico Con Sensor En Cuello Recto Valvula Ysg8007 ...

Lo he hecho con un Arduino Micro (Leonardo), conectando los componentes según el siguiente diagrama:

555 bc0rol83ox
Diagrama Fritzing de conexión (tomado de aquí)

El código que he creado es el siguiente:

<code>const int ledPin = 9;
const int fotoresistPin = 0;
const int sensibilidad = 5;
const int tiempoSens1 =200;
const int tiempoSens2 =50;

int valor;
int valorAnt;
int valorPrev;

void setup() {
Serial.begin(9600);
}

void loop() {
  valor = analogRead(fotoresistPin);
  Serial.print("Valor :");
  Serial.println(valor);
  valorPrev = valor;

  if (valor &lt; valorAnt - sensibilidad)
  {
    delay(tiempoSens1);
    valor = analogRead(fotoresistPin);
    if (valor >= valorPrev)
    {
    Serial.println("Enciendo");  
    digitalWrite(ledPin, HIGH);
    delay(50);
    Serial.println("Apago");  
    digitalWrite(ledPin, LOW); 
    }
  }

  valorAnt = valor;
  
  delay(tiempoSens2);

}</code>

Y en el siguiente vídeo se puede ver en funcionamiento:

https://youtu.be/mS1k-b3P_7Q

Referencias

Monitorización temperatura hormigón con Raspberry Pi

Quiero monitorizar la evolución en el tiempo de la temperatura de una masa de hormigón armado de gran espesor en tres puntos de su volumen durante su fraguado. Para ello, voy a disponer 4 sondas DS18B20 en el interior de la masa (en el centro, y cerca de las caras), y un sensor DHT22 en el exterior para controlar la temperatura y humedad ambientes, conectados todos a una Raspberry Pi que irá registrando los valores cada minuto, archivándolos en un pincho USB, y enviándolos por correo electrónico cada hora.

Materiales

  • Raspberry Pi. Vale cualquier modelo. Yo he empleado una Raspberry Pi B+ v1.2 que tenía disponible. Aprox 20€.
  • Tarjeta SD 16 GB. Valdría con una de 8 GB, lo suficiente para una instalación de Raspbian.
  • Memoria USB. Cualquier pincho USB que tengamos.
  • 4x DS18B20 sumergibles. Comprados aquí por 2.59€ la unidad. Total: 7.77€
  • Sensor DHT22 de temperatura y humedad, para monitorizar la temperatura y humedad ambientes
  • 5m cable CAT5
  • Modem 3G USB
  • Caja Estanca IP55, o un tupper.
  • Batería

Preparo los sensores

Los DS18b20 vienen con 1 m de cable. Como necesito algo más de longitud, empalmo un par de metros más por cada sensor y luego los junto todos a un cable de 5m. El tipo de cable que empleo es RJ45.

Hasta los 10m de longitud aproximadamente me basta con soldar entre dos de los cables una resistencia de 4.7kohm. Para longitudes mayores, en esta página hablan de la resistencia pull-up a disponer en función de la longitud del cable.

Tras soldar todos los cables, los protejo con cola térmica, y luego con cinta aislante.

Código para registrar las temperaturas

En esta entrada ya hablé de cómo usar un sensor DS18B20 con una Raspberry Pi, y esta otra, del sensor DHT22. Antes de la conexión definitiva hago pruebas con cada uno de los sensores por separado para ver que está todo en orden.

Básicamente, sigo los pasos que indiqué en la entrada en la que hablé del DS18B20 para probar que funcionan cada uno de los sensores. Una vez que averiguo el identificador de cada uno de los sensores, preparo este pequeño script en Python que registra la temperatura de los sensores en un fichero:

# -*- coding: utf-8 -*-

import os	#Para poder pasar comandos al sistema (sudo modprobe...)
import time	#Para poder sacar la hora del sistema
import logging	#Para loguear los eventos
import Adafruit_DHT	#Para poder usar el DHT


termo1 = "28-0417838399ff"
termo2 = "28-041783898fff"
termo3 = "28-04178386dbff"
termo4 = "28-04178389e9ff"

sensor = Adafruit_DHT.DHT22
pin = 24	#Pin donde está conectado el DHT22


#Cargo los módulos para el termómetro:
os.system("sudo modprobe wire")
os.system("sudo modprobe w1-gpio")
os.system("sudo modprobe w1-therm")


#Inicializo el log:
logging.basicConfig(filename='/media/pincho/temps.log',level=logging.INFO,format='%(asctime)s %(message)s')

#Función para obtener la hora del sistema:
def get_date_time():
	return time.strftime("%d/%m/%Y,%H:%M:%S")

#Función para obtener la temperatura de un termómetro:
def get_temp_sens(term):
	try:
		ruta = "/sys/bus/w1/devices/" + term + "/w1_slave"
		tfile = open(ruta)
		text = tfile.read()
		tfile.close()
		secondline = text.split("\n")[1]
		temperaturedata = secondline.split(" ")[9]
		temperature = float(temperaturedata[2:])
		temperature = temperature / 1000
		temperature = round (temperature,1)
	except:
		temperature = 0
	return float(temperature)

#Función para obtener la temperatura y humedad del DHT22:
def get_tempYhum():
        try:
                humidity, temperature = Adafruit_DHT.read_retry(sensor, pin)
		temperature = round (temperature,1)
		humidity = round (humidity,1)
	except:
		humidity = 0
                temperature = 0
        return float(temperature), float(humidity)


hora = get_date_time()
temp0,humedad = get_tempYhum()
temp0 = str(temp0)
humedad  = str(humedad)
tempsens1= str(get_temp_sens(termo1))
tempsens2= str(get_temp_sens(termo2))
tempsens3= str(get_temp_sens(termo3))
tempsens4= str(get_temp_sens(termo4))


linealog = hora + \
"," + temp0 + \
"," + humedad + \
"," + tempsens1 + \
"," + tempsens2 + \
"," + tempsens3 + \
"," + tempsens4

print(linealog)

logging.info(linealog)

Conexión de los sensores

Para conectar los DS18B20, decido emplear un conector RJ45 (para facilitar la conexión en obra) que saco de una tarjeta de red vieja que tenía por ahí (ni siquiera la desueldo, directamente la corto con una sierra:

Y le sueldo la resistencia y los cables que conectaré a la Raspberry Pi:

Configuro la Raspberry Pi

  • Descargo la última versión de Raspbian (Raspbian Stretch, 2018-03-13) y la instalo en una tarjeta SD con Etcher
  • Configuro Raspbian para poder acceder desde SSH, configuro los locales y teclado, etc. La nombro RaspiHormiMon
  • Creo un túnel reverso SSH, siguiendo las instrucciones que preparé en esta entrada.

Conecto el pincho USB

Además de enviar los datos por internet, voy a archivar los registros en un pincho USB. Para ello tengo que instalarlo y garantizar que se cargue siempre en el arranque, modificando /etc/fstab. Sigo los pasos que ya conté en esta entrada.

Conexión a internet

Pensaba que tendría que seguir los pasos de esta entrada que escribí hace un par de años, pero compruebo que al conectar el Huawei E303 con una tarjeta SIM con el pin deshabilitado, la Raspberry Pi la reconoce perfectamente (en las últimas versiones de Raspbian viene por defecto usbmodeswitch) sin necesidad de hacer nada y se conecta automáticamente a internet como si fuese una conexión alámbrica, eth1.

Que envíe el log por email

Configuro la Raspberry Pi para que pueda enviar ficheros por correo, siguiendo los pasos que cuento en esta entrada.

Crontab

Ahora añado las siguientes líneas al crontab para que se ejecuten las tareas descritas anteriormente:

  • Registro de temperaturas cada minuto
  • Envío por correo electrónico del fichero de registros cada hora

Ejecuto:

crontab -e

Y añado las dos siguientes líneas:

* * * * * sudo python /home/pi/logsens.py
0 * * * *  mpack -s "Log Temps" /media/pincho/temps.log direccionDeCorreo@dominio.com

Batería y alimentación

Como pretendo dejar el invento en una obra, que estará alimentado a saber de qué forma (un grupo electrógeno seguramente), le pongo una batería, que permita seguir funcionando si se va un rato la luz, y también que proteja de las subidas de tensión.

La alimentación se hará por medio de un cargador convencional micro-usb de 5V (los de los móviles).

Carcasa

Con todo ya listo, lo meto dentro de una caja IP55, que es relativamente estanca, y de dimensiones perfectas para encajar todo sin estar muy apretado.

Montaje en obra

Tengo que decir que yo no pude colocar los sensores en obra y los colocó mi compañero y amigo Jorge. Como no podía ser de otra forma, estuvo lloviendo mientras lo colocaba, por lo que ¡se empapó enterito!

Aquí van una serie de fotos de la colocación de los sensores en obra:

Resultados

La Raspberry Pi tomaba medidas cada minuto, y enviaba un correo electrónico con todo el registro cada hora.

Versión 2

Código revisado, que incorpora los leds de aviso de si hay un error cada minuto, para poder comprobar en obra una vez instalado que está todo en orden, sin tener que esperar a recibir el mensaje cada hora. En caso de haber algún problema, y tras descartar error en conexiones, podría ajustarse la resistencia variable (potenciómetro).

También instalé 5 conectores RJ-45, para poder conectar directamente varios cables y no tener que hacer laboriosos empalmes como tuve que hacer en la ocasión anterior…

 

Enviar correos con la Raspberry Pi desde la línea de comandos

Para un proyecto que tengo entre manos necesito poder enviar automáticamente un fichero con un log por correo electrónico desde una Raspberry Pi. Esto se hace con los programas ssmtp y mpack. En esta página se explican muy bien los pasos, que seguí más o menos al pie de la letra.

Primero instalo el programa ssmtp:

sudo apt-get update
sudo apt-get install ssmtp

Ahora edito el fichero de configuración:

sudo nano /etc/ssmtp/ssmtp.conf

Comento los parámetros que vienen por defecto y pego lo siguiente (tuve que darle varias vueltas hasta hacerlo funcionar):

root=midireccion@miservidor.com
mailhub=smtp.miservidor.com:465
rewriteDomain=miservidor.com
AuthUser=midireccion@miservidor.com
AuthPass=micontraseña
FromLineOverride=YES
UseTLS=YES

También tengo que editar el siguiente fichero:

sudo nano /etc/ssmtp/revaliases

Y pego al final del todo:

pi:midireccion@miservidor.com:smtp.miservidor.com:465

Y ahora pruebo a enviar un correo:

ssmtp direccionDeCorreo@dominio.com
subject: prueba
funciona?

Y envío el correo pulsando Ctrl+D.

¡Funciona!

Ahora quiero poder enviar un fichero adjunto. Para ello tengo que instalar el programa mpack:

sudo apt-get install mpack

Y para enviar un fichero por correo es tan sencillo como ejecutar:

mpack -s "Este es el asunto" fichero.txt direccion@correo.com

Túnel reverso SSH

Voy a contar un método muy útil para poder acceder a un servidor remoto al que por diversos motivos en principio no tenemos acceso directo por SSH, creando un túnel reverso tenebroso por SSH.

Una aplicación podría ser para poder acceder a una Raspberry Pi que tiene conexión a internet por medio de un modem 3G de la que desconocemos la IP (y que probablemente aún conociéndola, el ISP no nos dejaría acceder a la misma por SSH). Es el caso que tengo entre manos para una Raspberry Pi que quiero dejar monitorizando unas temperaturas de fraguado del hormigón en una obra, que cuento en esta entrada.

Necesitamos en primer lugar un Servidor A al que tenemos acceso por SSH. Podría ser una Raspberry Pi ubicada dentro de una red, y a la que podemos acceder desde fuera de la red. Para ello es muy posible que hayamos tenido que redirigir puertos del Router de la red a la misma, como es mi caso. Tengo el router configurado para que cualquier petición de conexión a un puerto concreto, digamos el 22122, se redirija al puerto 22 de la Raspberry Pi, que está escuchando y esperando conexiones SSH por ese puerto.

Tengo además instalado un servicio externo de DNS (en mi caso el gratuito No-IP) en ese Servidor A de forma que se le asigne un determinado nombre al host a la IP dinámica que mi ISP me ofrece. Digamos que ese nombre es miServidor.com

Desde el Servidor B (la Raspberry Pi con conexión 3G a internet, a la que voy a querer poder acceder en el futuro) pruebo a conectarme al Servidor A:

ssh usuarioMiServidorA@miServidor.com

Introduzco la contraseña del usuario usuarioMiServidor, y listo, ya esto conectado desde el Servidor B al Servidor A por SSH.

Habiendo comprobado que tengo acceso, salgo:

exit

Y ahora vuelvo a entrar, pero con el siguiente comando:

ssh -N -R 2222:localhost:22 usuarioMiServidorA@miServidor.com -p 22122

Y vuelvo a introducir la contraseña para conectarme (más abajo veremos cómo evitar tener que introducir la contraseña). Con esto lo que le estoy diciendo al Servidor A es que que toda conexión que le llegue al puerto 2222 (por ejemplo) lo redirija por el túnel al puerto 22. La opción -N es específica para redireccionamiento de puertos, e indica que no viene un comando después.

Y ahora, desde el Servidor A, abro el túnel para conectarme con el Servidor B, que básicamente consiste en redirigir todo el tráfico SSH a un determinado puerto:

ssh -l usuarioServidorB -p 2222 localhost

Introduzco la contraseña del usuarioServidor B y ¡ya estoy en el Servidor B!

Hasta aquí todo bien, pero nos quedan cosas por hacer. Por un lado, como en teoría no voy a tener acceso al Servidor B al iniciar la conexión, es necesario que se conecte por SSH sin necesitar introducir la contraseña. Y por otro, tendremos que tener algún tipo de servicio que se encargue de vigilar que el túnel está funcionando, y volver a abrirlo en el caso de que se haya caído.

Acceso SSH por medio de certificado

En el Servidor B (desde el que quiero acceder al Servidor B sin que me pida la contraseña), tengo que generar el par de claves público-privada. :

cd ~/.ssh

ssh-keygen -t rsa

Doy al enter varias veces aceptando las opciones por defecto, sin passphrase. Con esto se generan dos ficheros: id_rsa y id_rsa.pub.

Ahora copiamos la clave pública al Servidor A:

scp -P 22122 id_rsa.pub usuarioServidorB@servidorB:.ssh/authorized_keys

(O lo copiamos con un pincho USB o como se quiera.)

Ahora pruebo a conectarme desde el Servidor B al Servidor A, y a ver si no me pide la clave:

ssh usuarioMiServidorA@miServidor.com -p 22122

Si a la hora de hacer la conexión tenemos algún problema, puede interesar empelar el comando con la opción -v, y ver lo que pasa:

ssh -v usuarioMiServidorA@miServidor.com -p 22122

¡Funciona!

Control de la conexión

Ahora tenemos que comprobar que el túnel permanece abierto a lo lagro del tiempo, y garantizar que se reconecta en caso de pérdida de que lo haya perdido.

Creo un fichero ~/create_ssh_tunnel.sh, con el siguiente contenido (sacado y adaptado de aquí):

#!/bin/bash
createTunnel() {
/usr/bin/ssh -N -R 2222:localhost:22 pi@miServidor.com -p 22122
if [[ $? -eq 0 ]]; then
echo Tunnel to jumpbox created successfully
else
echo An error occurred creating a tunnel to jumpbox. RC was $?
fi
}
/bin/pidof ssh
if [[ $? -ne 0 ]]; then
echo Creating new tunnel connection
createTunnel
fi

Este script comprueba que haya un proceso ssh ejecutándose, y si no, abre el túnel.

Hacemos ejecutable el script:

chmod 700 ~/create_ssh_tunnel.sh

Modifico crontab para que se ejecute cada minuto:

crontab -e

Y añado al final del fichero:

*/1 * * * * ~/create_ssh_tunnel.sh > tunnel.log 2>&1
Con esto decimos que se ejecute el script cada minuto.

Y listo, ya está funcionando.

Referencias

https://blog.devolutions.net/2017/3/what-is-reverse-ssh-port-forwarding

https://www.tunnelsup.com/raspberry-pi-phoning-home-using-a-reverse-remote-ssh-tunnel/

 

 

Sujeción del Apple Pencil en un iPad Pro con imanes de neodimio

Estas navidades me compré un iPad Pro de 12.9» y la verdad es que me ha cambiado la forma de trabajar. El uso principal que le doy es como libreta, tomando notas con el Apple Pencil. Este accesorio es el que realmente aporta un cambio radical a la tableta pues permite escribir y dibujar sobre la misma con una precisión y versatilidad tremendas, y sin latencia perceptible.

Pero independientemente de la tecnología que hay detrás del Apple Pencil, creo que en esta ocasión el diseño del mismo deja mucho que desear, y por varios motivos:

  • El necesitar un mini adaptador lighning para cargarlo es realmente engorroso y anacrónico.
  • La opción de cargarlo por el puerto lightning del iPad deja al lápiz en una posición muy expuesta y un movimiento desafortunado puede romperlo fácilmente.
  • La tapita, aunque tiene un imán que la mantiene unida al lápiz, salta y rueda con facilidad
  • El lápiz es totalmente cilíndrico, por lo que puede rodar por la mesa hasta que encuentra un obstáculo – o el suelo.
  • Y, lo que peor llevo… ¿dónde lo guardas mientras no lo estás usando? Hay fundas que llevan incorporado un especio para el lápiz, pero añaden mucho peso a un iPad ya de por si muy pesado.

Para solucionar algunas de estas pegas le he añadido una mejora. A algunos applemaníacos seguro que les parecerá un sacrilegio alterar así un producto Apple, pero pienso que si Steve Jobs levantase la cabeza y viese las pegas anteriores le iba a caer una colleja a algún ingeniero/diseñador que otro…

Lo que he hecho ha sido tan sencillo como pegarle unos pequeños imanes de neodimio (que creo saqué de unos lectores de DVD) tanto al lápiz como a uno de los lados del iPad. Son tan potentes estos imanes que el lápiz queda muy firmemente fiajdo contra el lateral del iPad, y hace falta hacer una cierta fuerza para separarlo. Con acercarlo ligeramente, el lápiz salta y se pega a los imanes.

Al principio lo pegué solamente con Superglue, pero luego decidí añadirle un pequeño borde de resina epoxi, que sobresale ligeramente y lo afea, pero no se nota demasiado. Quizás con el Superglue hubiese sido suficiente.

Además, con los imanes el lápiz ya no rueda por la mesa.

Queda hasta elegante, y es muy discreto.

 

Luz de atril

Para un concierto en el que toqué recientemente nos hacía falta tener luces en los atriles ya que en algunas piezas se proyectaban vídeos mientras tocábamos y la luz era insuficiente para poder leer la partitura.

Así que decidí construirme una luz de atril, con batería recargable por USB.

Para fijar la lámpara (realmente, tres lámparas LED) al atril, preví un par de imanes de neodimio, que se pegan a cualquier superficie metálica (la mayoría de los atriles) de forma muy fuerte.

Material necesario:

  • Una percha
  • 3 leds cortados de una tira led
  • Una batería de ion litio 18650 (sacada de la batería de un portátil)
  • Módulo cargador TP4056
  • 2 imanes de neodimio (sacados de un disco duro)
  • Interruptor
  • Potenciómetro

Realmente no hay mucho que contar. Con unos alicates enderecé y di forma al bastidor. Ojo, que el alambre de esta percha era muy grueso y por tanto excesivamente rígido y difícil de doblar.

Luego soldé los cables correspondientes entre la batería y el módulo de carga, con la precaución de meter un tiempo antes la batería en el congelador, para que el calor de la soldadura no afectase al ión litio (estas baterías se llevan mal con el calor, y en algún sitio leí este truco).

Del módulo de carga soldé los cables al interruptor, y de este al potenciómetro, que alimentaba en serie a los tres leds.

En total unas 2 horas de una tarde de domingo.

Añadido 24/4/2018

Hace unos días me sobró un poco de tira de led (y un ratito) y decidí ampliar la luz del atril:

Altavoz Bose SoundDock + entrada de línea + bluetooth

Hace tiempo cayó en mis manos un altavoz Bose SoundDock de primera generación. Es un altavoz magnífico (y muy caro, unos 500 €), que se empleaba para reproducir música de un iPod o de un iPhone de las primeras generaciones (los que tienen conexión alargada, de 30 pines). El problema es que solo permite conectar uno de esos aparatos, ya antiquísimos, y que a ver quién usa aún uno… Además, en mi caso, la base estaba rota y ya ni siquiera tenía la clavija, por lo que estaba totalmente inservible. Pero, salvo que no había forma de conectarle un iPod o ningún otro dispositivo, el altavoz en sí parecía en perfecto estado…

Bose Sounddock

Así que me propuse arreglarlo. A continuación cuento todas las trastadas que le he hecho al altavoz, y cómo he llegado al resultado final, en el que tengo un altavoz perfectamente funcional, al que he añadido una entrada de audio por medio de una clavija de 2.5 mm, le he añadido bluetooth y un potenciómetro para regular el volumen. Ojo, que los primeros procedimientos que intenté no me funcionaron, pero los cuento también por si alguien se encuentra con los mismos problemas. Más adelante contaré cómo le he añadido una Raspberry Pi en la que he instalado el Google Assistant.

Pero antes, este es el resultado final:

Esta es la etiqueta que aparece en la base:

El frontal se demonta por medio de tres tornillos tor.

Podemos desconectar la banda, y luego hay que despegar el plástico negro:

Buscando por internet hay varias personas que han «hackeado» este altavoz con el mismo propósito, bien por rotura de la clavija como es mi caso, o para añadirle una entrada auxiliar. Mike Kruckenberg parece que fue el primero en explicar cómo lo hizo. Hay también varios vídeos en Youtube. Tengo que decir de antemano que el procedimiento de Mike Kruckenber, que es el primero a seguir (por simplicidad), no me funcionó. Por un lado mi placa parece ser una versión más antigua que todas las otras que he visto, y además sospecho que tendría algún problema más. Pero al final lo conseguí con otro procedimiento que contaré más abajo.

La idea de fondo es averiguar cuáles son los pines del iPod que mandan la señal de audio, y conectar ahí nuestra entrada. Son el pin 13 para audio izquierdo, el pin 14 para el derecho, y el 24 para tierra. Conectando ahí debería funcionar, pero hace falta un paso adicional pues solo mandando ahí audio el altavoz sigue sin funcionar. Al parecer, el iPod le indica por algún otro pin al altavoz que debe encenderse. No me entretengo a explicarlo (en el post de Mike Kruckenberg está muy bien explicado, y también en varios vídeos), pero su método no me funcionó. Aquí van las fotos de los intentos fallidos.

Otra prueba fallida:

Así que decidí dar por perdida la primera placa e ir directamente a la placa del amplificador, dentro.

Encontré otro post en el que hacían lo mismo, que lo explica muy bien. La idea es nuevamente localizar los pines de audio y «pinchar» ahí. Del encendido nos encargaremos luego.

Preparo una clavija hembra de jack de 3.5 mm y le sueldo los cables.

Como estos cables eran algo gruesos, con una pequeña broca agrandé ligeramente los agujeros donde iba a soldar en la placa. Inicialmente soldé por detrás:

Empleo blu-tack para mantener en su sitio los cables mientras sueldo. Siguiendo el mismo criterio de William Paul, realizo unos pequeños cortes al circuito, para que si hay algo más ocurriendo por ahí, no me afecte.

Al final me fue más fácil soldar directamente a las patas de la clavija, por delante:

Si probaba el altavoz con estas conexiones, escuchaba música por unos segundo nada más, y luego dejaba de sonar. Así que me quedaba arreglar el «encendido automático». Para eso tenemos que ir un poco más adentro.

Desmonto la placa del amplificador en sí.

Hay que enviar entre 4.2 V y 5.5 V al pin 6 de este circuito integrado para que se encienda. Paul William lo hizo con un divisor de tensión con dos resistencias, pero es más fácil conectarle directamente un cable que lleve 5 V de la placa anterior, que es lo que hice yo. Soldé con mucho cuidado un cable al pin 6, que luego puse un poco de resina epoxi para que permanezca fijo eternamente.

Soldando ese cable a algún punto que tenga 5 V de la placa anterior (buscar con el multímetro), ¡funcionaba a la perfección!

Ya solo quedaba el volver a ensamblarlo todo en el interior y a hacer un poco de bricolaje para que el acabado fuese perfecto. Esto es lo que más tiempo me llevó…

Lo primero era hacer una tapa para el hueco frontal. Hice una planilla marcando el hueco en un papel.

Recorté la planilla y la pegué sobre un trozo de plástico negro de una tapa de un lector externo de DVD (que ya había usado antes en el megáfono de juguete).

Con mi Dremel casera recorto la tapa:

Tras el corte con la mini-Dremel, tuve que lijar mucho hasta que la tapa encajase perfectamente en el hueco. El resultado es perfecto, parece una tapa que viene con el altavoz nuevo…

Y ahora, a por el receptor de audio de Bluetooth. Compré este módulo de Bluetooth por 5.52 €. Le sueldo tres cables a las conexiones de audio.

Sueldo dos cables a una clavija de micro-usb, para alimentar el receptor de audio de Bluetooth a través de algún punto con 5V de la placa. Será necesario un aislador de tensión para evitar zumbidos…

También sueldo tres cables a un conector de audio de 3.5 mm.

Los conecto en paralelo:

Pero no los conecto directamente a los tres puntos de entrada de audio en la placa, sino que como voy a querer regular el volumen conecto un potenciómetro estéreo logarítimico de 10 KΩ., que me costó 4.4 €.

El potenciómetro lo conecto así:

Y es logarítmico porque para audio tiene que ser así; el oido «no funciona linealmente». Esta figura lo explica muy bien:

Busco un punto de tierra en la placa y le conecto un cable (blanco):

El otro cable (naranja) inicialmente lo conecté al mismo punto de 5V que empleé para «encender» el altavoz, según se muestra en la siguiente imagen:

Esto sin embargo da un problema de zumbidos muy molestos, lo que hace necesario interponer un aislador de voltaje 5V-5V. Compré un B0505S-1W aquí por menos de 3 €.

Como esto me pasó después de haberlo conectado directamente, tuve que hacer un pequeño apaño posterior, que muestro en unas fotos al final.

Y ahora conecto un interruptor. Voy a sufrir para que me quepa todo dentro de este espacio…

Hago unos taladros en los botones originales de volumen + y – (que ya no tienen uso), que emplearé para el potenciómetro y para la clavija de audio. Fijo con pegamento epoxídico el conector de audio y con pegamento térmico el potenciómetro, que ya lleva su tuerca.

Esto parece el juego «Operación»…

Posteriormente, como daba zumbidos, tuve que añadir el aislador de voltaje, como muestro en las siguientes imágenes:

Antes de cortar los cables blanco y naranja que alimentan al reproductor Bluetooth.

Corto los cables y le sueldo el B0505S-1W:

¡Ya está!

Recorto un poco el fuste y le coloco el embellecedor al potenciómetro, y ya está terminado.

Referencias

http://mike.kruckenberg.com/archives/2006/06/add_aux_input_t.html

http://williampaulblog.blogspot.com.es/2012/11/ressurection-of-bose-sounddock-ipod-dock.html

Manejar un motor stepper con un driver DRV8825 y una Raspberry Pi

Para un proyecto que tengo entre manos (un scanner 3D por fotogrametría, ver esta entrada), quiero controlar un motor a pasos (stepper) con una Raspberry Pi. En esta entrada ya expliqué cómo hacerlo con Arduino, pero ahora lo voy a hacer con la Rapsberry Pi, y voy a emplear un driver DRV8825.

En teoría, al no ser linux un sistema de «tiempo real», no es muy indicado para manejar directamente elementos que requieren un control preciso del tiempo. Para mis propósitos, como no necesito controlar de forma muy precisa la velocidad, sino la posición, me sirve sin problemas.

0j42241200

Características principales del driver DRV8825:

  • Para motores bipolares
  • Permite microstepping de hasta 1/32
  • 1.5  por fase o 2.2A si se dispone de ventilación forzada de aire o disipadores
  • Interfaz casi idéntica al A4988
  • 45 V máximo
  • Control de corriente máxima con un potenciómetro

El motor que tengo es un motor NEMA 17 JK42HS40-1704 13A, comprado aquí por 12.50 €.

Características:

  • Número de parte: JK42HS40-1704 13A
  • Tamaño de marco: NEMA17
  • Ángulo del paso: 1,8 grados
  • Voltaje: 3.4V
  • Corriente: 1,7 A/phase
  • Resistencia: 2,0 ohmios/fase
  • Inductancia: 3,0 mH/phase
  • Llevar a cabo el esfuerzo de torsión: 4000g-cm 58.30 OZ-IN
  • Inercia del rotor: 54 g-cm2
  • Esfuerzo de torsión de la muesca: 0,22 kilogramo-cm
  • Número de ventajas de alambre: 4
  • Peso: 0,24 kilogramos
  • Longitud: 40m m
  • Eje del motor: 5mm
  • Longitud del árbol delantero: 20 mm
  • Certificación: CE, ROHS, ISO9001

 

Para alimentar el motor empleo una fuente de alimentación de un ordenador (ver esta entrada).

Siguiendo las instrucciones de la página de Pololu, voy a emplear el siguiente modo de conexión, con paso completo (sin microstepping):

El esquema Fritzing sería así:

Manejar un motor paso a paso con DRV8825 y Raspberry Pi

La conexión de los cables del motor al DRV8825 la hago así:

  • B2: azul
  • B1: rojo
  • A1: negro
  • A2: verde

Para no dañar el motor tenemos que regular inicialmente el potenciómetro a la mínima potencia, girando el potenciómetro en sentido antihorario hasta el final, y más adelante ajustarlo hasta la capacidad del motor. En este vídeo se explica cómo regular adecuadamente la intensidad.

Empiezo con el motor desconectado. Lo primero, calculo el voltaje por cada fase. Para eso me fijo en las características de mi motor. Ahí me dicen que el motor es de 1.7 A / fase. Tendré que limitar el DRV8825 a este valor. Por encima de 1.5 A (y hasta 2.2A) el controlador DRV8825 debe tener ventilación forzada de aire o un disipador, así que le pego un disipador (me venía al comprarlo con el DRV8825), pues pretendo fijarlo en la capacidad máxima del motor.

Ahora tengo que ajustar la corriente del DRV8825 con el potenciómetro. Primero tengo que averiguar a cuánto he de limitar esa corriente. Para ello empleo la fórmula que viene en la hoja de especificaciones del driver:

Current Limit = VREF × 2

(Ojo, que por muchas páginas se ven otras fórmulas; hay que emplear la fórmula específica de nuestro driver).

Entonces:

1.7 = VREF x 2

VREF = 0.85 V

Pero ojo, este voltaje va asociado a la corriente máxima que recibirá el motor, y depende de la configuración de micropasos. Hay que consultar en la Tabla 2 de la hoja de especificaciones del DRV8825. En mi caso, con paso completo (full step), la corriente es un 71%, así que deberé multiplicar por este factor el resultado anterior:

VREF = 0.71 · 0.85 = 0.60 V

Así que el voltaje límite que debo ajustar es 0.60 V por fase.

Ahora tengo que ver dónde medir con el multímetro en el DRV8825:

Aunque es más fácil medir directamente desde el potenciómetro:

Desconecto el motor, pero alimento con 12V el DRV8825 y alimento también el Arduino a través del puerto USB. Con todo así, mido el voltaje y ajusto el potenciómetro hasta alcanzar mis VREF calculado antes (0.60 V).

Ya tengo el driver ajustado a mi motor, así que ya puedo conectarlo y empezar a utilizarlo.

 

En la Raspberry Pi voy a emplear código en Python. He conectado el pin de STEP del DRV8825 en el pin GPIO7 de la Raspberry Pi (pin 26), y el de DIR en el pin GPIO8 (pin 26). Mandando señales a estos pines podré indicar que se avance un paso (pin STEP), y cambio de dirección en en pin DIR. Por como tengo conectado todo, son pasos completos, nada de micropasos, que no me hacen falta por el momento.

Con el código siguiente en Python el motor da una vuelta completa en una dirección, y luego cambia de dirección y da otra vuelta:

# -*- coding: utf-8 -*-

import time                     #Para las pausas
import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BOARD)        #Usar la numeración de pines de la placa

pinDir = 24                     #Pin DIR
pinStep = 26                    #Pin Step
numSteps = 200                  #Número de pasos del motor
microPausa = 0.005              #Número de segundos de pausa


GPIO.setup(pinDir,GPIO.OUT)
GPIO.setup(pinStep,GPIO.OUT)

while True:

        GPIO.output(pinDir,0)           #Establezco una dirección (0 o 1)

        for x in range(0,numSteps):
                GPIO.output(pinStep, True)
                time.sleep(microPausa)
                GPIO.output(pinStep, False)
                time.sleep(microPausa)

        time.sleep(microPausa)

        GPIO.output(pinDir, 1)          #Cambio de dirección

        for x in range(0,numSteps):
                GPIO.output(pinStep, True)
                time.sleep(microPausa)
                GPIO.output(pinStep, False)
                time.sleep(microPausa)

GPIO.cleanup()          #Para acabar correctamente

Y aquí un vídeo mostrando el motor en funcionamiento:

 

Referencias

https://www.pololu.com/product/2133

 

https://forum.pololu.com/t/drv-8825-stepper-motor-steps-and-delay-between-pulses/7530

Raspberry Pi Stepper Motor Tutorial