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

domingo, 11 de diciembre de 2016

Arduino Bluetooth y Android Studio (1/2)


Comunicación de ARDUINO con SMARTPHONE via Bluetooth

INTRODUCCIÓN:
Además de las desiciones, esperas (para recibir mis compras) y pequeñas pruebas de cada uno de los componentes y luego de pasar por muchas luchas con los Microprocesadores (Caso: PIC F18-XXX).
Junté todo lo aprendido a golpes y preguntas sin respuestas claras (para mi poco conocimiento) en la Web y ya no recuerdo de que modo y como llegué a conocer el mundo ARDUINO.
fue esto lo que terminó de hacerme sentir realmente útil frente a este nuevo mundo de la Electrónica Digital.
Fue así que terminé de comprender y encontrar todas las respuestas que me hacía detrás de la compra de un simple módulo que me permitía hacer y aplicar muchisimas aplicaciones. Muchas de ellas (inimaginables para mi) y que luego de unos días lograba concretar.
Lo que veremos en este Post no es otra cosa que lo explicado en mil y una formas distintas, lo que nos muestran en videos sin decirnos como lo lograron, lo que explican y explican mareandonos llevándonos de un lado para el otro. Diciendonos lo sencillo que es hacer y "MANOS A LA OBRA".
Pero que al final de todo esto ¡NADA FUNCIONA!
Claro Nada funciona porque omitieron explicar detalles creyendo que ya lo sabemos, o porque simplemente consideraron que no hacía falta aclarar o explicar.
Bien de una cosa te juro y aseguro, esto esta hecho para nosotros, los que necesitamos que nos ayuden a ¡ARRANCAR! para que a partir de esto y cuando queramos modificarlo y no funciones comencemos a aprender de verdad. Bueno, ahora como dicen TODOS!!! Manos a la OBRA!.


HARDWARE: Para esta comunicación hemos de usar:
Placa Arduino UNO, NANO, MEGA.
Módulo Bluetooth HC-05
Led colores Azul y Rojo
Sensor DHT-11
ProtoBoard con 8 o 10 Cables para conectar cada múdulo con nuestro Arduino.


SOFTWARE:
Arduino con su editor (.INO)
Android Studio para la realización de la Aplicación (.APK)

Desarrollo de todo
Este código de Arduino permite que con mi Smartphone via Bluetooth pueda:
- Enviarle un texto. Este puede ser una clave de acceso por ejemplo.
- Presionar Tecla Led ON y Tecla OFF para Encender y Apagar un Led de color Azul.
- Por medio de una Barra de Corrimiento Enciendo, Apago y le doy mayor o menor densidad a un Led de color Rojo.
- Presiono una Tecla de nombre Temperatura y me envía la Temp. y Humedad captada por el Sensor DHT-11.


Codigo del Arduino:

// Creado el 11/12/2016 Combinado.INO
// Permite Encender/Apagar LED Azul
// Controla LED Rojo con PWN
// Informa la Temperatura y Humedad con DHT11

#include 

#include 
SoftwareSerial BTxT(10, 11); // Crea nueva conexion- Pin10(RX) a TX y Pin11(TX) a RX

/*-----( Declaro Variables )-----*/
dht DHT;
#define DHT_PIN 3
String Temx; // Variable que contiene Temperatura
String Humx; // Variable que contiene Humedad
String Mensaje;  // Variable de cadena de caracteres para el mensaje
String DigitoEnvio; // La libreria Envia una cadena de a un caracter por vez 
int Bandera; // Bandera de Recepción de mensajes

void setup()
{
  Serial.begin(9600);  // Iniciamos el puerto que esta conectado al PC a 9600 Baudios
  BTxT.begin(9600);    // Iniciamos el puerto nuevo Serial_2 a 9600 Baudios
  
  Serial.println("PROGRAMA Led Azul y Rojo con Sensor DHT11 para Tolba Con Bluetooth");
  Serial.println();

  pinMode(10, INPUT);  // RxD Recepcion
  pinMode(11, OUTPUT); // TxD Transmicion
  pinMode(13, OUTPUT); // Configura Pin 13 como Salida
  pinMode(5, OUTPUT);  // Configura Pin 05 como Salida PWN
  pinMode(3, OUTPUT);  // Configura Pin 03 como Salida Temperatura/Humedad
}

