[video] Arduino Morse (led + altavoz)

Hola, hace 3 días que tengo mi placa Audrino y con los pocos materiales de los que dispongo (hasta que abra la tienda de electrónica que tengo cerca) he hecho un par de cosillas ya.

En el vídeo http://www.youtube.com/watch?v=o4N5T67BL1g se muestra una placa Audrino que tiene cargado el siguiente código:

unsigned short int punto = 70; // Duracion del punto
unsigned short int raya = punto * 4; // Duracion de la raya
unsigned short int negro = punto * 3; // Duracion del apagado entre rayas y puntos
unsigned short int letrayletra = punto * 5; // Duracion del apagado entre letras

void playTone(int tone, int duration, int speakerPin) {
  // Sends the signal to the speakerPin
  for (long i = 0; i < duration * 1000L; i += tone * 2) {
    digitalWrite(speakerPin, HIGH);
    delayMicroseconds(tone);
    digitalWrite(speakerPin, LOW);
    delayMicroseconds(tone);
  }
}

void playToneLed(int tone, int duration, int speakerPin, int ledPin) {
  // Sends the signal to speakerPin and ledPin
  for (long i = 0; i < duration * 1000L; i += tone * 2) {
    digitalWrite(speakerPin, HIGH);
    digitalWrite(ledPin, HIGH);
    delayMicroseconds(tone);
    digitalWrite(speakerPin, LOW);
    digitalWrite(ledPin, LOW);
    delayMicroseconds(tone);
  }
}

// ########## CLASE LETRA #########
class letra {
  private:
    char caracter;
    char* codigo;
    int ledPin;
  public:
    letra (char car, char* cad, unsigned short int pin);
    void set (char car, char* cad, unsigned short int pin);
    void mostrar ();
    void sonar ();
    void mostrarYsonar ();
};

letra::letra (char car, char* cad, unsigned short int pin) {
  // Constructor
  caracter = car;
  codigo = cad;
  ledPin = pin;
  pinMode(ledPin, OUTPUT);
}

void letra::set (char car, char* cad, unsigned short int pin) {
  // Setter
  caracter = car;
  codigo = cad;
  ledPin = pin;
}

void letra::mostrar () {
  // Shows the code in in the ledPin
  unsigned short int j = 0;
  while (codigo[j] != 0) {
    if (codigo[j] == '.') {
      digitalWrite (ledPin, HIGH);
      delay (punto);
      digitalWrite (ledPin, LOW);
      delay (negro);
    } else if (codigo[j] == '-') {
      digitalWrite (ledPin, HIGH);
      delay (raya);
      digitalWrite (ledPin, LOW);
      delay (negro);
    }
    j++;
  }
  delay (letrayletra);
}

void letra::sonar () {
  // Sounds the code on the speakerPin
  unsigned short int j = 0;
  while (codigo[j] != 0) {
    if (codigo[j] == '.') {
      playTone (440, 100, 9); 
      delay (negro/3);
    } else if (codigo[j] == '-') {
      playTone (440, 100 * 4, 9); 
      delay (negro/3);
    }
    j++;
  }
  delay (letrayletra);
}

void letra::mostrarYsonar () {
  // Sounds and shows the code (ledPin + speakerPin)
  unsigned short int j = 0;
  while (codigo[j] != 0) {
    if (codigo[j] == '.') {
      playToneLed (440, 100, 9, ledPin);
      delay (negro/4);
    } else if (codigo[j] == '-') {
      playToneLed (440, 100 * 4, 9, ledPin);
      delay (negro/4);
    }
    j++;
  }
  delay (letrayletra/2);
}
// ##############################

void setup() {
  Serial.begin(9600);
  pinMode(9, OUTPUT);
}

