lunes, 29 de febrero de 2016

Versión 3 de la Raspberry Pi

Según los datos oficiales, la Raspberry Pi 3 seguirá costando 35 dólares, igual que Raspberry Pi 2. Incluye soporte WiFi 802.11n y Bluetooth LE 4.1, Cuenta con un nuevo procesador de 64 bits a 1.2GHz con cuatro núcleos (ARM Cortex-A53). Los desarrolladores aseguran que el nuevo procesador es diez veces más potente que el de una Raspberry original y un 50% más rápida que la segunda Raspberry. La memoria RAM se mantiene en 1GB.


Las primeras imágenes que se han filtrado parecen apuntar a un diseño de las Raspberry Pi 3 prácticamente idéntico al de la actual versión manteniendo las mismas dimensiones que la Raspberry Pi 2, con cuatro puertos USB, el puerto Ethernet (quizás Gigabit Ethernet), la ranura SD, el puerto HDMI y por supuesto el puerto GPIO.

Visto en xataka

sábado, 27 de febrero de 2016

Error en la versión esp8266 2.1.0 de Arduino IDE

Esta mañana al iniciar el IDE de Arduino me indicó el gestor de tarjetas que había una actualización para el módulo ESP8266. La anterior versión era la 2.0.0 y se actualizó a la 2.1.0. A partir de ese momento, no pude programar correctamente el módulo.

Después de varios intentos infructuosos he vuelto a instalar la versión 2.0.0 seleccionando dicha versión en el Gestor de tarjetas y todo ha vuelto a la normalidad.


Para realizar esta operación ha de ir al menú Herramientas - Placa - Gestor de Tarjetas y seleccionar esp8266. Luego, en Seleccione versión elegir 2.0.0 y click en Instalar.

domingo, 7 de febrero de 2016

Variando la intensidad de un led por bluetooth

Este proyecto tiene como objetivo el variar la intensidad de un led mediante una aplicación android instalada en un dispositivo conectado con el Arduino UNO a través de bluetooth. Este proyecto es muy parecido al realizado en esta entrada con la salvedad de que variamos la intensidad del led utilizando modulación por ancho de pulso (PWM).

En arduino utilizamos la función analogWrite(pin, value) que escribe un valor pseudo-analógico usando PWM en un pin de salida. Esta función está activa para los pines 3, 5, 6, 9, 10 y 11 de Arduino UNO.

