دوم بوي ESP32. التكرار الثاني

دون انتظار لوحة DoomWatch ، قمت بإجراء طلب جديد مع تسليم Fedex. هذه المرة قمت بتقسيم الألواح في KiCad. من الغريب أن Kicad أحب المزيد من Eagle AutoDesk







وكان الهدف الرئيسي هو محاولة فك شريحة esp32d0wdq6. ليست الوحدة النهائية نفسها ، ولكن دائرة كهربائية منفصلة مع فلاش منفصل و PSRAM. كيف يتم ذلك وكيف يعمل ، مع عروض الفيديو ، اقرأ وانظر إلى أبعد من ذلك



هنا يمكنك أن تقرأ عن أول تكرار للوحة



حذاء طويل



سجل التمهيد
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





KiCad ثنائي الفينيل متعدد الكلور



في KiCad ، بدا لي الأمر أسهل. لذوقي ، بالطبع. يختلف قليلاً عن Eagle Autodesk. الميزة الرئيسية هي أنه لا يوجد حد لمقدار الرسوم إذا كنت لا ترغب في الدفع مقابل الترخيص. اسمحوا لي أن أذكرك أن حجم Eagle يبلغ 100x80mm للتطوير المجاني. إذا كانت الرسوم أعلى ، يجب عليك دفع ترخيص سنوي. في رأيي ، هناك أيضًا حد لعدد الطبقات







لم أتمكن من رؤية العرض ثلاثي الأبعاد في Eagle. من الضروري تثبيت Eagle Fusion 360. في Kicad هذا عنصر قائمة منفصل. على الرغم من أنني ربما لم أبحث هناك. بشكل عام ، يمكننا القول أنك تحولت تمامًا إلى KiCad ، حيث



قسمنا كل شيء إلى وحدات ، وترك في الصفحة الرئيسية ما يرتبط مباشرة بـ ESP32. الرقاقة نفسها والذاكرة





أخطاء



لقد رسمت اللوحة في فترات توقف. نتيجة لذلك ، نسيت إخراج GPIO0. أحضرته إلى DAC خارجي مثل MCCLK ، لكنني نسيت إحضاره إلى زر وضع التمهيد. اضطررت إلى نزع الورنيش من مسار اللحام لإخراج الزر. أيضًا ، تم ضبط المقاوم في دائرة الكوارتز على XTAL_N وفي الدليل ، من الضروري XTAL_P. لقد علقت مقاومًا من عدة أوم ، لكن كان من الممكن إلقاء وصلة



عبور. لم تنفصل مقاومات العنوان وإعادة الضبط الخاصة بـ MCP23017. يمكن ضبط الشريحة على عنوان I2C بثلاثة دبابيس. 0x20h عندما تكون جميع المسامير الثلاثة على الأرض. كل ذلك لأنني لم أحدد FootPrint



ولم ألاحظ الخطأ

خطأ: لا يمكن إضافة R10 (لم يتم تعيين بصمة).

خطأ: لا يمكن إضافة R9 (لم يتم تعيين بصمة)




i2C مرتبك لـ ES8374. يحدث ذلك في بعض الأحيان. من حيث المبدأ ، يمكنك استخدام دبابيس التبديل 21 -> 22 و 22 -> 21. أو قم بقص المسارات وكشط الورنيش ، كما فعلنا عادةً مع TX RX Uart (ابتسامة حزينة) بشكل







مفاجئ ، بعد لحام ESP32 و FLASH ، بدأت اللوحة بدون أي مشاكل. ولكن ، بعد أن وضعت SPRAM ، حصلت على إعادة تشغيل لا نهاية لها. اتضح أنه طعام عادي غير كحولي. سأكون أبحث عما إذا كان ESP32 غير ملحوم!







معدد MCP23017



توفير إمكانية الاستقصاء البديل للأزرار من خلال معدد الإرسال MCP23017 واستخدام DAC. على فاصل مقاوم. إذا لم يكن من الممكن وضع معدد إرسال ، فيمكنك استخدام ADC الداخلي. من خلال مستوى الجهد عند إدخال GPIO34 ، يمكنك اكتشاف ضغط الزر. الجانب السلبي هو أنه من المستحيل التصويت على عدة أزرار في نفس الوقت. بالإضافة إلى ذلك ، على التوالي ، ليست هناك حاجة إلى دائرة كهربائية دقيقة إضافية. فقط عدد قليل من المقاومات يحتوي



