Mostrando entradas con la etiqueta arduino. Mostrar todas las entradas
Mostrando entradas con la etiqueta arduino. Mostrar todas las entradas

2/26/2013

Programación del Bootloader a Arduino



Programación de Bootloader para Arduino Uno, Mega, Nano, Micro y cualquier modelo. En nuestro caso hemos usado para realizar el tutorial Arduino Nano.



¿Por qué programar el bootloader de Arduino?

El motivo de la programación del Bootloader es que realizaremos un pedido de Arduino Nano nos llegó sin el bootloader programado. Tras buscar por multitud de sitios web hemos comprobado que existe información al respecto pero muy poca en castellano y prácticamente ninguna en modo tutorial y ninguna para nuestro programador.
Así pues a continuación explicamos paso a paso y con capturas de pantalla cómo programar el bootloader de Arduino.
 

Requisitos para programar el bootloader de Arduino

Arduino

Necesitaremos obviamente disponer de un Arduino, en nuestro caso usaremos Arduino Nano:
Requisitos para programar el bootloader de Arduino

 

Programador ISP con cable de 10 pines

El programador ISP para el Atmel Atmega328 que lleva nuestro Arduino Nano es un “USBASP ISP Programmer”:
Requisitos para programar el bootloader de Arduino
Que incorpora un cable de 10 pines y que pedimos por eBay por menos de 5€:
Requisitos para programar el bootloader de Arduino
El programador se conecta al Arduino a través de el conector ICSP, que en nuestro caso no lleva los pines del ICSP soldados como mostramos en las imágenes anteriores. A continuación mostramos los esquemas de conexiones del conector ICSP tanto del Arduino:
Requisitos para programar el bootloader de Arduino
Como la del conector de 10 pines de nuestro programador:
Requisitos para programar el bootloader de Arduino
Puesto que el conector del programador no coincide con el conector ICSP del Arduino deberemos hacer las siguientes conexiones:
Requisitos para programar el bootloader de Arduino
Para ello lo más cómodo es hacer uso de cables de placa de prototipos también conocidos con el termino en inglés cables Breadboard:
Requisitos para programar el bootloader de Arduino
A continuación mostramos algunas imágenes de como se queda la conexión, en ellas se pueden ver como el no tener los pines soldados en el conector ICSP nos ha simplificado la tarea, en caso contrario hubiésemos necesitado otro conector o siendo más drásticos habríamos tenido que cortar el cable del programador y unir de nuevo los cables de modo que ya coincidan con el conector de nuestro Arduino:
Requisitos para programar el bootloader de Arduino
Requisitos para programar el bootloader de Arduino
Requisitos para programar el bootloader de Arduino

 

IDE de desarrollo para Arduino

Además del Arduino y del programador con los conectores necesitaremos también disponer de un PC con el IDE de Arduino. En el siguiente tutorial explicamos cómo instalarlo paso a paso:
En este tutorial explicamos cómo programar el bootloader de Arduino desde un PC con sistema operativo Linux, aunque el proceso es muy similar para el caso de un equipo con Windows.

Programar el bootloader de Arduino

Una vez realizadas las conexiones como hemos indicado anteriormente conectaremos el programador ISP al PC y arrancaremos el IDE del Arduino, con el superusuario “root” en caso de utilizar el sistema operativo Linux, para la programación del bootloader (que es nuestro caso), para ello utilizaremos el comando Linux “gksu” que arranca aplicaciones como superusuario. A continuación mostramos como quedaría el acceso directo (o lanzador) del IDE del Arduino:
Programar el bootloader de Arduino
Si no abrimos el IDE de Arduino como superusuario root puede que muestre este error al intentar transferir el bootloader:
Programar el bootloader de Arduino
Con el texto:
Error al grabar la secuencia de inicio.
avrdude: error: could not find USB device "USBasp" with vid=0x16c0 pid=0x5dc.
Para Linux (que es nuestro caso) y Mac OS no es necesaria la instalación de drivers, para Windows es posible que requiera la instalación de drivers.
Puesto que el IDE de Arduino incorpora la herramienta para la programación del bootloader, simplemente le indicaremos qué placa es la que queremos programar, desde el menú "Herramientas"- "Tarjeta" - "Arduino Nano w/ATmega328" (en nuestro caso) :
Programar el bootloader de Arduino
Indicaremos también cual es el programador que estamos usando desde el menú "Herramientas" - "Programador" - "USBasp" (en nuestro caso):
Programar el bootloader de Arduino
Una vez seleccionada la tarjeta y el programador pulsaremos en el menú "Herramientas" - "Grabar Secuencia de Inicio":
Programar el bootloader de Arduino
Si los conectores y el programador son correctos el IDE de Arduino nos indicará que se está grabando la secuencia de inicio en la Tarjeta I/O:
Programar el bootloader de Arduino
Tras finalizar el proceso de transferencia del bootloader a Arduino, el IDE nos lo indicará:
Programar el bootloader de Arduino
Nota: puede que muestre algún warning, suelen ser normales, el IDE mostrará este texto tras finalizar el proceso de carga del bootloader:
Finalizada la grabación de la secuencia de inicio
avrdude: warning: cannot set sck period. please check for usbasp
firmware update.
Tras haber programado el Arduino Nano con su Bootloader, ya podemos desconectar el programador del PC y los cables del Arduino.
Por último, para comprobar que el bootloader se ha programado correctamente podemos simplemente conectar el Arduino a nuestro PC y descargarle cualquier programa, como por ejemplo el que hace parpadear el LED y ver que efectivamente parpadea correctamente. En el siguiente tutorial explicamos paso a paso cómo conectar un LED a Arduino y cómo hacerlo parpadear:

Artículos relacionados

 

Créditos

Artículo realizado íntegramente por Antonio RN de RS miembro del Proyecto AjpdSoft.

11/19/2012

Arduino UNO con Display LCD Keypad Shield y sensor temperatura

Conectar pantalla LCD a Arduino UNO e interactuar con ella, mostrar temperatura



Explicamos en este tutorial cómo conectar una pantalla LCD a Arduino UNO. Mostramos varios ejemplos de código para interacturar con los botones del shield LCD (keypad) de la pantalla LCD para movernos por los menús. Explicamos también cómo cambiar la luminosidad de la pantalla LCD (intensidad de la retroiluminación) desde el menú (con los keypad) y cómo conectar un sensor de temperatura y mostrarla en la pantalla LCD.



Cómo conectar display LCD Keypad Shield a Arduino UNO

