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/

 

 

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.

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 (naranjha) lo conecto al mismo punto de 5 V que empleé para “encender” el altavoz.

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”…

¡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

Megáfono de juguete

He terminado un megáfono para regalarle a mi sobrino de tres años y que se dedique a gritar todo lo que quiera por él.

La idea es tener un juguete al que habla o grita por un lado y se amplifica por el otro (un megáfono). También le añado un conector de audio por si se quiere poner unos auriculares, y un potenciómetro para regular el volumen. Empleará unas baterías de ión litio recuperadas de la batería de un portátil, y se podrá recargar con un conector micro USB.

Lista de la compra:

  • Tubo de PVC diámetro 40 mm, con embellecedor (acoplamiento a pared para sifones). Comprado aquí por 3.50 €, aunque hubiera valido cualquier tubo, vaso de plástico, etc.
  • Tapón PVC 40 mm, comprado aquí por 0.98 €.
  • Amplificador audio LM386. Comprado aquí por 6 € (porque tenía prisa), pero si se quiere esperar unas semanas, puede venir de China por 1.19 €.
  • Potenciómetro con embellecedor (lo tenía por ahí). Realmente no es necesario, valdría el del kit LM386.
  • Altavoz 8 ohm reciclado de algún juguete (no recuerdo)
  • 2 pilas 18650 extraídas de la batería de un portátil
  • BMS para 2 pilas 18650 en serie, comprado aquí por 2.25 €.
  • Módulo cargador de pilas de litio TP4056, comprado aquí (5 unidades por 1.99€; 0.40€ la unidad)
  • Convertidor DC-DC (Step-up) comprado aquí por 2.29 €.
  • Cables diversos, pegamento, etc…

Herramientas:

  • Soldador
  • Dremel (yo he usado uno que me fabriqué hace tiempo; ver esta entrada)

 

Algunas de las piezas antes de ponerme a montarlo todo:

El esquema de montaje es el siguiente:

Todo montado, a falta del convertidor de voltaje, que aún no me había llegado:

Hago la tapa a partir de un plástico cualquiera (de una tapa de un lector de DVD portátil que tenía por ahí), que corto del mismo diámetro que el embudo, y le hago unos agujeros para el altavoz, por medio de una plantilla:

Plantilla agujeros Megáfono

Recorto la tapa con la “Dremel” que me fabriqué:

Hago los pequeños taladros, también con la dremel:

Veo que encaja todo bien (sin pegar aún):

 

Practico los agujeros para el pulsador y el potenciómetro:

Y ahora lo complicado, a meter todo dentro:

Todavía no me ha llegado el convertidor de voltaje…

Empiezo a pegar…

Ya llegó el step-up:

Todo en su sitio, solo falta la tapa:

Hago una “plantilla” para hacer los agujeros en su sitio en la tapa:

Ya está.

Pruebo a conectar el cargador, ok.

Pruebo unos auriculares, ok.

 

Mejoras para futuros proyectos parecidos:

  • emplear cable de menor sección y más flexible, pues “maniobrar” dentro del tubo fue realmente complicado
  • aislar (acústicamente) o separar más el altavoz del micrófono, pues se acoplan con facilidad

 

Power supply de una fuente de alimentación ATX de PC

Para trabajar con todo tipo de “inventos” es muy útil tener una fuente de alimentación. Las fuentes de ordenador de sobremesa se pueden adaptar de forma muy fácil para esto, y suministran (sin necesidad de hacer nada) diferentes voltajes:

  • +3.3 V
  • +5 V
  • +12 V
  • -12 V

(Combinando los anteriores podemos obtener otros voltajes, naturalmente).

Hay inifinidad de tutoriales por internet en el que explican cómo hacer esto, aunque relamente no hace falta un tutorial porque es cortar cables y listo.

