Teclado para Rotor Prosistel

Diagram del teclado para el rotor prosistel

El control del rotor, tien las teclas CW y CCW así como un encoger rotatorio para indicar los grados que queremos que se posicione.

He pensado ponerle un teclado para poner directamente los grados y tener unas teclas con una dirección pre programada.

El modulo de control tiene un puerto serie, solo se utilizan los pines 2, 3 y 5

Se desarrolla bajo el entorno de Arduino, los materiales necesarios, son:

  • Arduino Mega
  • Tarjeta Ethernet Shield.
  • Convertidor Serie-TTL
  • Teclado 4×4.
  • Display I2C
  • Encoder rotatorio.

 

KEYER Radioartisan

Realización de un keyer (CW). siguiendo el blog del Keyer de Radioartisan.

Información sobre el programa en la Wiki de Radioartisan

Panel de Pruebas

Seguir leyendo

Bus SPI

El SPI es un protocolo de comunicación síncrona de 4 hilos, entre dispositivos electrónicos presentado por Motorola en 1982, es un sistema de comunicación de muy corta distancia, normalmente dentro la placa de circuito impreso.
Es un protocolo de transmisión que permite alcanzar velocidades muy altas y que se diseñó pensando en comunicar un micro controlador con distintos periféricos y que funciona a full dúplex
 
SPI utiliza una solución síncrona, porque utiliza unas líneas diferentes para los datos y el Clock. El Clock es una señal que indica al que escucha exactamente cuándo leer las líneas de datos, con lo que el problema de perdida de sincronía se elimina de raíz.
Por eso mismo, no se necesita pactar la velocidad de transmisión, ya que será el Clock quien fije la velocidad y puede ser variable a lo largo de la comunicación sin que sea un problema
En el caso de que tengamos varios dispositivos:
 
Por cada dispositivo, necesitamos una linea de selección.
 
 
Comparación entre SPI e I2C
Ventajas del Bus SPI
  • Comunicación Full Duplex. Envía y recibe a la vez lo que aumenta la velocidad.
  • Más rápido que el I2C y que el puerto Serie asíncrono norma.
  • El tamaño de los mensajes puede ser arbitrariamente grande
  • Se requiere un hardware sencillo
  • Requiere un menor consumo y menor electrónica de conexión que el I2C
  • Como el Clock lo proporciona el master, los esclavos no necesitan osciladores
Las desventajas son:
  • Necesita más pines que el I2C o el Puerto serie normal.
  • Las comunicaciones tiene que estar perfectamente establecidas de antemano. No puedes enviar mensajes de diferentes longitudes cuando te convenga.
  • No hay señal de conforme del esclavo, se espera que obedezca y punto.
  • Master único y casi sin posibilidad de master múltiple
  • Funciona solo en distancias muy cortas
  • Normalmente necesita un pin adicional por cada esclavo.
Pines en el arduino
MOSI 51, ICSP-4
MISO 50, ICSP-1
SCK  52, ICSP-3
SS    53
 

I2C (Inter-Integrated Circuit)

Two Wire Interface, o interface de 2 hilo

Phillips, propuso una norma de comunicación digital, entre los diferentes componentes de una sistema electrónico.

Una norma que especificaba la velocidad, niveles de tensión, y el protocolo a seguir para conseguir esa comunicación y la hizo abierta.

Esa norma se llamó Inter Integrated Circuits bus, o IIC, y pronto se convirtió en un estándar de facto en la industria. 

  • Protocolo de dos hilos de control, uno para transmitir los datos, SDA y otro, el reloj asíncrono que indica cuando leer los datos SCL. Mas GND y 5V (cuando se requiera).
  • Cada dispositivo conectado al bus I2C y cada uno tiene su dirección exclusiva, de 7 bits, (Asi que, en teoría, podemos conectar 27 = 128, dispositivos).
  • Uno de estos componentes, debe actuar como master, es decir controla el reloj.
  • No se requiere una velocidad de reloj estricta, ya que es el master quien controla el Clock.
  • Es multimaster, el master puede cambiar, pero solo uno puede estar activo a la vez, y proporciona un protocolo de arbitraje y detección de colisiones. 

