lunes, 29 de julio de 2019

Discado DTMF con Arduino Parte 2


En este caso a partir de un estímulo (Presionar una Tecla, disparo de un sensor, etc.) Arduino automáticamente simula la acción de "descolgar" y "discar" el Número de teléfono al cual se le pre estableció llamar.

El paso siguiente es agregar otros números para realizar una "cadena" de llamados.

martes, 23 de julio de 2019

Diseño de Placas PCB

A la hora de realizar nuestros Diseños de Circuitos Impresos es muy importante que nuestro PCBWizard logre representarlo correctamente. Por ello deberemos tener en cuenta dos aspectos fundamentales a la hora de imprimir nuestros Circuitos.

1) Cuando el Diseño de nuestra placa se imprime fuera de la hoja dejando una sola parte de todo el Diseño. Debemos desplazarlo hacia abajo o hacia el costado según sea necesario dentro de la Grilla (Fondo).

2) Cuando no imprime la Escala real que necesitamos debemos verificar que la Grilla (fondo) sea del mismo formato con el que se esta dibujando. (mm o inches).


lunes, 22 de julio de 2019

Comunicación Full-Duplex con ARDUINO y nRF24L01

INTRODUCCION:
No es mi intensión criticar absolutamente a nadie, pero en mi caso personal me ha ocurrido que muchos explican muy bien dejando sobre entendida muchas cosas (que en mi caso personal) ignoro.
Otro ejemplo ha sido: Explican exclusivamente las líneas determinadas del funcionamiento de “algo” y luego te pasan el video funcionando todo. Cuando yo quiero llevarlo a la práctica no funciona.
Claro falta agregar esto, aquello y lo otro. Es por ese motivo que me gusta hacer y presentar lo poquito que voy aprendiendo para que otro “no pierda un fin de semana”, como yo simplemente porque no vio lo obvio “falta agregar pinMode(5, OUTPUT)”.

Cabe aclarar que no critico los modos de enseñanza de los demás, pero al menos podrían hacer el comentario aclaratorio. Ya que siempre nos piden nuestros Like / suscribirse.

TEMA CONCRETO (Sin saraza)
La tarea que tiene el programa SERVIDOR es enviar un número aleatorio “usando millis()” al Esclavo. Por otro lado el Esclavo independientemente de lo que reciba envía un valor fijo “999” al Servidor.
Una vez logres esta comunicación podrás jugar del modo que vos quieras o lo necesites. Los mensajes son independientes sin que haya una clave o tiempo para que uno u otro deba responder.
En este caso particular no necesitaba usar Cadena de caracteres, es por eso que solo podrán trabajar con números.
Las conexiones están por todas partes, pero en mi caso solo me quiero dedicar a dejarte un Sketch/Programa/Aplicación. (Inspirado en la explicación de Prometec que me enseño mucho).
SERVIDOR / MAESTRO
// MAESTRO.ino
// Creo que no hace falta usar para este ejemplo.
// #include <SPI.h>
// *******************

#include <nRF24L01.h>
#include <RF24.h>
RF24 radio(9,10); // Rx~ y Tx~
const uint8_t pipes[2] = { 0xF0F0F0F0E1LL, 1 };
void setup(void) {
    pinMode(10, OUTPUT);
Serial.begin(9600);
    radio.begin();
radio.setRetries(15,15); // Maximos reintentos
    radio.openWritingPipe(pipes[0]);
    radio.openReadingPipe(1,pipes[0]);
}
void loop(void) {
     delay(2500); // Solo sirve para no desbordar el Visor Serial
   
     // Paramos la escucha para poder hablar
     radio.stopListening();
     unsigned long Numero = millis();
     Serial.print("Mensaje Enviado ");
     Serial.println(Numero);
     bool ok = radio.write( &Numero, sizeof(unsigned long) );
     if (ok){
         Serial.println("ok...");
     }else{  
         Serial.println("SERVIDOR:No pude enviar mi NRO.");
     }
// Volvemos a escuchar al Esclavo
     radio.startListening();
     if ( radio.available()){
          int AhoraEl;
          radio.read( &AhoraEl, sizeof(int) );
          if (AhoraEl != 0){
              Serial.print("Recibi del Esclavo ");
              Serial.println(AhoraEl);
          }
     }
}


ESCLAVO
[code]
// ESCLAVO.ino
// Creo que no hace falta usar para este ejemplo.
// #include <SPI.h>
// *******************

