السبت، 16 مايو 2026

باث فايندر



باث فايندر هو جهاز محمول يُرتدى على الجسم، ويحتوي على خريطة لمدينتي، ويمكن عرضها والتنقل فيها باستخدام أزرار لوحة التحكم.

المواد المستخدمة في هذا المشروع

المكونات المادية

DFRobot UNIHIKER M10 - كمبيوتر لوحي أحادي مزود بشاشة لمس، يدعم برمجة بايثون لإنترنت الأشياء

PCBWay لوحات الدوائر المطبوعة المخصصة

تطبيقات البرامج والخدمات عبر الإنترنت

أوتوديسك فيوجن

الأدوات اليدوية وآلات التصنيع

طابعة ثلاثية الأبعاد (عامة)

قصة

تحية طيبة أيها المسافرون الأعزاء، وأهلاً بكم من جديد


هذا هو PathFinder، جهاز خريطة رقمية يمكنك صنعه بنفسك، يعمل بلوحة UNIHIKER M10، مصمم لمساعدتك في إيجاد طريقك.


أمارس رياضة ركوب الدراجات في المناطق الجبلية القريبة من مسقط رأسي، وهناك، غالبًا ما أواجه انقطاعًا في شبكة الإنترنت في بعض المناطق. الاعتماد كليًا على خرائط جوجل غير عملي؛ ففي بعض الأحيان، وبسبب مشاكل في البيانات، لا يتم تحميل الخرائط بالكامل، وقد يُسبب ذلك مشكلة كبيرة إذا علقت في مكان ما.


يمكن حل كل هذا لو كان لدينا خريطة ورقية وبعض مهارات الملاحة. لا أملك خريطة ورقية، لكنني صنعت خريطة رقمية يتم تحميلها على لوحة UNIHIKER M10. يمكننا التنقل في الخريطة باستخدام أزرار الاتجاهات. وبهذا، يمكن لأي شخص أن يساعد نفسه إذا علق في مكان ما.


لاختبار هذه الخريطة، ذهبت إلى منطقة نائية في الجبال بالقرب من مسقط رأسي واستخدمتها للتنقل في طريق لم أزره من قبل. اتبعت الخريطة وتمكنت من إيجاد طريقي دون أي مشاكل.

تتناول هذه المقالة عملية بناء هذا المشروع بالكامل، بدءًا من تصنيع لوحات الدوائر المطبوعة (PCBs) وصولًا إلى البرمجة وتجميع الجهاز، فلنبدأ إذًا.

المواد المطلوبة

هذه هي المواد المستخدمة في هذا المشروع:

لوحات دوائر مطبوعة مخصصة (مقدمة من PCBWAY)

لوحة تطوير Unihiker M0

أجزاء مطبوعة بتقنية الطباعة ثلاثية الأبعاد

دائرة متكاملة لإدارة الطاقة IP5306

مكثفات 10 ميكروفاراد 1206

منفذ من النوع C

زر ضغط رأسي

مصباح LED أخضر 0603

ملف حث 1 ميكروهنري SMD

أزرار ضغط بحجم 4x4 مم.

معدات - يونيهايكر إم 1



يُعدّ جهاز UNIHIKER M10 نجم مشروعنا، وهو حاسوب لوحي فريد من نوعه. يأتي مزودًا بشاشة لمس مدمجة بحجم 2.8 بوصة، بالإضافة إلى تقنيتي Wi-Fi وBluetooth.

ما يُميّز هذا الجهاز حقًا هو المعالج والمعالج المساعد. فهو يعمل بمعالج RK3308 ARM 64 بت، رباعي النواة، بتردد 1.2 جيجاهرتز. ويحتوي على ذاكرة وصول عشوائي DDR3 بسعة 512 ميجابايت، بالإضافة إلى شريحة eMMC مدمجة بسعة 16 جيجابايت.

للتحكم في منافذ الإدخال/الإخراج العامة (GPIO)، يحتوي الجهاز على معالج مساعد، هو GD32VF103C8T6. قد يبدو الاسم طويلًا، ولكنه معالج RISC-V بتردد 108 ميجاهرتز، مزود بذاكرة فلاش بسعة 64 كيلوبايت وذاكرة SRAM بسعة 32 كيلوبايت.

