Doom Boy ESP32. Iterasi kedua

Tanpa menunggu papan DoomWatch , saya membuat pesanan baru dengan pengiriman Fedex. Kali ini saya membagi papan di KiCad. Anehnya, Kicad bahkan lebih menyukai Eagle AutoDesk







. Tujuan utamanya adalah untuk mencoba melepaskan chip esp32d0wdq6. Bukan modul selesai itu sendiri, tetapi sirkuit mikro terpisah dengan Flash dan PSRAM terpisah. Bagaimana itu dilakukan dan bekerja, dengan demo video, baca dan lihat lebih jauh



Di sini Anda dapat membaca tentang iterasi pertama papan



Boot



Log Booting
rst:0x1 (POWERON_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)

configsip: 0, SPIWP:0xee

clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00

mode:DIO, clock div:2

load:0x3fff0030,len:4

load:0x3fff0034,len:7076

load:0x40078000,len:14600

load:0x40080400,len:4160

0x40080400: _init at ??:?



entry 0x40080684

I (28) boot: ESP-IDF v4.2-dev-2243-gcf056a7d0-dirty 2nd stage bootloader

I (29) boot: compile time 18:51:57

I (30) boot: chip revision: 1

I (33) boot_comm: chip revision: 1, min. bootloader chip revision: 0

I (52) boot.esp32: SPI Speed: 40MHz

I (53) boot.esp32: SPI Mode: DIO

I (53) boot.esp32: SPI Flash Size: 8MB

I (56) boot: Enabling RNG early entropy source…

I (62) boot: Partition Table:

I (65) boot: ## Label Usage Type ST Offset Length

I (73) boot: 0 factory factory app 00 00 00010000 000e8000

I (80) boot: 1 wifidata WiFi data 01 02 000fc000 00004000

I (88) boot: 2 wad unknown 42 06 00100000 004f4000

I (95) boot: End of partition table

I (99) boot_comm: chip revision: 1, min. application chip revision: 0

I (106) esp_image: segment 0: paddr=0x00010020 vaddr=0x3f400020 size=0x38f98 (233368) map

I (216) esp_image: segment 1: paddr=0x00048fc0 vaddr=0x3ffb0000 size=0x07058 ( 28760) load

I (230) esp_image: segment 2: paddr=0x00050020 vaddr=0x400d0020 size=0x86370 (549744) map

0x400d0020: _stext at ??:?



I (468) esp_image: segment 3: paddr=0x000d6398 vaddr=0x3ffb7058 size=0x04ec4 ( 20164) load

I (478) esp_image: segment 4: paddr=0x000db264 vaddr=0x40080000 size=0x00404 ( 1028) load

0x40080000: _WindowOverflow4 at /esp/v3.3.2/esp-idf/components/freertos/xtensa/xtensa_vectors.S:1730



I (479) esp_image: segment 5: paddr=0x000db670 vaddr=0x40080404 size=0x12b7c ( 76668) load

I (538) boot: Loaded app from partition at offset 0x10000

I (538) boot: Disabling RNG early entropy source…

I (549) psram: This chip is ESP32-D0WD

I (551) spiram: Found 64MBit SPI RAM device

I (551) spiram: SPI RAM mode: flash 40m sram 40m

I (555) spiram: PSRAM initialized, cache is in low/high (2-core) mode.

I (562) cpu_start: Pro cpu up.

I (566) cpu_start: Starting app cpu, entry point is 0x4008191c

0x4008191c: start_cpu0_default at /esp/v3.3.2/esp-idf/components/esp32/cpu_start.c:466



I (0) cpu_start: App cpu up.

I (1454) spiram: SPI SRAM memory test OK

I (1462) cpu_start: Pro cpu start user code

I (1462) cpu_start: Application information:

I (1462) cpu_start: Project name: esp32_doom

I (1466) cpu_start: App version: 085f21b-dirty

I (1472) cpu_start: Compile time: Jul 26 2020 18:51:49

I (1478) cpu_start: ELF file SHA256: 9166eca39a0109f9…

I (1484) cpu_start: ESP-IDF: v4.2-dev-2243-gcf056a7d0-dirty