#include <nRF24L01.h>
#include <RF24.h>
RF24 radio(9,10); // Rx~ / Tx~
const uint8_t pipes[2] = { 0xF0F0F0F0E1LL, 2 };
void setup(void) {
     pinMode(10, OUTPUT);
Serial.begin(9600);
     radio.begin();
radio.setRetries(15,15);
     radio.openWritingPipe(pipes[0]);
     radio.openReadingPipe(1,pipes[0]);
}
void loop(void) {
     // Escuchamos al Servidor
     radio.startListening();
     unsigned long ElServidor = 0;
     radio.read( &ElServidor, sizeof(unsigned long) );
     delay(50);
     if (ElServidor !=0) {
         Serial.print("Numero Recibido del Servidor = ");
         Serial.println(ElServidor);
     }
   
     if ( radio.available() ) {
        // Dejamos de escuchar para poder hablar
        radio.stopListening();
        int AhoraYo = 999;
        Serial.print("Enviando Mensaje ");
        Serial.println(AhoraYo);
        bool ok = radio.write( &AhoraYo, sizeof(int) );
        delay(50);
        radio.startListening(); // Redundancia
        if (ok){
           Serial.println("ok...");
        }else{
           Serial.println("ESCLAVO:No pude enviar el 999");
        }
     }
}

Discado DTMF con Arduino

Con esta aplicación he logrado llamar a un Nr. de teléfono desde mi Arduino por medio de una Línea Telefónica Fija.




String NroTel = "15999999"; // el numero de telefono para marcar
int numero = NroTel.length();

const byte tono1Pin = 10; // pin para tono 1 ~ 10
const byte tono2Pin = 11; // pin para tono 2 ~ 11

int DTMF[13][2]={
  {941,1336}, // frec. p/tecla tono 0
  {697,1209}, // frec. p/tecla tono 1
  {697,1336}, // frec. p/tecla tono 2
  {697,1477}, // frec. p/tecla tono 3
  {770,1209}, // frec. p/tecla tono 4
  {770,1336}, // frec. p/tecla tono 5
  {770,1477}, // frec. p/tecla tono 6
  {852,1209}, // frec. p/tecla tono 7
  {852,1336}, // frec. p/tecla tono 8
  {852,1477}, // frec. p/tecla tono 9
  {941,1209}, // frec. p/tecla tono *
  {941,1477}, // frec. p/tecla tono #
  {0,0} // pausa
};

void setup() {
     Serial.begin(9600);
     Serial.print("Inciando Proceso");
     
     pinMode(6, INPUT); digitalWrite(6, LOW); // Colgado/Descolgado 
     pinMode(7, INPUT); digitalWrite(7, LOW); // Tecla Tonos
     
     pinMode(tono1Pin,OUTPUT); // Output Tono 1 [D10]
     pinMode(tono2Pin,OUTPUT); // Output Tono 2 [D11]

     pinMode(12,OUTPUT); digitalWrite(12, LOW);// Led Testigo DTMF
}

void loop() {
     if (digitalRead(7) == HIGH){
         Serial.println("Discado <Por medio de Tonos DTMF>: ");
         Serial.print("Numero: ");
         for(int i = 0; i < numero; i++) {
             char x = NroTel.charAt(i);
             int digito = String(x).toInt();
             // Disco el digito del Nro Telefonico
             Serial.print(digito);
             byte digit = digito;
             boolean tono1state = false;
             boolean tono2state = false;
             unsigned long tono1delay = (500000/DTMF[digit][0])-10;
             unsigned long tono2delay = (500000/DTMF[digit][1])-10;
             unsigned long tono1timer = micros();
             unsigned long tono2timer = micros();
             // Para la duracion del tiempo de un solo tono
             unsigned long timer = millis();

             if(digit==12) { delay(1000); } // un segundo retraso si el digito es 12

             digitalWrite(12,HIGH);  // Led Testigo
             while(millis() - timer < 100) {
                   if(micros()-tono1timer>tono1delay) {
                      tono1timer=micros();    // Reset restablecer el temporizador del timer
                      tono1state=!tono1state; // Alternar estado del tono 1
                      digitalWrite(tono1Pin, tono1state);
                   }

                   if(micros()-tono2timer>tono2delay) {
                      tono2timer=micros();    // reset restablecer el Temporizador
                      tono2state=!tono2state; // alternar estado del tono2estado
                      digitalWrite(tono2Pin, tono2state);
                   }
             }
             digitalWrite(12,LOW); // Led Testigo
             digitalWrite(tono1Pin,LOW);
             digitalWrite(tono2Pin,LOW);
             delay(150); // 100ms pausa entre los tonos
         }
         Serial.println(" ");
     }
}