Enviar SMS con Python y la libreria PySerial

Mandar un SMS con Python
Mandar un SMS con Python

Algunos módem usb permiten recibir ordenes mediante comandos AT, con estos comandos podemos hacer muchas cosas. Hace años, muchos años, estos comandos los utilizábamos para configurar centralitas, realizar llamadas, obtener información del aparato, etc. Ahora esta técnica esta en desuso, pero aun así, algunos módems están preparados todavía para poderse programar con estos comandos.

Aprovechando la librería PySerial y python he creado un programa para cuando lee ciertos valores desde el arduino me los mande por SMS a mi móvil.

Para empezar con el programa tenemos que saber cual es el puerto serie del módem, en mi caso cuando pincho el módem usb al ordenador me crea tres puertos /dev/ttyUSB0, /dev/ttyUSB1 y /dev/ttyUSB2, para windows no tengo ni idea que hace.

Una vez que sabemos los puertos del módem, tenemos que saber cual de ellos es el que responde a los comandos AT. Para saber que puerto responde a los comandos hice este programa

#!/usr/bin/env python

import serial

sSerie = serial.Serial('/dev/ttyUSB0', 9600)
#sSerie.open()
try:
    sSerie.write("AT\r\n")
    print sSerie.readline()
    print sSerie.readline()

except ValueError:
    print "Oops!  se ha producido un error ..."

#sSerie.close()

Con este programa, lo que hacemos es abrir el puerto correspondiente, y le enviamos el comando “AT”. Si el módem sabe que es lo que le estoy enviando nos devolverá “OK”, en caso contrario “ERRROR”, o saltara la excepción del programa.

También lo podemos probar con un programa de terminal, como el “Serial port Terminal” o el “minicom” en Linux, o con el “Hiperterminal” en windows. Solo tenemos que abrir el puerto a probar y escribir “AT” y esperar la respuesta

Así con todos los puertos disponibles, en mi caso me admitió peticiones por los puertos /dev/ttyUSB1 y /dev/ttyUSB2.

Una vez que sabes el puerto, podes probar ha enviar un SMS de la siguiente forma.

#!/usr/bin/env python

import serial
# para enviar el Ctrl-Z
from curses import ascii

sSerie = serial.Serial('/dev/ttyUSB2', 9600)
#sSerie.open()
try:
    # Enviamos un reset al modem
    sSerie.write("ATZ\r\n") 
    # Le ponemos en modo para SMS
    sSerie.write("AT+CMGF=1\r\n") 
    # Le pasamos el numero al que vamos ha mandar el SMS
    sSerie.write("AT+CMGS=\"123456789\"\r\n"); 
    # Texto del mensaje terminado en Ctrl+Z
    sSerie.write("Esto es un mensaje" + ascii.ctrl('z')) 
    # Leemos la informacion devuelta
    print sSerie.readline() 
    # Leemos la informacion devuelta
    print sSerie.readline() 
    # Leemos la informacion devuelta
    print sSerie.readline() 

except ValueError:
    print "Oops! se ha producido un error ..."

#sSerie.close()

Y con esto ya podemos mandar SMS desde python, esta un poco chapucero, pero para lo hace y lo que he tardado en el, sobra la mitad.

Ya solo nos queda leer los datos del arduino y mandar el SMS.

Medir distancias con el sensor HC-SR04 y arduino

Sensor de ultrasonidos HC-SR04
Sensor de ultrasonidos HC-SR04

El sensor HC-SR04 es un modulo que mediante ultrasonidos nos permite medir distancias. Lo que hace el sensor es enviar un sonido, este rebota en un objeto y es recogido de nuevo por el sensor, sabiendo cuanto tiempo ha tardado en volver la señal, podemos calcular la distancia que hay desde el sensor hasta el objeto. Con el HC-SR04 podemos obtener medidas desde 1 ó 2 cm hasta los 5 metros.

Materiales usados

Arduino UNO Arduino UNO
 Sensor HC-SR04 HC-SR04
protoboard Protoboard
cables_union Cables de conexión

Medir distancias con el sensor HC-SR04

La conexión con el arduino es muy sencilla, el sensor HC-SR04 (niceeshop(TM) HC SR04 distancia por ultrasonidos módulo de medición del sensor para Arduino) viene con 4 patillas, las normales de vcc, que la conectaremos al pin de arduino de 5 vol.,  y de GND, que lo conectaremos a uno de los pines de masa del arduino, y 2 pines más que son los que nos permitirán obtener los valores para hacer los cálculos para obtener la medición. Estos pines son TRIGGER, indica cuando se ha enviado la señal, y ECHO, cuando se ha detectado el retorno del sonido.

[singlepic id=39 w=400 h=400 float=center]