Como puntos a destacar, para que arranque la fuente es necesario puentear el cable verde a cualquier cable tierra (negro). Y en función de lo antigua que sea la fuente será necesario añadir una resistencia o no; en mi caso no fue necesario.

Para hacer los agujeros en la cargasa recomiendo empezar con pequeños taladros y luego hacerlos más grandes.

Compré unos conectores como estos y estos los que realmente compré ya no los veo, pero hay miles)

Y para la próxima que me haga, las conexiones las voy a hacer con estas horquillas, que facilitará mucho la vida.

No hice muchas fotos durante el montaje, pero es que es muy básico todo…

 

Referencias

http://www.instructables.com/id/Computer-Power-Supply-to-Bench-Power-Supply-Adapte/?ALLSTEPS

http://www.wikihow.com/Convert-a-Computer-ATX-Power-Supply-to-a-Lab-Power-Supply

 

Herramienta rotativa manual tipo Dremel

Con un motor que rescaté de una impresora rota me he construido una “dremel”: una herramienta que puede ser un taladro, una fresadora, un lija, un disco de corte…

El proyecto es muy básico, pero realmente muy útil y así nos ahorramos la compra de una de estas herramientas. Lo único que hace falta es un motor DC suficientemente rápido, o tubo o similar para sujetarlo, un pulsador, un portabrocas y luego las brocas, discos, fresas o lo que vayamos a necesitas, que tendremos que comprar.

El portabrocas tiene que poder fijarse al eje del motor, por lo que tendrá que ser de un diámetro pequeño. Yo compré uno similar a este por 5.99 €.

Este es el motor que saqué de una impresora:

Le acoplo el portabrocas:

El motor quedaba un poco holgado dentro del tubo, así que enrollé un poco de cable y con esto encajó perfectamente.

Para la tapa, corté un poco de plástico de una caja de CD:

Compré algunos accesorios, como mini brocas, discos de corte y piezas para amolar/fresar.

 

Mejoras si vuelvo a construirme uno:

  • Emplear un pulsador más grande y mejor (el que puse es muy pequeño e incómodo)
  • Añadirle un par de baterías de ion litio 18650 y cargador, y así lo hago totalmente inalámbrico.

Manejar un motor stepper con un driver A4988 y Arduino

Voy a contar cómo manejar un motor paso a paso (stepper) con Arduino a través de un driver A4988. En esta otra entrada ya expliqué cómo hacerlo con un controlador DRV8825, que es una versión mejorada del A4988 (el DRV8825 admite microstepping has 1/32, frente al 1/16 del A4988, 45V frente a 35V, y 2.5A frente a 2A).

Pololu driver A4988

 

Características principales del driver A4988:

  • Para motores bipolares
  • Permite microstepping de hasta 1/16
  • 2A
  • Interfaz casi idéntica al DRV8825
  • 35 V máximo
  • Control de corriente máxima con un potenciómetro

Nota importantísima: los datos anteriores, en especial el del límite de 2A es para los A4988 en los módulos Pololu (algo más caros). Hay una variante muy común que son los StepStick (más baratos, y seguramente es este el que tienes si lo has comprado de China). y la principal diferencia es que su límite es de 1A. Así que mucho ojito.

Stepstick driver A4988

El motor que voy a usar es un motor NEMA 17 GZGW09, comprado aquí por 13.50 €, pero valdría cualquier motor bipolar de 4 cables.

gzgw09

Características:

  • Step angle: 1.8 degree
  • Rated voltage: DC 4.83V
  • Rated current: 0.84A
  • Phase impedance: 5.75 Ohm + / – 10 degree centigrade
  • Phase inductance: 9.3 mH + / – 20 degree centigrade (1kHz 1V RMA)
  • Holding torque: 0.48Nm Min
  • Shaft diameter: 5mm / 0.188 (3/16)
  • Shaft length: 20mm
  • Motor height: 34mm
  • Number of lead wire: 4 wires
  • Driven X-axis and Y-axis movement, sprinkler wire wheel to scroll
  • Great for DIY project
  • Dimensions: 5.8 cm x 4.2 cm x 4.2 cm
  • Weight: 220 g

 

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

