viernes, 30 de noviembre de 2012

Detector de obstáculos mediante arduino y el hc-sr04

Detector de obstáculos mediante arduino y el hc-sr04
xsetaseta@gmail.com

Ayer me llegó un hc-sr04, detector de obstáculos mediante ultrasonidos. Se puede encontrar por un precio entre 2€ y 6€.
En este montaje pretendo realizar un detector de obstáculos que produzca un sonido dependiendo la distancia.
El montaje se realiza mediante el buen arduino y el detector hc-sr04, ademas de  un altavoz  piezoelectrico.
Su utilización práctica puede ser extensa, pero la primera que me viene a la mente es de ayuda para aparcar un coche.


hc-sr04
Voltaje: 5VDC
  • Corriente en reposo: < 2 mA
  • Salida: High 5V/Low 0V
  • Angulo: < 15º
  • Distancia: 2 a 450 cm
  • Resolución: 0,3 cm
Pins de conexión:
  • VCC
  • Trig (Disparo del ultrasonido)
  • Echo (Recepción del ultrasonido)
  • GND

La formula para calcular la distancia es:
Distancia = {(Tiempo entre Trig y el Echo) * (V.Sonido 340 m/s)}/2
El montaje es el siguiente:

La asignación de los pin de arduino que se conectan al hc-sr04 se pueden cambiar a gusto de cada uno.
En mi montaje la conexión es la siguiente:

ARDUINO Digital
HC-SR04
GND
GND
5V
Vcc
9
Trig
8
Echo

En este primer montaje solo realizamos el detector que manda la distancia hasta el obstaculo al ordenador mediante la conexion usb.
// Ultrasonic - Library for HR-SC04 Ultrasonic Ranging Module.
// SETA43
// xsetaseta@gmail.com

#include <Ultrasonic.h>

Ultrasonic ultrasonic(9,8); // (Trig PIN,Echo PIN)

int sonar; //Declaramos la variable sonar

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

void loop()
{
 
  sonar = ultrasonic.Ranging(CM); //Leemos la distancia del sonar
  
  Serial.print(sonar); // CM or INC
  Serial.println(" cm" );
  delay(100);
}
Programa que utiliza la librería Ultrasonic.
En la versión de esta librería que he utilizado, está colocada para que solo mida hasta 50cm.
Para medir hasta 5m debes modificar el archivo de la librería Ultrasonic.ccp.
Cambiar:
Time_out=3000;  // 30ms 5 metros // 3ms 50cm

// SETA43
// xsetaseta@gmail.com
//29-11-2012


#define ECHOPIN 8       // Pin to receive echo pulse (Echo PIN)
#define TRIGPIN 9        // Pin to send trigger pulse (Trig PIN)


unsigned int tiempo,distancia;


void setup() {
  Serial.begin(9600);
  pinMode(ECHOPIN, INPUT);
  pinMode(TRIGPIN, OUTPUT);
}
  
void loop()
{
 
  digitalWrite(TRIGPIN, LOW);
  delayMicroseconds(2);
  digitalWrite(TRIGPIN, HIGH);
  delayMicroseconds(10);
  digitalWrite(TRIGPIN, LOW);
  // Calcula la distancia midiendo el tiemp que est el pin ECHOPIN en alto.
  tiempo = pulseIn(ECHOPIN, HIGH);
  // La velocidad del sonido es 340 m/s o 29 microsegundos por centimetro.
  distancia= tiempo/58;
  //manda la distancia al puerto serie.
  Serial.print(distancia);
  Serial.println(" cm");
  delay(200);
  
}
En este caso no utiliza ninguna librería, emplea el comando pulseIn.


Consola del arduino recibiendo datos de distancia.
En el caso que vemos en la consola, hemos utilizado float para ver decimales en los centímetros.



Una vez probado el funcionamiento del circuito, nos disponemos a poner el altavoz  piezoelectrico.
Al utilizar un altavoz  piezoelectrico no hace falta colocar resistencia debido a su alta impedancia.
Si se utiliza un altavoz de 8 ohmios se debería utilizar una resistencia en serie de 330 ohmios.

La conexión del altavoz se realiza al pin Digital 7, y a la masa GND.
También se puede variar el pin de conexión en el programa.

// SETA43
// xsetaseta@gmail.com
//29-11-2012


#define ECHOPIN 8       // Pin to receive echo pulse (Echo PIN)
#define TRIGPIN 9        // Pin to send trigger pulse (Trig PIN)

#define PINTONO 7


unsigned int tiempo,distancia;


void setup() {
  Serial.begin(9600);
  pinMode(ECHOPIN, INPUT);
  pinMode(TRIGPIN, OUTPUT);
  pinMode(PINTONO, OUTPUT);
}
  
void loop()
{
 
  digitalWrite(TRIGPIN, LOW);
  delayMicroseconds(2);
  digitalWrite(TRIGPIN, HIGH);
  delayMicroseconds(10);
  digitalWrite(TRIGPIN, LOW);
  // Calcula la distancia midiendo el tiemp que est el pin ECHOPIN en alto.
  tiempo = pulseIn(ECHOPIN, HIGH);
  // La velocidad del sonido es 340 m/s o 29 microsegundos por centimetro.
  distancia= tiempo/58;
  //manda la distancia al puerto serie.
  Serial.print(distancia);
  Serial.println(" cm");
  tone(PINTONO,2000);
  delay(200);
  //Si la distancia es menor que 10cm, produce un tono continuo
  if (distancia>10)noTone(PINTONO);
  delay(distancia*3);
  
}

Vídeo del montaje funcionando:  http://youtu.be/Efmkj8W7ai
Bibliografía:
Un saludo.
JUAN GALAZ

lunes, 26 de noviembre de 2012

Viejos montajes - Spectrum 16 entradas/salidas

Página principal


Viejos montajes - Spectrum 16 entradas/salidas

Abriendo mis cajones he encontrado un viejo montaje realizado para el Spectrum.
Eran los años  80, el Spectrum era el ordenador mas vendió en España, simple y barato, basado en el procesador Z80.
El  Z80 era un procesador de 8 bit, que estaba montado en muchos de los ordenadores de aquella época, Spectum, Amstrad, MSX, etc..
Por aquella época empece hacer mis pinitos en ordenadores, programación en Basic, y algún montaje que otro.
Investigando para poder controlar aparatos mediante el ordenador, decidí comprar un Z80-PIO.
El Z80-PIO era un integrado de 16 entrada/salidas y circuitos de control. Podían programarse las 16 E/S a gusto del programador.
La programación del Z80-PIO se realizaba mediante el Basic de Spectrum.
Me puse manos a la obra y realice el montaje que a continuación muestro.



Un saludo.
Juan Galaz