Skip to main content
Version: ACS CC

Transmițător și traducător de cod Morse

Transmițător care emite un caracter în cod Morse și un receptor ce îl primește și îl decodifică pentru a-l afișa pe un ecran.

info

Author: Gabriel-Ioan PAVEL
GitHub Project Link: https://github.com/UPB-PMRust-Students/acs-project-2026-gabrielioanpavel

Description

Ideea proiectului este comunicarea unidirecțională prin cod Morse, implementată la nivel bare-metal. Arhitectura este separată în două noduri complet izolate fizic, comunicarea realizându-se exclusiv prin intermediul frecvenței de 433MHz folosind modularea OOK (On-Off Keying).

  1. Nod emițător - Raspberry Pi Pico: Gestionează interfața cu utilizatorul. Microcontrollerul folosește un pin ADC pentru a citi tensiunea unui potențiometru, mapând valoarea citită pe un index corespunzător unei litere din alfabetul englez. La declanșarea unei întreruperi externe (apăsarea lungă a butonului), litera selectată este codificată în semnale Morse (puncte și linii) și transmisă în eter prin pinul de date al modulului RF.
  2. Nod receptor - STM32: Gestionează captarea, filtrarea și afișarea datelor. Deoarece receptoarele RF de 433MHz generează zgomot alb în absența unui semnal, nodul receptor folosește detecția fronturilor și filtre software bazate pe praguri de timp pentru a izola semnalul util. Odată ce o secvență Morse validă este identificată, aceasta este decodificată și trimisă via SPI către un ecran LCD de 1.44'' pentru afișare.

Logica este realizată cu ajutorul frameworkului embassy pentru a facilita execuția de cod asincron, permițând procesarea non-blocantă a semnalelor radio și actualizarea ecranului fără a recurge la un sistem de operare în timp real complex.

Motivation

Am ales acest proiect din interesul pentru transmiterea semnalelor prin unde radio folosind sisteme integrate, vizând înțelegerea la nivel fizic a comunicațiilor wireless nesecurizate și neprotocolate. Din pasiunea pentru protocoalele de comunicații, am luat decizia de a nu folosi module cu protocoale integrate (precum cele Bluetooth), implementând astfel manual logica de timing, sincronizare și filtrare necesară.

Architecture

  1. Nod emițător
  • Input: Potențiometru conectat la un pin ADC. Se folosește de un filtru trece-jos pentru a reduce zgomotul electric, facilitând maparea valorilor la cele 26 de litere ale alfabetului englez. Un task asincron ascultă și actualizează constant caracterul într-o variabilă.
  • Activare: Un task asincron așteaptă apăsarea lungă a unui buton pentru a transmite litera selectată. Apăsarea scurtă a acestuia activează buzzer-ul care va reprezenta prin sunet codul Morse al literei selectate.
  • Transmisie: Odată ce butonul este apăsat lung, microcontrollerul citește litera și generează timingurile high/low pentru a transmite "punctele" și "liniile", pentru a fi transmise de modulul RF, care are o antenă legată. În timpul transmisiei, un LED verde stă aprins.
  1. Nod receptor
  • Recepție: Modulul receptor RF cu o antenă captează semnalul. Se folosește un divizor de tensiune pentru a coborî tensiunea de 5V de la modul la 3.3V pentru ca semnalul să fie primit de microcontroller printr-un pin GPIO.
  • Decodificare: Un task asincron bazat pe EXTI monitorizează fronturile de semnal pe PA0. Un algoritm de discriminare a duratei impulsurilor clasifică perioadele de high/low în "puncte" (100ms), "linii" (300ms) sau zgomot/pauze, adăugând secvențele valide într-un buffer de decodificare.
  • Afișare: Odată ce un mesaj este decodificat, un task asincron trimite prin interfața SPI caracterul către ecranul de 1.44''.

Log

Week 5 - 11 May

  • Am finalizat ideea arhitecturii și funcționalității celor două noduri.
  • Am actualizat schema nodului de transmisie.
    • (+) LED, rezistență de 220Ohm.
    • (+) Buzzer, tranzistor NPN 2N2222.
    • (/) Potențiometrul și condensatorul aferent sunt acum conectate la AGND, nu la GND.
    • (/) Înlocuit antena de 17.3cm cu YAGEO S432.
  • Am actualizat schema nodului de recepție
    • (/) Înlocuit antena de 17.3cm cu YAGEO S432.
  • Am actualizat documentația.
  • Am lipit toate componentele pe plăcile de testare.

Week 12 - 18 May

Week 19 - 25 May

Hardware

Proiectul folosește două microcontrollere, un ecran SPI, o pereche de module RF, un buzzer, un LED, condensatori și rezistori.

Schematics

nod-tx nod-rx

Bill of Materials

DeviceUsagePrice
Raspberry Pi PicoMicrocontroller pentru emitere32 RON
STM32 Nucleo-U545RE-QMicrocontroller pentru recepție~125 RON
Pereche emițător-receptor RF 433MHzPereche pentru transmisie prin radio9 RON
1.44'' SPI LCDEcran pentru output43 RON
Potențiometru rotativSelectare de litere~10 RON
2x Placă de testare 70x90Plăci pentru cele două noduri2x 3 RON
ANT1204F002R0433AAntene~3 RON
Condensatoare 100nFFiltre trece-jos~0.2 RON / buc.
Rezistențe 220, 1k, 2kDivizor de tensiune + rezistență pentru anumite componente~ 0.15 RON / buc.
Tranzistor 2N2222Tranzistor NPN pentru a comanda buzzerul de la un pin GPIO0.17 RON
BuzzerFeedback selectare caracter1 RON
LED VerdeFeedback transmisie0.39 RON

Software

LibraryDescriptionUsage
embassy-rpFramework async bare-metal pentru RP2040Abstractizare hardware pentru Pico: ADC, GPIO, PWM, timere
embassy-stm32Framework async bare-metal pentru STM32Abstractizare hardware pentru STM32: EXTI, SPI, GPIO, timere
embassy-executorExecutor async pentru sisteme embeddedRularea task-urilor asincrone pe ambele noduri
embassy-timeCeas async pentru sisteme embeddedMăsurarea duratei impulsurilor RF și temporizări non-blocante
embedded-graphicsBibliotecă de grafică 2D pentru sisteme embeddedRandarea textului pe ecranul LCD
mipidsiDriver generic pentru display-uri MIPI DSI/SPIInițializarea și controlul ecranului ST7735S de 1.44''
embedded-hal-busUtilitar pentru partajarea bus-urilor hardwareÎmpachetarea bus-ului SPI cu pinul CS pentru driver-ul mipidsi
static_cellAlocare statică sigură în RustAlocarea buffer-ului de display fără heap și fără static mut