En el tema de la programación, tampoco tenemos demasiadas complicaciones, activamos los pines donde hemos conectado los pines de datos del HC-SR04 el TRIGGER como OUTPUT y el ECHO como INPUT. Ponemos en HIGH el pin del TRIGGER, y lo volvemos ha poner en LOW, esperamos a que el pin del ECHO detecte la señal. Calculamos cuanto a tardado, y sabiendo el tiempo que ha tardado calculamos la distancia.

// Código original en ingles en
// http://www.swanrobotics.com/HC-SR04_Project
// Este ejemplo es de dominio publico

const int TriggerPin = 10; // pin del TRIGGER
const int EchoPin = 11; // pin del ECHO

long Duracion = 0;

void setup(){
pinMode(TriggerPin,OUTPUT); // Pin del TRIGGER lo ponemos en output
pinMode(EchoPin,INPUT); // Pin del ECHO lo ponemos en input

Serial.begin(9600); // activamos el puerto serie para ver los resultados
}

void loop(){
digitalWrite(TriggerPin, LOW); // ponemos el pin TRIGGER en LOW
delayMicroseconds(2); // esperamos 2 milisegundos
digitalWrite(TriggerPin, HIGH); // ponemos el pin TRIGGER en HIGH
delayMicroseconds(10); // lo temos activado durante 10 milisegundos
digitalWrite(TriggerPin, LOW); // ponemos el pin del TRIGGER en LOW

Duracion = pulseIn(EchoPin,HIGH); // Esperamos a que el pin del ECHO devuelva HIGH, y guardamos el tiempo
// Devuelve el tiempo en milisegundos
long Distancia_mm = fDistancia(Duration); // Función para calcular la distancia

Serial.print("Distancia = "); // Y la mostramos por el puerto serie
Serial.print(Distancia_mm);
Serial.println(" mm");

delay(1000); // Esperamos 1 segundo para hace de nuevo la medición
}

// Función para calcular la distancia
long fDistancia(long tiempo)
{
// Calculamos la distancia en mm
// ((tiempo)*(Velocidad del sonido)/ el camino se hace dos veces) 

long DistanceCalc; // Variable para los cálculos
DistanceCalc = (tiempo /2.9) / 2; // Cálculos en milímetros
// DistanceCalc = (tiempo /29) / 2; // Cálculos en centímetros
// DistanceCalc = (tiempo / 74) / 2; // Cálculos en pulgadas
return DistanceCalc; // Devolvemos el calculo
}

Seguro que alguno le parecerá difícil, pero lo único que hacemos es mediante el sensor HC-SR04 enviar un señal, esperar a que vuelva, calcular cuanto a tardo, y por la formula de la velocidad del sonido calcular la distancia.

Pero aun así es mas fácil todavía, por internet se puede encontrar una librería para el sendor HC-SR04 para el ide del arduino que facilita enormemente el calculo.

El código quedaría de la siguiente manera

// Ultrasonic - Library for HR-SC04 Ultrasonic Ranging Module.
// Rev.4 (06/2012)
// J.Rodrigo ( www.jra.so )
// more info at www.ardublog.com

#include <Ultrasonic.h>

Ultrasonic ultrasonic(10,11); // (Trig PIN,Echo PIN)

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

void loop()
{
  Serial.print(ultrasonic.Ranging(CM)); // CM or INC
  Serial.println(" cm" );
  delay(100);
}

El programa nos devuelve la distancia en centímetros (CM), si lo queremos en pulgadas (INC), tendremos que cambiar esto

ultrasonic.Ranging(CM)

por esto

ultrasonic.Ranging(INC)

Aun así, según esta codificado el programa, solo obtendremos mediciones de hasta 50 centímetros, para poder obtener mediciones mas largas tendremos que modificar la siguiente linea

Ultrasonic ultrasonic(10,11); // (Trig PIN,Echo PIN)

Por esta otra

Ultrasonic ultrasonic(10, 11, 30000); // (Trig PIN,Echo PIN, Timeout)

Lo único que hemos hecho es cambiar el timeout, que esta establecido por defecto en 3.000 ms, que es igual a 50 cm, por 30.000 ms, que son 5 metros.

Con este parámetro podremos configurar la distancia máxima que queremos medir con el sensor HC-SR04.  Para calcular el timeout correspondiente a la distancia que queremos, los podemos hacer con la siguiente formula

Timeout = Distancia máxima en centímetros * 58

 Con estos ya podemos calcular distancias con nuestro arduino (Arduino Uno R3).

Como conseguirlo

niceeshop(TM) HC SR04 distancia por ultrasonidos módulo de medición del sensor para Arduino

Arduino Uno R3

 