En este tutorial explicaremos y mostraremos ejemplos para trabajar con una pantalla LCD (display LCD Keypad Shield) conectada a Arduino. Para ello necesitaremos una pantalla LCD (Display LCD Keypad Shield), en concreto usaremos un Arduino LCD Keypad Shield 16x2 HD44780 con un coste aproximado de 18 euros:
Cómo conectar display LCD Keypad Shield a Arduino UNO
Por supuesto necesitaremos un Arduino UNO, en el siguiente tutorial explicamos cómo adquirirlo y cómo conectarlo al PC para transferir el programa:
Conectaremos el LCD a Arduino como mostramos en la imagen:
Cómo conectar display LCD Keypad Shield a Arduino UNO
En el siguiente tutorial explicamos cómo descargar el software para realizar programas y enviarlos a Arduino, también explicamos cómo conectar Arduino a un PC para el envío de programas:

Programa Arduino para mostrar texto en display LCD y contador que se va incrementando

Una vez conectado el display LCD a Arduino y conectado Arduino al PC por el puerto USB, desde el IDE de desarrollo de Arduino pegaremos el siguiente programa:
/*
 Ejemplo de uso de display LCD 16x2.  Usando la librería LiquidCrystal
 library compatible con el driver de Hitachi HD44780 driver 
*/

// incluimos la libreria LiquidCrystal
#include 

// inicializamos la librería con los numeros pins del interfaz
// cada LCD puede llevar sus propios numeros
LiquidCrystal lcd(8, 13, 9, 4, 5, 6, 7);

void setup() {
  // establecemos el numero de columnas y filas del display 
  lcd.begin(16, 2);
  // enviamos el mensaje a mostrar en el display
  lcd.print("www.ajpdsoft.com");
}

void loop() {
  // enviamos la posicion del cursor al display
  // (nota: la linea 1 es la segunda fila, empieza a contar en 0
  lcd.setCursor(0, 1);
  // mostramos el numero de segundos desde el inicio del programa
  lcd.print(millis()/1000);
}
Programa Arduino para mostrar texto en display LCD y contador que se va incrementando
Comprobaremos la sintaxis pulsando en "Verificar":
Programa Arduino para mostrar texto en display LCD y contador que se va incrementando
Si todo es correcto pulsaremos en el botón "Cargar" para enviar el programa a Arduino:
Programa Arduino para mostrar texto en display LCD y contador que se va incrementando
Si todo es correcto el programa quedará transferido a la memoria de Arduino y se iniciará, mostrando el texto indicando en el display LCD (en nuestro caso "www.ajpdsoft.com") y un contador de segundos en la segunda línea:
Programa Arduino para mostrar texto en display LCD y contador que se va incrementando


Programa Arduino para mostrar texto en scroll en display LCD

Un ejemplo de programa Arduino para mostrar un texto en movimiento en un display LCD:
// include the library code:
#include 

// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(8, 13, 9, 4, 5, 6, 7);

void setup() {
  // set up the LCD's number of columns and rows: 
  lcd.begin(16, 2);
  // Print a message to the LCD.
  lcd.print("www.ajpdsoft.com");
  delay(1000);
}

void loop() {
  // scroll 13 positions (string length) to the left 
  // to move it offscreen left:
  for (int positionCounter = 0; positionCounter < 13; positionCounter++) {
    // scroll one position left:
    lcd.scrollDisplayLeft(); 
    // wait a bit:
    delay(150);
  }

  // scroll 29 positions (string length + display length) to the right
  // to move it offscreen right:
  for (int positionCounter = 0; positionCounter < 29; positionCounter++) {
    // scroll one position right:
    lcd.scrollDisplayRight(); 
    // wait a bit:
    delay(150);
  }
  
    // scroll 16 positions (display length + string length) to the left
    // to move it back to center:
  for (int positionCounter = 0; positionCounter < 16; positionCounter++) {
    // scroll one position left:
    lcd.scrollDisplayLeft(); 
    // wait a bit:
    delay(150);
  }
  
  // delay at the end of the full loop:
  delay(1000);
}


Programa Arduino para introducir texto en el LDC con las teclas de desplazamiento

Un ejemplo de programa Arduino para mostrar un texto en la primera línea de una pantalla LCD y en la segunda permite que el usuario introduzca un texto usando las teclas de desplazamiento del display LCD:
#include 

LiquidCrystal lcd(8, 13, 9, 4, 5, 6, 7);

int adc_key_val[5] = {50, 200, 400, 600, 800 };
int NUM_KEYS = 5;
int adc_key_in;
int key=-1;
int oldkey=-1;
boolean luzEncendida=true;
boolean cursorActivo=false;
unsigned long time;
int x=0;
char caracterActual = 'A';

void setup()
{
  lcd.clear(); 
  lcd.begin(16, 2);
  lcd.setCursor(0,0); 
  lcd.print("www.ajpdsoft.com");
  time = millis();
  //  pinMode(10, OUTPUT);
}

void loop()
{
  if (millis()-time > 10000) {  // Si han pasado mas de 10 segundos apagamos la luz
    pinMode(10, OUTPUT);
    digitalWrite(10, LOW);
    luzEncendida=false;
  }
  if (millis()-time > 5000) {  // Si han pasado mas de 5 segundos apagamos el cursor
    lcd.noBlink();
    cursorActivo=false;
  } 

  adc_key_in = analogRead(0);    // Leemos el valor de la pulsacion
  key = get_key(adc_key_in);    // Obtenemos el boton pulsado

  if (key != oldkey)   // if keypress is detected
  {
    delay(50);  // Espera para evitar los rebotes de las pulsaciones
    adc_key_in = analogRead(0);    // Leemos el valor de la pulsacion
    key = get_key(adc_key_in);    // Obtenemos el boton pulsado
    if (key != oldkey)    
    {
      time = millis();  // TODO: falta la comprobacion de si se ha desbordado el tiempo
      if (!luzEncendida) {  // Al pulsar cualquier tecla encendemos la pantalla
        pinMode(10, INPUT);
        luzEncendida=true;
      } 
      else {  // si la pantalla esta encendida seguimos funcionando normalmente
        lcd.setCursor(x, 1);
        oldkey = key;
        if (key >=0){  // Si se ha pulsado cualquier tecla
          lcd.blink();  // Mostramos el cursor parpadeando
          cursorActivo=true;
        }
        if (key == 0){  // Se ha pulsado la tecla derecha
          x++;
          if (x>15) x=15;
          caracterActual='A';
        }
        if (key == 1) {  // Se ha pulsado la tecla arriba
          caracterActual++;
          if (caracterActual > 'Z') caracterActual='Z';
          lcd.write(caracterActual);
        }
        if (key == 2) {  // Se ha pulsado la tecla abajo
          caracterActual--;
          if (caracterActual < 'A') caracterActual='A';
          lcd.write(caracterActual);
        }
        if (key == 3) {  // Se ha pulsado la tecla izquierda
          x--;
          if (x<0) x=0;
          caracterActual='A';
        }
        if (key == 4){  // Se ha pulsado la tecla de seleccion
        }
        lcd.setCursor(x, 1);
      }
    }
  }
  delay(100);
}