لا يستطيع المعالج المركزي التحكم المباشر في منافذ الإدخال/الإخراج العامة، لذا أُضيف معالج مساعد يُمكننا التحكم به باستخدام لغة بايثون. يتحكم النظام بالمعالج المساعد باستخدام مكتبة PinPong.

صُنعت اللوحة بواسطة شركة DFRobot، ويمكنكم الاطلاع على المزيد من التفاصيل عنها عبر صفحة ويكي الخاصة بهم.

هنــــــــــــــــــــــــــــا



يعمل جهاز UNIHIKER M10 بنظام Debian Linux كامل. يتم التحكم بكل مكوناته، بما في ذلك الشاشة ومنافذ GPIO والمستشعرات، عبر لغة Python، لذا لا يدعم بيئة تطوير Arduino، وللأسف، لا يدعم لغة C.

استلهمتُ تصميم الخريطة من واجهة Pip-Boy 3000 في لعبة Fallout: New Vegas، والتي تتميز بلونها الكهرماني. فالخرائط العادية مملة، وبصفتي من مُحبي سلسلة Fallout، كان من واجبي تصميم خريطة مستوحاة من Pip-Boy.

يُستخدم مكتبتان. الأولى هي برنامج تشغيل UNIHIKER، الذي يتحكم بشاشة العرض المدمجة بدقة 240×320. أما الثانية فهي مكتبة PinPong، التي تُستخدم لقراءة وكتابة منافذ GPIO.

عرض الإطارات


نقوم أولاً بإنشاء عنصر واجهة المستخدم للص

gui = GUI()

# Create once
display_img = gui.draw_image(x=0, y=0, image="/tmp/frame.png")

# Every frame: save new image, then update the same widget
frame.save("/tmp/frame.png")
display_img.config(image="/tmp/frame.png")

تُنشأ جميع الرسومات في الذاكرة باستخدام Pillow - بدون إطار عرض أو Pygame. تمر كل إطار بالمراحل التالية:


قص جزء من الخريطة بحجم 2000×2000 لعرض 320×240 بكسل

تطبيق لون كهرماني

رسم شبكة CRT مع أيقونات نقاط الاهتمام

تركيب خطوط المسح الضوئي

تحريك مؤشر التصويب

رسم أشرطة واجهة المستخدم الرسومية

تدوير الخريطة إلى الوضع الأفقي

حفظها ورفعها

```python
from PIL import Image, ImageDraw

viewport = self._map.crop((x0, y0, x0 + VIEWPORT_W, y0 + VIEWPORT_H))
frame = viewport.convert("RGBA")
draw = ImageDraw.Draw(frame)
```

لون كهرماني

يتم تحميل الخريطة بنظام ألوان RGB عادي. وللحصول على مظهر فسفور Pip-Boy، تُستخدم القناة الحمراء كمصدر سطوع للقنوات الثلاث جميعها.

r, g, b = img.split()
img = Image.merge("RGB", (
r,
r.point(lambda v: int(v * 0.71)), # amber green
r.point(lambda v: int(v * 0.26)), # amber blue
))

Ratios `(1.0, 0.71, 0.26)` match the target amber `(255, 182, 66)`.

الأزرار المادية

تُوصَّل الأزرار بدبابيس GPIO باستخدام مقاومات سحب داخلية. عند الضغط عليها، ينخفض ​​مستوى إشارة الدبوس، لذا فإن قراءة القيمة `0` تعني "مضغوط".

from pinpong.board import Board, Pin

Board("unihiker").begin()
btn_up = Pin(Pin.P3, Pin.IN, Pin.PULLUP)

if btn_up.read_digital() == 0:
move_y = -PAN_SPEED

if not hasattr(Pin, "PULLUP") and hasattr(Pin, "PULL_UP"):
Pin.PULLUP = Pin.PULL_UP

عرض أفقي على شاشة عمودية

شاشة العرض الفعلية بحجم ٢٤٠×٣٢٠ بكسل (عمودي). أرسم على لوحة رسم بحجم ٣٢٠×٢٤٠ بكسل (أفقي) وأقوم بتدوير كل إطار قبل الحفظ.

frame = frame.rotate(-90, expand=True)
# result: 240×320 — fills the screen when held sideways

حلقة العرض

حلقة قياسية ذات خطوة زمنية ثابتة — توقف مؤقتًا للمدة المتبقية في ميزانية الإطار

target_fps = 15
frame_time = 1.0 / target_fps