int letraIN = 0;
unsigned short int ledPin = 13;
void loop() {
  digitalWrite(ledPin, LOW);
  letraIN = 0;
  letraIN = Serial.read();
  letra let (0, "", ledPin);
  switch (letraIN) {
    case 'a': let.set ('a', ".-", ledPin);
              break;
    case 'b': let.set ('b', "-...", ledPin);
              break;
    case 'c': let.set ('c', "-.-.", ledPin);
              break;
    case 'd': let.set ('d', "-..", ledPin);
              break;
    case 'e': let.set ('e', ".", ledPin);
              break;
    case 'f': let.set ('f', "..-.", ledPin);
              break;
    case 'g': let.set ('g', "--.", ledPin);
              break;
    case 'h': let.set ('h', "....", ledPin);
              break;
    case 'i': let.set ('i', "..", ledPin);
              break;
    case 'j': let.set ('j', ".---", ledPin);
              break;
    case 'k': let.set ('k', "-.-", ledPin);
              break;
    case 'l': let.set ('l', ".-..", ledPin);
              break;
    case 'm': let.set ('m', "--", ledPin);
              break;
    case 'n': let.set ('n', "-.", ledPin);
              break;
    case 'o': let.set ('o', "---", ledPin);
              break;
    case 'p': let.set ('p', ".--.", ledPin);
              break;
    case 'q': let.set ('q', "--.-", ledPin);
              break;
    case 'r': let.set ('r', ".-.", ledPin);
              break;
    case 's': let.set ('s', "...", ledPin);
              break;
    case 't': let.set ('t', "-", ledPin);
              break;
    case 'u': let.set ('u', "..-", ledPin);
              break;
    case 'v': let.set ('v', "...-", ledPin);
              break;
    case 'w': let.set ('w', ".--", ledPin);
              break;
    case 'x': let.set ('x', "-..-", ledPin);
              break;
    case 'y': let.set ('y', "-.--", ledPin);
              break;
    case 'z': let.set ('z', "--..", ledPin);
              break;
    case '0': let.set ('0', "-----", ledPin);
             break;
    case '1': let.set ('1', ".----", ledPin);
             break;
    case '2': let.set ('2', "..---", ledPin);
             break;
    case '3': let.set ('3', "...--", ledPin);
             break;
    case '4': let.set ('4', "....-", ledPin);
             break;
    case '5': let.set ('5', ".....", ledPin);
             break;
    case '6': let.set ('6', "-....", ledPin);
             break;
    case '7': let.set ('7', "--...", ledPin);
             break;
    case '8': let.set ('8', "---..", ledPin);
             break;
    case '9': let.set ('9', "----.", ledPin);
             break;
    case '.': let.set ('.', ".-.-.-", ledPin);
             break;
    case ',': let.set (',', "--..--", ledPin);
             break;
    case '?': let.set ('?', "..--..", ledPin);
             break;
    case '"': let.set ('"', ".-..-.", ledPin);
             break;
  }
  //let.mostrar();
  //let.sonar();
  let.mostrarYsonar();
}

Este código básicamente lo que hace es recibir caracteres por el puerto COM y los reproduce (luz, sonido o luz + sonido)

Por otro lado tengo un programa escrito en C/C++, en el que utilizando la API de windows (es lo más rápido que he encontrado para ir empezando) envía cadenas de texto, introducidas por el usuario mediante teclado, caracter a caracter.
El código es el siguiente:

#include <iostream>
#include <windows.h>

using namespace std;


int main() {
/****************************
 CONFIGURACION DEL PUERTO COM
****************************/
HANDLE hSerial;
   hSerial = CreateFile("COM3",
      GENERIC_READ | GENERIC_WRITE,
      0,
      0,
      OPEN_EXISTING,
      FILE_ATTRIBUTE_NORMAL,
      0);
   if(hSerial==INVALID_HANDLE_VALUE){
      if(GetLastError()==ERROR_FILE_NOT_FOUND){
         cout << "The COM port doesn't exist" << endl;
      }
      cout << "Error: Invalid Handle" << endl;
   }

   DCB dcbSerialParams = {0};
   dcbSerialParams.DCBlength=sizeof(dcbSerialParams);  // Esta linea esta mal en el PDF (aqui esta bien)
   if (!GetCommState(hSerial, &dcbSerialParams)) {
      cout << "Error getting state" << endl;
   }
   dcbSerialParams.BaudRate=CBR_9600;
   dcbSerialParams.ByteSize=8;
   dcbSerialParams.StopBits=ONESTOPBIT;
   dcbSerialParams.Parity=NOPARITY;
   if(!SetCommState(hSerial, &dcbSerialParams)){
      cout << "Error setting serial port state" << endl;
   }

   COMMTIMEOUTS timeouts={0};
   timeouts.ReadIntervalTimeout=50;
   timeouts.ReadTotalTimeoutConstant=50;
   timeouts.ReadTotalTimeoutMultiplier=10;
   timeouts.WriteTotalTimeoutConstant=50;
   timeouts.WriteTotalTimeoutMultiplier=10;
   if(!SetCommTimeouts(hSerial, &timeouts)){
      cout << "Error Setting time out" << endl;
   }

/********************
 TRANSMISION DE DATOS
********************/
char szBuff[1] = {0};
DWORD dwBytesRead = 0;
char palabra[64]; // 8 * 8

while (palabra[0] != '!') {
   cout << "Palabra (! para salir): ";
   cin >> palabra;
   cout << endl;
   unsigned short int i = 0;
   while (palabra[i] != 0) {
      szBuff[0] = palabra[i];
      if(!WriteFile(hSerial, szBuff, 1, &dwBytesRead, NULL)){
         cout << "No se pudo" << endl;
         break;
      }
      i++;
   }
}
}

La mayor parte de este código es la configuracion del puerto COM.

Ejeje espero que les guste y/o sirva de ayuda a alguien.

Mi próxima meta es el uso de relés para un sistema “pseduodomótico” :stuck_out_tongue: y un controlador MIDI para veejeen (vj).

Felicidades, Este ejemplo de utilización del Arduino es estupendo.

Un saludo, Johnny