// Convertimos el valor leido en analogico en un numero de boton pulsado
int get_key(unsigned int input)
{
  int k;

  for (k = 0; k < NUM_KEYS; k++)
  {
    if (input < adc_key_val[k])
    {
      return k;
    }
  }

  if (k >= NUM_KEYS)k = -1;  // Error en la lectura
  return k;
}



Programa Arduino para mostrar menús y submenús en display LCD

Un ejemplo de programa Arduino para mostrar un menú y sus submenús correspondientes en una pantalla LCD:
#include 

LiquidCrystal lcd(8, 13, 9, 4, 5, 6, 7);

const int numeroDeMenus=5;
const int numeroMaximoDeSubmenus=4;

char tituloMenu[numeroDeMenus][16] = {
  "1  Menu 1    ",
  "2  Menu 2    ",               
  "3  Menu 3    ",
  "4  Menu 4    ",
  "5  Menu 5    " };
  
byte numeroDeSubmenus[numeroDeMenus] = {4,3,2,1,4};

char tituloSubmenu[numeroDeMenus][numeroMaximoDeSubmenus][16] = 
{
  "1.1 Submenu 1","1.2 Submenu 2","1.3 Submenu 3","1.4 Submenu 4",
  "2.1 Submenu 1","2.2 Submenu 2","2.3 Submenu 3","",
  "3.1 Submenu 1","3.2 Submenu 2","","",
  "4.1 Submenu 1","","","",
  "5.1 Submenu 1","5.2 Submenu 2","5.3 Submenu 3","5.4 Submenu 4"};

int adc_key_val[5] ={
  50, 200, 400, 600, 800 };
int NUM_KEYS = 5;
int adc_key_in;
int key=-1;
int oldkey=-1;
boolean luzEncendida=true;
boolean cursorActivo=false;
unsigned long time;
int x=0;
int y=0;

void setup()
{
  lcd.clear(); 
  lcd.begin(16, 2);
  lcd.setCursor(0,0); 
  lcd.print("www.ajpdsoft.com");
  lcd.setCursor(0,1); 
  lcd.print("Menu version 0.1");
  delay(5000);
  lcd.setCursor(0,0); 
  lcd.print("Muevase con las ");
  lcd.setCursor(0,1); 
  lcd.print("teclas direccion");
  delay(4000);
  lcd.clear();
  lcd.setCursor(0,0); 
  lcd.print("Menu principal");
  lcd.setCursor(0,1); 
  lcd.print(tituloMenu[x]);
  time = millis();
  //  pinMode(10, OUTPUT);
}

void loop()
{
  // Si han pasado mas de 10 segundos apagamos la luz
  if (millis()-time > 10000) {
    pinMode(10, OUTPUT);
    digitalWrite(10, LOW);
    luzEncendida=false;
  }
  // Si han pasado mas de 5 segundos apagamos el cursor
  if (millis()-time > 5000) {
    lcd.noBlink();
    cursorActivo=false;
  } 

  adc_key_in = analogRead(0);    // Leemos el valor de la pulsacion
  key = get_key(adc_key_in);    // Obtenemos el boton pulsado

  if (key != oldkey)   // if keypress is detected
  
    delay(50);  // Espera para evitar los rebotes de las pulsaciones
    adc_key_in = analogRead(0);    // Leemos el valor de la pulsacion
    key = get_key(adc_key_in);    // Obtenemos el boton pulsado
    if (key != oldkey)    
    {
      // TODO: falta la comprobacion de si se ha desbordado el tiempo
      time = millis();  
      if (!luzEncendida) {  // Al pulsar cualquier tecla encendemos la pantalla
        pinMode(10, INPUT);
        luzEncendida=true;
      } 
      else {  // si la pantalla esta encendida seguimos funcionando normalmente
        oldkey = key;
        if (key >=0){  // Si se ha pulsado cualquier tecla
          lcd.blink();  // Mostramos el cursor parpadeando
          cursorActivo=true;
        }
        if (key == 0){  // Se ha pulsado la tecla derecha
          x++;
          if (x>numeroDeMenus-1) x=numeroDeMenus-1;
          y=0;
        }
        if (key == 1) {  // Se ha pulsado la tecla arriba
          y++;
          if (y > numeroDeSubmenus[x]-1) y=numeroDeSubmenus[x]-1;
        }
        if (key == 2) {  // Se ha pulsado la tecla abajo
          y--;
          if (y < 0) y=0;
        }
        if (key == 3) {  // Se ha pulsado la tecla izquierda
          x--;
          if (x<0) x=0;
          y=0;
        }
        if (key == 4){  // Se ha pulsado la tecla de seleccion
        }
        lcd.clear();
        lcd.setCursor(0,0); 
        lcd.print(tituloMenu[x]);
        lcd.setCursor(0,1); 
        lcd.print(tituloSubmenu[x][y]);
      }
    }
  }
  delay(50);
}

// Convertimos el valor leido en analogico en un numero de boton pulsado
int get_key(unsigned int input)
{
  int k;

  for (k = 0; k < NUM_KEYS; k++)
  {
    if (input < adc_key_val[k])
    {
      return k;
    }
  }

  if (k >= NUM_KEYS)k = -1;  // Error en la lectura
  return k;
}

Programa Arduino para mostrar temperatura, opciones modificables, luminosidad en display LCD

Un ejemplo de programa Arduino para mostrar la temperatura de un habitáculo usando un sensor de temperatura (NTC o resistencia variable con la temperatura de coeficiente negativo) en una pantalla LCD Keypad Shield. El programa también permite modificar la luminosidad (intensidad de la retroiluminación) del display LCD, cambiar parámetros, guardar valores en memoria EEPROM, etc.
Para conectar el sensor de temperatura (NTC o resistencia variable con la temperatura de coeficiente negativo) se pueden seguir las intrucciones del siguiente tutorial:
Con la diferencia de que hemos conectado el sensor de temperatura a la entrada analógica 1 porque la 0 la usa el LCD.
El código del programa completo Arduino:

#include 
#include 
#define ThermistorPIN 1  // Analog Pin 1
#define NUM_KEYS 5