while True:
t0 = time.time()
# ... read buttons, render, push frame ...
sleep_t = frame_time - (time.time() - t0)
if sleep_t > 0:
time.sleep(sleep_t)

المكتبات

| Library | Install | Purpose |
|---|---|---|
| `pillow` | `pip install pillow` | All image rendering |
| `unihiker` | pre-installed | Push frames to the screen |
| `pinpong` | pre-installed | GPIO buttons and buzzer |
| `math`, `time`, `os` | standard library | Animation, timing, file checks |


بعد ضبط إعدادات الخريطة، انتقلنا إلى مشكلة مصدر الطاقة في لوحة UNIHIKER. تستخدم لوحة UNIHIKER M10 منفذ USB من النوع C كمصدر للطاقة، مما يوفر جهدًا ثابتًا قدره 5 فولت لتشغيلها. تكمن المشكلة في هذه اللوحة في عدم وجود موصل بطارية مدمج.

بالقرب من منفذ النوع C، نجد طرفين. الطرف الأول موصول بجهد VCC الخاص بمنفذ USB من النوع C، والطرف الآخر موصول بالأرضي (GND).

بتوفير جهد 5 فولت لهذين الطرفين، يمكننا تشغيل اللوحة، ولكننا نحتاج إلى مصدر طاقة ثابت.

تصميم ثلاثي الأبعاد


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

ولتحسين التصميم، أضفتُ غطاءً للشاشة، له وظيفة عملية أيضًا. فعند استخدام الجهاز في الهواء الطلق، يوفر الغطاء ظلًا للشاشة، مما يُسهّل رؤيتها.

كما أضفتُ مقبضًا كبيرًا، وهو ليس جزءًا عمليًا أو وظيفيًا، وإنما وُضع لأغراض جمالية بحتة. بالإضافة إلى ذلك، أضفتُ قطعة أخرى في الجهة الأمامية لأغراض جمالية.

بإضافة هذه القطع المختلفة، كان هدفي استخدام ثلاثة خيوط طباعة ثلاثية الأبعاد ملونة، الأحمر والأبيض والأسود، لطباعة المكونات، مما يُنتج مزيجًا لونيًا رائعًا.

يحتو النموذج على تخطيط دوائر كهربائية مُنظم، بما في ذلك لوحة الأزرار. ولكل دائرة نقاط تثبيت خاصة بها، حيث نضع اللوحات ونثبتها باستخدام براغي M2.

أضفنا أيضًا فتحات على أحد جانبي الجهاز للوصول إلى منفذ USB الخاص بـ UNIHIKER M10 في حال رغبنا في إعادة برمجة الجهاز. كما أضفنا فتحات للوصول إلى منفذ USB الخاص بوحدة الطاقة وزر التشغيل/الإيقاف.

ولتركيب حزام بطاقة الهوية، أضفنا قطعة على شكل خطاف في أحد طرفي الحزام.

أزاء مطبوعة بتقنية الطباعة ثلاثية الأبعاد


بعد الانتهاء من تصميم النموذج، قمنا بطباعة جميع الأجزاء بتقنية الطباعة ثلاثية الأبعاد باستخدام خيوط Hyper PLA بنفس الإعدادات، والتي تضمنت ارتفاع طبقة 0.2 مم، ونسبة تعبئة 25%، ودعامات شجرية بمسافة 0.3 مم على المحور Z.

طُبع الهيكل الأمامي بخيوط Hyper PLA بيضاء. أما الهيكل الخلفي، وغطاء الشاشة، والجزء الزخرفي، فطُبعت جميعها بخيوط Hyper PLA سوداء.

استُخدمت خيوط Hyper PLA حمراء لطباعة المفاتيح الأربعة ومقبض الجهاز.

تصميم لوحة الدوائر المطبوعة - لوحة الطاقة


هنا، نعيد استخدام الدائرة المستخدمة في مشروع الشاشة المحمولة.

في هذه الدائرة، تسحب دائرة إدارة الطاقة IP5306 تيارًا ثابتًا قدره 5 فولت/2 أمبير من بطارية ليثيوم أيون 3.7 فولت. تمنع خصائص قطع التيار العالي والمنخفض فيها الشحن الزائد والتفريغ الزائد للبطارية.