Puede especificarse un valor de 0 - 255: un valor 0 genera 0 V en el pin especificado y 255 genera 5 V. Para valores de 0 a 255, el pin alterna rápidamente entre 0 V y 5 V (cuanto mayor sea el valor, más a menudo el pin se encuentra en HIGH (5 V). Por ejemplo, un valor de 64 será 0 V tres cuartas partes del tiempo y 5 V una cuarta parte. Un valor de 128 será 0 V la mitad del tiempo y 5 V la otra mitad. Un valor de 192 será 0 V una cuarta parte del tiempo y 5 V tres cuartas partes.

El esquema del montaje es sencillo:

Conectamos el módulo HC-06 al Arduino UNO (RX - TX) y un led al puerto 5.

El código completo de arduino es el siguiente:

char dato;
String comando;
#define led 5

void setup() {
  Serial.begin(9600);
  pinMode(led, OUTPUT);
  analogWrite(led,255);
  delay(1000);
  analogWrite(led,0);
  delay(10);
  Serial.println("Preparado...");
}

void LeerPuertoSerie() {
  comando = "";
  while(Serial.available()){
    delay(10);
    if (Serial.available() > 0){
      dato = Serial.read();
      comando += dato;
    }
  }
}
void loop(){
  LeerPuertoSerie();
  if (comando.length() > 0){
    Serial.println(comando);
    if (comando == "ON") {
        analogWrite(led,255);
        delay(10);
        comando == "";
    } else {
      if (comando == "OFF") {
        analogWrite(led,0);
        delay(10);
        comando == "";
      } else {
        if ((comando.toInt()>=0)&&(comando.toInt()<=255)) {
        analogWrite(led, comando.toInt());
          delay(10);
        }
      }
    }
  }
}



El programa lee el puerto serie y espra a recibir un comando:
ON: Enciende el led con la intensidad máxima
analogWrite(led,255);

OFF: Apaga el led
analogWrite(led,0);

Valor : si recibe un número comprendido entre 0 y 255, ilumina el led según dicho valor.
analogWrite(led, comando.toInt());

Utilizando App Inventor creamos nuestro programa:



Bloques de inicialización de variables e inicio del programa:


Bloques para salir del programa, desconectar y conectar con el módulo bluetooth:


  Bloque para desconexión:


Bloque que envía el comando ON (para enviar el comando OFF es similar):


Bloque que enviá el valor del slide:


Si deseas tener más conocimientos sobre la programación con App Inventor no dejes de visitar AppInventor a muete.

En este enlace puedes descargar la aplicación para tu dispositivo android. Las fuentes del programa las puedes descargar de aquí.

Fuentes:

sábado, 6 de febrero de 2016

Librería ESP8266WebServer (Arduino IDE)

La librería ESP8266WebServer se utiliza para simplificar la creación de un servidor web utilizando un módulo ESP8266. Para explicar su funcionamiento voy a realizar un pequeño ejemplo que encenderá y apagará un led utilizando un navegador web. El led estará conectado a través de una resistencia de 330 ohmios al puerto D0.

El código completo del programa es el siguiente:

#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>

const char* ssid ="WLAN_E17C";
const char* password = "ced0ccb58c84e525e35f";
const int LED = 16; //GPI16 - D0

ESP8266WebServer server(80);

void led_on(){
 digitalWrite(LED,HIGH);
 server.send(200, "text/plain", "LED encendido");
}

void led_off(){
 digitalWrite(LED,LOW);
 server.send(200, "text/plain", "LED apagado");
}

void info() {
 server.send(200, "text/plain", "Hola mundo!");
}

void no_encontrado() {
 server.send(404,"text/plain","Error en la petición");
}

void setup() {
 //inicializa el puerto serie
 Serial.begin(115200);
 delay(10);
 //inicializa el led
 pinMode(LED,OUTPUT);
 digitalWrite(LED,LOW);
 //Inicializa el módulo wifi
 WiFi.mode(WIFI_STA); //Establece el módulo como cliente wifi
 WiFi.disconnect(); //Se desconecta de cualquier WiFi conectado previamente
 Serial.println(); 
 //conecta con la red wifi
 Serial.print("Connecting to ");
 Serial.println(ssid);
 WiFi.begin(ssid, password);
 while (WiFi.status() != WL_CONNECTED) {   // Espera por una conexión WiFi
    delay(500);
    Serial.print(".");
 }
 Serial.println("");
 Serial.println("WiFi connected");
 Serial.print("IP address: ");
 Serial.println(WiFi.localIP());
 digitalWrite(LED,HIGH);
 //definimos los paths
 server.on("/on",led_on);
 server.on("/off",led_off);
 server.onNotFound(no_encontrado);
 //inicializa el servidor web
 server.begin();
 Serial.println("Servidor HTTP activo");
}

void loop() {
 server.handleClient();
}

El código es muy parecido al ejemplo de servidor web de este artículo. Lo que cambia es el propio servidor web.

Creamos un objeto servidor WEB que escuchará el puerto 80:

ESP8266WebServer server(80);

Con server.on indicamos una función como respuesta del servidor cuando el navegador solicita cierta URL. El ESP8266 nos permite definir comportamientos diferentes para “subdirectorios” de la URL, y así podríamos configurar diferentes respuestas para “/sub-url-1”, “/sub-url-2”, etc.:

server.on("/",info);
server.on("/on",led_on);
server.on("/off",led_off);
server.onNotFound(no_encontrado);

También podemos introducir el código directamente en vez de llamar a una función. Por ejemplo:

server.on(“/on”,[]() {
 digitalWrite(LED,HIGH);
});

Cuando el navegador se conecte al ESP8266 se va a ejecutar ese código que hemos puesto dentro de server.on, y que en el caso de que la URL apunte a la raiz (/) es una llamada a la función server.send, que lo que hace es responder al navegador. Para ello, hay que darle tres argumentos:
  • Código de respuesta: es un código que se utiliza en el protocolo HTTP para indicar diferentes eventos en las conexiones. Posiblemente te suene el 404 cuando das con un enlace roto, pues el código 200 es menos visible pero más común, es el que se devuelve cuando sí que se encuentra el contenido.
  • MIME-type: es un código que indica el tipo de contenido que se devuelve, puede ser texto, imagen…
  • Respuesta: El contenido de la respuesta en sí, en este caso tan solo queremos responder un “Hola mundo!” de prueba.

void info() {
 server.send(200, "text/plain", "Hola mundo!");
}

El método server.onNotFound() definiremos la función que queremos que actúe cuando la petición que recibimos no la tenemos definida. En este caso, vamos a llamar a la función no_encontrado() que hemos definido anteriormente.

Para iniciar el servidor web:

server.begin();

En loop() escuchamos las conexiones entrantes:

server.handleClient();

Fuentes:

Nuevo Arduino Tian

Arduino Tian es una placa SBC, equivalente a Raspberry Pi, que el Proyecto Arduino ha lanzado recientemente.
 
 
 
Arduino Tian está enfocado al mundo Arduino pero también es capaz de correr un sistema operativo Gnu/ Linux que permita gestionar las conexiones de la placa. Arduino Tian también tiene un módulo Wifi que permitirá realizar conexiones sin necesitar de ninguna placa.
 

miércoles, 3 de febrero de 2016

ESP8266 HC-06 con Arduino IDE

En este artículo estableceremos una conexión por el puerto serie entre nuestro ESP8266 y el módulo Bluetooth HC-06.

El esquema que vamos a utilizar es el siguiente:


Untitled Sketch_bb.png


Una diferencia con Arduino UNO es que el puerto serie del módulo presente en los pins TX y RX es el mismo que el puerto serie con el que programamos por lo que durante la programación del módulo debemos de dejar de alimentar el módulo HC-06. Una vez programado y para realizar las pruebas, debemos de desconectar el PC y conectar el módulo.

En este ejemplo, vamos a encender y apagar un led conectado a GPIO16 enviando comandos a través del módulo bluetooth.

La programación del módulo ESP8266 es sencilla. La parte principal del programa es la función que lee los comandos enviados por la aplicación android:

void LeerPuertoSerie() {
 comando = "";
 while(Serial.available()){
    delay(10);
    if(Serial.available() > 0) {
     dato = Serial.read();
     comando += dato;
    }
 } 
}

En esta función, se almacena en comando los mensajes recibidos por el puerto serie y es llamado en loop():

LeerPuertoSerie();
  if (comando.length() > 0) {
    if(comando == "OFF") { //apaga el led
     digitalWrite(LED,LOW);
    }
    if(comando == "ON") { //enciende el led
     digitalWrite(LED,HIGH);
    }
}

El programa completo es el siguiente:

#define LED 16 // GPIO16 (D0) Puerto al que conectamos el LED
char dato; // Carácter que recibimos por bluetooth
String comando; // Comando que generamos con los caracteres
void setup() {
 // Configuramos el puerto serie a 9600
 Serial.begin(9600);
 delay(10);
 // Inicializa el Led
 pinMode(LED,OUTPUT);
 digitalWrite(LED,LOW);
}
// Lee el puerto serie hasta recibir el último carácter
void LeerPuertoSerie() {
 comando = "";
 while(Serial.available()){
    delay(10);
    if(Serial.available() > 0) {
     dato = Serial.read();
     comando += dato;
    }
 }  
}
void loop() {
 // lee los comandos por el puerto serie
 LeerPuertoSerie();
 if (comando.length() > 0) {
    if(comando == "OFF") { //apaga el led
     digitalWrite(LED,LOW);
    }
    if(comando == "ON") { //enciende el led
     digitalWrite(LED,HIGH);
    }
 }
}

Además, he creado una aplicación android en AppInventor para que, conectándose al módulo de bluetooth, envíe los comandos para encender y apagar el led.



Screenshot_2016-02-03-23-21-15.png

Los módulos que componen el programa son los siguientes:



Con el siguiente código conectamos con el módulo bluetooth HC-06:


y con este código enviamos el comando “ON”. Para enviar el comando “OFF” es similar cambiando únicamente el texto enviado.



Al finalizar el programa:


El programa compilado lo puedes descargar aquí mientras que el proyecto appinventor lo puedes decargar aquí.