/*
  Circuito del dispaly LCD:
 * LCD RS pin to digital pin 8
 * LCD Enable pin to digital pin 9
 * LCD D4 pin to digital pin 4
 * LCD D5 pin to digital pin 5
 * LCD D6 pin to digital pin 6
 * LCD D7 pin to digital pin 7
 * LCD BL pin to digital pin 10
 * KEY pin to analogl pin 0
 *
 * Esquema del sensor de temperatura:
 *   [Ground] -- [10k-pad-resistor] -- | -- [10k thermistor] --[Vcc (5v)]
 *                                     |
 *                                Analog Pin 1
 */


LiquidCrystal lcd(8, 13, 9, 4, 5, 6, 7);

const int numeroDeMenus=6;

char tituloMenu[numeroDeMenus][16] = {
  "Fijar Temp.: ",
  "Fijar Tiempo:",               
  "Kp:          ",
  "Kd:          ",
  "Ki:          ",
  "Intensidad:  " };

int adc_key_val[5] ={
  50, 200, 400, 600, 800 };
int adc_key_in;
int key=-1;
int oldkey=-1;
boolean luzEncendida=true;
boolean cursorActivo=false;
boolean enMenu=false;
unsigned long time;
unsigned long tiempoPID;
byte numeroLecturas=0;
int x=0;
int signo=0;
char temp[10];
int lecturas[100];
byte numeroLectura=0;
//int lectura=0;
int maximo, minimo, diferencia, t1, t2, t3;
byte consigna=25;
byte tiempo=1;
byte kp=1;
byte kd=1;
byte ki=1;
byte intensidad=10;


void setup()
{
  cargarConfig();
  pinMode(10, OUTPUT);
  analogWrite(10,intensidad*25);
  Serial.begin(9600); 
  lcd.clear(); 
  lcd.begin(16, 2);
  lcd.setCursor(0,0); 
  lcd.print("www.ajpdsoft.com");
  lcd.setCursor(0,1); 
  lcd.print("C.Ventanas v1.0 ");
  delay(2000);
  //  lcd.setCursor(0,0); 
  //  lcd.print("Muevase con las ");
  //  lcd.setCursor(0,1); 
  //  lcd.print("teclas direccion");
  //  delay(4000);
  lcd.clear();
  lcd.setCursor(0,0); 
  lcd.print("Temperatura:    ");
  lcd.setCursor(0,1);
  int lectura=getTemp(1);
  sprintf(temp, "%3d%c%1d%cC", lectura/100, '.', lectura/10%10,223);
  lcd.print(temp);
  time = millis();
  tiempoPID = millis();
}

void loop()
{
  int lectura = getTemp(ThermistorPIN);
  lecturas[numeroLectura++] = lectura;
  if (millis()-time > 20000) {  // Si han pasado mas de 20 segundos apagamos la luz
    digitalWrite(10, LOW);
    luzEncendida=false;
  }
  if (millis()-time > 7000) {  // Si han pasado mas de 7 segundos salimos del menu
    if (enMenu) guardarConfig();
    enMenu = false;
    x=0;
    time = millis();
    //  }
    //  if (!enMenu) {
    lcd.clear();
    lcd.setCursor(0,0); 
    lcd.print("Temperatura:    ");
    lcd.setCursor(0,1);
    sprintf(temp, "%3d%c%1d%cC", lectura/100, '.', lectura/10%10,223);
    lcd.print(temp);
    //    Serial.print("Temperatura[");
    //    Serial.print(numeroLectura);
    //    Serial.print("]: "); 
    //    Serial.println(temp); 
  }
  if (millis()-time > 5000) {  // Si han pasado mas de 5 segundos apagamos el cursor
    lcd.noBlink();
    cursorActivo=false;
  } 

  adc_key_in = analogRead(0);    // Leemos el valor de la pulsacion
  key = get_key(adc_key_in);    // Obtenemos el boton pulsado

  if (key != oldkey)   // if keypress is detected
  {
    delay(50);  // Espera para evitar los rebotes de las pulsaciones
    adc_key_in = analogRead(0);    // Leemos el valor de la pulsacion
    key = get_key(adc_key_in);    // Obtenemos el boton pulsado
    if (key != oldkey)    
    {
      time = millis();  // TODO: falta la comprobacion de si se ha desbordado el tiempo
      if (!luzEncendida) {  // Al pulsar cualquier tecla encendemos la pantalla
        analogWrite(10,intensidad*25);
        luzEncendida=true;
      } 
      else {  // si la pantalla esta encendida seguimos funcionando normalmente
        oldkey = key;
        char accion = 0;
        if (key >=0){  // Si se ha pulsado cualquier tecla
          lcd.blink();  // Mostramos el cursor parpadeando
          cursorActivo=true;
        }
        if ((key == 0) && (enMenu)){  // Se ha pulsado la tecla derecha
          x++;
          if (x>numeroDeMenus-1) x=numeroDeMenus-1;
        }
        if ((key == 1) && (enMenu)) {  // Se ha pulsado la tecla arriba
          accion++;
        }
        if ((key == 2) && (enMenu)) {  // Se ha pulsado la tecla abajo
          accion = accion-1;
        }
        if ((key == 3) && (enMenu)) {  // Se ha pulsado la tecla izquierda
          x--;
          if (x<0) x = 0;
        }
        if (key == 4){  // Se ha pulsado la tecla de seleccion
        }
        enMenu = true;
        lcd.clear();
        lcd.setCursor(0,0); 
        lcd.print(tituloMenu[x]);
        lcd.setCursor(0,1); 
        switch (x) {
        case 0: // Estamos en fijar temperatura
          consigna += accion;
          lcd.print(consigna);
          lcd.print((char)223);
          lcd.print("C");
          break;
        case 1:  // Estamos en fijar tiempo
          tiempo += accion;
          lcd.print(tiempo);
          lcd.print("0 seg.");
          break;
        case 2:  // Estamos en Kp.
          kp += accion;
          lcd.print(kp);
          break;
        case 3:  // Estamos en Kd.
          kd += accion;
          lcd.print(kd);
          break;
        case 4:  // Estamos en Ki.
          ki += accion;
          lcd.print(ki);
          break;
        case 5:  // Estamos en Ki.
          intensidad += accion;
          if (intensidad > 254) intensidad = 0;
          if (intensidad > 10) intensidad = 10;
          lcd.print(intensidad);
          lcd.print("0%");
          analogWrite(10,intensidad*25);
          break;
        } 
      }
    }
  }
  if ((numeroLectura > 99) && (numeroLecturas < 2)) {
    long suma = 0;
    maximo = -10000;
    minimo = 10000;
    for (int i=0; i < 100; i++){
      suma = suma + lecturas[i];
      if (lecturas[i] > maximo) {
        maximo = lecturas[i];
      }
      if (lecturas[i] < minimo) {
        minimo = lecturas[i];
      }

      //      Serial.print("Temperatura[");
      //      Serial.print(i);
      //      Serial.print("]: "); 
      //      Serial.println(lecturas[i]); 
    }
    diferencia = maximo - minimo;
    suma = suma / 100;
    // Si la diferencia es superior a un grado 
    //es que ha habido un error en la lectura
    if (diferencia > 100) {  
      Serial.println("Lectura no valida");
      // TODO: Descartar lectura y repetir la medida
    } 
    else {
      numeroLecturas++;
      t3=t2;
      t2=t1;
      t1=suma;
    }
    Serial.print("Suma: "); 
    Serial.println(suma); 
/*    Serial.print("Media: "); 
    Serial.print(suma/100); 
    Serial.print(","); 
    Serial.println(suma/10%10); 
    Serial.print("Maximo: "); 
    Serial.print(maximo/100); 
    Serial.print(","); 
    Serial.print(maximo/10%10); 
    Serial.print(" - Minimo: "); 
    Serial.print(minimo/100); 
    Serial.print(","); 
    Serial.print(minimo/10%10); 
    Serial.print(" - Diferencia: "); 
    Serial.print(diferencia/100); 
    Serial.print(","); 
    Serial.println(diferencia/10%10); */
  }
  if (numeroLectura > 99) {
    // Cuando se termina de tomar las 100 
    //lecturas empezamos de nuevo por la primera
    numeroLectura = 0;
  }
  PID();
  delay(10);
  // Si se desborda millis() empieza otra 
  //vez por cero, ocurre cada 50 dias
  if (millis() < time){   
    time = millis();
  }
}