منفذ الشحن المستخدم هو منفذ من النوع C ذو فتحات توصيل، ويتصل بمنفذ شحن الدائرة المتكاملة. بالإضافة إلى منفذ الشحن والأرضي (GND)، أضفنا مكثف ترشيح سعته 10 ميكروفاراد، ومجموعة مكثفات سعتها 10 ميكروفاراد مع مقاومة 2 أوم.

كما أضفنا أربعة مصابيح LED، تعمل كمؤشرات امتلاء البطارية، إلى منفذ LED الخاص بالدائرة المتكاملة.

أضفنا زر ضغط لتشغيل وإيقاف هذا الجهاز.

كما أضفنا مكثفَي ترشيح إضافيين إلى مخرجي الدائرة المتكاملة والأرضي (GND).

خدمة PCBWAY





في عملية تجميع لوحة الدوائر المطبوعة هذه، نستخدم محقنة لتوزيع معجون اللحام. نضع معجون اللحام على كل نقطة توصيل للمكونات لبدء عملية تجميع الدائرة الرئيسية. نستخدم هنا معجون لحام Sn/Pb بنسبة 63/37، والذي تبلغ درجة انصهاره 190 درجة مئوية.

بعد ذلك، نختار كل مكون من مكونات SMD ونضعه في مكانه الصحيح.

ثم تُثبّت جميع المكونات بشكل دائم على نقاط التوصيل الخاصة بها عند وضع الدائرة بأكملها على صفيحة التسخين بالتدفق، والتي تُسخّن لوحة الدوائر المطبوعة إلى درجة انصهار معجون اللحام.

بعد ذلك، نضع كل مكون من مكونات THT، بما في ذلك منفذ Type C وزر الضغط العمودي، في مكانه الصحيح. نضع منفذ Type C في الأعلى، بينما نعكس وضع زر الضغط ونضعه في الأسفل. باستخدام مكواة اللحام، نلحم كلا المكونين في مكانهما.

مصدر الطاقة


نستخدم في هذا المشروع خلية ليثيوم أيون كمصدر للطاقة، وتحديدًا خلية ليثيوم أيون من نوع 14500 بجهد 3.7 فولت وسعة 600 مللي أمبير، مزودة بدائرة PCM مثبتة مسبقًا. تحمي هذه الدائرة الخلية من الشحن الزائد والتفريغ الزائد، كما توفر حماية من قصر الدائرة.

يتم لحام طرفي الخلية (B+ وB-) بأطراف البطارية على لوحة إدارة الطاقة باستخدام مكواة لحام.

لاختبار الدائرة، استخدمتُ جهاز قياس متعدد، وضغطتُ على الزر الرأسي لتشغيلها، فرأينا مؤشر LED يضيء.

باستدام جهاز القياس المتعدد، تحققنا من جهد خرج الدائرة، والذي بلغ 5 فولت ثابتة، مما يعني أن الدائرة تعمل بشكل صحيح.

تصميم لوحة الدوائر المطبوعة - لوحة الأزرار


هذه هي لوحة الدوائر المطبوعة الثانية التي استخدمناها في مشروعنا، وهي لوحة الأزرار.

أضفنا هنا أربعة أزرار ضغط بحجم 4×4 مم على لوحة بحجم 20×20 مم. تم تحديد موضع كل زر وفتحات التثبيت وفقًا للنموذج ثلاثي الأبعاد.

كما أضفنا موصل CON5. تم توصيل الطرف الأول بالأرضي (GND)، بينما تم توصيل الأطراف الأربعة المتبقية بدبابيس كل زر. سنستخدم هذا الموصل لاحقًا لربط جهاز UNIHIKER M10 بلوحة الأزرار.

للعلم، نعيد استخدام هذه اللوحة من مشروع سابق، يمكنك الاطلاع عليه عبر الرابط أدناه.

هنــــــــــــــــــــــــــــــــــــــــــــــــــا


كان تجميع لوحة الأزرار بسيطًا للغاية.

وضعنا الأزرار الأربعة في أماكنها، ثم قلبنا اللوحة، واستخدمنا مكواة اللحام لتوصيل جميع أطراف الأزرار.

إعدادات الإلكترونيات


يتكون النظام الإلكتروني لهذا المشروع من وحدة UNIHIKER M10 موصولة بلوحة الأزرار بالترتيب التالي:

الزر A موصول بالمنفذ P3 في وحدة UNIHIKER. الزر B موصول بالمنفذ P0 في وحدة UNIHIKER. الزر C موصول بالمنفذ P1. الزر D موصول بالمنفذ P2.