Configurar red TOR para navegar “anonimamente” en Ubuntu

[singlepic id=38 w=320 h=320 float=right]En ocasiones necesitamos que nuestra navegación sea “anónima”, sin que que Google, Facebook,etc, nos controle por donde estamos navegando. Para esto se desarrollo la red TOR. Esta red lo que hace de forma rápida es hacer saltar nuestra conexión de un “proxy” a otro con nuestra conexión encriptada. No sabiendo el servidor final que ip es la que realmente le esta haciendo la petición.

Como todo sistema que permite una navegación “anónima”, esta red rápidamente se ha empezado ha utilizar por grupos de delincuencia. Por lo que diversas agencias de seguridad, NSA, FBI, etc, ya han conseguido romper dicho anonimato. Pero aun así, las técnicas utilizadas, para romper dicho anonimato, requieren de mucho tiempo para saber realmente quien esta detrás de una comunicación.

Para poder iniciar una comunicación a través de la red TOR en nuestro sistema bajo Ubuntu, tenemos que instalar dos programas, uno que es el sistema TOR  y un proxy para permitir la comunicación Privoxy.

Para poder instalar estos programas tenemos que agregar un nuevo repository de la siguiente forma

sudo apt-add-repository ppa:ubun-tor/ppa

Actualizamos nuestra base de datos de aplicaciones

sudo apt-get update

E instalamos los programas

sudo apt-get install tor privoxy

Con esto ya tenemos los programas necesarios para poder navegar “anónimamente” por la red.

Ahora lo que nos queda es configurar nuestro navegador para poder utilizar la red TOR. Para ello cambiaremos la configuración de red del navegador para que utilice el proxy que hemos instalado con los siguientes parámetros

Protocol: socks5
Host: localhost
Port: 9050

Ahora solo tienes que abrir cualquier pagina que te de la ip que utilizas para navegar por internet para comprobar que va cambiando cada cierto tiempo. Yo uso esta www.cmyip.com

No solo permite navegar por ella, si no que, cualquier programa que se le pueda configurar una  conexión mediante un proxy es factible de poder usar la red TOR, yo lo he probado con Spotify, y funciona correctamente, pudiendo escuchar canciones que están bloqueadas para poder escucharlas en España.

La utilización de esta red se tiene que hacer con MUCHA cautela, debido a la gran utilización de ella por grupos de delincuencia.

La reforma del Código Penal, en el artículo 197/3, no distingue entre auditorías de seguridad o intromisiones con finalidad ilícita.

Comunicación bluetooth y arduino

Añadirle la comunicación bluetooth al arduino es muy sencilla. Lo único que tenemos que hacer es conseguir un adaptador bluetooth HC-05 (KKmoon Wireless Bluetooth Maestro y Esclavo HC-05 del módulo de transceptor para Arduino ARM DSP PIC) o HC-06 (XINTE Inalámbrica Bluetooth Serial esclavo módulo HC-06 apto para Arduino).

Comunicación bluetooth con arduino

Este adaptador nos permite una comunicación serie con el dispositivo de comunicación bluetooth al que nos conectemos. Podemos configurarlo en modo maestro, el adaptador seleccionara el dispositivo al que se quiere conectar, o en modo esclavo, el adaptador estará a la espera de dispositivos que se quieran conectar a el.

El HC-05 / HC-06 es un componente de tipo smd, es decir, es como un integrado que tendremos que soldar a nuestra placa con conectores de superficie.

[singlepic id=36 w=320 h=320 float=center]

Pero hay en el mercado infinidad de montajes que ya bien preparados para su conexión directa con arduino (Arduino Uno R3). La alimentación estándar del HC-05/HC-06 es de 3.3v, pero el sistema ya viene preparado para poderlo alimentarlo hasta los 6v.

[singlepic id=37 w=320 h=320 float=center]

Para conectarlo al arduino lo podemos hacer de dos formas,

1º Modo: Conectarlo directamente a los pines de Tx-Rx del arduino.

Para ello solo tendremos que conectar el pin Tx del dispositivo bluetooth al Rx del arduino, y el Rx de la comunicación bluetooth al Tx del arduino. El problema que tiene este montaje, es que eliminamos la posibilidad de utilizar el monitor del ide del arduino para depurar el programa. Otro inconveniente que tiene, es que para poder programar el arduino, el bluetooth no puede estar conectado a la placa del arduino.

[singlepic id=34 w=320 h=320 float=center]

2º Modo: Conectarlo a cualquier pin y utilizar la librería “Software Serial”

Otra forma de conectarlo es utilizar las funciones que nos ofrece la librería “Software serial”, para poder hacer que, cualquier pin del arduino, pueda funcionar como un puerto serie. Lo único que tenemos que tener en cuenta es que el pin donde este conectado el Tx del bluetooth sera el pin Rx, y donde este el Rx sera el Tx