La idea es que todos los componentes se conecten en paralelo a las dos líneas del Bus, SDA y SCL. 

En cada momento solo puede haber un master, en este caso, nuestro Duino y los demás se configuran como esclavos.

  • Puede haber más de un master. La norma propone un sistema de arbitraje, para transferir el control de uno a otro, pero en un instante dado, solo uno puede ser el master.
  • Las resistencias de Pullup conectadas a SDA y SCL. Son imperativas, ya que el bus es activo bajo (Esto es, la señal activa es un 0, no un 1.)
  • Cuando se vaya a conectar algo al busI2C, es imprescindible que leas el manual para saber si los pullup los tienes que poner tú, o vienen puestos en el componente.

 

Arduino lo soporta de fábrica con una librería estándar, que utiliza dos de los pines analógicos para las funciones SDA (Datos) y SCL (Clock).

  • En el Arduino UNO, los pines I2C están en los pines analógicos A4 (SDA) y A5 (SCL).
  • En el Arduino Mega y DUE, son el 20 (SDA) y en el 21(SCL).

La librería I2C, en Arduino se llama Wire, y gestiona el protocolo de comunicaciones completo.

Dispositivos Usuales

Adaptador I2C LCD

Reloj I2C

Expansor Puertos PCF8574P

Servo 9G

El servo es un motor paso a paso. Nos permite mantener una posición que indiquemos, y nos permite controlar la velocidad de giro. Se puede hacer

Características técnicas de un servomotor;

Características:

Peso: 9 g

Dimensiones: 22.2 x 11.8 x 31 mm aprox.

Par de torque: 1.8 kgf·cm

Velocidad de movimiento: 0.1 s/60º

Voltaje de funcionamiento: 4.8 V (~5V)

Temperatura de funcionamiento: 0 ºC – 55 ºC

Todos tienen un funcionamiento muy parecido y la programación puede variar muy poco.

Hay que tener en cuenta:

  • El angulo de giro, permite hacer un barrido entre -90º y 90º. Lo que viene a ser un ángulo de giro de 180º.
  • Tiene una precisión de un grado es decir, podemos mover de grado en grado.
  • Funcionan con una señal PWM, con un pulso de trabajo entre 1 ms y 2 ms y con un periodo de 20 ms (50 Hz). Indica que la velocidad máxima a la que podemos mover el servomotor con Arduino. Solo podremos cambiar de posición cada 20 ms.

  • Las conexiones dependerán del tipo de servomotor, Tienen tres cables, uno irá a tierra, otro a la alimentación de 5 Voltios y el tercero a un pin PWM.

¿Cómo programar un servo?

El código para girar el motor de 0º a 180º

Comprobamos que tenemos instalada la librería servo.h, en caso contrario la instalaremos.

En los ejemplos hay uno, que hace girar el servo de 0º a 180º y después hacer el giro inverso.

Lo pongo a continuación pero traducido al español.

/* Sweep

by BARRAGAN <http://barraganstudio.com>
This example code is in the public domain. modified 8 Nov 2013
by Scott Fitzgerald
http://www.arduino.cc/en/Tutorial/Sweep
Traducido por Manuel EA7TB
*/

#include <Servo.h> // Incluímos la librería para poder controlar el servo
Servo myservo; // // Declaramos la variable para controlar el servo
int pos = 0; // Declaramos la variable para determinar la posicion.

void setup() {
     myservo.attach(9); // Iniciamos el servo para que empiece a trabajar con el pin 9
}

void loop() {
     // movemos de 0º a 180º, de grado en grado
     for (pos = 0; pos <= 180; pos += 1) {
         myservo.write(pos); // Indicamos la posicion al servo, con la variable pos.
         delay(15); // esperamos 15ms para indicarle al servo su nueva posicion,
      }
      delay(1000); // retardo para que gire en direccion contraria
      // movemos de 180º a 0º, de grado en grado
      for (pos = 180; pos >= 0; pos -= 1) {
           myservo.write(pos); // Indicamos la posicion al servo, con la variable pos.
          delay(15); // esperamos 15ms para indicarle al servo su nueva posicion,
      }
      delay(1000); // retardo para que vuelva a empezar.
}

