Doom Boy ESP32

بادئة Doom لـ ESP32 افعل ذلك بنفسك على برنامج تشغيل MCP23017 للأزرار من UncleRus



تحسبًا لساعات الموت ، جاء مجلس مشروع طويل الأمد. يتم فصل MCP23017 و CS4344 الخارجي والكثير من الأشياء الأخرى على اللوحة.

بالنسبة للأزرار ، يتم استخدام موسع المنفذ MCP23017 المتصل عبر I2C. بالنسبة له هناك سائق يمكنك الحصول عليه من UncleRus .

جرت محاولة لإطلاق ADC CS4344 خارجي.

الموت من Espressif


بعد تنزيل المنفذ ، كان على Doom العبث قليلاً لجمعه. في النهاية ، اجتمع كل شيء وتدفقوا إلى ESP32 لكن ... لقد اصطدمت بحادث في البداية. في موضوع الجتاباب رأيت مناقشة مماثلة للمشكلة:



اقترح مؤلف الميناء صنع
ربما تحتاج إلى استخدام خيار malloc () وكذلك حجز بعض الذاكرة لـ DMA. سأرى ما إذا كان بإمكاني الحصول على هذا التجميع على سيد وتحديث sdkconfig عندما يكون لدي الوقت.
بشكل عام ، "دون تفكير مرتين" استبدلت جميع وظائف تخصيص الذاكرة المستنفدة بـ malloc ().
بدأ العرض التوضيحي. أمامي كان يربط الأزرار

موسع MCP23017 GPIO




MCP23017

مع الخطط الكبيرة لتوسيع الوظائف من خلال منافذ وحدة التحكم ، قررت توفير القليل على منافذ الإدخال / الإخراج لوحدة التحكم الدقيقة نفسها عن طريق تثبيت MCP23017. إنه موسع بسيط مع إمكانية الوصول إلى إشارات الإدخال / الإخراج عبر واجهة I2C. لم أخترع السائق ، ولكن ببساطة أخذته من UncleRus .

تستخدم خمسة أزرار عصا التحكم للتنقل. زوجان من الأزرار في اللقطة واختيار القائمة. في الواقع ، هذا ليس كافيًا ، لا يزال عليك فتح الأبواب والتحرك يسارًا ويمينًا دون الانعطاف ، أي مثل سرطان البحر. يتم سحب النتائج داخل MCP23017 إلى VDD. يتم إغلاق الاتصال على الأرض. من الرائع جدًا وجود مقاومات سحب داخل الدائرة المصغرة. لا يزال من الممكن الخلط بينه وبين الانقطاعات من MCP23017. لديها دبابيس لكل منفذ ، INTA و INTB ، ولكن بطريقة أخرى في وقت آخر.

قائمة كاملة بالفرق
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},
};


كان أسهل من خلال معالجة الأزرار مما كنت أعتقد. خفضت تواتر I2C لتحسين الاستقرار. في أي حال ، لم يذهب 1MHz المعلنة. كان تردد 100 كيلو هرتز كافًا للاستطلاع في دورة بتأخير 20 مللي ثانية.

CMake


لقد قتلت الكثير من الوقت عند إضافة CMakeList.txt للمكونات. شيء لا يعمل مع جعل. وأردت أن آخذ SDK أعذب. لم يكن المنفذ الأصلي حتى 3.2.x. أخذت esp-idf-v3.3.1 ربما ستعمل على esp-idf-4.0

الصوت من خلال DAC


في الواقع هناك شوكة أخرى . يتميز ببطاقة SD-CARD متصلة وصوت من خلال DAC المدمجة. يتيح لك المنفذ الأصلي من Espressif تحميل ملف wad فقط في ذاكرة فلاش الداخلية للبرامج ، ثم تحتاج إلى استخدام ملف مقطوع لا يوجد فيه صوت!

المخطط هنا.

فكرة ربط DAC خارجي بدلاً من DAC المضمنة أسرتني. على الأقل بنس واحد من Cirrus Logic ،



بعد ذلك قمت بإعداد DAC على CS4344 ثم خاب أملي. عمل الصوت مع الانقطاعات. عندما رأيت ملف i_sound.c في مشروعيلقد لاحظت عدم استخدام ملف dma.h واحد. كأن هناك رابط معه وهو نفسه ، ولكن كل شيء معلق عليه. ربما شاهدت باهتمام؟ لكن أعتقد أن المؤلف لاحظ أيضًا أن هناك خطأ ما في الصوت وحاول القضاء عليه. ربما ألغى ولم ينشر آخر التزام. أو ربما يعمل كل شيء كما ينبغي على DAC الداخلي. ومع ذلك ، يمكنك تجاهل مقاطعات التشويه لإخراج الصوت من خلال DAC المدمج ومكبر الصوت الصغير. لقد لعبت حول معدل البت وتغيير الرمز بشكل عام. لم تجلب شيئا.

ونعم ، فيما يتعلق بتوصيل SD-CARD. في البداية ، قمت بتعليقها بالتوازي مع الشاشة على ناقل SPI ، مع فصل إشارة اختيار رقاقة CS بشكل منفصل. فشلت الفكرة. بتهوية السؤال دعم مشاركة ناقل SD-SPIتوصلت إلى استنتاج مفاده أنه ليست كل بطاقات SD-CARD مصنوعة بنفس الطريقة أو أن يدي ليست مستقيمة. اضطررت إلى إلغاء تثبيته من خلال المحول إلى اللوحة بدلاً من الميكروفون. تم الانتهاء من ذلك دون سحب المقاومات الخارجية إلى VDD.
التعامل مع المقاومات الداخلية

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


في هذا الموضوع ، تركت هذا الدرس ونشرت شفرة المصدر على GitHub .

سيكون من الضروري عمل نسخة أخرى من لوحة الدوائر المطبوعة. هذه ليست جيدة!


لا يوجد صوت على الفيديو.

وكان لدي أيضًا اتصال بعصا التحكم للدوران عندما كنت ملحومًا. بشكل عام ، أول فطيرة

متكتلة

تمكنت من إنشاء صوت. الهزات موجودة ، لكنها ليست حرجة. تغييرات الكود:

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