Generador ultrasonidos para perros

En esta práctica vamos a proceder , paso a paso , a crear un sistema que, creciendopastor aleman poco a poco, va a generar un sonido de ultrasonidos, con frecuencia, tiempo y algoritmo de escucha, configurable al entorno particular ( circunstancias de cada vivienda ).

Debemos de comentar que no se trata de castigar a ningún animal, sino educarle para que, cuando tenemos una situación insostenible de ladridos, eduquemos al perro para que no ladre a determinadas horas. Lo ideal es hablar con el propietario, pero en este mundo de Dios tenemos una variedad de criaturas “muy variadas”

Creamos el oscilador dentro de arduino. Lo primero es crear un sonido audible, luego lo modificaremos para que sea de ultrasonidos. Hemos utilizado un buzzer a la salida 13 . El programa que tenemos que poner para ello es:

int ledPin = 13; // select the pin for the LED

void setup ()
{
pinMode (ledPin, OUTPUT);

}

void loop()

{
digitalWrite(ledPin, HIGH);
delayMicroseconds(125);
digitalWrite(ledPin, LOW);
delayMicroseconds(125);
}

Lo único que creamos es un lazo que pone el ledPin alto y bajo cada 125 microsegundos, lo que es equivalente a 4 KHz. Esto sería interminable y por ello, el primer objetivo es crear una interrupción temporal, de forma que se pare pasados 10 segundos.

Creación del tiempo de trabajo. Lo podemos hacer de dos formas. Con un loop temporal de forma que se añada un contador o bien con alguna librería que maneje tiempos. En este caso vamos a optar por contadores anidados, de forma que cada vez que se ejecute un ciclo , se ponga suba el contador. Cuando llegue a ciertas unidades , se desactiva el ciclo. Añadimos lo siguiente

int contador = 0; // Creamos el contador master

{
if (contador < 30000)
{
digitalWrite(ledPin, HIGH);
delayMicroseconds(125);
digitalWrite(ledPin, LOW);
delayMicroseconds(125);
contador = contador + 1;
}
}

Elejimos 30000 como unidad de reloj, que da unos 7 segundos ( dependiendo de la frecuencia de cada reloj ) Esto no es muy importante por el momento. La rutina nos dice que si el contado es menor de ese valor, se ejecuta un ciclo. cuando ha terminado, se incrementa con contador = contador + 1;

Sistema para detectar el sonido del ladrido .

sensor-sonido-ky-038Vamos a utilizar un sensor típico de arduino que nos genera una señal analógica variable ( según la potencia del sonido que reciba ). En un primer paso, cuando detecte un umbral determinado, el sistema dará orden para que se genere el sonido. Hemos variado un poco el contador, cambiando éste por una sentencia for. Es lo mismo pero el if creaba problemas en la rutina interna. Nos va queda como:

void loop() {
sensorValue = analogRead (sensorPin);
if ( sensorValue > 30 )

{ for (contador = 0; contador < 30000; contador ++)
{
if (contador < 30000)  {
digitalWrite(ledPin, HIGH);
delayMicroseconds(125);
digitalWrite(ledPin, LOW);
delayMicroseconds(125);
}}}}

La sentencia for nos dice , primero pone el contador a 0, luego comprueba si la condicion se cumple ( en este caso decimos que el contador sea inferior a 30000 ) y para terminar, antes de salir del for, incrementa en una unidad el contador con contador ++

4º Detectar un número de ladridos para activar el sistema. Ahora viene algo con un poco mas complejidad. Tenemos que hacer que se active cuando el sensor detecte 3 o 4 ladridos. Los ladridos son pulsos de cierta duración y cierta intensidad, separados en el tiempo. Para un pastor alemán, suelen ser pausados ( a mas grandes mas pausados son los ladridos ). Se puede empezar por dos ladridos tomando en cuenta que tiene que aparecer un tono alto, descanso, tono alto y descanso. Vamos a posponer esto ahora para pasar a crear el ultrasonido. Ver punto 6

Frecuencia de trabajo. Los perros suelen tener una ancho de banda que puede llegar a 40 Khz. Vamos a crearlo para 30.000 Hercios, por lo cual, la duración del ancho del pulso es 1/30000  entre dos  , lo que da unos 17 microsegundos.

Mando para activar uno varios canales. En la actividad que ya se hizo en electrónica sobre control con mando a distancia ,  tenemos este mando que nos va a permitir dar un paso adelante para comprobar si el sistema funciona o no. Para qué liarnos con el punto 4 si es el mas complejo de todos, y comprobamos el el perro pasa de nuestro invento ?. Buenos, pues utilizaremos el programa que adjunto aquí y que detallo mas abajo

int ledPin = 13; // select the pin for the LED
int mando = 8; // Lee el canal D0 del mando

int contador = 0; // Creamos el contador interno
int contador2 = 0; // Creamos el contador master
void setup ()
{
pinMode (ledPin, OUTPUT);
pinMode (mando, INPUT) ;
for (int i = 7 ; i < 12 ; i++)
pinMode(i, INPUT) ;
Serial.begin (9600);
}

void loop() {

if (digitalRead(7) ) // Si hay señal de radio válida
{ Serial.print(“Nos llega un valor. \t”); // se imprime Nos llega un valor
if (digitalRead(8)) // leemos el puerto 8 a ver si llega señal

{for (contador2 = 0; contador2 < 2; contador2 ++)
if (contador2 < 2){
for (contador = 0; contador < 30000; contador ++)
{
if (contador < 30000){
digitalWrite(ledPin, HIGH);
delayMicroseconds(125); // para 4000 hercios es 125 microsegundos. Para 30000, sobre 17
digitalWrite(ledPin, LOW);
delayMicroseconds(125);
}} }
Serial.print( “Aquí termina el sonido”); // Se imprime, Se ha pulsado …
}

if (digitalRead(9)) // Esto es para otro canal
Serial.print( “Se ha activado el Botón B”);
if (digitalRead(10)) // Se repite para el 10
{
Serial.print( “Ahora se ha pulsado el Botón C.”);
digitalWrite (12, ! digitalRead(12)) ; // Sacamos por el puerto 12 el valor de 12
delay (500) ; // esperamos 0.5 segundos
}
if (digitalRead(11))
{
Serial.print( “Se ha pulsado el botón D”);
digitalWrite (13, ! digitalRead(13)) ; // se activa la salida 13
delay (500) ; // se espera 0,5 segundos
}
Serial.println(“\t”); // Imprime un tabulador
}

}

7º Lo mas fácil pero con poca información. Se trata de buscar un altavoz piezoeléctrico de alta potencia con las características. Hay que tener en cuenta que estos dispositivos tienen una alta impedancia capacitiva y no pueden usarse como altavoces normales. Por otro lado, la manera de trabajar es por tensión ( aplicar tensión variable en sus bornes ). En nuestro caso, vamos a poner un 2N3055 con carga resistiva y el altavoz puesto entre colector y emisor. Cuando el transistor trabaje en modo conmutación, le aplicará una señal cuadrada de valor 24 voltios. Es interesante meter tensión para obtener la mayor potencia sonora, pero esto está por comprobar.