De la librería Servo.h hemos declarado un objeto o variable servoMotor y hacemos uso de dos métodos:

  • myservo.attach, que nos permite indicar en que pin tenemos conectado el servo
  • myservo.write, donde le indicamos a qué ángulo se debe posicionar.

Fácil, no?.

Para posicionarlo en un punto determinado, solo hay que poner.

myservo.write(pos);

el valor de pos debe estar entre 0 y 180

PLACA 4 RELES

Shield arduino de 4 rele.
PLACA 4 RELES
Shield arduino de 4 rele.
Los reles se activan a nivel alto.
Las patillas para la activacion son:
Rele 1 pin 7
Rele 2 pin 6
Rele 3 pin 5
Rele 4 pin 4
Código
/* 
 * Placa_4_reles. 
 * Activa y desactiva de forma secuencial los reles 
 * Laca para cuatro reles. 
 * Rele 1 pin 7 
 * Rele 2 pin 6 
 * Rele 3 pin 5 
 * Rele 4 pin 4 
 */ 

int rele1 = 7; 
int rele2 = 6; 
int rele3 = 5; 
int rele4 = 4; 

void setup() { 
  pinMode(7, OUTPUT); 
  pinMode(6, OUTPUT); 
  pinMode(5, OUTPUT); 
  pinMode(4, OUTPUT); 
} 

void loop() { 
   for (int i=4; i<8; i++){ 
    digitalWrite(i, HIGH); 
    delay(2000); 
    digitalWrite(i,LOW); 
    delay(2000); 
   } 
}

Pulsadores

ARDUINO PULSADORES
Cunado necesitamos varios pulsadores y hay una saturación en los pines del
arduino o queremos minimizar el cableado. La solución es usar una entrada
analógica con un divisor de tensión
El funcionamiento se base en la siguiente formula:
                         R1
Vout = —————- x Vcc
                   R1 + Rx
Siendo Rx, la resistencia que se usa al pulsar un pulsador.
                                                 R1    R1 + R2   R1 + R3  R1 + R4   R1 + R5   R1 + R6
Resistencia Total Rt    3K3     13K3        7K2         5K5           4k3          3k86
V = Vcc x(R1 / Rt)          5,00       1,24        2,29         3,00         3,84          4,27
De esta forma, con un solo cable conectado a una entrada analógica, se tiene
cinco pulsadores.

El programa para utilizarlo.

/****************************************************** 
 * Pulsador_de_5 
 * Control de pulsadores con divisor de tension 
 * Utiliza la funcion map() para obtener el puslador que 
 * esta pulsado. 
 * ***************************/ 

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

void loop() { 
  // lee el puerto analógico 0 
  int analogValue = analogRead(0); 
  analogValue = map(analogValue, 0, 1023, 0, 6); 

  switch (analogValue) { 
    case 1: 
      Serial.println("Activo el pulsador  1"); 
      delay(400); 
      break; 
    case 2: 
      Serial.println("Activo el pulsador   2"); 
      delay(400); 
      break; 
    case 3: 
      Serial.println("Activo el pulsador   3"); 
      delay(400); 
      break; 
    case 4: 
      Serial.println("Activo el pulsador   4"); 
      delay(400); 
      break; 
    case 5: 
      Serial.println("Activo el pulsador  5"); 
      delay(400); 
      break; 
    default: 
      Serial.println("no hay pulsada ninguna tecla"); 
      delay(400); 
  } 
}

DHT11: Sensor de temperatura y Humedad 

Sensor de temperatura y humedad

Por eso se desarrollaron los sensores de la familia DHT. Nos proporcionan de forma digital la temperatura y la humedad, con diferente precisión según el modelo.

Básicamente hay dos variantes DHT11

