Watch DOOM di ESP32. Bagian 1

Setelah mencoba pengembangan dengan modul ESP32 yang sudah jadi, saya ingin melakukan sesuatu yang kecil dan asli. Saya memutuskan untuk membuat arloji. Awalnya saya berpikir tentang ESP32-PICO-D4 . Karena hanya memiliki 4 MB flash untuk program ini, saya memutuskan untuk membuat versi lengkap dengan ekstensi hingga 16 MB flash dan 8 MB SRAM. Apa pun jamnya, Anda dapat menjalankan Doom pertama. Secara umum, itu semua isian penuh!



Apa yang belum dilakukan atau perlu perbaikan:

  1. Indikator baterai
  2. Sirkuit charging Charging diimplementasikan pada Schottky diode
  3. Antena tidak terletak dengan baik di lapisan lain dari ESP32

Bukan tutorial!



Dengan tampilan




Saya menerapkan layar warna pada pengontrol ST7789 dengan resolusi 240x240. Cukup ringkas dan murah. Semakin banyak driver dan port yang muncul di jaringan. Misalnya, ada port untuk LittlevGL , tetapi tidak ada gerobak dorong pada tampilan ini. Saya pikir itu bisa dibeli dan direkatkan. Mungkin seseorang memiliki pengalaman? Share.

Saya mengembangkan satu papan di ST7789 dan itu dimulai tanpa masalah.



LittlevGL esp32


Dengan mengisi program dan men-debug


Saya menggunakan konverter BRIDGE USB-TO-UART CP2102. Pertama, itu kompak dan kedua, diagram koneksi sangat sederhana dan hampir tidak ada bagian tambahan yang diperlukan.
Opsi 2: Kapasitor 4,7 μF dapat ditambahkan jika memberi daya pada perangkat lain dari regulator on-chip.
Jika Anda menghubungkan REGIN dan VBUS ke catu daya USB 5V, Anda hanya akan memerlukan kapasitor shunt di input. Meskipun saya pikir itu bisa bekerja tanpanya. VDD pada sebuah chip dalam hal ini adalah jalan keluarnya! Saya membuat kesalahan dan menghubungkannya ke rangkaian daya 3.3V dan tidak bisa mengerti mengapa saya memiliki 4.65V pada catu daya ?!

Tautan dalam dokumentasi di bawah ini memiliki opsi untuk menghubungkan ke daya 3.3V. Tapi saya pikir sama sekali tidak perlu menyalakan CP2102 ketika kita tidak perlu mengunggah atau men-debug perangkat



Pengisian baterai modulo


Resistor pada LTC4054 mengatur arus pengisian:



Nutrisi


Didukung oleh baterai 3.7V dengan stabilizer HT7833. Output 500mA saat ini. Ini memiliki drop tegangan kecil ~ 300mV. LD1117-3.3 memiliki "sedikit" lebih banyak.

Catatan tentang kesimpulan VDD_SDIO. Output catu daya pin ini adalah 1.8V atau 3.3V, tergantung pada keadaan mikrokontroler IO12 saat startup . 3.3V GPIO12 adalah 0 (standar)
VDD_SDIO works as the power supply for the related IO, and also for an external device.

When VDD_SDIO operates at 1.8 V, it can be generated from ESP32’s internal LDO. The maximum currentthis LDO can offer is 40 mA, and the output voltage range is 1.65 V~2.0 V.

When the VDD_SDIO outputs 1.8 V, the value of GPIO12 should be set to 1 when the chip boots and it is recommended that users add a2 kΩ ground resistor and a 4.7 mF filter capacitor close to VDD_SDIO.

When VDD_SDIO operates at 3.3 V, it is driven directly by VDD3P3_RTC through a 6Ωresistor, therefore,there will be some voltage drop from VDD3P3_RTC.

When the VDD_SDIO outputs 3.3 V, the value of GPIO12 is 0 (default) when the chip boots and it is recommended that users add a 1mF capacitor close to VDD_SDIO

Ini sangat nyaman jika Anda memiliki flash 1.8V. Tetapi dalam kasus saya, saya mencetak kesimpulan ini dan menghubungkan flash 3V3 dan PSRAM saya ke catu daya

umum.Beberapa modul ESP32 menggunakan VDD_SDIO, oleh karena itu saya tidak dapat menggantung apa pun dari periferal pada IO12 saat startup. Anda dapat, misalnya, menggantung tombol. Dalam salah satu solusi saya, saya menggantung kaki SPI pada IO12 dan modul tidak memulai. Rupanya IO12 mendapat unit dari port SPI ini, tetapi saya membutuhkan 0 atau sebaliknya. Ini harus diperhitungkan!

Bersama:

gambar

8MB PSRAM


8MB PSRAM Upgrade Mod
Dukungan untuk RAM eksternal
PSRAM / CE (pin 1)> ESP32 GPIO 16
PSRAM SO (pin 2)> flash DO
PSRAM SIO [2] (pin 3)> flash WP
PSRAM SI (pin 5)> flash DI
PSRAM SCLK (pin 6)> ESP32 GPIO 17
PSRAM SIO [3] (pin 7)> flash HOLD
PSRAM Vcc (pin 8)> ESP32 VCC_SDIO


Antena PCB


Saya menggunakan antena PCB Ukuran Kecil 2,4 GHz . Itu ada di perpustakaan Eagle Autodesk dan menempati area kecil. Anda mungkin dapat menggunakan ANTENA KERAMIK DIELEKTRIK tetapi Anda harus membelinya, dan harga antena PCB sedikit lebih sibuk. Namun, antena keramik kurang efektif. Opsi apa pun Pilihan

Antena Panduan Cepat Desain Antena dan Panduan Tata Letak RF cocok untuk memeriksa konsep.

