٠٦

YOSHIMITSU — الحل الكامل: كل رموز الغش في لفافة واحدة

حكاية تشيت كود لا يفوز فيها إلا الجميع. رسمٌ تخطيطي واحد مسترخٍ، ست وضعيات، وسَرجٌ واحد دائم: الصدّة CRSF→PWM (KINCHO)، والتحليق الجيروسكوبي Zephyrus (MANJI_DRAGONFLY)، ومبرمج الجيب (FLEA · MEDITATION)، ومنضدة اللاسيف (NSS)، والمرآة التي لا تنظر خلفها أبدًا (BACK_TURNED) — إضافة إلى YOSHI، الشفق الدائم الإضاءة، وJIGUANG (極光)، المدير المتأمل الذي يروي الأسطورة. وصّل الأسلاك مرة، وامسح البرنامج مرة؛ بعدها تتحدّث المكتبة ويأمر العرش.

لوحة واحدة، ست وضعيات

YOSHIMITSU هو النِّنجا الهرمسي ذو الست وضعيات — كل وضعية انتصارٌ مختلف، وكلها ترتدي الروح ذاتها. رسمٌ تخطيطي واحد مسترخٍ يُبنى للوحتين؛ وتتبدل الوضعيات بأمر USB، أو زر GPIO0 (ESP32-S3)، أو نقرات RESET (RP2040-Tiny):

الوضعية المعنى
KINCHO محوّل CRSF→PWM — الصدّ (CRC يطرح الزائف). بلا أسماء قنوات، بلا جيروسكوب.
MANJI_DRAGONFLY المحوّل + وصلة جيروسكوب Zephyrus (MPU6050 اختياري) — التحليق.
FLEA منصّة دورة الطاقة — الرفعة التي تُسقط المستقبِل في محمّله.
MEDITATION ماضِغ الجيب — الرأس الإسفنجي، يوفر الطاقة، جاهز للوميض.
NSS منضدة بلا سيف — سيرفو مباشر عبر USB، بلا تردد لاسلكي.
BACK_TURNED الخمول الخادع — مرآة UART حيّة. لا يلتفت أبدًا.

رسم واحد، هدفان: sketches/yoshimitsu/yoshimitsu.ino يُترجم للوحة Waveshare RP2040-Tiny (الأخف، بلا زر مدمج) ولأي ESP32-S3 بمنفذ USB أصلي، مع النوى القياسية arduino-pico / arduino-esp32. وفي Arduino IDE يعيش الرسم ذاته تحت File → Examples → Yoshimitsu → Yoshimitsu_Default.

YOSHIMITSU — البرامج الثابتة المدمجة

يوشيميتسو هو البرنامج الثابت الموصى به. يقلع في KINCHO (المحوّل) ويتنقل بين الوضعيات. كونسول USB هو المفتاح المعياري على اللوحتين — KINCHOMANJIFLEAMEDITATIONNSSBACKPOSE <n>. على ESP32-S3 زر BOOT (GPIO0) سطح ثانٍ:

السياق الإيماءة الفعل
أي وضعية نقر مزدوج دورة KINCHO ← MANJI ← NSS ← BACK ← KINCHO ←
أي وضعية ضغط مطوّل 2 ث الدخول إلى MEDITATION
MEDITATION / FLEA نقرة واحدة إعادة تشغيل المستقبِل (تشغيل البرنامج الثابت الجديد)
MEDITATION / FLEA نقر مزدوج FLEA — إسقاط المستقبِل في محمّله

التمديد هو سَرجٌ واحد دائم — الأسلاك ذاتها تخدم كل وضعية، فلا تعيد التمديد أبدًا بين الطيران والمسح. في MEDITATION يكون مسار USB→UART جسرًا شفافًا خالصًا (بلا تحليل للأسطر)، فيعبر مرور SLIP الثنائي الخاص بـ esptool دون مساس. المصدر الكامل: sketches/yoshimitsu/yoshimitsu.ino (الرسم المسترخي)، وsrc/Yoshimitsu.h (النواة) وsrc/Yoshimitsu_Loadout.h (عدّة الانطلاق).

