Doom Boy ESP32

Doom prefijo para ESP32 hágalo usted mismo en el controlador MCP23017 para botones de UncleRus



En previsión de las horas de Doom , llegó la junta de un proyecto de larga data. El MCP23017 externo y el CS4344 y muchas otras cosas están divorciados en la placa.

Para los botones, se utiliza el expansor de puerto MCP23017 conectado a través de I2C. Para él hay un controlador que puede obtener de UncleRus .

Se intentó lanzar un ADC CS4344 externo.

Doom de Espressif


Después de descargar el puerto, Doom tuvo que jugar un poco para recogerlo. Al final, todo se unió y se inundó en ESP32 pero ... me sorprendí al principio. En el tema de githab del proyecto, vi una discusión similar sobre el problema:



el autor del puerto sugirió hacer
Probablemente necesite usar la opción malloc (), así como reservar algo de memoria para DMA. Veré si puedo obtener esta compilación en master y actualizar el sdkconfig cuando tenga tiempo.
En general, "sin pensarlo dos veces" reemplacé todas las funciones de asignación de memoria portadas con malloc (). La
demostración comenzó. Delante de mí estaba conectando botones

Extensor GPIO MCP23017




MCP23017

Con grandes planes para expandir la funcionalidad a través de los puertos del controlador, decidí ahorrar un poco en los puertos de entrada / salida del microcontrolador instalando MCP23017. Es un expansor simple con acceso a señales de entrada / salida a través de la interfaz I2C. No inventé el controlador, sino que simplemente lo tomé de UncleRus .

Cinco botones usan el joystick para navegar. Un par de botones en la toma y selección de menú. De hecho, esto no es suficiente, aún tiene que abrir las puertas y moverse hacia la izquierda y hacia la derecha sin girar, es decir, como un cangrejo. Los hallazgos se extraen dentro del MCP23017 a VDD. El contacto se cierra a tierra. Es genial que haya resistencias pull-up dentro del microcircuito. Todavía se puede confundir con las interrupciones del MCP23017. Tiene dos pines para cada puerto, INTA e INTB, pero de alguna manera en otro momento.

Lista completa de equipos
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},
};


Fue más fácil cortar el procesamiento de botones de lo que pensaba. Bajé la frecuencia de I2C para mejorar la estabilidad. En cualquier caso, el 1MHz declarado no fue. La frecuencia de 100 kHz fue suficiente para sondear en un ciclo con un retraso de 20 ms.

CMake


Perdí mucho tiempo agregando CMakeList.txt para componentes. Algo no funcionó con make. Y quería tomar un SDK más fresco. El puerto original ni siquiera iba a 3.2.x. Tomó esp-idf-v3.3.1 probablemente funcionará en esp-idf-4.0

Sonido a través del DAC


En realidad hay otro tenedor . Cuenta con una tarjeta SD conectada y sonido a través del DAC incorporado. El puerto original de Espressif le permite cargar un archivo wad solo en la memoria Flash interna de los programas, ¡y luego necesita usar un archivo cortado en el que no hay sonido!

El esquema aquí

La idea de conectar un DAC externo en lugar del DAC incorporado me capturó. Al menos el centavo de Cirrus Logic.



Luego configuré el DAC en CS4344 y luego me decepcionó. El sonido funcionó con interrupciones. Cuando vi el archivo i_sound.c en mi proyectoNoté que no se usa un archivo dma.h. Como si hubiera un vínculo con él, y él mismo lo es, pero todo está comentado. Tal vez vi sin prestar atención? Pero creo que el autor también notó que algo estaba mal con el sonido y trató de eliminarlo. Quizás eliminado y no publicó el último commit. O tal vez todo funciona como debería en el DAC interno. Sin embargo, puede descuidar las interrupciones de distorsión para emitir sonido a través del DAC incorporado y a un pequeño altavoz. Jugué con bitrate y cambio de código general. No trajo nada.

Y sí, con respecto a la conexión de SD-CARD. Inicialmente, lo colgué en paralelo con la pantalla del bus SPI, separando por separado la señal de selección del chip CS. La idea falló. Al ventilar la pregunta , admite el uso compartido del bus SD-SPILlegué a la conclusión de que no todas las tarjetas SD están hechas de la misma manera o que mis manos no son tan rectas. Tuve que soldarlo a través del adaptador a la placa en lugar del micrófono. Fue enrollado sin pull-ups por resistencias externas a VDD.
Resistencias internas manejadas

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


En esto dejé esta lección y publiqué el código fuente en GitHub .

Sería necesario hacer otra edición de la placa de circuito impreso. Este no es bueno!


No hay sonido en el video.

Y también tuve un contacto de joystick para girar cuando soldaba. En general, el primer panqueque tiene bultos

UPD

. Logré establecer un sonido. Los idiotas están presentes, pero no son críticos. Cambios de código:

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