gambar



Sedikit tentang mencocokkan antena




The Pedoman Desain ESP32 Hardware pada halaman 7 memberikan pedoman untuk menerapkan filter RF:
Impedansi keluaran pin RF ESP32 (QFN 6 * 6) dan ESP32 (QFN 5 * 5) masing-masing adalah (30 + j10) Ω dan (35 + j10) Ω, masing-masing
Untuk menghitung, gunakan Alat Bagan Smith Online . Ide utamanya adalah untuk sampai ke pusat lingkaran di (30 + j10). Namun, ini adalah data yang dihitung dan penggunaan parameter yang sebenarnya dapat dipengaruhi oleh ketebalan trek dan PCB, serta lokasi relatif terhadap komponen sirkuit lainnya.



Ini bukan satu-satunya sirkuit pencocokan antena. Sebagai contoh, pencocokan pada papan esp32-pic sedikit berbeda:

esp32-pico-kit-v4_schematic

Smith Chart dan Impedance Matching

Lokasi antena dan area bebas di sekitarnya juga penting. Seperti yang saya tulis sebelumnya, dalam kasus saya, posisi tidak dipilih secara optimal. Tetapi untuk iterasi pertama papan dan verifikasi konsep, bagian



kedua akan dikhususkan untuk papan itu sendiri dan porting perangkat lunak ketiga. Mungkin semuanya cocok menjadi satu.

Saya akan sedikit maju tentang Doom port dari Espressif Systems. Port menggunakan ILI9341, kami memiliki ST7789. Tetapi karena inisialisasi dan output dari buffer dikeluarkan dalam file yang terpisah dan dibagi menjadi metode yang terpisah, adaptasi ke tampilan saya seharusnya tidak menyebabkan kesulitan besar.

  • Ili_init dan displayTask bertanggung jawab untuk menginisialisasi tampilan
  • DisplayTask bertanggung jawab atas tampilan.

displayTask
void IRAM_ATTR displayTask(void *arg) {
	int x, i;
	int idx=0;
	int inProgress=0;
	static uint16_t *dmamem[NO_SIM_TRANS];
	spi_transaction_t trans[NO_SIM_TRANS];
	spi_transaction_t *rtrans;

    esp_err_t ret;
    spi_bus_config_t buscfg={
        .miso_io_num=-1,
        .mosi_io_num=PIN_NUM_MOSI,
        .sclk_io_num=PIN_NUM_CLK,
        .quadwp_io_num=-1,
        .quadhd_io_num=-1,
        .max_transfer_sz=(MEM_PER_TRANS*2)+16
    };
    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
    };

	printf("*** Display task starting.\n");

    //Initialize the SPI bus
    ret=spi_bus_initialize(HSPI_HOST, &buscfg, 1);
    assert(ret==ESP_OK);
    //Attach the LCD to the SPI bus
    ret=spi_bus_add_device(HSPI_HOST, &devcfg, &spi);
    assert(ret==ESP_OK);
    //Initialize the LCD
    ili_init(spi);

	//We're going to do a fair few transfers in parallel. Set them all up.
	for (x=0; x<NO_SIM_TRANS; x++) {
		dmamem[x]=pvPortMallocCaps(MEM_PER_TRANS*2, MALLOC_CAP_DMA);
		assert(dmamem[x]);
		memset(&trans[x], 0, sizeof(spi_transaction_t));
		trans[x].length=MEM_PER_TRANS*2;
		trans[x].user=(void*)1;
		trans[x].tx_buffer=&dmamem[x];
	}
	xSemaphoreGive(dispDoneSem);

	while(1) {
		xSemaphoreTake(dispSem, portMAX_DELAY);
//		printf("Display task: frame.\n");
#ifndef DOUBLE_BUFFER
		uint8_t *myData=(uint8_t*)currFbPtr;
#endif

		send_header_start(spi, 0, 0, 320, 240);
		send_header_cleanup(spi);
		for (x=0; x<320*240; x+=MEM_PER_TRANS) {
#ifdef DOUBLE_BUFFER
			for (i=0; i<MEM_PER_TRANS; i+=4) {
				uint32_t d=currFbPtr[(x+i)/4];
				dmamem[idx][i+0]=lcdpal[(d>>0)&0xff];
				dmamem[idx][i+1]=lcdpal[(d>>8)&0xff];
				dmamem[idx][i+2]=lcdpal[(d>>16)&0xff];
				dmamem[idx][i+3]=lcdpal[(d>>24)&0xff];
			}
#else
			for (i=0; i<MEM_PER_TRANS; i++) {
				dmamem[idx][i]=lcdpal[myData[i]];
			}
			myData+=MEM_PER_TRANS;
#endif
			trans[idx].length=MEM_PER_TRANS*16;
			trans[idx].user=(void*)1;
			trans[idx].tx_buffer=dmamem[idx];
			ret=spi_device_queue_trans(spi, &trans[idx], portMAX_DELAY);
			assert(ret==ESP_OK);

			idx++;
			if (idx>=NO_SIM_TRANS) idx=0;

			if (inProgress==NO_SIM_TRANS-1) {
				ret=spi_device_get_trans_result(spi, &rtrans, portMAX_DELAY);
				assert(ret==ESP_OK);
			} else {
				inProgress++;
			}
		}
#ifndef DOUBLE_BUFFER
		xSemaphoreGive(dispDoneSem);
#endif
		while(inProgress) {
			ret=spi_device_get_trans_result(spi, &rtrans, portMAX_DELAY);
			assert(ret==ESP_OK);
			inProgress--;
		}
	}
}


Demo cepat Video Esp32-Doom



Pesanan untuk papan telah dikirim ke pabrik Jlcpcb.

Tantangan Diluncurkan!

All Articles