void loop() {

vuelta:
  Mensaje = ""; // Preparamos el mensaje ha recibir hacia el PC
  Bandera = 0;  // Recepcion de mensajes
  
  // Mientras que lleguen caracteres por el puerto BTxT (serial_2)
  while (BTxT.available()) {
     char c = BTxT.read();  // Lee los caracteres uno a uno con la variable c
     delay(10);
     Mensaje += c;          // Almacena la suma de caracteres en el mensaje
     Bandera = 1;
  }

  if (Bandera == 1) {
     Mensaje.trim();
     Serial.println("Hemos recibido un Mensaje: ["+Mensaje+"]"); 
  } else {
     goto vuelta;
  }
  
  if (Mensaje == "A" || Mensaje == "B") {
      Serial.println("Recibimos esta Orden: "+Mensaje);
      if (Mensaje == "A"){
          digitalWrite(13,1);   // Enciende LED en Pin 13
          DigitoEnvio = "A~";
          BTxT.println(DigitoEnvio);
      } else {
          digitalWrite(13,0);   // Apaga LED en Pin 13 
          DigitoEnvio = "B~";
          BTxT.println(DigitoEnvio);
      }
      delay(10);
      Serial.println("Respuesta: " + DigitoEnvio);        
      goto vuelta;
  }
  
  if (Mensaje == "TH"){
     Tolvas();
     Serial.println("Recibimos este Texto "+Mensaje);
     delay(100);
     BTxT.println("TH-"+Temx+"-"+Humx+"~");
     goto vuelta;
  }

  if (Mensaje.substring(0,3) == "TXT"){
     int desde = 4;
     int hasta = Mensaje.length();
     Mensaje = Mensaje.substring(desde, hasta);
     Serial.println("Recibimos este Texto "+Mensaje);
     BTxT.println("Enviaste "+Mensaje+"~");
     goto vuelta;
  }

  if ((Mensaje.toInt() >= 0) && (Mensaje.toInt() < 256)) {
      Serial.println("Recibimos este Numero: "+Mensaje);
      if (Mensaje.toInt() < 65){
          analogWrite(5,0);
          BTxT.println("Led Rojo OFF~");
      } else {
          analogWrite(5, Mensaje.toInt());
//          Esta linea molesta más de lo que sirve
//          BTxT.println(Mensaje+"~");
      }
      delay(10);
      Serial.println("PWM Recibido ["+Mensaje+"]");
  }
}

void Tolvas(){
  int chk = DHT.read11(DHT_PIN);
  delay (100);
  chk = DHT.read11(DHT_PIN);
  delay (1000);
  switch (chk)
  {
    case DHTLIB_OK:  
        Serial.print("OK \t");
        break;
    case DHTLIB_ERROR_CHECKSUM: 
        Serial.print("Error en el Checksum \t");
        break;
    case DHTLIB_ERROR_TIMEOUT: 
        Serial.print("Error Tiempo de Salida \t");
        break;
    case DHTLIB_ERROR_CONNECT:
        Serial.print("Error de Coneccion \t");
        break;
    case DHTLIB_ERROR_ACK_L:
        Serial.print("Error Ack Bajo (Low)/Falta 5v \t");
        break;
    case DHTLIB_ERROR_ACK_H:
        Serial.print("Error Ack Alto (High) \t");
        break;
    default:
        Serial.print("Error Desconocido \t");
        break;
  }
  // DISPLAY DATA
  Temx = "";
  Humx = "";
  Serial.println(DHT.temperature, 1);
  Serial.println(DHT.humidity, 1);
  Temx = DHT.temperature;
  Humx = DHT.humidity;  
  delay (100);
  return Temx, Humx;
}
 
OBSERVACIONES:
No tengo duda alguna, que este codigo luego de analizarlo, podremos conincidir que sobran muchas cosas y que se podía hacer más "técnico" de otros modos y con otros comandos. No es el objetivo de ello. Este programa primario enseña como se comporta cada componente y le dice a TODOS que esta pasando a cada momento. Esa fue la necesidad de hacerlo de este modo tan básico de Comandos y Estructuras.

En la próxima entrega veremos el Desarrollo de la aplicación (.APK) realizada con Android Studio.
Les deseo lo mejor!