Doom Boy ESP32. Deuxième itération

Sans attendre le tableau DoomWatch , j'ai passé une nouvelle commande avec livraison Fedex. Cette fois, j'ai divisé les planches dans KiCad. Curieusement, Kicad aimait encore plus Eagle AutoDesk.







L'objectif principal était d'essayer de dessouder la puce esp32d0wdq6. Pas le module fini lui-même, mais un microcircuit séparé avec un flash et une PSRAM séparés. Comment c'est fait et fonctionne, avec des démos vidéo, lisez et regardez plus loin



Ici vous pouvez en savoir plus sur la première itération du tableau



DĂ©marrage



Journal de démarrage
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





PCB KiCad



Dans KiCad, il m'a semblé que tout était plus facile. A mon goût, bien sûr. Légèrement différent d'Eagle Autodesk. Le principal avantage est qu'il n'y a pas de limite sur le montant des frais si vous ne souhaitez pas payer pour une licence. Permettez-moi de vous rappeler que Eagle a une limite de taille de 100x80mm pour le développement gratuit. Si les frais sont plus élevés, vous devez payer une licence annuelle. À mon avis, il y a aussi une limite sur le nombre de couches







Je ne pouvais pas voir la vue 3D dans Eagle. Il est nécessaire d'installer Eagle Fusion 360. Dans Kicad, il s'agit d'un élément de menu distinct. Bien que je n'y ai peut-être pas regardé. En général, nous pouvons dire complètement basculé vers KiCad.Le



tout divisé en modules, laissant sur la page principale ce qui est directement lié à ESP32. La puce elle-même et la mémoire





les erreurs



J'ai dessiné le tableau par pauses. En conséquence, j'ai oublié de sortir GPIO0. Je l'ai apporté à un DAC externe en tant que MCCLK, mais j'ai oublié de l'amener sur le bouton de mode de démarrage. J'ai dû arracher le vernis de la piste de soudure pour la sortie du bouton. De plus, la résistance du circuit à quartz a été réglée sur XTAL_N et dans le manuel, il est nécessaire de XTAL_P. J'ai accroché une résistance de plusieurs ohms, mais il était possible de lancer un cavalier.Les



résistances Address et Reset du MCP23017 n'ont pas divorcé. La puce peut être réglée sur l'adresse I2C avec trois broches. 0x20h lorsque les trois broches sont au sol. Tout cela parce que je n'ai pas spécifié FootPrint



je n'ai pas fait attention Ă  l'erreur

Erreur: impossible d'ajouter R10 (aucune empreinte affectée).

Erreur: impossible d'ajouter R9 (aucune empreinte affectée)




I2C confus pour ES8374. Des fois ça arrive. En principe, il peut être utilisé en commutant les broches 21 -> 22 et 22 -> 21. Ou coupez les pistes et grattez le vernis, eh bien, comme nous le faisions habituellement avec TX RX Uart (sourire triste)







Étonnamment, après avoir soudé ESP32 et FLASH, la carte a démarré sans aucun problème. Mais, après avoir mis SPRAM, j'ai eu un redémarrage sans fin. Cela s'est avéré être un manque de nourriture banal. Je chercherais si l'ESP32 n'est pas soudé!







Multiplexeur MCP23017



Fournit la possibilité d'une interrogation alternative des boutons à la fois via le multiplexeur MCP23017 et en utilisant le DAC. Sur un diviseur résistif. S'il n'est pas possible de mettre un multiplexeur, vous pouvez utiliser l'ADC interne. Par le niveau de tension à l'entrée GPIO34, vous pouvez détecter une pression sur un bouton. L'inconvénient est qu'il est impossible d'interroger plusieurs boutons en même temps. De plus, respectivement, aucun microcircuit supplémentaire n'est nécessaire. Seulement quelques résistances Le



multiplexeur dispose de 2 ports de 8 broches. Un port, dans notre cas, peut être configuré comme sortie et des LED peuvent être accrochées dessus. Je voulais prévoir un clignotement si la durée de vie est inférieure à 20% ou si les cartouches sont épuisées. Ensuite, vous pouvez jouer sans le panneau. Cela s'est avéré être réalisé. Une LED verte reste. S'il n'y a pas d'ennemis dans la pièce ou en ligne de vue, vous pouvez éclairer







