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
 


Please enter a valid email to subscribe

Confirm your email address

We need to confirm your email address.
To complete the subscription, please click the link in the email we just sent you.

Thank you for subscribing!

Arduino
via Egeo 16
Torino, 10131
Italy