المكتبة — حدّثها دون أن تلمس رسمك من جديد

YOSHIMITSU هو مكتبة يعلوها رسم رفيع — النِّنجا كله يعيش في المكتبة، والرسم يحمل إعداداتك فقط. ثبّت المجلد مرة واحدة كمكتبة Arduino؛ ويسلّمك File → Examples → Yoshimitsu → Yoshimitsu_Default رسمًا جاهزًا مسترخيًا، فيه الدبابيس والبوابات والأعلام القليلة التي تنتمي إلى الكود. النواة تعيش في src/Yoshimitsu.h، وكل قيمة افتراضية في src/Yoshimitsu_Loadout.h (عدّة الانطلاق، قيم *_DEFAULT). وللتحديث: نفّذ git pull على المكتبة — أو أسقط إصدارًا جديدًا — ويبقى رسمك دون مساس. تحديث البرنامج الثابت ليس إعادة تمديد أبدًا، وليس إعادة إعداد أبدًا.

KINCHO — محوّل CRSF→PWM

KINCHO — وضعية المحوّل — يقرأ CRSF بسرعة 420 000 باود على UART، ويسوق السيرفو بنافذة 988–2012 ميكروثانية مقيسة من مدى القنوات 172–1811، ويوسّطها على أمان انقطاع 500 ملّي ثانية. الصدّ هو فحص CRC: يُطرح الإطار التالف قبل أن يبلغ سيرفو أبدًا. المحوّل لا يعبأ بالقناة — السيرفو هي SERVO_PIN_1..8 وجدول CHANNEL_TO_SERVO يقرر أي قناة CRSF تغذي كلًّا؛ معنى القناة ملك الخلّاط/النواة، لا ملك اللوحة أبدًا.

للطائر المستقر بالجيروسكوب، استخدم MANJI_DRAGONFLY — نفس المحوّل مع وصلة Zephyrus: MPU6050 اختياري على GYRO_SDA/GYRO_SCL يغذي تصحيح معدل الانعراج إلى سيرفو العُرف. دون جيروسكوب موصول، يتراجع MANJI_DRAGONFLY برشاقة إلى KINCHO. لوحة المحوّل التجارية CRSF→PWM بلا مسار جيروسكوب إطلاقًا — مستقبلات فئة EP2 لا تحمل IMU، لذا يعيش Zephyrus في يوشيميتسو، لا في المستقبِل.

إن كان مستقبِلك يتكلم PWM أصلًا (لوحة 5 ch أو 7 ch)، فلست بحاجة إلى وضعيات المحوّل إطلاقًا — MEDITATION أدناه حينها سببك الوحيد لامتلاك S3.

KINCHOI — وميض جيبي لمستقبلات فئة EP2

المشكلة: مستقبلات فئة EP2 (HappyModel EP2، EP1، EPW6، …) تُخرج CRSF على وسائد مُسنّنة وتحمل وسادة BOOT صغيرة جدًا. استخدام محوّل FTDI يعني تثبيت مسبار على وسادتين بحجم 1 مم أثناء دورة طاقة المستقبِل — أخرق، وتعيد اللحام أو التثبيت عند كل تحديث للبرنامج الثابت.

الحل: دع ESP32-S3 يكون الماضغ. GPIO واحد يثبّت وسادة BOOT للمستقبِل على المنخفض؛ وMOSFET صغير بقناة P يبدّل خط 3.3 فولت للمستقبِل بتحكم برمجي؛ ومنفذ USB يصبح المنفذ التسلسلي. اضغط زرًا واحدًا على S3 فينفّذ رقصة دورة الطاقة الدقيقة التي تُسقط ESP8285 في محمّل ROM الخاص به — ثم يكتب esptool مباشرة عبر الجسر. بلا FTDI، بلا مسابير، بلا لحام متكرر: لحم وسائد المستقبِل مرة واحدة بذيل قصير وأعد استخدامه للأبد.