void PID(){
  // Si se desborda millis() empieza otra 
  // vez por cero, ocurre cada 50 dias
  if (millis() < tiempoPID){   
    tiempoPID = millis();
  }
  // Si no ha pasado todavía el timepo de ciclo del PID
  if (millis() < tiempoPID + (tiempo*10*1000)){  
    // entonces mantenemos la fuerza y esperamos mas tiempo
    // s = sActualPID;  
  } 
  else if (numeroLecturas >= 2){
    numeroLecturas--;
    Serial.print("Distancia a la consigna: ");
    Serial.print(t1-consigna*100);
    Serial.print(" - Velocidad: ");
    Serial.println(t1-t2);
    tiempoPID = millis();
  }

}

// Convertimos el valor leido en analogico 
// en un numero de boton pulsado
int get_key(unsigned int input)
{
  int k;

  for (k = 0; k < NUM_KEYS; k++)
  {
    if (input < adc_key_val[k])
    {
      return k;
    }
  }

  if (k >= NUM_KEYS)k = -1;  // Error en la lectura.
  return k;
}

int temperaturaFicticia = 2450;
int ptf= 0;
int getTemp(byte input)
{
  int  celsius = Thermistor(analogRead(input))*100; 
  return celsius;
  temperaturaFicticia += (random(7)-3-ptf);
  if (temperaturaFicticia > 2800) ptf = 1;
  if (temperaturaFicticia < 2000) ptf = 0;
  return temperaturaFicticia;
}

float pad = 10000;  // balance/pad resistor value, set this to
                   // the measured resistance of your pad resistor
// float thermr = 10000; // thermistor nominal resistance

float Thermistor(int RawADC) {
  long Resistance;  
  float Temp;  // Dual-Purpose variable to save space.

  Resistance=((1024 * pad / RawADC) - pad); 
  // Saving the Log(resistance) so not to calculate  it 4 times later
  Temp = log(Resistance); 
  Temp = 1 / (0.001129148 + (0.000234125 * Temp) + 
         (0.0000000876741 * Temp * Temp * Temp));
  Temp = Temp - 273.15;  // Convert Kelvin to Celsius                      

  return Temp;    // Devolver temperatura
}

boolean cargarConfig(){
  if ((EEPROM.read(0) == 27) && (EEPROM.read(1) == 28) && 
     (EEPROM.read(2) == 13) && (EEPROM.read(3) == 18)) {
    // Comprobamos que la eeprom tenga una 
    // configuracion valida con numeros concretos
    // solo cargamos el valor de la configuracion si los valores coinciden
    if (EEPROM.read(4) == EEPROM.read(5)) consigna = EEPROM.read(4);  
    if (EEPROM.read(6) == EEPROM.read(7)) tiempo = EEPROM.read(6);
    if (EEPROM.read(8) == EEPROM.read(9)) kp = EEPROM.read(8);
    if (EEPROM.read(10) == EEPROM.read(11)) kd = EEPROM.read(10);
    if (EEPROM.read(12) == EEPROM.read(13)) ki = EEPROM.read(12);
    if (EEPROM.read(14) == EEPROM.read(15)) intensidad = EEPROM.read(14);
    return true;
  }
  return false;
}

void guardarConfig(){
  EEPROM.write(0,27);
  EEPROM.write(1,28);
  EEPROM.write(2,13);
  EEPROM.write(3,18);
  // Ponemos nmeros concretos en el comienzo 
  // de la EEPROM para confirmar que tiene valores correctos.
  EEPROM.write(4,consigna);
  EEPROM.write(5,consigna);  // almacenamos los valores 2 veces
  EEPROM.write(6,tiempo);
  EEPROM.write(7,tiempo);  // almacenamos los valores 2 veces
  EEPROM.write(8,kp);
  EEPROM.write(9,kp);  // almacenamos los valores 2 veces
  EEPROM.write(10,kd);
  EEPROM.write(11,kd);  // almacenamos los valores 2 veces
  EEPROM.write(12,ki);
  EEPROM.write(13,ki);  // almacenamos los valores 2 veces
  EEPROM.write(14,intensidad);
  EEPROM.write(15,intensidad);  // almacenamos los valores 2 veces
}


Artículos relacionados


Créditos

Artículo realizado íntegramente por Alonsojpd miembro fundador del Proyecto AjpdSoft, con la inestimable colaboración de Antonio RN de RS.

10/18/2011

Realizar una conexión a Internet con la placa Arduino y un módulo GPRS GSM



Explicamos cómo realizar una conexión a Internet, a una página web por socket mediante Arduino UNO y un módulo GPRS/GSM. Mostramos todos los requisitos hardware y software para realizar este proyecto de prueba con Arduino. Indicamos cómo conectar dos Arduinos para enviar la salida serie de uno de ellos (el que lleva el módulo GPRS/GSM) a otro.




