Projecte Morse amb Arduino

Aquest document HTML recull tot el projecte des de les pràctiques més bàsiques fins a una integració avançada amb interfície web.

1. Introducció i Objectius

El codi Morse és un sistema de transmissió d'informació mitjançant punts i ratlles. En aquest projecte aprendràs a programar l'Arduino per generar senyals Morse amb un LED, un buzzer, rebre entrades amb un botó i, finalment, comunicar-te amb una interfície web.

2. Pràctiques Bàsiques

Pràctica 1: Encendre un LED en Patrons Morse

Objectiu: Fer parpellejar un LED en patrons Morse (per exemple, la lletra "S": ···).

Codi Arduino d'exemple:


// Pràctica 1: LED en Morse
const int ledPin = 13;

void setup() {
  pinMode(ledPin, OUTPUT);
}

void loop() {
  // "S" en Morse: tres punts
  for (int i = 0; i < 3; i++) {
    digitalWrite(ledPin, HIGH);
    delay(250); // Durada d'un punt
    digitalWrite(ledPin, LOW);
    delay(250);
  }
  delay(1000); // Separació de paraula
}
      

Pràctica 2: Generar So amb un Buzzer en Morse

Objectiu: Substituir el LED per un buzzer per reproduir sons en Morse.

Codi Arduino d'exemple:


// Pràctica 2: Buzzer en Morse
const int buzzerPin = 8;

void setup() {
  pinMode(buzzerPin, OUTPUT);
}

void loop() {
  // "O" en Morse: tres ratlles
  for (int i = 0; i < 3; i++) {
    tone(buzzerPin, 1000);  // Emissió de so a 1000 Hz
    delay(750);             // Durada d'una ratlla
    noTone(buzzerPin);
    delay(250);
  }
  delay(1000);
}
      

Pràctica 3: Rebre Entrades en Morse amb un Botó

Objectiu: Capturar l'entrada de l'usuari mitjançant un botó i determinar si es tracta d'un punt o d'una ratlla.

Codi Arduino d'exemple:


// Pràctica 3: Captura de senyals amb un botó
const int buttonPin = 7;
const int ledPin = 13;

void setup() {
  pinMode(buttonPin, INPUT);
  pinMode(ledPin, OUTPUT);
  Serial.begin(9600);
}

void loop() {
  int state = digitalRead(buttonPin);
  if (state == HIGH) {
    digitalWrite(ledPin, HIGH);
    unsigned long startTime = millis();
    // Esperem que l'usuari deixi de prémer el botó
    while(digitalRead(buttonPin) == HIGH);
    unsigned long duration = millis() - startTime;
    digitalWrite(ledPin, LOW);
    
    // Distingeix entre punt i ratlla segons la durada
    if (duration < 500) {
      Serial.println("Punt");
    } else {
      Serial.println("Ratlla");
    }
    delay(300);
  }
}
      
Nota: Ajusta els valors de durada segons la teva prova i configuració.

3. Projecte Intermedi: Conversió de Morse a Text

Pràctica 4: Convertir Codi Morse en Text

Objectiu: Desenvolupar un algoritme que, basant-se en la temporització dels senyals, converteixi els patrons Morse en caràcters alfabètics.

Continguts:

Exemple de pseudocodi:


// Pseudocodi per convertir Morse a text
String morseToLetter(String morse) {
  // Exemple bàsic:
  if(morse == ".") return "E";
  else if(morse == "-") return "T";
  // Afegeix més condicions segons el teu mapa Morse
  return "";
}
      

Pràctica 5: Visualització en un LCD

Objectiu: Mostrar en temps real el text resultant en un display LCD.

Exemple de codi Arduino utilitzant la llibreria LiquidCrystal:


#include 

// Configuració dels pins: RS, E, D4, D5, D6, D7
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

void setup() {
  lcd.begin(16, 2);
  lcd.print("Morse a Text");
}

void loop() {
  // Simulació d'entrada de text
  lcd.setCursor(0, 1);
  lcd.print("Hola, món!");
  delay(2000);
}
      

4. Projecte Avançat: Integració Web amb Arduino

Objectiu: Crear una interfície web que mostri en temps real els senyals Morse capturats o enviats per l'Arduino. Es pot utilitzar la Web Serial API per connectar el navegador amb l'Arduino (si el navegador i l'Arduino ho permeten) o establir un servidor intermedi.

A continuació, un exemple de codi HTML amb JavaScript per establir la comunicació via la Web Serial API:


// Exemple bàsic de Web Serial API
async function connectSerial() {
  try {
    const port = await navigator.serial.requestPort();
    await port.open({ baudRate: 9600 });
    const reader = port.readable.getReader();
    while (true) {
      const { value, done } = await reader.read();
      if (done) break;
      const text = new TextDecoder().decode(value);
      document.getElementById('resultat').innerText += text;
    }
  } catch (error) {
    console.error('Error al connectar:', error);
  }
}

document.getElementById('connectBtn').addEventListener('click', connectSerial);
    

Inclou aquest codi dins d'aquest mateix HTML per tenir tot el projecte en un sol fitxer:

Resultats de la comunicació seran mostrats aquí...

Nota: La Web Serial API requereix que el navegador sigui compatible i que la pàgina es serveixi a través d'un protocol segur (HTTPS o localhost).

5. Recursos Addicionals

6. Conclusió

Aquest projecte et permetrà aprendre de manera progressiva des dels conceptes més bàsics fins a la integració avançada amb interfícies web. A més, tot el contingut està recollit en un únic document HTML per facilitar-ne la consulta i la distribució.