I (1491) heap_init: Initializing. RAM available for dynamic allocation:

I (1498) heap_init: At 3FFAE6E0 len 00001920 (6 KiB): DRAM

I (1504) heap_init: At 3FFCF628 len 000109D8 (66 KiB): DRAM

I (1511) heap_init: At 3FFE0440 len 00003AE0 (14 KiB): D/IRAM

I (1517) heap_init: At 3FFE4350 len 0001BCB0 (111 KiB): D/IRAM

I (1524) heap_init: At 40092F80 len 0000D080 (52 KiB): IRAM

I (1530) spiram: Adding pool of 4096K of external SPI memory to heap allocator

I (1539) spi_flash: detected chip: generic

I (1543) spi_flash: flash io: dio

I (1548) cpu_start: Starting scheduler on PRO CPU.

I (0) cpu_start: Starting scheduler on APP CPU.

I (1557) spiram: Reserving pool of 32K of internal memory for DMA/internal allocations





KiCad PCB



Di KiCad, menurut saya lebih mudah. Untuk seleraku, tentu saja. Sedikit berbeda dengan Eagle Autodesk. Nilai tambah utama adalah tidak ada batasan jumlah biaya jika Anda tidak ingin membayar lisensi. Izinkan saya mengingatkan Anda bahwa Eagle memiliki batas ukuran 100x80mm untuk pengembangan gratis. Jika biayanya lebih besar, Anda harus membayar lisensi tahunan. Menurut saya, ada juga batasan jumlah lapisan







Saya tidak bisa melihat Tampilan 3D di Eagle. Eagle Fusion 360 perlu diinstal. Di Kicad, ini adalah item menu yang terpisah. Meskipun saya mungkin tidak melihat ke sana. Secara umum, kami dapat mengatakan sepenuhnya beralih ke KiCad, membagi



semuanya menjadi modul, meninggalkan di halaman utama apa yang terkait langsung dengan ESP32. Chip itu sendiri dan memori





Kesalahan



Saya menggambar papan itu dalam jeda. Akibatnya, saya lupa mengeluarkan GPIO0. Saya membawanya ke DAC eksternal sebagai MCCLK, tetapi saya lupa membawanya ke tombol mode boot. Saya harus merobek pernis dari jalur penyolderan untuk keluaran tombol. Juga, resistor di sirkuit kuarsa diatur ke XTAL_N dan di manual perlu XTAL_P. Saya menggantung resistor beberapa ohm, tetapi mungkin untuk melempar jumper.



Alamat dan Reset resistor untuk MCP23017 tidak bercerai. Chip dapat diatur ke alamat I2C dengan tiga pin. 0x20h saat ketiga pin berada di tanah. Semua karena saya tidak menentukan FootPrint,



saya tidak memperhatikan kesalahannya

Kesalahan: Tidak dapat menambahkan R10 (tidak ada footprint yang ditetapkan).

Kesalahan: Tidak dapat menambahkan R9 (tidak ada footprint yang ditetapkan)




I2C bingung untuk ES8374. Terkadang itu terjadi. Pada prinsipnya, dapat digunakan dengan mengganti pin 21 -> 22 dan 22 -> 21. Atau potong jalurnya dan kikis pernisnya, seperti yang biasa kita lakukan dengan TX RX Uart (Senyum sedih)







Anehnya, setelah menyolder ESP32 dan FLASH, papan mulai menyala tanpa masalah. Tapi, setelah meletakkan SPRAM, saya mendapat reboot tanpa akhir. Ternyata itu adalah kekurangan makanan yang dangkal. Saya akan mencari jika ESP32 tidak disolder!







Multiplexer MCP23017



Memberikan kemungkinan polling alternatif tombol baik melalui multiplexer MCP23017 dan menggunakan DAC. Di pembagi resistif. Jika multiplekser tidak memungkinkan, Anda dapat menggunakan ADC internal. Dengan level voltase pada input GPIO34, Anda dapat mendeteksi penekanan tombol. Kekurangannya adalah tidak mungkin untuk mengumpulkan beberapa tombol pada waktu yang bersamaan. Plus, masing-masing, bahwa tidak diperlukan sirkuit mikro tambahan. Hanya beberapa resistor