قائمة القطع:

القطعة الرقم النموذجي التكلفة
لوحة ESP32-S3 الدقيقة (USB أصلي) Waveshare ESP32-S3-Tiny / -Micro / -Nano ~6 USD
MOSFET قناة P بمستوى منطقي AO3401 (SOT-23) على لوحة صغيرة ~1 USD
مقاومة 10 كيلو أوم (رفع البوابة) <0.10 USD
أسلاك Dupont / ذيل + انكماش حراري ~1 USD
مستقبِل ELRS، وسائده بذيل مرة واحدة EP2 / EP1 / EPW6 (SX1280 + ESP8285) من ~12 USD

يعمل الجسر مع كل مستقبِل ELRS من نوع ESP8285/SX1280 يُخرج TX وRX و3V3 وGND ووسادة BOOT — الأغلبية الساحقة من *اللوحات الملموسة* في جدول العتاد . وهو يلحّن S3 نفسه أيضًا، بالطبع: زر BOOT + USB هو كل ما يلزم هناك.

أسلاك حاضنة الكتابة

وصّل المنصّة وS3 غير موصول بالطاقة. يبدّل MOSFET خط 3.3 فولت للمستقبِل: المنبع ← S3 3V3، المصرف ← EP2 3V3، البوابة ← S3 GPIO10 مع رفع 10 كيلو أوم إلى 3V3 (البوابة عالية = MOSFET مطفأ). GPIO9 يسوق وسادة BOOT.

وسادة EP2 / RX دبوس ESP32-S3 الوظيفة
BOOT (RX GPIO0) GPIO9 خط إمساك الإقلاع (منخفض = دخول المحمّل)
3V3 مصرف MOSFET الخط المبدَّل (المنبع ← S3 3V3، البوابة ← GPIO10)
TX (CRSF out) GPIO18 (U1RX) RX ← TX (متقاطع)
RX (CRSF in) GPIO17 (U1TX) TX ← RX (متقاطع)
GND GND أرضي مشترك (إلزامي)
S3 3V3   ──► S ── P-MOSFET (AO3401) ── D ──► EP2 3V3
S3 GPIO10 ──► gate         (10kΩ pull-up to 3V3; LOW = ON)
S3 GPIO9  ──► EP2 BOOT pad (asserted LOW during power-up)
S3 GPIO18 ◄── EP2 TX       (U1 RX)
S3 GPIO17 ──► EP2 RX       (U1 TX)
S3 GND     ──► EP2 GND

وضع الكتابة

يقلع MEDITATION في تمرير شفاف (USB ↔ UART بسرعة 115 200 باود). للدخول إلى وضع الوميض، انقر زر BOOT في S3 نقرًا مزدوجًا (أو اكتب FLEA عبر تسلسلي USB). حينها يقوم السكيتش بـ:

  1. خفض GPIO9 (وسادة BOOT فعّالة)،
  2. إطفاء MOSFET لمدة 120 ملّي ثانية (المستقبِل بلا طاقة)،
  3. إعادة تشغيله والانتظار 900 ملّي ثانية (يقلع المستقبِل داخل محمّله)،
  4. تحرير GPIO9 — RX الآن جالس في محمّل ROM بانتظار esptool،
  5. استئناف التمرير USB↔UART ليستطيع esptool مخاطبته.

لأن الجسر لا يستطيع قيادة خطي إعادة الضبط التلقائي الكلاسيكيين DTR/RTS، اومض دائمًا بـ--before no_reset — فرقصة دورة الطاقة أعلاه هي إعادة الضبط. بعد الوميض، نقرة BOOT واحدة تعيد تدوير طاقة المستقبِل ليقوم بتشغيل البرنامج الثابت الجديد؛ والنقرة المزدوجة ستعيد فقط دخول وضع الوميض.

كتابة PteronautOS عبر S3