استخدمنا أيضًا الجرس المدمج، الموصول بالمنفذ P26.

بعد ذلك، قمنا بتوصيل طرفي 5 فولت وGND في لوحة الطاقة بطرفي 5 فولت وGND في وحدة UNIHIKER باستخدام سلكين.

بالضغط على الزر العمودي، يتم تشغيل النظام، وتضيء شاشة UNIHIKER، مما يشير إلى أن النظام يعمل.

عملية تجميع الهيكل


نبدأ الآن عملية التجميع، والتي تبدأ بوضع لوحة الأزرار فوق نقاط تثبيت البراغي الأربعة. ثم نثبتها باستخدام أربعة براغي M2.

بعد ذلك، توضع خلية الليثيوم في الجزء السفلي من الجهاز، حيث قمنا بتصميم حامل البطارية. كما توضع الدائرة الكهربائية في مكانها فوق نقطتي تثبيت البراغي وتُشدّ باستخدام برغيين M2. نستخدم القليل من الغراء الساخن لتثبيت الخلية في مكانها.

نستخدم غراءً فائقًا لتثبيت الجزء الزخرفي الذي صممناه ووضعه فوق الجزء الأمامي من الجهاز. نضع الغراء الفائق على الجهة الأمامية، ثم نضع الجزء الزخرفي ونثبته في مكانه.

يتم وضع جهاز UNIHIKER M10 من داخل الجزء الأمامي من الجهاز. نستخدم الغراء الساخن لتثبيته بإحكام.

تُضاف الأزرار المطبوعة بتقنية الطباعة ثلاثية الأبعاد في مكانها من داخل الجزء الأمامي من الجهاز. ثم يتم تجميع الجزأين الأمامي والخلفي معًا وتثبيتهما باستخدام أربعة براغي M2.

بعد ذلك، يُضاف مقبض الجهاز في مكانه على الجهة الأمامية من الجهاز. هذا المقبض مخصص للزينة فقط وليس له وظيفة عملية.

من الجهة الأمامية، نضع غطاء المصباح في مكانه ونثبته باستخدام برغيين من نوع M2.

تمّ التجميع.

إليكم النتيجة النهائية لهذا المشروع: PathFinder، جهاز الخرائط الرقمية الذي صنعته بنفسي، والذي يساعد المسافرين على إيجاد طريقهم. إنه ببساطة خريطة داخل شاشة، يتم تحميلها دون الحاجة إلى شبكة Wi-Fi أو أي اتصال بالإنترنت. باستخدام لوحة التحكم، يمكننا التنقل بسهولة على الخريطة.

صُممت الخريطة لتشبه خريطة لعبة Fallout: New Vegas، بلونها الكهرماني، لكنها تُظهر مدينتي، وهذا رائع حقًا.

لاختبار الجهاز عمليًا، أخذت دراجتي النارية وذهبت إلى منطقة لم أزرها من قبل. جربت التنقل باستخدام PathFinder، وقد عمل بشكل ممتاز.

اتبعت الخريطة، وسلكت طريقًا في منطقة نائية، في قلب غابة، وتنقلت عبرها، ثم عدت في النهاية إلى طريق سريع مألوف.

الخلاصة

هذه الخريطة تعمل، بل وتعمل بشكل جيد، لكنني واجهت بعض المشاكل أثناء الاختبار الميداني.

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

من القيود الأخرى حجم الخريطة. حاليًا، تغطي الخريطة مساحة محدودة تبلغ حوالي 2000×2000 بكسل. يمكن زيادة هذه المساحة بتعديل حجم ملف map.py، لكن ذلك يزيد من حجم الكود. لذا، أحتاج إلى إيجاد طريقة لتوسيع الخريطة بكفاءة دون زيادة حجم الكود بشكل ملحوظ.

أدركت أيضًا أن هذا الجهاز قد يكون أكثر عمليةً إذا تم تثبيته على دراجتي النارية بدلًا من حمله كشارة.

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


في الإصدار الثاني من هذا المشروع، سأعمل أولاً على إصلاح المشاكل الأساسية، وربما أجربه في رحلة.

شكرًا جزيلًا لكم على وصولكم إلى هنا، وسأعود قريبًا بمشروع جديد!

مع السلامة.







ليست هناك تعليقات:

إرسال تعليق