Doom Boy ESP32

Doom-Präfix für ESP32 Do-it-yourself im MCP23017-Treiber für Schaltflächen von UncleRus



In Erwartung der Doom-Stunden kam der Vorstand eines langjährigen Projekts. Der externe MCP23017 und CS4344 und viele andere Dinge sind auf der Platine geschieden.

Für Tasten wird der über I2C angeschlossene MCP23017-Port-Expander verwendet. Für ihn gibt es einen Treiber, den Sie von UncleRus bekommen können .

Es wurde versucht, einen externen ADC CS4344 zu starten.

Doom von Espressif


Nachdem Doom den Port heruntergeladen hatte, musste er ein wenig basteln, um ihn zu sammeln. Am Ende kam alles zusammen und flutete in ESP32, aber ... ich hatte am Anfang einen Absturz. In der Githab-Ausgabe des Projekts sah ich eine ähnliche Diskussion des Problems:



Der Autor des Hafens schlug vor, dies zu tun
Sie müssen wahrscheinlich die Option malloc () verwenden und Speicher für DMA reservieren. Ich werde sehen, ob ich diese Kompilierung auf Master bekommen und die sdkconfig aktualisieren kann, wenn ich Zeit habe.
Im Allgemeinen habe ich „ohne nachzudenken“ alle portierten Speicherzuweisungsfunktionen durch malloc () ersetzt. Die
Demo wurde gestartet. Vor mir verband ich Knöpfe

MCP23017 GPIO Extender




MCP23017

Mit großen Plänen zur Erweiterung der Funktionalität über die Controller-Ports habe ich beschlossen, durch die Installation von MCP23017 ein wenig an den Eingangs- / Ausgangsports des Mikrocontrollers selbst zu sparen. Es ist ein einfacher Expander mit Zugriff auf Eingangs- / Ausgangssignale über die I2C-Schnittstelle. Ich habe den Treiber nicht erfunden, sondern ihn einfach von UncleRus übernommen .

Fünf Tasten verwenden den Joystick zum Navigieren. Ein paar Tasten auf der Aufnahme und Menüauswahl. In der Tat ist dies nicht genug, Sie müssen immer noch die Türen öffnen und sich nach links und rechts bewegen, ohne sich zu drehen, das heißt wie eine Krabbe. Die Ergebnisse werden im MCP23017 auf VDD übertragen. Der Kontakt schließt gegen Masse. Es ist sehr cool, dass sich im Mikrokreis Pull-Up-Widerstände befinden. Man könnte immer noch mit Unterbrechungen vom MCP23017 verwechselt werden. Es hat zwei Pins für jeden Port, INTA und INTB, aber irgendwie ein anderes Mal.

Vollständige Liste der Teams
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},
};


Es war einfacher, die Tastenverarbeitung zu durchbrechen, als ich dachte. Ich habe die Frequenz von I2C gesenkt, um die Stabilität zu verbessern. In jedem Fall ging das deklarierte 1MHz nicht. Die Frequenz von 100 kHz reichte völlig aus, um in einem Zyklus mit einer Verzögerung von 20 ms abzufragen.

CMake


Ich habe viel Zeit beim Hinzufügen von CMakeList.txt für Komponenten verloren. Mit make funktionierte etwas nicht. Und ich wollte ein frischeres SDK nehmen. Der ursprüngliche Port ging nicht einmal auf 3.2.x. Hat esp-idf-v3.3.1 genommen, es wird wahrscheinlich auf esp-idf-4.0 funktionieren

Ton durch den DAC


Eigentlich gibt es noch eine Gabel . Es verfügt über eine angeschlossene SD-CARD und Sound über den eingebauten DAC. Über den ursprünglichen Port von Espressif können Sie eine Wad-Datei nur in den internen Flash-Speicher von Programmen laden. Anschließend müssen Sie eine Schnittdatei verwenden, in der kein Ton zu hören ist.

Das Schema hier

Die Idee, einen externen DAC anstelle des eingebauten DAC anzuschließen, hat mich gefangen genommen. Zumindest der Penny von Cirrus Logic.



Als nächstes habe ich den DAC auf CS4344 eingerichtet und war dann enttäuscht. Der Ton arbeitete mit Unterbrechungen. Als ich die Datei i_sound.c in meinem Projekt sahIch habe festgestellt, dass eine dma.h-Datei nicht verwendet wird. Als ob es eine Verbindung zu ihm gibt und er selbst, aber alles wird kommentiert. Vielleicht habe ich unaufmerksam zugesehen? Aber ich denke, der Autor hat auch bemerkt, dass etwas mit dem Sound nicht stimmt und versucht, ihn zu beseitigen. Möglicherweise beseitigt und das letzte Commit nicht veröffentlicht. Oder vielleicht funktioniert alles so, wie es auf dem internen DAC sollte. Sie können jedoch Verzerrungsunterbrechungen vernachlässigen, um Ton über den eingebauten DAC und über einen winzigen Lautsprecher auszugeben. Ich habe mit der Bitrate und der allgemeinen Codeänderung herumgespielt. Es brachte nichts.

Und ja, bezüglich des Anschlusses von SD-CARD. Anfangs habe ich es parallel zum Display am SPI-Bus aufgehängt und das CS-Chip-Auswahlsignal separat getrennt. Die Idee ist gescheitert. Durch Lüften der Frage Unterstützung der SD-SPI-Busfreigabekam zu dem Schluss, dass nicht alle SD-Karten gleich sind oder meine Hände nicht so gerade sind. Ich musste es durch den Adapter auf die Platine anstelle des Mikrofons entlöten. Es wurde ohne Klimmzüge durch externe Widerstände gegen VDD aufgewickelt.
Interne Widerstände behandelt

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


Daraufhin habe ich diese Lektion beendet und den Quellcode auf GitHub gepostet .

Es wäre notwendig, eine weitere Ausgabe der Leiterplatte herzustellen. Dieser ist nicht gut!


Das Video enthält keinen Ton.

Und ich hatte auch einen Joystick-Kontakt zum Drehen, wenn ich gelötet habe. Im Allgemeinen ist der erste Pfannkuchen klumpig

UPD

Ich habe es geschafft, einen Sound zu etablieren. Idioten sind vorhanden, aber nicht kritisch.

Codeänderungen : 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