Doom Boy ESP32

Awalan Doom untuk ESP32 lakukan sendiri pada driver MCP23017 untuk tombol-tombol dari UncleRus



Untuk mengantisipasi jam Doom , dewan proyek yang sudah lama berdiri datang. MCP23017 eksternal dan CS4344 eksternal dan banyak hal lainnya diceraikan di papan

tulis.Untuk tombol, port expander MCP23017 yang terhubung melalui I2C digunakan. Baginya ada driver yang bisa Anda dapatkan dari UncleRus .

Upaya telah dilakukan untuk meluncurkan ADC CS4344 eksternal.

Doom oleh Espressif


Setelah mengunduh port, Doom harus mengotak-atik sedikit untuk mengambilnya. Pada akhirnya, semuanya berkumpul dan membanjiri ESP32 tapi ... Saya mengalami kerusakan pada awalnya. Pada Masalah githab proyek saya melihat diskusi yang sama tentang masalah:



Penulis pelabuhan menyarankan untuk membuat
Anda mungkin perlu menggunakan opsi malloc () dan juga mencadangkan sebagian memori untuk DMA. Saya akan melihat apakah saya bisa mendapatkan kompilasi ini pada master dan memperbarui sdkconfig ketika saya punya waktu.
Secara umum, saya "tanpa berpikir dua kali" mengganti semua fungsi alokasi memori porting dengan malloc ().
Demo dimulai. Di depan saya sedang menghubungkan tombol

MCP23017 GPIO extender




MCP23017

Dengan rencana besar untuk memperluas fungsi melalui port controller, saya memutuskan untuk menghemat sedikit pada port input / output dari mikrokontroler itu sendiri dengan menginstal MCP23017. Ini adalah expander sederhana dengan akses ke sinyal input / output melalui antarmuka I2C. Saya tidak menciptakan driver, tetapi hanya mengambilnya dari UncleRus .

Lima tombol menggunakan joystick untuk bernavigasi. Beberapa tombol pada pemotretan dan pemilihan menu. Sebenarnya, ini tidak cukup, Anda masih harus membuka pintu dan bergerak ke kiri dan ke kanan tanpa berputar, yaitu, seperti kepiting. Temuan ditarik ke dalam MCP23017 ke VDD. Kontak ditutup ke tanah. Sangat keren bahwa ada resistor pull-up di dalam rangkaian mikro. Orang masih bisa bingung dengan gangguan dari MCP23017. Ini memiliki dua pin untuk setiap port, INTA dan INTB, tetapi entah bagaimana lain kali.

Daftar lengkap tim
static const JsKeyMap keymap[]={
	{0x10, &key_up},
	{0x40, &key_down},
	{0x80, &key_left},
	{0x20, &key_right},
	
	{0x4000, &key_use},				//cross
	{0x2000, &key_fire},			//circle
	{0x2000, &key_menu_enter},		//circle
	{0x8000, &key_pause},			//square
	{0x1000, &key_weapontoggle},	//triangle

	{0x8, &key_escape},				//start
	{0x1, &key_map},				//select
	
	{0x400, &key_strafeleft},		//L1
	{0x100, &key_speed},			//L2
	{0x800, &key_straferight},		//R1
	{0x200, &key_strafe},			//R2

	{0, NULL},
};


Lebih mudah memotong pemrosesan tombol dari yang saya kira. Saya menurunkan frekuensi I2C untuk meningkatkan stabilitas. Bagaimanapun, 1MHz yang dinyatakan tidak pergi. Frekuensi 100kHz cukup memadai untuk pemungutan suara dalam satu siklus dengan penundaan 20 ms.

CMake


Saya menghabiskan banyak waktu untuk menambahkan CMakeList.txt untuk komponen. Sesuatu tidak bekerja dengan make. Dan saya ingin mengambil SDK segar. Port asli tidak akan mencapai 3.2.x. Mengambil esp-idf-v3.3.1 itu mungkin akan bekerja pada esp-idf-4.0

Suara melalui DAC


Sebenarnya ada garpu lain . Ini fitur SD-CARD yang terhubung dan suara melalui DAC built-in. Port asli dari Espressif memungkinkan Anda untuk memuat file gumpalan hanya ke memori Flash internal program, dan kemudian Anda perlu menggunakan file yang dipotong di mana tidak ada suara!

Skema di sini.

Gagasan untuk menghubungkan DAC eksternal dan bukan DAC bawaan menangkap saya. Setidaknya satu sen dari Cirrus Logic.



Selanjutnya saya mengatur DAC pada CS4344 dan kemudian saya kecewa. Suara bekerja dengan gangguan. Ketika saya melihat file i_sound.c di proyek sayaSaya perhatikan bahwa satu file dma.h tidak digunakan. Seolah-olah ada tautan ke dia, dan dia sendiri, tapi semuanya dikomentari. Mungkin saya menonton dengan penuh perhatian? Tetapi saya pikir penulis juga memperhatikan bahwa ada sesuatu yang salah dengan suara itu dan mencoba untuk menghilangkannya. Mungkin dihilangkan dan tidak memposting komit terakhir. Atau mungkin semuanya berfungsi sebagaimana mestinya pada DAC internal. Namun, Anda dapat mengabaikan distorsi-interupsi untuk mengeluarkan suara melalui DAC bawaan dan ke speaker kecil. Saya bermain-main dengan perubahan kode bitrate dan keseluruhan. Itu tidak membawa apa-apa.

Dan ya, tentang koneksi SD-CARD. Awalnya, saya menggantungnya secara paralel dengan tampilan pada bus SPI, memisahkan secara terpisah sinyal pemilihan chip CS. Gagasan itu gagal. Dengan memberi ventilasi pertanyaan Dukung pembagian bus SD-SPIsampai pada kesimpulan bahwa tidak semua SD-CARD dibuat sama atau tangan saya tidak lurus. Saya harus melepasnya melalui adaptor ke papan, bukan mikrofon. Itu berakhir tanpa pull-up oleh resistor eksternal ke VDD.
Resistor Internal Ditangani

    gpio_set_pull_mode(PIN_NUM_MOSI, GPIO_PULLUP_ONLY);
    gpio_set_pull_mode(PIN_NUM_MISO, GPIO_PULLUP_ONLY);
    gpio_set_pull_mode(PIN_NUM_CLK, GPIO_PULLUP_ONLY);
    gpio_set_pull_mode(PIN_NUM_CS, GPIO_PULLUP_ONLY);


Mengenai hal ini saya berhenti dari pelajaran ini dan memposting kode sumber di GitHub .

Penting untuk membuat edisi lain dari papan sirkuit tercetak. Yang ini tidak bagus!


Tidak ada suara di video.

Dan saya juga memiliki kontak joystick untuk berputar ketika saya menyolder. Secara umum, pancake pertama adalah

UPD kental

saya berhasil membangun suara. Tersentak hadir, tetapi tidak kritis. Perubahan Kode:

spi_lcd.c
dmamem[x]=heap_caps_malloc(MEM_PER_TRANS*2, MALLOC_CAP_DMA);

i_sound.c
void IRAM_ATTR updateTask(void *arg)
{
// size_t bytesWritten;
while(1)
{
I_UpdateSound();
i2s_write(I2S_NUM_0, mixbuffer, SAMPLECOUNT*SAMPLESIZE, &bytesWritten, portMAX_DELAY);
}
}


.dma_buf_count = 2,
.dma_buf_len = 512,


xTaskCreatePinnedToCore(&updateTask, "updateTask", 1000, NULL, 7, NULL, 0);

All Articles