Requisitos para realizar conexión a Internet desde Arduino con GPRS

En la siguiente sección del siguiente artículo explicamos los requisitos hardware y software necesarios para realizar el envío de SMS con Arduino y un módulo GPRS, dichos requisitos son los mismos que para la conexión a Internet:
Básicamente necesitaremos un Módulo GPRS (en nuestro caso usamos un GPRS Sagem Quadband Module for Arduino), una Placa Arduino UNO y los requisitos software explicados en este otro artículo, donde también indicamos cómo conectar Arduino al PC paso a paso y cómo enviar programas desde el IDE de Arduino a la memoria Flash de la placa:


Cómo conectar el módulo GPRS a la placa Arduino UNO

En la siguiente sección del siguiente artículo explicamos paso a paso cómo conectar la antena externa al módulo GPRS y cómo conectar el módulo GPRS a la placa Arduino UNO:

Consideraciones importantes a tener en cuenta antes de enviar el programa a Arduino para usar el módulo GPRS

Hay que tener en cuenta que el módulo GPRS tiene "dos posiciones" para la conexión con Arduino:
1. Por un lado hay que indicarle al módulo GPRS cuándo está conectado al PC por el puerto USB (serie emulado), esto se hace colocando dos jumpers que incorpora en la parte superior de la siguiente forma:
Considereciones importantes a tener en cuenta antes de enviar el programa a Arduino para usar el módulo GPRS
Es muy importante tener esto en cuenta, cuando queramos enviar el programa a Arduino, los dos jumpers deben estar como se indica en la imagen anterior, si no es así el Upload (envío) del programa dará error.
El error que nos mostrará el IDE de desarrollo de Arduino si no hemos colocado los jumpers correctamente será:
avrdude: stk500_getsync(): not in sync: resp=0x00
avrdude: stk500_disable(): protocol error, expect=0x14, resp=0x51
2. Para probar el programa de conexión a Internet o cualquier otra tarea que hayamos programado con Arduino y el módulo GPRS deberemos desconectarlo del USB del PC y alimentarlo externamente. Además, deberemos cambiar los jumpers mencionados anteriormente a esta nueva posición:
Considereciones importantes a tener en cuenta antes de enviar el programa a Arduino para usar el módulo GPRS
Si no se hace esto, cuando desconectemos Arduino del PC y lo alimentemos externamente, el módulo GPRS no funcionará.

Programar Arduino UNO para realizar una conexión a Internet con el módulo GPRS

Para realizar una conexión a Internet con la placa Arduino UNO, insertaremos una tarjeta SIM en el módulo GPRS con la opción de datos activa, conectaremos el módulo GPRS a la placa Arduino, colocaremos los jumpers del módulo en su posición para conexión con PC y conectaremos Arduino UNO al PC por el puerto USB. Una vez realizados todos estos pasos (explicados anteriormente), abriremos el IDE de desarrollo de Arduino y escribiremos el siguiente programa:
/* 
 *  Conexion a Internet con modulo GPRS y Arduino
*/ 
  
int pinActivarGPRS = 2;  // pin para activar el módulo GPRS

//procedimiento para activar el módulo GPRS
void activarModuloGPRS()
{
  digitalWrite(pinActivarGPRS, HIGH);
  delay(2000);
  digitalWrite(pinActivarGPRS, LOW);
}

void setup()
{
  pinMode(pinActivarGPRS, OUTPUT);
  Serial.begin(19200); //velocidad de conexión con módulo GPRS
  activarModuloGPRS(); //activar el módulo GPRS
 
  delay(20000); //esperamos 20 segundos a que se active el módulo GPRS  

  Serial.println("AT&k3");  //activa el control de flujo RTS/CTS en el modem
  delay(1000);
  Serial.print("AT+KCNXCFG=0,"); //inicia la configuración para el GPRS
  Serial.print(34,BYTE);
  Serial.print("GPRS");  //tipo de conexión
  Serial.print(34,BYTE);
  Serial.print(",");
  Serial.print(34,BYTE);
  Serial.print("gprs-service.com");  //punto de acceso
  Serial.print(34,BYTE);
  Serial.print(",");
  Serial.print(34,BYTE);
  Serial.print("");  //usuario del operador
  Serial.print(34,BYTE);
  Serial.print(",");
  Serial.print(34,BYTE);
  Serial.print("1234");  //contraseña del operador, para Simyo "1234"
  Serial.print(34,BYTE);
  Serial.println();
  delay(1000);
  //establecer configuraciones de tiempos de espera, reintentos de conexion y demas
  Serial.println("AT+KCNXTIMER=0,60,2,70"); 
  delay(1000);
  Serial.println("AT+KCNXPROFILE=0");
  delay(1000);
  Serial.println("AT+CGATT=1");  //para conectarnos a la red movil del operador
  delay(1000);
  Serial.print("AT+KTCPCFG=0,0,");  //para indicar el host o IP al que nos conectaremos
  Serial.print(34,BYTE);
  Serial.print("www.ajpdsoft.com");
  Serial.print(34,BYTE);
  Serial.println(",80");  //puerto por el que se realizará la conexión
  delay(1000);
  Serial.println("AT+KTCPCNX=1"); //para iniciar un intercambio de datos TCP
  delay(7000);
  //para envio de datos a la conexion
  //el 18 indica la cantidad de datos que queremos enviar "GET / HTTP/1.0\r"
  Serial.println("AT+KTCPSND=1,18"); 
  delay(2000);
  Serial.println("GET / HTTP/1.0");
  Serial.print(10,BYTE); //salto de línea
  Serial.print(13,BYTE); //retorno de carro
  Serial.print("--EOF--Pattern--"); //fin de la cadena de envio de datos
  delay(2000);
  Serial.println("AT+KTCPRCV=1,807"); //activar recepcion de datos
  delay(1000);
  Serial.println("AT+KTCPCLOSE=1,1");  //cerrar la conexion
  delay(1000);   
}

void loop()
{ 
}
Como siempre, verificaremos el código pulsando en el botón "Verify" del IDE de desarrollo de Arduino:
Programar Arduino UNO para realizar una conexión a Internet con el módulo GPRS
Y lo enviaremos a la placa Arduino pulsando en "Upload":
Programar Arduino UNO para realizar una conexión a Internet con el módulo GPRS

Enviar salida serie de un Arduino a otro para comprobar resultado de la conexión a Internet