Las características del DHT11 son:

  • Muy barato, sobre 2€
  • Funciona con 3,3 y 5V de alimentación
  • Rango de temperatura: de 0º a 50º con 5% de precisión (pero solo mide por grados, no fracciones)
  • Rango de humedad: de 20% al 80% con 5% de precisión
  • 1 Muestra por segundo (No es el más rápido del oeste)
  • Bajo consumo
  • Devuelva la medida en ºC

Destacar que el chip incorpora electrónica para hacer internamente la conversión de temperatura y humedad y nos da un valor de medida de forma digital, es decir, que no necesitamos un pin analógico.

El Programa de lectura del DHT11

En primer lugar, tenemos que descargar una librería para manejarlos cómodamente, DX11.zip e importarla. Aquí teneís la librería DHT11.zip

Hacemos el importar la librería DHT11 que nos pondrá:

#include <DHT11.h>

Y definimos una instancia del sensor donde declaramos el pin al que esta conectado.

int pin=2; 

DHT11 dht11(pin);

Leerlo ahora es muy sencillo:

int error ; 

float temp, humi; 

error = dht11.read(humi, temp)

Basta con hacer dht11.read pasandole las variables donde queremos el resultado, y comprobamos que no haya errors (Siempre es buena idea comprobar que no hay error cuando hacemos una llamda).

Código:

#include <DHT11.h> 
int pin=2; 
DHT11 dht11(pin); 

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

void loop() 
   { 
       int err; 
       float temp, hum; 
       if((err = dht11.read(hum, temp)) == 0) // Si devuelve 0 es que ha leido bien 
          { 
             Serial.print("Temperatura: "); 
             Serial.print(temp); 
             Serial.print(" Humedad: "); 
             Serial.print(hum); 
             Serial.println(); 
          } 
       else 
          { 
             Serial.println(); 
             Serial.print("Error Num :"); 
             Serial.print(err); 
             Serial.println(); 
          } 
       delay(1000); // lee una vez por segundo 
   }

El resultado se envía a la consola.

Para hacer variar los valores, de humedad y temperatura y comprobar que todo funciona correctamente, podeis, sencillamente, enviar vuestro aliento al sensor, subirá tanto la temperatura como la humedad.

Teclado 3×4

 

Libreria:

La librería que viene en nuestra ayuda se llama keypad.h. Esta librería no viene de forma estándar con la distribución del compilador de Arduino. Así que tenemos que descargarla desde la web. http://playground.arduino.cc/code/Keypad 

Conexiones

Código

//* Teclado4x3.ino 

 *  Comprobacion de que el numero pulsado, se muestra en el monitor seria. 

 *  Libreria: Keypad.h 

 *  Definimos dos constantes, para las filas (Fila) y columnas (Colu) 

 *  y una matriz con los caracteres del teclado. 

 */ 

#include <Keypad.h> //libreria. 

const byte Fila = 4;   // numero de filas 

const byte Colu = 3;  // numero de columnas 

char keys[Fila][Colu] = { 
  {'1', '2', '3'}, 
  {'4', '5', '6'}, 
  {'7', '8', '9'}, 
  {'*', '0', '#'} 
}; 

byte PinFilas[Fila] = {8, 9, 10, 11};  // indicamos a que pines estan conectados las Filas 
byte PinColum[Colu] = {12, 13, 14};  // indicamos a que pines estan conectados las columnas 

//creamos un objeto de la libreria keypad para usar sus funciones 

Keypad keypad = Keypad( makeKeymap(keys), PinFilas, PinColum, Fila, Colu ); 

void setup() { 
  Serial.begin(9600); // Definimos la velocidad del puerto serial. 
} 

void loop() { 
  //cuando se pulse una tecla, se guardará en una variable llamada key 
  char key = keypad.getKey(); 
  //Si se ha pulsado una tecla, se envia por serial 
  if (key != NO_KEY) { 
    Serial.println(key); 
  } 
}

Explicación

El primer paso es incluir la librería y las constantes que vamos a utilizar:

const byte Fila = 4;   // numero de filas 