[singlepic id=35 w=320 h=320 float=center]

Como programarlo

La programación es muy sencilla. Solo tendremos que crear una variable para poder manejar el puerto serie.

Si lo conectamos directamente a los pines Rx-Tx del arduino solo tendremos que poner

  Serial.begin(9600);

Si lo hacemos con la librería “Software Serial” tendremos que crear el puerto y luego inicializarlo

// Creamos el puerto serie, le pasamos los pines que serán 
// Tx (donde esta conectado en Rx del bluetooth)
// y Rx (donde esta conectado el Tx del bluetooth)
SoftwareSerial miPuetoSerie =  SoftwareSerial(rxPin, txPin);

// Y lo inicializamos como cualquier puerto serie
miPuetoSerie.begin(9600);

Con esto ya tenemos establecida la comunicación bluetooth con el arduino.

Para leer los datos mediante la comunicación bluetooth utilizaremos en los dos casos

char unChar = miPuertoSerie.read();

Y para escribir utilizaremos

miPuertoSerie.print("Información a enviar");

Ejemplo de funcionamiento bluetooth HC-05/HC-06 y arduino

Ejemplo de funcionamiento, enciende el led del arduino, pin 13, cuando recibe a través de la comunicación bluetooth un “1”, y lo apaga cuando recibe un “0”

#include <SoftwareSerial.h>

#define rxPin 10
#define txPin 11
#define ledPin 13

// configura un nuevo puerto
SoftwareSerial miPuertoSerie =  SoftwareSerial(rxPin, txPin);

int unChar;

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

void loop() {
  // escucha la llegada de nuevos datos serie:
  char unChar = miPuertoSerie.read();
  // imprime el caracter:
  if (unChar > 0) {
    switch (unChar) {
      case '1':
        digitalWrite(ledPin, HIGH);
        miPuertoSerie.write("Led encendido");
        break;
      case '0':
        digitalWrite(ledPin, LOW);
        miPuertoSerie.write("Led apagado");
        break;
    }
  }
}

Para probarlo, solo tendremos que enlazar nuestro teléfono, ordenador, etc. al dispositivo de comunicación bluetooth, en el caso del HC-05 aparece como “HC-05” y en el caso del HC-06 como “linvor” o “HC-06”. Y, con un programa de terminal, mandar un “1” o un “0”.

En mi caso lo probé con mi teléfono y la aplicación “BlueTerm”.

Como conseguirlo

HC-05: KKmoon Wireless Bluetooth Maestro y Esclavo HC-05 del módulo de transceptor para Arduino ARM DSP PIC

HC-06: XINTE Inalámbrica Bluetooth Serial esclavo módulo HC-06 apto para Arduino

Arduino: Arduino Uno R3

Protoboard: 2860 Tiepoint Protoboard Sin Soldadura Incluye Jumpwires

Problema Ubuntu y HP LaserJet

[singlepic id=33 w=320 h=320 float=right]En Ubuntu 13.10 existe un problema con las impresoras HP LaserJet, el sistema no es capaz de descargarse los controladores privativos de HP, este problema esta documentado para la versión 11.10. Yo no he tenido este problema en ninguna otra versión, por lo que supongo que ya estaba solucionado y en esta versión ha vuelto a salir.

El problema surge al no poder descargar los controladores para la impresora, en la ventana de mensaje sale que se ha encontrado la impresora y se esta descargando el controlador para ella, pero la descarga nunca se realiza.

Si hacemos pruebas en la ventana de “Configuración del sistema”“Impresoras”, todo parece estar correcto, pero la impresora no imprime. Aunque eliminemos la impresora y la volvamos a instalar, la instalación la da como correcta, pero la impresora no imprime.

Si hacemos pruebas mediante el servidor de impresión (CUPS), accesible desde la dirección “localhost:631”, tampoco obtendremos ninguna resultado. Todo esta bien, pero la impresora no imprime.

Para solucionar este problema hay mucha información por internet, pero todos ellos, indican que tenemos que hacer una serie de scripts, instalar determinados programas, y demás. A mi todo esto no me ha funcionado.

La solución es bastante mas fácil que todo eso. Solo tenemos que ejecutar este programa con privilegios de administrador, ya sea mediante “su” o “sudo”, y listo.

sudo hp-plugin

Este programa nos descarga los controladores privativos  de HP y nos los instala.

Si no tenemos instalado este programa, lo podemos hacer mediante

sudo apt-get install hplip-gui

Con esto quedo solucionado el problema con la impresora.

“La solución más simple suele ser la mejor”