معدد الإرسال على منفذين من 8 دبابيس. يمكن تكوين منفذ واحد ، في حالتنا ، كمخرج ويمكن تعليق مصابيح LED عليه. كنت أرغب في توفير وميض إذا كانت الحياة أقل من 20٪ أو نفدت الخراطيش. ثم يمكنك اللعب بدون اللوحة. اتضح أن تتحقق. يبقى مؤشر LED أخضر واحد. إذا لم يكن هناك أعداء في الغرفة أو على خط البصر ، يمكنك إلقاء الضوء







مؤشر ترابط الصحة والذخيرة
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);
    }
}






شريحة الصوت ES8374



بالنسبة للصوت ، استخدمت ES8374 باعتباره DAC و ADC. تحتوي الدائرة المصغرة على مكبر صوت مدمج منخفض التردد ~ 1.25 وات. وهو مدعوم من الصندوق من قبل Espressif Audio Development Framework . في حزمة QFN-28 الصغيرة ، نحصل على Mono DAC و ADC للميكروفون و ULF مع دعم SDK. ما هو مطلوب لمثل هذا الجهاز.





إطلاق BT Speaker من مثال pipeline_bt_sink .



أخذت لوحة lyrat_v4_3 في الإعدادات. برنامج الترميز الثابت على AUDIO_CODEC_ES8374_DEFAULT_HANDLE

منافذ GPIO المكونة

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


وألغيت تهيئة audio_board_key_init و audio_board_led_init. من خلال الصحيح ، تحتاج إلى تحديد اللوحة المخصصة الخاصة بك



جيروسكوب L3GD20



قررت إضافة الجيروسكوب L3GD20. ميزة مثيرة للاهتمام هي أنه يمكن توصيله بجهاز SPI أو I2C. R27 ، R28 في حالة الاتصال عبر I2C قم بتعيين العنوان

// عناوين L3GD20H

# تعريف L3GD20H_I2C_ADDRESS_1 0x6a // SDO pin منخفض

# تعريف L3GD20H_I2C_ADDRESS_2 0x6b // SDO pin مرتفع
توجد مكتبة على GitHub l3gd20h-esp-idf





وبالتالي ، لدينا 3 أجهزة على I2C. تحكم ADC-DAC ES8374 وأزرار MCP23017 و L3GD20 نفسها. أطلق كل ثلاثة



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





ولكن لسبب ما لا يعطي L3GD20 إحداثيات. WHO_AM_I يستجيب بشكل صحيح مع 0xd4. الزوايا لا تتغير. ليس لدي مكثف C1 - 10nF ، حاولت أن أضع الذي وجدت أقرب 100nF. اعتقدت أنه على الرغم من أنه كان يكذب ، لكن يبدو أن المحول الداخلي لم يبدأ. وهذا مهم



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…





عرض 18 دبوس ILI9341







يحسب تيار الإضاءة الخلفية على النحو التالي. يتطلب 90mA. نظرًا لأن الانخفاض عبر الترانزستور المفتوح هو ~ 0.7 فولت ، فإن مصدر الطاقة لمصابيح الإضاءة الخلفية هو 3.3 فولت - 0.7 فولت = 2.6 فولت. ووفقًا لقانون أوم 2.6 فولت / 0.090 أمبير = 28.8 أوم. توصيل 47 أوم. اتضح الظلام قليلا. سيكون من الضروري تقليل المقاومة





كما تم فصل Touch XPT2046TS. تم تعليق دبابيس SPI بالتوازي مع الشاشة. يتم عرض XPT_CS على دبوس منفصل. هناك شك في أنها ستنجح. إذا لم يبدأ العرض ، لكنت أجريت تجارب. بالنسبة لوحدة التحكم ، ليست هناك حاجة إليها بشكل خاص. مأخوذة من المثال







العروض



إطلاق عرض LVGL. في إعدادات المثال ، حاولت تعيين 40 ميجا هرتز لناقل SPI. عمل المثال أسرع قليلاً من الفيديو







لكن Doom بدأ يعمل ويعمل بثبات فقط عند 32 ميجا هرتز. على الرغم من أن 26 ميجاهرتز لـ ILI9341 يعتبر بالفعل رفع تردد التشغيل

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








خاتمة



منافذ الإدخال / الإخراج ESP32 ليست كافية دائمًا للتعبئة إلى أقصى حد. في هذا الصدد ، يبدو STM32 أكثر جاذبية. لكنه لا يحتوي على دعم Wi-Fi مدمج.في



الختام ، لاحظت أن الجهاز يمكنه تشغيل محاكي Nintendo ESP32-NESEMU ، ومحاكي Nintendo Entertainment System لـ ESP32.

لقد طلبت Game Console مع Ali. سيكون من الممتع رؤية ما بداخلها. ربما ESP32 أيضًا







إنني أتطلع إلى المناقشة والمشورة في التعليقات.



All Articles