Siguiendo las instrucciones de Pololu, voy a emplear el siguiente esquema de conexión, con paso completo (sin microstepping):

Empleo un Arduino Nano, pero valdría cualquier otro. Uso el pin 8 para la dirección y el 9 para el step. El esquema Fritzing sería así:

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

  • 1A: rojo (morado)
  • 1B: gris (gris)
  • 2A: amarillo (blanco)
  • 2B: verde (negro)

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.

Lo primero es determinar el chip que realmente tenemos, pues cambia mucho si es un Pololu o un StepStick.

En la hoja de especificaciones se dice:

El Pololu tiene un valor de para la resistencia de censado SMD de 0.05 Ω (si se fabricó a partir de enero de 2017, entonces 0.068 Ω), mientras que en el StepStick es de 0.2 Ω. Lo mejor es mirarlo en la propia placa.

Así pues, en mi caso, tengo un StepStick (Rs= 0.2 Ω), y la intensidad máxima para mi motor de 0.84 A.

VREF = ItripMAX · 8 · Rs = 0.84 · 8 · 0.2 = 1.34 V

Así que debería limitar a 1.34 V.

Pero ojo, el valor de la intensidad que hemos empleado antes es la máxima. En función de qué configuración de microstepping vayamos a usar, se podrá emplear otro valor.

Así, si empleamos pasos completos sin micro pasos, vemos que la tensión va variando en cada micropaso (también se puede consultar una tabla en las especificaciones):

Si emplease pasos completos y no micro pasos, entonces la tensión máxima que se entrega al motor es de un 70.71%.

Y entonces, si voy a emplear pasos completos tendré que ajustar el voltaje a:

 

VREF= 0.7071· ItripMAX · 8 · Rs = 0.7071 · 0.84 · 8 · 0.2 = 0.95 V

Para medir este voltaje, lo hacemos con el multímetro sobre el potenciómetro y sobre tierra, y ajustamos el potenciómetro hasta la VREF calculada antes (0.95 V).

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

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

const int dirPin = 8;
const int stepPin = 9;
 
const int steps = 200;
int microPausa = 1000;
 
void setup() {
 pinMode(dirPin, OUTPUT);
 pinMode(stepPin, OUTPUT);
}
 
void loop() {
 digitalWrite(dirPin, HIGH);  // Establezco una dirección

 for (int x = 0; x < steps ; x++) {
   digitalWrite(stepPin, HIGH);
   delayMicroseconds(microPausa);
   digitalWrite(stepPin, LOW);
   delayMicroseconds(microPausa);
 }
 delay(1000);
 
 digitalWrite(dirPin, LOW);  // Cambio la dirección

 for (int x = 0; x < steps ; x++) {
   digitalWrite(stepPin, HIGH);
   delayMicroseconds(microPausa);
   digitalWrite(stepPin, LOW);
   delayMicroseconds(microPausa);
 }
 delay(1000);

}

Y un vídeo mostrando el motor en movimiento con el código anterior:

Referencias

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

Motores paso a paso con Arduino y driver A4988 o DRV8825

http://www.instructables.com/id/Drive-a-Stepper-Motor-with-an-Arduino-and-a-A4988-/

https://www.spainlabs.com/foros/tema-Ajuste-de-los-pololus-en-caliente

Manejar un motor stepper con un driver DRV8825 y Arduino

Voy a contar cómo manejar un motor paso a paso (stepper) con Arduino a través de un controlador DRV8825. En esta otra entrada explico cómo hacerlo con una Raspberry Pi, de forma muy similar, y en esta hablo de varios motores y drivers.

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 voy a usar es un motor NEMA 17 JK42HS40-1704 13A, comprado aquí por 12.50 €, pero valdría cualquier motor bipolar de 4 cables.