Multiplexer memiliki 2 port 8 pin. Satu port, dalam kasus kami, dapat dikonfigurasi sebagai output dan LED dapat digantung padanya. Saya ingin menyediakan kedipan jika masa pakai kurang dari 20% atau kartrid habis. Kemudian Anda bisa bermain tanpa panel. Ternyata itu terwujud. Satu LED hijau tetap ada. Jika tidak ada musuh di ruangan atau di garis pandang, Anda bisa menerangi







Benang indikator kesehatan dan amunisi
void ledTask(void *arg){

    while(1){
            p = &players[cur_player];

            if (p->mo != NULL && p->mo->health < 20) {
                mcp23x17_set_level(&dev, 9, on);
            } else {
                mcp23x17_set_level(&dev, 9, true);
            }

            if(p->ammo[weaponinfo[p->readyweapon].ammo] < 5){
              mcp23x17_set_level(&dev, 10, on);
            } else {
              mcp23x17_set_level(&dev, 10, true);
            }

            printf("p->ammo[am_clip] = %d\n", p->ammo[weaponinfo[p->readyweapon].ammo]);

            if (p->mo != NULL) {
                printf("p->mo->health = %d \n", p->mo->health);
            }

            printf("Ammo N = %d\n", weaponinfo[p->readyweapon].ammo);

             on = !on;
             vTaskDelay(1000/portTICK_PERIOD_MS);
    }
}






Chip audio ES8374



Untuk suara, saya menggunakan ES8374 sebagai DAC dan ADC. Sirkuit mikro berisi penguat frekuensi rendah built-in ~ 1,25 Watt. Ini didukung langsung oleh Espressif Audio Development Framework . Dalam paket kecil QFN-28, kami mendapatkan Mono DAC, ADC untuk mikrofon, dan ULF dengan dukungan SDK. Apa yang dibutuhkan untuk perangkat seperti itu





Meluncurkan Speaker BT dari contoh pipeline_bt_sink



Saya mengambil papan lyrat_v4_3 dalam pengaturan. Memperbaiki codec pada AUDIO_CODEC_ES8374_DEFAULT_HANDLE

port GPIO yang dikonfigurasi

esp_err_t get_i2s_pins(i2s_port_t port, i2s_pin_config_t *i2s_config)
{
    AUDIO_NULL_CHECK(TAG, i2s_config, return ESP_FAIL);
    if (port == I2S_NUM_0 || port == I2S_NUM_1) {
        i2s_config->bck_io_num = GPIO_NUM_18;
        i2s_config->ws_io_num = GPIO_NUM_26;
        i2s_config->data_out_num = GPIO_NUM_27;
        i2s_config->data_in_num = GPIO_NUM_35;
    } else {
        memset(i2s_config, -1, sizeof(i2s_pin_config_t));
        ESP_LOGE(TAG, "i2s port %d is not supported", port);
        return ESP_FAIL;
    }
    return ESP_OK;
}


Dan membuang inisialisasi audio_board_key_init dan audio_board_led_init. Dengan yang benar, Anda perlu menentukan papan kustom Anda



Giroskop L3GD20



Saya memutuskan untuk menambahkan giroskop L3GD20. Fitur yang menarik adalah dapat dihubungkan sebagai perangkat SPI atau I2C. R27, R28 dalam hal koneksi melalui I2C mengatur alamatnya

// Alamat L3GD20H

# tentukan L3GD20H_I2C_ADDRESS_1 0x6a // Pin SDO rendah

# tentukan L3GD20H_I2C_ADDRESS_2 0x6b // Pin SDO tinggi
Ada perpustakaan di GitHub l3gd20h-esp-idf





Jadi, kami memiliki 3 perangkat di I2C. Kontrol ADC-DAC ES8374, tombol pada MCP23017 dan L3GD20 itu sendiri. Meluncurkan ketiganya



i2cdetect
i2c-tools> i2cdetect

0 1 2 3 4 5 6 7 8 9 a b c d e f

00: β€” -- β€” -- β€” -- β€” -- β€” -- β€” -- β€” -- β€” --