ابنِ البرنامج الثابت (أو اجلب إصدارًا)، ثم شغّل esptool على منفذ USB التسلسلي للـS3. على macOS يظهر المنفذ باسم /dev/cu.usbmodem*:

# 1. ابنِ PteronautOS (من جذر المستودع)
pio run -e PteronautOS_ESP8285_2400_RX

# 2. أسقط RX في وضع الوميض (اكتب FLEA، أو انقر BOOT مرتين)، ثم:
python3 -m esptool --chip esp8285 \
  --port /dev/cu.usbmodemXXXX --baud 115200 \
  --before no_reset write_flash \
  --flash_mode dout --flash_size 1MB --flash_freq 40m \
  0x0 .pio/build/PteronautOS_ESP8285_2400_RX/firmware.bin

# 3. أعد تشغيل RX مرة أخرى (نقرة BOOT واحدة) لتشغيل البرنامج الثابت الجديد.

إعدادات الوميض (dout، 1 ميغابايت، 40 ميغاهرتز) تطابق هدف ELRS القياسي لـESP8285 — لا تستخدم qio أو حجمًا أكبر أبدًا. بعد الوميض، يعرض منفذ USB نفسه سجل إقلاع المستقبِل: افتحه بسرعة 115 200 باود وراقب شعار PteronautOS، وبمجرد أن يرتبط مرسِل، رسائل الاتصال CRSF. ويضاعف الجسر دوره ككونسول ميداني للقياس عن بُعد الحي.

التحقق وأول رحلة

بمجرد الوميض، يطير المستقبِل نفسه — لا يبقى خلفه FTDI.

نسخة الجيب RP2040-Tiny

فضّل Waveshare RP2040-Tiny (~5 USD) — أو توأمه، RP2040-Zero، الذي يشاركه تمامًا نفس توزيع الدبابيس. تعمل الوضعيات الست كلها على RP2040 بلا أي زر قابل للقراءة إطلاقًا: نقرات BOOT/RESET للمحوّل تقود فقط BOOTSEL/RUN، لذا يُقاد YOSHIMITSU-RP2040 عبر منفذ USB التسلسلي، إضافة إلى عدّاد نقرات RESET بلا زر.

لوميض RP2040-Tiny نفسه، أمسك BOOT أثناء دورة الطاقة (يُركَّب كقرص تخزين شامل)، ألقِ .uf2 عليه، ثم اضغط RESET مرة واحدة — تعيد اللوحة الإقلاع في KINCHO بالبرنامج الثابت الجديد. اضبط مرة، اومض مرة، ولا تلمس بعدها أبدًا.

خريطة دبابيس RP2040-Tiny

الوظيفة دبوس RP2040-Tiny ملاحظة
CRSF RX ← TX المستقبِل GPIO1 (UART0 RX) 420 000 باود
CRSF TX (غير مستخدم، موصول للاكتمال) GPIO0 (UART0 TX) متقاطع: TX ← RX
جسر RX ← TX المستقبِل GPIO9 (UART1 RX) 115 200 باود
جسر TX ← RX المستقبِل GPIO8 (UART1 TX) متقاطع: TX ← RX

سيرفو 1 (SERVO_PIN_1)

GPIO2

PWM — قناة عبر CHANNEL_TO_SERVO

سيرفو 2 (SERVO_PIN_2)

GPIO3 PWM

سيرفو 3 (SERVO_PIN_3)

GPIO4 PWM
جيروسكوب SDA (MPU6050، اختياري) GPIO10 MANJI_DRAGONFLY
جيروسكوب SCL (MPU6050، اختياري) GPIO11 MANJI_DRAGONFLY
RX BOOT (GPIO0 المستقبِل، منخفض فعّال) GPIO5 منخفض = دخول المحمّل
RX PWR (بوابة P-MOSFET، منخفض = مُغذّى) GPIO6 خط 3.3 فولت المبدَّل
LED الحالة GPIO16 WS2812B