Características del motor:

  • 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/fase
  • 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):

Empleo un Arduino Nano, pero valdría cualquier otro. Uso el pin 8 para la dirección y el 9 para el step. El esquema Fritzing de mi montaje es así:

Manejar un motor paso a paso con DRV8825 y Arduino

 

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, que cuento a continuación.

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.

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

const int dirPin = 8;
const int stepPin = 9;
 
const int steps = 200;
int microPausa = 1000;
 
void setup() {
 pinMode(dirPin, OUTPUT);
 pinMode(stepPin, OUTPUT);
}
 
void loop() {
 digitalWrite(dirPin, HIGH);  // Establezco una dirección

 for (int x = 0; x < steps ; x++) {
   digitalWrite(stepPin, HIGH);
   delayMicroseconds(microPausa);
   digitalWrite(stepPin, LOW);
   delayMicroseconds(microPausa);
 }
 delay(1000);
 
 digitalWrite(dirPin, LOW);  // Cambio la dirección

 for (int x = 0; x < steps ; x++) {
   digitalWrite(stepPin, HIGH);
   delayMicroseconds(microPausa);
   digitalWrite(stepPin, LOW);
   delayMicroseconds(microPausa);
 }
 delay(1000);

}

 

Y un vídeo mostrando el motor en movimiento con el código anterior:

 

Referencias

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

Controlador de motor a pasos DRV8825

Motores paso a paso con Arduino y driver A4988 o DRV8825

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

Acceder a la consola de una Raspberry Pi (Zero) por UART con un adaptador USB PL2303

La Pi Zero es una maravilla, si no fuera por lo complicado que es acceder a su consola, al tener un único puerto USB y no tener ni WiFi integrado ni una conexión de red: hace falta conectarse con un teclado y a una pantalla a través de HDMI, o a través de un hub USB, más una tarjeta WiFi USB, etc.

Una forma más sencilla de poder acceder a la consola de la Raspberry Pi es a través de UART, con un cable específico USB, o con un adaptador USB PL2303. Esto es válido no solo para la Raspberry Pi Zero, sino para todas las Raspberrys.

Adaptador USB – TTL PL2303 (vista delantera)

Adaptador USB – TTL PL2303 (vista trasera)

Lo primero es activar la comunicación en serie en la Raspberry Pi. Esto lo podemos hacer con sudo raspi-config
y después en Advanced Options – Serial decimos sí a permitir hacer login por serie. Otra alternativa es editar el ficher /boot/config.txt y añadir al final enable_uart=1. En cualquier caso, es necesario reiniciar tras hacer el cambio.

Ahora es necesario instalar los drivers en nuestro ordenador para que reconozca el PL2303. Para ello nos descargamos de la página oficial el driver correspondiente a nuestro sistema operativo (para Mac, para Windows, para Linux no hace falta, viene por defecto). Tras instalarlo tenemos que reiniciar el ordenador.

Como en Windows me ha dado problemas (no reconoce el módulo), al final lo he probado desde mi Mac y ha funcionado. He hecho lo siguiente.

 

Tras instalar el driver del enlace anterior y reiniciar, he conectado el adaptador (a su vez conectado a la Raspberry Pi) de la siguiente forma:

Ojo, que el TXD de la Raspberry Pi se conecta al RXD del PL2303 y viceversa.

Esquema conexión PL2303 a Raspberry Pi Zero

Tras comprobar que todo estaba bien conectado, he abierto una consola en mi Mac y he escrito el siguiente comando: screen /dev/cu.usbserial 115200. ¡Y ya está! Tras hacer eso y dar al enter, ya nos pide el usuario y contraseña y ya estamos conectados a la Raspberry Pi.

(Ojo, que a lo mejor en otros casos el dispositivo podrá tener otro nombre; entonces bastará con teclear screen /dev/cu. y darle al TAB para ver los que hay, y escogemos.)