This shows you the differences between two versions of the page.
pm:prj2025:cmoarcas:gheorghe.petrica [2025/05/21 11:21] gheorghe.petrica [Software Design] |
pm:prj2025:cmoarcas:gheorghe.petrica [2025/05/30 09:55] (current) gheorghe.petrica [Rezultate Obţinute] |
||
---|---|---|---|
Line 52: | Line 52: | ||
=== Diagrama Bloc pentru casetofon === | === Diagrama Bloc pentru casetofon === | ||
- | {{:pm:prj2025:cmoarcas:arduino_uno.png?700|}} | + | {{:pm:prj2025:cmoarcas:ImperiumBT.png?700|}} |
=== Schema electrica === | === Schema electrica === | ||
Line 66: | Line 66: | ||
#define CDC_PREFIX1 0x53 | #define CDC_PREFIX1 0x53 | ||
#define CDC_PREFIX2 0x2C | #define CDC_PREFIX2 0x2C | ||
- | |||
#define CDC_END_CMD 0x14 | #define CDC_END_CMD 0x14 | ||
#define CDC_PLAY 0xE4 | #define CDC_PLAY 0xE4 | ||
Line 83: | Line 82: | ||
#define CDC_SFL 0x60 | #define CDC_SFL 0x60 | ||
#define CDC_PLAY_NORMAL 0x08 | #define CDC_PLAY_NORMAL 0x08 | ||
- | |||
#define MODE_PLAY 0xFF | #define MODE_PLAY 0xFF | ||
#define MODE_SHFFL 0x55 | #define MODE_SHFFL 0x55 | ||
#define MODE_SCAN 0x00 | #define MODE_SCAN 0x00 | ||
+ | uint8_t cd, tr, mode; | ||
+ | unsigned long prevMillis = 0; | ||
| | ||
Functia urmatoare **send_package()** trimite un pachet de cate 8 octeti pe SPI, cu intarziere pe fiecare transfer: | Functia urmatoare **send_package()** trimite un pachet de cate 8 octeti pe SPI, cu intarziere pe fiecare transfer: | ||
void send_package(uint8_t c0, uint8_t c1, uint8_t c2, uint8_t c3, uint8_t c4, uint8_t c5, uint8_t c6, uint8_t c7) { | void send_package(uint8_t c0, uint8_t c1, uint8_t c2, uint8_t c3, uint8_t c4, uint8_t c5, uint8_t c6, uint8_t c7) { | ||
- | SPI.beginTransaction(SPISettings(62500, MSBFIRST, SPI_MODE1)); | + | uint8_t data[8] = {c0, c1, c2, c3, c4, c5, c6, c7}; |
- | SPI.transfer(c0); | + | for (int i = 0; i < 8; i++) { |
- | delayMicroseconds(874); | + | SPDR = data[i]; |
- | SPI.transfer(c1); | + | while (!(SPSR & (1 << SPIF))); |
- | delayMicroseconds(874); | + | delayMicroseconds(874); |
- | SPI.transfer(c2); | + | } |
- | delayMicroseconds(874); | + | } |
- | SPI.transfer(c3); | + | |
- | delayMicroseconds(874); | + | Initializam SPI, dupa cum urmeaza, astfel incat sa ruleze cu o viteza de transfer de 62.5kHz |
- | SPI.transfer(c4); | + | void spi_init() { |
- | delayMicroseconds(874); | + | DDRB |= (1 << PB3) | (1 << PB5); |
- | SPI.transfer(c5); | + | DDRB &= ~(1 << PB4); |
- | delayMicroseconds(874); | + | SPCR = (1 << SPE) | (1 << MSTR) | (1 << SPR1) | (1 << SPR0); |
- | SPI.transfer(c6); | + | SPSR &= ~(1 << SPI2X); |
- | delayMicroseconds(874); | + | |
- | SPI.transfer(c7); | + | |
- | SPI.endTransaction(); | + | |
} | } | ||
Line 117: | Line 114: | ||
Serial.begin(9600); | Serial.begin(9600); | ||
#endif | #endif | ||
- | delay(1000); // wait for radio to boot | + | delay(1000); |
- | // Init SPI for Arduino Uno (uses default pins) | + | spi_init(); |
- | SPI.begin(); // uses hardware SPI: SCK(13), MISO(12), MOSI(11) | + | |
send_package(0x74, 0xBE, 0xFE, 0xFF, 0xFF, 0xFF, 0x8F, 0x7C); // idle | send_package(0x74, 0xBE, 0xFE, 0xFF, 0xFF, 0xFF, 0x8F, 0x7C); // idle | ||
delayMicroseconds(10000); | delayMicroseconds(10000); | ||
Line 134: | Line 130: | ||
void loop() { | void loop() { | ||
if ((millis() - prevMillis) > 50) { | if ((millis() - prevMillis) > 50) { | ||
- | // disc trk min sec | ||
send_package(0x34, 0xBF ^ cd, 0xFF ^ tr, 0xFF, 0xFF, mode, 0xCF, 0x3C); | send_package(0x34, 0xBF ^ cd, 0xFF ^ tr, 0xFF, 0xFF, mode, 0xCF, 0x3C); | ||
- | prevMillis = millis(); // reset timer | + | prevMillis = millis(); |
#ifdef DEBUG | #ifdef DEBUG | ||
Serial.println("Sent packet"); | Serial.println("Sent packet"); | ||
Line 283: | Line 279: | ||
<note tip> | <note tip> | ||
- | Care au fost rezultatele obţinute în urma realizării proiectului vostru. | + | Rezultatele obtinute au fost destul de satisfacatoare, am intampinat cateva probleme pe care nu am putut sa le rezolv din cauza DAC-ului ales, deoarece acesta are nevoie de un master clock extern care sa fie sincron cu celelalte semnale de pe ele, iar ESP-ul nu este capabil de a oferi corect un astfel de semnal, generand destul de mult zgomot (cred ca un MAX98357 ar fi rezolvat problema zgomotului). Rezultatul final poate fi observat in urmatorul link: |
- | </note> | + | https://drive.google.com/file/d/1erp1HS01shDhwGrpYLM5Av1lJeFgSRbM/view?usp=sharing |
- | + | ||
- | ===== Concluzii ===== | + | |
- | + | ||
- | ===== Download ===== | + | |
- | + | ||
- | <note warning> | + | |
- | O arhivă (sau mai multe dacă este cazul) cu fişierele obţinute în urma realizării proiectului: surse, scheme, etc. Un fişier README, un ChangeLog, un script de compilare şi copiere automată pe uC crează întotdeauna o impresie bună ;-). | + | |
- | + | ||
- | Fişierele se încarcă pe wiki folosind facilitatea **Add Images or other files**. Namespace-ul în care se încarcă fişierele este de tipul **:pm:prj20??:c?** sau **:pm:prj20??:c?:nume_student** (dacă este cazul). **Exemplu:** Dumitru Alin, 331CC -> **:pm:prj2009:cc:dumitru_alin**. | + | |
- | </note> | + | |
- | + | ||
- | ===== Jurnal ===== | + | |
- | + | ||
- | <note tip> | + | |
- | Puteți avea și o secțiune de jurnal în care să poată urmări asistentul de proiect progresul proiectului. | + | |
</note> | </note> | ||
===== Bibliografie/Resurse ===== | ===== Bibliografie/Resurse ===== | ||
- | <note> | + | https://github.com/NullString1/VWCDC |
- | Listă cu documente, datasheet-uri, resurse Internet folosite, eventual grupate pe **Resurse Software** şi **Resurse Hardware**. | + | https://schuett.io/2013/09/avr-raspberry-pi-vw-beta-vag-cdc-faker/ |
- | </note> | + | https://itohi.com/acoustics/esp32-as-bluetooth-audio/ |
- | + | ||
- | <html><a class="media mediafile mf_pdf" href="?do=export_pdf">Export to PDF</a></html> | + | |