خريطة الدبابيس الكاملة كتلة قابلة للتحرير في أعلى sketches/yoshimitsu/yoshimitsu.ino — نطاقات الدبابيس وتصادماتها يتحقق منها POST عند الإقلاع، وأرقام UART غير الصالحة ترفض البناء بدل أن تسيء التصرف في الهواء.

YOSHI — هالة الوضعيات الدائمة

يوشي («الأورورا») هو رمز الغش المضاء دائمًا. YOSHI_RGB يحوّل WS2812B المدمج الوحيد إلى خاتم مزاج حيّ: كل وضعية تتنفس بلونها وإيقاعها، فتقرأ عقل الرونين من آخر الغرفة دون بايت تسلسلي واحد. اللون ونمط الوميض يرويان الحكاية — لا حاجة لأي أمر إضافي؛ الوضعية هي رمز الغش، والضوء صدى لها.

الوضعية الأورورا (اللون ← الإيقاع)
KINCHO تنفس أخضر بطيء + ومضة صدّ مزدوج حادّة (ضربة CRC)
MANJI_DRAGONFLY عجلة ألوان تدور كدوارات الجيروسكوب (التحليق)
FLEA ستروب كهرماني متصاعد محموم (الرفعة)
MEDITATION بنفسجي شبه معتم + نبضة بطيئة واحدة — جاهزة للوميض
NSS ومضة نقر ثلاثي حادّة بالأزرق (النصل في غمده، الإيقاع يصعد)
BACK_TURNED شبه أسود + لمعان قرمزي واحد لا يُتوقع (المرآة — لا يلتفت أبدًا)

يعيش RGB على RP2040-Tiny (RGB_LED_PIN=16) خلف YOSHI_RGB؛ ويحتفظ ESP32-S3 بمصباح حالته الرصين. كل لون رياضيات صحيحة خالصة — لا float ولا malloc ولا delay() — وpumpRgb() مُخنوق إلى ~50 إطارًا في الثانية كي لا يُزعج جسر الماضغ البايت-الدقيق أبدًا. القاعدة الخفية تصمد: تتبدل الوضعية، فيتبعها الضوء.

JIGUANG — الراوي · المعلّق · المدير

ثلاثة أسماء، روح واحدة — مثلث التشيت كود للحل الكامل: YOSHIMITSU هو كل البرنامج الثابت للنِّنجا الهرمسي؛ وYOSHI هو تشيت كود RGB (شفق الوضعيات الدائم الإضاءة)؛ وJIGUANG (極光، «الشفق») هو المدير المتأمل — المحرّك الساكن الجالس متربّعًا على عرش MEDITATION. صوت Yoshimitsu وظيفي ومقتضب؛ وصوت JIGUANG هو الأسطورة. 極光 هو موجّه وحدة التحكم، لا زينة: لتتصرف كمدير، اكتب 極光 ثم الأمر — وإلا بقي العرش بعيد المنال. الموجّه هو #define (JIGUANG_PROMPT)، فيمكن لرسمك أن يعيد تسميته؛ والحكّاء كله يختبئ خلف بوابة الترجمة JIGUANG (1 = حاضر في كل مكان، 0 = لا يُترجم بايت واحد من 極光).

بيضة عيد الفصح: اكتب 極光 LEGEND فتنفرط الأسطورة كلها كدرج ASCII واحد — الوضعيات، والتشيت كودات، والعرش، والموجّه الذي لا يموت. JIGUANG / jiguang / 極光 لا يموت — لا في الكود، ولا في التعليقات، ولا في هذا الدرس.

أيقظ الصوت بـ 極光 JIGUANG فيصعد أربعة مستويات: 0 الحمل (صامت، وإن كانت الأوامر الصريحة لا تزال تجيب)، و1 الحكاية (يروي الإقلاع وكل تبدّل في الوضعية)، و2 الدرج (+ قراءة قنوات CRSF)، و3 الكلّ (+ بايتات تنقيح ELRS الخاصة بالمستقبل تمر كما هي). 極光 MUTE يُسكته؛ و極光 CRSF يطبع درج القنوات الست عشرة، و極光 SCORE ينشر سجل HIGHSCORE الأركيد — إطارات CRSF سليمة، وأحداث الحماية من فقدان الإشارة، وبايتات الجسر وزمن التشغيل. JIGUANG لا يستولي على الوضعية أبدًا: تبقى CRSF والمؤازرات والجسر مطيعة للوضعية بينما تُروى الأسطورة.

