domingo, 15 de diciembre de 2019

Comunicacion I2C con Arduino, Teclado y Display


Hola. Espero que todos estén bien.
Este mes he querido aprender acerca de la comunicación I2C “lo más básico posible” para no marearme y lograr algo que me sea de utilidad. Y este pequeño proyecto es uno que me permite hacer muchas cosas por eso quise compartirlo con Uds.
Gracias a este circuito podremos liberar todas las Entradas y Salidas para usarlas en otras cosas. Siendo el Rey de esto; el fabuloso Micro Integrado PCF8574. Siendo económico y muy fácil de utilizar, por todos aquellos que no somos GRAND MASTER en electrónica.
Con respecto a los Links de Descarga de las librerías están en la descripción del Video. Espero que les sirva como ha sido en mi caso personal. les envío un Cordial Saludo y les deseo lo mejor!

[code]

#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x3f,16,2);
#include <Keypad_I2C.h>
#include <Keypad.h>

const byte FILA = 4;
const byte COLS = 4;
char keys[FILA][COLS] = {
  {'1','2','3','A'},   {'4','5','6','B'},
  {'7','8','9','C'},
  {'*','0','#','D'}
};
byte filaEnt[FILA] = {0, 1, 2, 3};
byte colsEnt[COLS] = {4, 5, 6, 7};
Keypad_I2C Teclado = Keypad_I2C( makeKeymap(keys), filaEnt, colsEnt, FILA, COLS, i2caddress );
int i2caddress = 0x20; int x=0;

void setup(){

  Serial.begin(9600);
  Teclado.begin();
  lcd.init(); // inicializar el LCD
  lcd.backlight();   lcd.clear();   lcd.home();

  lcd.setCursor(0,0); // Ubicación(X,Y)
  lcd.print("Hola Mundo"); }
char Tecla = Teclado.getKey();
void loop(){   if (Tecla){
     if (x>=16){x=0; lcd.setCursor(0,1);lcd.print("                ");}
     Serial.println(Tecla); //debug.
lcd.setCursor(x,1); lcd.print(Tecla);
      x++;   }
}[/code]



sábado, 23 de noviembre de 2019

KeyPad 4x4 de Arduino con un solo cable de Entrada


Hola, creo que el Título lo dice todo. Para evitar en nuestros proyectos de ocupar 8 pines para usar el Teclado Matricial, les muestro un modo simple de hacerlo.


La idea es leer los 8 pines provocando (con distintos valores de resistencias) una lectura única.


Claramente podremos variar los valores de las resistencias de acuerdo a las que tengas en tu caso. Lo importante es que si varias el valor de los propuestos en este post tendrás que tomar nota de cada uno de los valores que lea el Puerto analógico.


Con respecto a la lectura esta sugerida para el Puerto Analógico pudiendo usar el que tengas libre. En mi caso lo he probado con los Puertos A0 y A6 (Este último) es porque la prueba la hice con el Arduino NANO V3.


Si lo Haces con el Arduino UNO te faltarán los Puertos Analógicos A6 y A7, por eso lo probé con el A0 y todo anduvo muy bien.


Espero que les sirva como en mi caso personal. Les deseo lo Mejor!!!





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(" ");
     }
}