Fil de l'indicateur de santé et de munitions
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);
    }
}






Puce audio ES8374



Pour le son, j'ai utilisé ES8374 comme DAC et ADC. Le microcircuit contient un amplificateur basse fréquence intégré ~ 1,25 Watt. Il est pris en charge par le framework de développement audio Espressif . Dans un petit boîtier QFN-28, nous obtenons Mono DAC, ADC pour microphone et ULF avec prise en charge du SDK. Ce qui est nécessaire pour un tel appareil.





Lancement de BT Speaker Ă  partir de l'exemple pipeline_bt_sink .



J'ai pris la carte lyrat_v4_3 dans les paramètres. Codec fixe sur les

ports GPIO configurés AUDIO_CODEC_ES8374_DEFAULT_HANDLE

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;
}


Et jeté l'initialisation de audio_board_key_init et audio_board_led_init. Par le bon, vous devez déterminer votre tableau personnalisé



Gyroscope L3GD20



J'ai décidé d'ajouter un gyroscope L3GD20. Une caractéristique intéressante est qu'il peut être connecté en tant que périphérique SPI ou I2C. R27, R28 en cas de connexion via I2C régler l'adresse

// Adresses L3GD20H

#define L3GD20H_I2C_ADDRESS_1 0x6a // La broche SDO est basse

#define L3GD20H_I2C_ADDRESS_2 0x6b // La broche SDO est haute
Sur GitHub il y a une librairie l3gd20h-esp-idf





Ainsi, nous avons 3 appareils sur I2C. Contrôle ADC-DAC ES8374, boutons sur MCP23017 et L3GD20 lui-même. Lancé les trois



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: — -- — -- — -- — -- — -- — -- — -- — --





Mais pour une raison quelconque, L3GD20 ne donne pas de coordonnées. WHO_AM_I répond correctement avec 0xd4. les angles ne changent pas. Je n'ai pas de condensateur C1 - 10nF, j'ai essayé de le mettre, qui a trouvé le 100nF le plus proche. Je pensais même s'il mentait, mais il semble que le convertisseur interne ne démarre pas. Et c'est important



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…





Affichage 18 broches ILI9341







Calculé le courant de rétroéclairage comme suit. Nécessite 90mA. Étant donné que la chute à travers le transistor ouvert est de ~ 0,7 V, l'alimentation des LED de rétroéclairage est de 3,3 V - 0,7 V = 2,6 V Et selon la loi d'Ohm 2,6V / 0,090A = 28,8 Ohm. Livré 47 Ohm. Il s'est avéré un peu sombre. Il faudra réduire la résistance.En





outre, le Touch XPT2046TS a été séparé. Les broches SPI sont suspendues en parallèle avec l'écran. XPT_CS est affiché sur une broche séparée. Il y a un doute que cela fonctionnera. Si l'écran n'avait pas démarré, j'aurais fait des expériences. Pour la console, ce n'est pas particulièrement nécessaire. Pris de l'exemple







DĂ©mos



Lancement de la démo LVGL. Dans les paramètres d'exemple, j'ai essayé de définir 40 MHz pour le bus SPI. L'exemple a fonctionné un peu plus vite que la vidéo







Mais Doom a démarré et n'a fonctionné de manière stable qu'à 32 MHz. Bien que 26 MHz pour ILI9341 soit déjà considéré comme un 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
    };








Conclusion



Les ports d'E / S ESP32 ne sont pas toujours suffisants pour bourrer au maximum. À cet égard, STM32 semble plus attrayant. Mais il n'a pas de support Wi-Fi intégré.



En conclusion, je note que l'appareil peut exécuter l'émulateur Nintendo ESP32-NESEMU et l'émulateur Nintendo Entertainment System pour l'ESP32.

J'ai commandé la console de jeu avec Ali. Ce sera intéressant de voir ce qu'il y a à l'intérieur. Peut-être aussi ESP32







J'attends avec impatience la discussion et les conseils dans les commentaires.



All Articles