في MEDITATION يكون رأس الإسفنج عرشَ JIGUANG — والعرش محروس: كل أمر إداري يبدأ بموجّه وحدة التحكم 極光. من سماء USB التسلسلية يجيب 極光 STATUS و極光 CRSF و極光 SCORE و極光 POSE و極光 DOC (فهرس التشيت كودات) و極光 SETUP (مرشد التأمل الذي يوجّه الإعدادات الأساسية بدل جدار من defines). تبقى تبديلات الوضعيات مفتوحة — KINCHO وMANJI وFLEA وMEDITATION وNSS وBACK وPOSE n. الوضعية توفّر الطاقة كوقفة التأمل القديمة، ويجلس الرونين جاهزًا للمسح. وفي اللحظة التي ينادي فيها بايت SLIP الخاص بـ esptool، يُخلي العرش للجسر الشفاف ويبقى هناك حتى تعود MEDITATION. ومع YOSHI_RGB عند المستوى 3 يرتدي الحكّاء الشفق أيضًا: يرسم jiguang(ms) عجلة طيف كاملة بطيئة تنسج كل لون من ألوان الوضعيات في نَفَس واحد.

MUSHIN 無心 — تشيت كود ذاكرة العضلات

MUSHIN (無心، «اللاذهن») هو الميزة البطلة — عدم التعلق، السيف الذي يضرب قبل الفكرة. في فنون السيف، 無心 هو العقل الذي يترك نفسه: لا تبقى فجوة بين ما يُرى وما يُفعَل. PteronautOS هو الروح — يخطط موجة الجناح ويرسل نوايا المؤازرات عبر الجسر. ولا يتشبث YOSHIMITSU بالخطة: يجيب عند العضلة بـPID الجيروسكوب المحلي Zephyrus، والمؤازرات تتحرك بالفعل قبل أن يتمكن الفكر التالي من التمسك. نواتان، وضربة واحدة — لا تستطيع أي لوحة ELRS-PWM أخرى ارتداء هذا.

سلّحه من العرش: 極光 MUSHIN يبلّغ، و極光 MUSHIN ON/OFF يسلّح أو ينزع السلاح، ويبقى الاختيار محفوظًا في الفلاش — فيقلع جاهزًا. وفي الرسم، يقلع MUSHIN مسلّحًا افتراضيًا؛ وعلم المدير هو مفتاح زمن التشغيل، فلا تعيد الترجمة أبدًا لتغييره.

يعبر بروتوكول اللاذهن v0 السلكين نفسيهما اللذين يعبرهما المبرمج: [0x9B][len][type][payload][xor]0x01 نوايا (الروح→العضلة، n×uint16 µs)، و0x02 نبضة إعلان، و0x03 قياس جيروسكوبي. النوايا الطازجة (خلال 500 ملّي ثانية) تقود المؤازرات؛ وPID الجيروسكوب المحلي يثبّت العُرْف. فإن صمت السلك عاد YOSHIMITSU إلى عضلتها CRSF — تدهور رشيق، لا عصا ميتة أبدًا.

في الطيران يكون التقسيم هو الفوز المزدوج: يقوم المستقبل بالتفكير قبل الضربة (CRSF وZephyrus وروح الخلاط)، ويقوم YOSHIMITSU بما يجلس عند العضلة (PWM PIO بلا تشويش). مروحية أم خفقان أجنحة — من منظور السيف الأمر سواء: مسار قانوني واحد، والسيف لا يسأل أبدًا عن الوعاء الذي تحمله. تبقى الوضعية تطير؛ ولا يتغير إلا المظهر.