Mostrando las entradas con la etiqueta librerías. Mostrar todas las entradas
Mostrando las entradas con la etiqueta librerías. Mostrar todas las entradas

domingo, 16 de agosto de 2015

¿Sonar?

Bueno, luego de hacer las publicaciones del medidor de distancia por ultrasonido, del servo y de la pantalla, se me ocurrió realizar un radar. En el título lo puse entre signos de pregunta, porque no sé hasta que punto es factible realizarlo, pero si es necesario lo vamos a realizar en 2 o 3 publicaciones.

No es un proyecto propiamente dicho porque no va a tener utilidad. Quizá se pregunten ¿porqué?, bueno la razón o razones son sencillas:

1) Tiene un alcance ridículamente limitado (en las publicación del ultrasonido pude ver que tenía un máximo de 2 metros aproximadamente)

2) Los tiempos van a ser cruciales, por lo que parecería que no se va a poder mostrar en tiempo real el objeto.

Pero a pesar de esas cosas voy a desarrollarlo por "amor al arte" y ver que sale, quizá se pueda conseguir algo interesante.

Entonces, para empezar, voy a reciclar código (como no podía ser de otra forma) de la publicación del servo, de la pantalla y del ultrasonido.

La idea sería mostrar en la pantalla los puntos que se consideran que bloqueen la "vista" del ultrasonido.

Sin más, les dejo el código:


//pantalla
#include <Adafruit_GFX.h>                                    // Core graphics library
#include "SWTFT.h"                                           // Hardware-specific library
//algunos colores
#define negro     0x0000
#define azul      0x001F
#define rojo      0xF800
#define verde     0x07E0
#define cyan      0x07FF
#define magenta   0xF81F
#define amarillo  0xFFE0
#define blanco    0xFFFF
//de la pantalla
SWTFT tft;

//para el touch
#include <stdint.h>
#include "TouchScreen.h"
//declaraciones para el touch
#define YP A1                                                // must be an analog pin, use "An" notation!
#define XM A2                                                // must be an analog pin, use "An" notation!
#define YM 7                                                 // can be a digital pin
#define XP 6                                                 // can be a digital pin

#define MINPRESSURE 10
#define MAXPRESSURE 1000

TouchScreen ts = TouchScreen(XP, YP, XM, YM, 300);

//servo
#include <SoftwareServo.h>
SoftwareServo servo1;

//ultrasonido
#define trigPin 32
#define echoPin 34

int x = 0, y = 0, x1 = 0, y1 = 0, check = 1;
long distancia;

void setup() {
  servo1.attach(30);
  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);
  tft.reset();
  tft.begin();
  tft.fillScreen(negro);
  tft.setRotation(3);
  tft.fillCircle(50, 50, 10, blanco);
  Serial.begin(9800);
}

void loop() {
  tft.fillScreen(negro);
  for (int val = 0; val <= 180; val++)
  {
    servo1.write(val);
    ultrasonido();                                                                      //obtenemos la distancia hasta el objeto
    tft.fillCircle((160-(distancia*cos(val))), (240-((distancia*sin(val))/2)), 2, blanco);  //ubicamos el cursor en el medio abajo 
    SoftwareServo::refresh();                                                           //y situamos el punto donde esté el objeto
  }
  tft.fillScreen(negro);
  for (int val = 180; val >= 0; val--)
  {
    servo1.write(val);
    ultrasonido();                                                                      //obtenemos la distancia hasta el objeto
    tft.fillCircle((160-(distancia*cos(val))), (240-((distancia*sin(val))/2)), 2, blanco);  //ubicamos el cursor en el medio abajo
    SoftwareServo::refresh();                                                           //y situamos el punto donde esté el objeto
  }
}

void ultrasonido() {

  long duracion;
a:;
  digitalWrite(trigPin, LOW);
  delayMicroseconds(5); 
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(15);
  digitalWrite(trigPin, LOW);
  duracion = pulseIn(echoPin, HIGH);
  SoftwareServo::refresh();
  distancia = (duracion/2) / 29.1;
  if (distancia > 450)
  {
    goto a;                                                                              //si el objeto está muy lejos volvemos a
  }                                                                                      //buscar el valor
  Serial.println(distancia);
}


jueves, 13 de agosto de 2015

Servos

Hola, hoy quería mostrarles lo sencillo que resulta manejar un servo con arduino.

Antes de comenzar, voy a hacer una breve explicación de qué es un servo o servomotor de modelismo. Un servo es un dispositivo electromecánico que tiene la capacidad de ir y mantenerse en la posición que se le diga, recibe pulso periódico pwm, que varía de 1mS a 2mS, como muestra la imágen.


Bueno, ahora que saben más o menos qué es y como funciona, vamos al programa.