10: 10 β€” -- β€” -- β€” -- β€” -- β€” -- β€” -- β€” -- β€”

20: β€” -- β€” -- 24 β€” -- β€” -- β€” -- β€” -- β€” -- β€”

30: β€” -- β€” -- β€” -- β€” -- β€” -- β€” -- β€” -- β€” --

40: β€” -- β€” -- β€” -- β€” -- β€” -- β€” -- β€” -- β€” --

50: β€” -- β€” -- β€” -- β€” -- β€” -- β€” -- β€” -- β€” --

60: β€” -- β€” -- β€” -- β€” -- β€” -- 6a β€” -- β€” -- β€”

70: β€” -- β€” -- β€” -- β€” -- β€” -- β€” -- β€” -- β€” --





Namun untuk beberapa alasan, L3GD20 tidak memberikan koordinat. WHO_AM_I menjawab 0xd4 dengan benar. sudut tidak berubah. Saya tidak memiliki kapasitor C1 - 10nF, saya mencoba meletakkannya, yang menemukan 100nF terdekat. Saya pikir meskipun dia berbohong, tetapi tampaknya konverter internal tidak mulai. Dan ini penting



i2cdump
i2c-tools> i2cdump -c 0x6a

0 1 2 3 4 5 6 7 8 9 a b c d e f 0123456789abcdef

00: b6 5e 81 fc 05 50 31 83 c4 f9 85 d0 48 c6 00 d4 ?^???P1?????H?.?

10: 1a 15 16 ea c0 b9 4f 72 07 d8 a1 21 a1 00 14 02 ??????Or???!?.??

20: 07 00 00 80 00 00 0c 00 1a 00 13 00 16 00 00 20 ?..?..?.?.?.?..

30: 00 00 00 00 00 00 00 00 00 05 00 00 00 00 00 00 .........?..

40: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00…

50: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00…

60: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00…

70: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00…





Menampilkan 18 pin ILI9341







Menghitung arus lampu latar sebagai berikut. Membutuhkan 90mA. Karena penurunan transistor terbuka adalah ~ 0,7V, catu daya untuk lampu latar LED adalah 3,3V - 0,7V = 2,6V. Dan menurut Hukum Ohm 2.6V / 0.090A = 28.8 Ohm. Mengirimkan 47 Ohm. Ternyata agak gelap. Ini akan diperlukan untuk mengurangi resistensi





, dan Touch XPT2046TS dipisahkan. Pin SPI digantung sejajar dengan layar. XPT_CS ditampilkan pada pin terpisah. Ada keraguan bahwa itu akan berhasil. Jika tampilan tidak dimulai, saya akan melakukan eksperimen. Untuk konsol, itu tidak terlalu dibutuhkan. Mengambil dari contoh







Demo



Meluncurkan demo LVGL. Dalam contoh pengaturan, saya mencoba mengatur 40MHz untuk bus SPI. Contoh bekerja sedikit lebih cepat daripada video







Tapi Doom mulai dan bekerja secara stabil hanya pada 32MHz. Meskipun 26MHz untuk ILI9341 sudah dianggap overclocking

spi_device_interface_config_t devcfg={
        .clock_speed_hz=26000000,               //Clock out at 26 MHz. Yes, that's heavily overclocked.
        .mode=0,                                //SPI mode 0
        .spics_io_num=PIN_NUM_CS,               //CS pin
        .queue_size=NO_SIM_TRANS,               //We want to be able to queue this many transfers
        .pre_cb=ili_spi_pre_transfer_callback,  //Specify pre-transfer callback to handle D/C line
    };








Kesimpulan



Port ESP32 I / O tidak selalu cukup untuk memuat secara maksimal. Dalam hal ini, STM32 terlihat lebih menarik. Tetapi tidak memiliki dukungan Wi-Fi bawaan .



Kesimpulannya, saya perhatikan bahwa perangkat dapat menjalankan emulator Nintendo ESP32-NESEMU, dan emulator Nintendo Entertainment System untuk ESP32.

Saya memesan Konsol Game dengan Ali. Akan menarik untuk melihat apa yang ada di dalamnya. Mungkin ESP32 juga







Saya menantikan diskusi dan saran di komentar.



All Articles