En este proyecto, para poder comprobar la placa Arduino con el módulo GPRS GSM realiza la conexión a Internet correctamente, deberemos conectar una segunda placa Arduino al primero como explicamos a continuación.
Por un lado conectaremos un cable del pin TX - 1 del Arduino sin el módulo GPRS GSM al jumper USB del módulo GPRS GSM como se muestra en la imagen y por otro lado conectaremos un segundo cable del pin GND del Arduino sin el módulo GPRS al ping GND del Arduino con el módulo:
1. Vista del Arduino con el módulo GPRS GSM:
Enviar salida serie de un Arduino a otro para comprobar resultado de la conexión a Internet
2. Vista del Arduino sin el módulo GPRS:
Enviar salida serie de un Arduino a otro para comprobar resultado de la conexión a Internet
3. Vista de los dos Arduinos conectados:
Enviar salida serie de un Arduino a otro para comprobar resultado de la conexión a Internet
Una vez conectados los dos Arduinos, conectaremos el segundo (el que no lleva el programa ni el módulo GPRS) al PC por el puerto USB, iniciaremos el IDE de Arduino, seleccionaremos el puerto desde el menú "Tools" - "Serial Port":
Enviar salida serie de un Arduino a otro para comprobar resultado de la conexión a Internet
Pulsaremos en el botón "Serial Monitor" y en la ventana que nos mostrará debemos seleccionar la misma velocidad que hayamos indicando en el programa para la conexión serie, en nuestro caso 19200 baud (si no hacemos esto puede que veamos caracteres raros en la pantalla):
Enviar salida serie de un Arduino a otro para comprobar resultado de la conexión a Internet
Ahora alimentaremos eléctricamente el Arduino con el módulo GPRS GSM, tras unos segundos, si la conexión de los dos Arduinos mediante los dos cables es correcta, iremos viendo la salida serie del primer Arduino en el PC y así podremos verificar y testear el resultado de la conexión a Internet:
Enviar salida serie de un Arduino a otro para comprobar resultado de la conexión a Internet
 

Artículos relacionados


Créditos

Artículo realizado íntegramente por Alonsojpd miembro fundador del Proyecto AjpdSoft, con la inestimable colaboración de Antonio RN de RS.

10/16/2011

Enviar SMS y hacer llamadas desde placa Arduino con módulo GPRS



Explicamos cómo conectar un módulo GPRS a una placa Arduino UNO para dotarla de conexión a la red móvil. Este módulo nos permitirá enviar SMS desde Arduino, hacer y recibir llamadas e incluso conectarnos a Internet. Explicamos todos los requisitos hardware necesarios para este proyecto hardware de ejemplo.



Requisitos para enviar SMS y hacer llamadas desde placa Arduino

En este proyecto hardware de ejemplo usaremos un módulo GPRS específico para Arduino, nos permitirá disponer de un módem GSM con tarjeta SIM de móvil, por lo que podremos realizar cualquier operación como si de un módem GSM se tratase (hacer llamadas, recibir llamadas, enviar SMS, recibir SMS, conectarnos a Internet, etc.) todo ello con comandos AT (Hayes). En el siguiente artículo explicamos estos comandos más en profundidad y cómo usar un módem GSM:
Lo explicado en el artículo anterior será válido para este, salvando las distancias obvias entre VB.Net y Arduino.
Indicamos a continuación los requisitos hardware para enviar SMS y hacer llamadas con nuestra placa Arduino de forma autónoma (sin necesidad de cables ni conexión al PC):
  • Módulo GPRS (unos 75 euros) , en nuestro caso hemos adquirido un GPRS Sagem Quadband Module for Arduino:
Requisitos para enviar SMS y hacer llamadas desde placa Arduino
Para la conexión a la red móvil del módulo GPRS necesitaremos una tarjeta SIM normal (como la de los móviles) activa y disponible para enviar SMS y hacer llamadas.
  • Placa Arduino UNO (unos 25 euros) :
Requisitos para enviar SMS y hacer llamadas desde placa Arduino
  • Como siempre, para cualquier proyecto con Arduino necesitaremos disponer de un cable USB de tipo A-B para conectar Arduino con el PC y necesitaremos el IDE de desarrollo y los drivers (si usamos Microsoft Windows 7, en Linux no son necesarios). En el siguiente artículo explicamos los primeros pasos para conectar Arduino con el PC:

Cómo conectar módulo GPRS a placa Arduino UNO

Prepararemos en primer lugar el módulo GPRS que cuando lo adquirimos incorpora una antena externa que hay que conectar. Por un lado el conector que va al microchip del módulo:
Cómo conectar módulo GPRS a placa Arduino UNO
Conectaremos el chip con la antena al módulo GPRS como se muestra en la imagen:
Cómo conectar módulo GPRS a placa Arduino UNO
Insertaremos también una tarjeta SIM activa, a ser posible sin PIN para evitar tener que enviárselo por comando AT (aunque se puede hacer):
Cómo conectar módulo GPRS a placa Arduino UNO
A continuación conectaremos el módulo GPRS a la placa Arduino, dicho módulo es específico para Arduino por lo que encajará en los pines correspondientes sin problema, con un poco de presión:
Cómo conectar módulo GPRS a placa Arduino UNO
El módulo GPRS quedará perfectamente anclado y conectado a la placa Arduino:
Cómo conectar módulo GPRS a placa Arduino UNO
Todo el hardware conectado (antena externa, módulo GPRS y placa Arduino):
Cómo conectar módulo GPRS a placa Arduino UNO

 

Considereciones importantes a tener en cuenta antes de enviar el programa a Arduino para usar el módulo GPRS

Hay que tener en cuenta que el módulo GPRS tiene "dos posiciones" para la conexión con Arduino:
1. Por un lado hay que indicarle al módulo GPRS cuándo está conectado al PC por el puerto USB (serie emulado), esto se hace colocando dos jumpers que incorpora en la parte superior de la siguiente forma:
Considereciones importantes a tener en cuenta antes de enviar el programa a Arduino para usar el módulo GPRS
Es muy importante tener esto en cuenta, cuando queramos enviar el programa a Arduino, los dos jumpers deben estar como se indica en la imagen anterior, si no es así el Upload (envío) del programa dará error.
El error que nos mostrará el IDE de desarrollo de Arduino si no hemos colocado los jumpers correctamente será:
avrdude: stk500_getsync(): not in sync: resp=0x00
avrdude: stk500_disable(): protocol error, expect=0x14, resp=0x51
2. Para probar el programa de envío de SMS, de llamadas o cualquier otra tarea que hayamos programado con Arduino y el módulo GPRS deberemos desconectarlo del USB del PC y alimentarlo externamente. Además, deberemos cambiar los jumpers mencionados anteriormente a esta nueva posición:
Considereciones importantes a tener en cuenta antes de enviar el programa a Arduino para usar el módulo GPRS

 