En la parte de ejemplos, en el ide de arduino, hay una opción que dice "servo", ahí se van a encontrar con 2 ejemplos "knob" y "sweep", si bien estos ejemplos sirven, creo que solo tienen una cantidad de pines limitados (9 y 10), por lo que no se pueden poner más que 2 servos (o al menos eso entendí). Por eso, buscando un poquito me topé con esta otra librería que parece que podría aceptar como salida cualquier pin, soporte o no salidas pwm.

El siguiente códgo lo saqué de este sitio y lo único que hice fue traducir los comentarios.

#include <SoftwareServo.h> 

SoftwareServo myservo;  // crea el objeto servo, para controlar el servo

int potpin = 0;  // pin analógico para conectar el potenciómetro
int val;    // variable que lee el valor analógico

void setup() 
{ 
  myservo.attach(2);  // vincual el servo al pin 2 void loop() 
{ 
  val = analogRead(potpin);            // lee el valor del pote
  val = map(val, 0, 1023, 0, 179);     // re-escala el valor del pote a 0 - 180
  myservo.write(val);                  // pone el servo en el ángulo escalado del pote
  delay(15);                           // le da tiempo al servo para llegar

  SoftwareServo::refresh();
} 



Bueno, el código parece ser simple, por lo que pude leer, la línea "SoftwareServo::refresh();" tiene que estar cada 50mS o menos, para que el servo funcione correctamente, por lo que eso podría llegar a ser un problema para programas largos, por lo que recomiendo (dependiendo del programa) agregar el siguiente código:


tiempo = micros();
colocar el código acá
Serial.print((micros() - tiempo));


Eso lo que va a hacer es calcular de forma casi precisa cuantos micro segundos pasaron mientras el código se estaba ejecutando, probablemente tenga un error, pero no creo que llegue al mS. En caso de que se superen los 50mS con el código, lo único que hay que hacer es colocar periódicamente "SoftwareServo::refresh();" y ya se soluciona (obviamente siempre teniendo en cuenta que el tiempo sin poner ese fragmento de código no supere los 50mS).

Descargas:

Librería del servo:

https://mega.co.nz/#!blhhhCpS!MpJYJ44tsdfn8ZwFCpdu7anjrVUms-0BXTSjYwX5rhY

domingo, 26 de julio de 2015

módulo NRF24L01

En esta ocación voy a demostrar como se usan los módulos NRF24L01.




Se alimenta con 3,3V (es algo a destacar) pero tolera los 5V de un arduino como señal. Utiliza la interfaz "SPI" para comunicarse y tienen un bajo consumo (se consiguen los NRF24L01+ que tienen significativamente más potencia) que para trabajos de domótica son ideales, además de las librerías (que vienen con algunos ejemplos) les voy a dejar un programa mio que sirva para "chatear" entre 2 computadoras inalámbricamente a través del puerto serie que ofrece el ide de arduino. 

La librería que uso es la MIRF.

El chat es un programa simple, está pensado para comunicar un arduino nano y un mega

También les dejo unos programas para mandar y recibir datos fijos, además del chat en un archivo comprimido.

La idea es que descomenten las partes del código necesarios para el arduino mega o el nano

/*
  Este programa sirve para transmitir y recibir mensajes entre
  2 arduinos, el ejemplo este sirve para un arduino mega a un
  arduino nano. Descomentar según sea el caso.
  V2.5
*/

#include <SPI.h>
#include <Mirf.h>
#include <nRF24L01.h>
#include <MirfHardwareSpiDriver.h>

int incomingByte;
byte mensaje[33];

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

/*
  Mirf.cePin = 48;                          //para arduino mega
  Mirf.csnPin = 49;
*/

/*
  Mirf.cePin = 10;                          //para arduino nano
  Mirf.csnPin = 9;
*/

  Mirf.spi = &MirfHardwareSpi;
  Mirf.init();
  
/*
  Mirf.setRADDR((byte *)"mega");            //para arduino mega
  Mirf.setTADDR((byte *)"nano");
*/

/*
  Mirf.setRADDR((byte *)"nano");            //para arduino nano
  Mirf.setTADDR((byte *)"mega");
*/

  Mirf.payload = 1;
  Mirf.config();
}

void loop(){
  
  if (Serial.available() > 0)               //emisor 
  {
    Serial.print("yo -> ");
    char mensaje_letra;
    while (Serial.available())
    {
      incomingByte = Serial.read();
      mensaje_letra = incomingByte;
      Serial.print(mensaje_letra);
      Mirf.send((byte *)&incomingByte);
      while(Mirf.isSending());
      delay(3);
    }
    Serial.println(" ");
  }
  
  if(Mirf.dataReady())                      //receptor
  {
    Serial.print("el -> ");
    char mensaje_letra;
    int i = 0;
    byte c;
    while (Mirf.dataReady())
    {
      Mirf.getData(&c);
      mensaje[i] = c;
      mensaje_letra = mensaje[i];
      Serial.print(mensaje_letra);
      i++;
      delay(4);
    }
    i = 0;
    Serial.println(" ");
  }
}





Descargas:


Mirf:




Ejemplos: