Doom Boy ESP32

Préfixe Doom pour ESP32 bricolage sur le pilote MCP23017 pour les boutons d'UncleRus



En prévision des heures Doom , le conseil d'administration d'un projet de longue date est venu. Les MCP23017 et CS4344 externes et bien d'autres choses sont divorcées sur la carte.

Pour les boutons, l'expandeur de port MCP23017 connecté via I2C est utilisé. Pour lui, il y a un chauffeur que vous pouvez obtenir chez UncleRus .

Une tentative a été effectuée pour lancer un ADC externe CS4344.

Doom par Espressif


Après avoir téléchargé le port, Doom a dû bricoler un peu pour le récupérer. En fin de compte, tout s'est réuni et a inondé ESP32 mais ... J'ai attrapé un crash au début. Sur la question githab du projet, j'ai vu une discussion similaire sur le problème:



l'auteur du port a suggéré de faire
Vous devrez probablement utiliser l'option malloc () et réserver de la mémoire pour DMA. Je vais voir si je peux obtenir cette compilation sur master et mettre à jour le sdkconfig quand j'aurai le temps.
En général, j'ai «sans réfléchir à deux fois» remplacé toutes les fonctions d'allocation de mémoire portées par malloc (). La
démo a commencé. Devant moi se connectait des boutons

Extendeur GPIO MCP23017




MCP23017

Avec de grands plans pour étendre la fonctionnalité via les ports du contrôleur, j'ai décidé d'économiser un peu sur les ports d'entrée / sortie du microcontrôleur lui-même en installant MCP23017. Il s'agit d'un simple expandeur avec accès aux signaux d'entrée / sortie via l'interface I2C. Je n'ai pas inventé le pilote, mais je l'ai simplement pris à UncleRus .

Cinq boutons utilisent le joystick pour naviguer. Quelques boutons sur la prise de vue et la sélection du menu. En fait, cela ne suffit pas, il faut encore ouvrir les portes et se déplacer à gauche et à droite sans tourner, c'est-à-dire comme un crabe. Les résultats sont tirés à l'intérieur du MCP23017 vers VDD. Le contact se ferme à la terre. C'est très cool qu'il y ait des résistances de pull-up à l'intérieur du microcircuit. On pourrait encore être confondu avec des interruptions du MCP23017. Il a deux broches pour chaque port, INTA et INTB, mais en quelque sorte une autre fois.

Liste complète des équipes
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},
};


Il était plus facile de couper le traitement des boutons que je ne le pensais. J'ai abaissé la fréquence de I2C pour améliorer la stabilité. En tout cas, le 1MHz déclaré n'a pas fonctionné. La fréquence de 100 kHz était suffisante pour interroger dans un cycle avec un retard de 20 ms.

CMake


J'ai perdu beaucoup de temps à ajouter CMakeList.txt pour les composants. Quelque chose n'a pas fonctionné avec make. Et je voulais prendre un SDK plus frais. Le port d'origine n'allait même pas à 3.2.x. A pris esp-idf-v3.3.1 cela fonctionnera probablement sur esp-idf-4.0

Son via le DAC


En fait, il y a une autre fourchette . Il dispose d'une carte SD connectée et d'un son via le DAC intégré. Le port d'origine d'Espressif vous permet de charger un fichier wad uniquement dans la mémoire Flash interne des programmes, puis vous devez utiliser un fichier coupé dans lequel il n'y a pas de son!

Le schéma ici.

L'idée de connecter un DAC externe au lieu du DAC intégré m'a captivé. Au moins le sou de Cirrus Logic.



Ensuite, j'ai installé le DAC sur CS4344, puis j'ai été déçu. Le son a fonctionné avec des interruptions. Quand j'ai vu le fichier i_sound.c dans mon projetJ'ai remarqué qu'un fichier dma.h n'est pas utilisé. Comme s'il y avait un lien avec lui, et lui-même l'est, mais tout est commenté. Peut-être que j'ai regardé inattentivement? Mais je pense que l'auteur a également remarqué que quelque chose n'allait pas avec le son et a essayé de l'éliminer. Peut-être éliminé et n'a pas posté le dernier commit. Ou peut-être que tout fonctionne comme il se doit sur le DAC interne. Cependant, vous pouvez négliger les interruptions de distorsion pour diffuser le son via le DAC intégré et vers un petit haut-parleur. J'ai joué avec le bitrate et le changement de code global. Cela n'a rien apporté.

Et oui, concernant la connexion de la SD-CARD. Initialement, je l'ai suspendu en parallèle avec l'affichage sur le bus SPI, en séparant séparément le signal de sélection de la puce CS. L'idée a échoué. En ventilant la question Prise en charge du partage de bus SD-SPIest arrivé à la conclusion que toutes les cartes SD ne sont pas identiques ou que mes mains ne sont pas aussi droites. J'ai dû le dessouder via l'adaptateur à la carte au lieu du microphone. Il a été enroulé sans tractions par des résistances externes au VDD.
Résistances internes gérées

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


À ce sujet, j'ai quitté cette leçon et publié le code source sur GitHub .

Il faudrait faire une autre édition de la carte de circuit imprimé. Celui-ci n'est pas bon!


Il n'y a pas de son sur la vidéo.

Et j'avais aussi un contact par joystick pour tourner quand je soudais. En général, la première crêpe

UPD est grumeleuse

j'ai réussi à établir un son. Les secousses sont présentes, mais pas critiques. Modifications du code:

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