const byte Colu = 3;  // numero de columnas

Reservamos memoria en bytes, para los valores de los pulsadores y la asignación del pin que se corresponde con los de Arduino. Sin embargo, hay que observar que, vamos a necesitar un número alto de pines en este y los siguientes ejemplos.

byte PinFilas[Fila] = {8, 9, 10, 11};  // indicamos a que pines estan conectados las Filas 

byte PinColum[Colu] = {12, 13, 14};  // indicamos a que pines estan conectados las columnas

Este es el momento de ‘crear’ el teclado propiamente dicho, es decir, con esta sentencia, el programa generará una matriz que verá como un teclado, al que se remitirá, cuando tenga que representar un dígito. Esto se consigue con la siguiente línea:

Keypad keypad = Keypad( makeKeymap(keys), PinFilas, PinColum, Fila, Colu );

Zumbador

Arduino Zumbador

Si conectamos un piezo con una señal digital, vibran a una frecuencia sigue bastante fielmente la variación eléctrica con que los excita, y si vibran a la frecuencia audible, oiremos el sonido que producen. A un componente que hace esto, le llamamos Buzzer o zumbador.

Naturalmente, la calidad del sonido que producen dista bastante de lo que podríamos denominar alta fidelidad. Pero es suficiente para generar tonos audibles (como la típica alarma de los despertadores digitales) e incluso tonos musicales reconocibles que podemos secuenciar.

En esta sesión, montaremos un circuito muy sencillo con un zumbador

La conexión es tan simple como conectar negativo a GND y positivo al pin 9. De todas maneras hay que tener cuidado. Los piezos tienen polaridad y hay que asegurarse de conectarlos correctamente.

  • Si los conectáis al revés, simplemente no sonará, y tendréis que dar la vuelta.
  • Además para este primer montaje, necesitamos usar un pin PWM (como el 9) porque es la alternancia entre HIGH y LOW lo que produce el efecto piezoeléctrico (recordad que una señal PWM envía un tren de ondas cuadradas de amplitud variable), por lo que lo más cómodo es usar un pin PWM en lugar de programar un efecto equivalente en un pin normal.

El Programa

Vamos a empezar creando una función, Beep(), que haga ruido simplemente:

void beep(unsigned char pausa)

        { 

            analogWrite(9, 20); 

            delay(pausa);            // Espera 

            analogWrite(9, 0);         // Apaga 

            delay(pausa);              // Espera 

        }

Y ahora prueba

     void setup() 

        { 

            pinMode(9, OUTPUT); 

            beep(50); 

            beep(50); 

            beep(50); 

            delay(1000); 

        } 

     void loop() 

       {    beep(200); 

       }

Lo único que beep () hace es poner una señal PWM en el pin 9 de 20 sobre 255. Podéis varias el valor, pero el tono de audio no cambiará gran cosa porque está controlado por la señal de base. Esto es suficiente para generar una de las molestas señales acústicas de un despertador barato.

¿Qué pasa si quiero generar señales de tono variable para hacer una melodía? Bueno pues Arduino dispone de la función tone() que genera una señal de la frecuencia indicada, y notone() que la corta:

     void setup() 

        { 

            int pinOut = 8; 

            int freq = 440; 

            int duracion = 1000; 

            tono(pinOut, freq, duracion); 
         }

La función tone() genera un audio de la frecuencia y duración definidas.

Podemos definir una matriz con las frecuencias de las notas a utilizar  y lee las correspondencias con las notas musicales. Veamos cómo generar una escala con un zumbador:

     int speakerPin = 9; 

     int numTonos = 10; 

     int tonos[ ] = {261, 277, 294, 311, 330, 349, 370, 392, 415, 440,466, 494}; 
     // mid C C# D D# E F F# G G# A 
    void setup() 
         { }
    void loop() 
         { 
             for (int i = 0; i < numTonos; i++) 
                 { 
                    tone(speakerPin, tonos[i]); 
                    delay(500); 
                 } 
            noTone(speakerPin); 
       }