Programar Arduino para enviar SMS a móvil

A continuación mostramos el programa para enviar un SMS desde Arduino usando un módulo GPRS, básicamente usa comandos AT para realizar el proceso, como si de un módem GSM se tratase:
/*
 *  Programa para enviar un SMS usando un módulo GPRS
    con placa Arduino por AjpdSoft
 */

int pinLED = 13;
int pinActivarGPRS = 2;  // pin para activar el módulo GPRS

int numeroSMSEnviar = 1; // numero de SMS a enviar
int contador = 0; //para solo repetir una vez el loop

//procedimiento para activar el módulo GPRS
void activarModuloGPRS()
{
  digitalWrite(pinActivarGPRS, HIGH);
  delay(2000);
  digitalWrite(pinActivarGPRS, LOW);
}

void setup()
{
  pinMode(pinLED, OUTPUT);
  pinMode(pinActivarGPRS, OUTPUT);

  Serial.begin(19200); //velocidad de conexión con módulo GPRS
    
  activarModuloGPRS(); //activar el módulo GPRS
  
  delay(20000); //esperamos 20 segundos a que se active el módulo GPRS
  
  Serial.println("AT+CMGF=1"); //activamos el modo SMS
}

void loop()
{
  while (contador < numeroSMSEnviar)
  {
    delay(1500);
    Serial.print("AT+CMGS="); // comando AT para enviar SMS
    Serial.print(34, BYTE);   // enviar caracter "
    Serial.print("numero_movil"); // numero de movil receptor del SMS
    Serial.println(34, BYTE);  //  enviar caracter "
    delay(1500); 
    Serial.print("Envio SMS desde Arduino AjpdSoft"); //texto del SMS
    delay(500);
    Serial.print(0x1A,BYTE); // final del SMS, comando 1A (hex)
       
    delay(10000);        

    contador++;    
  }

  if (contador == numeroSMSEnviar){
    Serial.println("AT*PSCPOF");  // desactivar el módulo GPRS
    contador++;
  }
}
Verificaremos la sintaxis del programa, como siempre, pulsando en el botón "Verify" del IDE de Arduino, si todo es correcto nos lo indicará con el mensaje "Done compiling":
Programar Arduino para enviar SMS a móvil
Recordamos que para enviar el programa a Arduino necesitaremos colocar los jumpers del módulo GPRS como indicamos aquí. Una vez colocados los jumpers en su posición correcta pulsaremos en botón "Upload" del IDE de desarrollo de Arduino para enviar el programa, si todo es correcto y el programa ha sido enviado a la memoria Flash de Arduino nos lo indicará con el mensaje "Done uploading":
Programar Arduino para enviar SMS a móvil
Para probar el programa y verificar que envía el SMS correctamente al número de móvil indicado habrá que desconectar Arduino del puerto USB, cambiar los jumpers como indicamos aquí y alimentar Arduino con un adaptador como mostramos en la imagen:
Programar Arduino para enviar SMS a móvil
Una vez alimentado Arduino se iniciará el programa y, tras unos 20 segundos (el tiempo de espera que hemos programado), nos llegará el SMS al número de móvil indicado en el programa:
Programar Arduino para enviar SMS a móvil

Programar Arduino para hacer llamadas a móvil

Al igual que hemos explicado cómo enviar SMS con Arduino y el módulo GPRS, mostramos ahora el código para hacer una llamada perdida desde Arduino a un móvil:
/*
 *  Programa para realizar una llamada perdida a un movil
    usando un modulo GPRS con placa Arduino por AjpdSoft
 */

int pinLED = 13;
int pinActivarGPRS = 2;  // pin para activar el módulo GPRS

int timesToSend = 1;  // numero de llamadas a realizar
int contador = 0;  //para solo repetir una vez el loop

void switchModule()
{
  digitalWrite(pinActivarGPRS, HIGH);
  delay(2000);
  digitalWrite(pinActivarGPRS, LOW);
}

void setup()
{
  pinMode(pinLED, OUTPUT);
  pinMode(pinActivarGPRS, OUTPUT);

  Serial.begin(19200);   //velocidad de conexión con módulo GPRS
    
  switchModule();   //activamos el modo SMS
 
  delay(20000);  //esperamos 20 segundos a que se active el módulo GPRS                      
  
   Serial.println("AT+CMGF=1");      // set the SMS mode to text 
}

void loop()
{
  while (contador < timesToSend)
  {
    delay(1500);
    Serial.println("ATD686073762;"); //numero al que realizaremos la llamada
    delay(12000); 
    Serial.println("ATH"); //colgaremos y finalizaremos la llamada
       
    delay(5000);        

    contador++;    
  }

  if (contador == timesToSend)
  {
    Serial.println("AT*PSCPOF");    // desactivar el módulo GPRS
    contador++;
  }
}
Realizando las mismas operaciones que hemos indicado para enviar el programa y para probarlo en el caso del SMS, si todo es correcto, Arduino realizará una llamada perdida al número de móvil indicado:
Programar Arduino para hacer llamadas a móvil

 

Conclusión sobre el módulo GPRS y Arduino

Con estas opciones probadas de envío de SMS y llamada perdida y todas las posibles gracias al módem GSM (módulo GPRS) y los comandos AT, podremos dotar a nuestro proyecto hardware con Arduino de una potente herramienta para numerosas funcionalidades: por ejemplo, si desarrollamos una estación meteorológica podremos avisar por SMS a uno o varios números de móvil cuando se den unas determinadas condiciones (temperatura más baja de un valor preestablecido, etc.). Podremos conectarnos, desde Arduino, a cualquier página web y enviar parámetros, podremos incluso hacer una llamada perdida a un móvil cuando se produzca un determinado evento (así ahorramos el coste del SMS), podremos navegar a una URL y obtener determinado código HTML.
Como hemos demostrado se trata de un módulo muy sencillo de conectar y de programar. De hecho hemos desarrollado este proyecto hardware de uso de módulo GPRS sin necesidad de conocimientos en electrónica ni sistemas.
Sin duda Arduino se está convirtiendo en una herramienta muy útil, al alcance de cualquiera por su bajo precio y con una infinidad de funcionalidades, con la gran ventaja de acercar el hardware conectado al PC para usuarios sin apenas conocimientos en electrónica y sistemas.

 

Artículos relacionados


Créditos

Artículo realizado íntegramente por Alonsojpd miembro fundador del Proyecto AjpdSoft, con la inestimable colaboración de Antonio RN de RS.