Go Down

Topic: [video] Arduino Morse (led + altavoz) (Read 1 time) previous topic - next topic

aladaris

Aug 18, 2009, 07:38 pm Last Edit: Aug 18, 2009, 07:39 pm by aladaris Reason: 1
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:
Code: [Select]

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:
Code: [Select]

#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" :P y un controlador MIDI para veejeen (vj).

Johnny Hoyo

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

Un saludo,
Johnny

Go Up