لوحة تحكم كشك بشاشة لمس على ZimaBoard 2 باستخدام Docker (X.Org + Chromium)

إيفا وونغ هي كاتبة تقنية و ومهندسة هاوية في ZimaSpace. مهووسة بالتكنولوجيا مدى الحياة ولديها شغف بالمختبرات المنزلية والبرمجيات مفتوحة المصدر، تتخصص في تبسيط المفاهيم التقنية المعقدة إلى أدلة عملية وسهلة الفهم. تؤمن إيفا بأن الاستضافة الذاتية يجب أن تكون ممتعة وليست مخيفة. من خلال دروسها، تمكّن المجتمع من تبسيط إعدادات الأجهزة، بدءًا من بناء أول نظام تخزين شبكي NAS وحتى إتقان حاويات Docker.

مرحباً جميعاً،

أردت أن أشارك كيف شغلت كشك شاشة لمس بملء الشاشة على ZimaBoard 2 الخاص بي المتصل بشاشة لمس 22" عبر HDMI.

بما أن ZimaOS لا يحتوي على مدير حزم (apt غير موجود)، الحيلة هي القيام بكل شيء داخل حاويات Docker.

إعدادي

ZimaBoard 2 1664 (Intel N100، 16 جيجابايت رام)

ZimaOS الإصدار 1.5.4

شاشة لمس 22" عبر HDMI + إدخال شاشة لمس USB-C→USB-A

صورة مقربة لصندوق كمبيوتر Thermaltake Tower 900 أبيض وأحمر، مع إضاءة LED زرقاء مخصصة وعرض تفصيلي للمكونات الداخلية، بما في ذلك معالج إنتل والذاكرة.

النهج

ZimaOS مبني على Buildroot — لا يوجد apt، لا يوجد Xorg، لا يوجد بيئة سطح مكتب. بدلاً من ذلك، نشغل حاوية Debian مع سائق Xorg modesetting + Chromium في وضع الكشك، مع تمرير /dev/dri. حاوية nginx:alpine منفصلة تخدم ملفات لوحة التحكم.

-15% OFF

الخطوة 1 — أضف المستخدم الخاص بك إلى مجموعة docker

افتح الطرفية على الويب عبر http://your-zima-ip:7681 وشغل:

bash

sudo usermod -aG docker YOUR_USERNAME

ثم أعد الاتصال بـ SSH لتفعيل التغيير.

الخطوة 2 — إنشاء الملفات

bash

mkdir -p /DATA/AppData/kiosk/dashboard

/DATA/AppData/kiosk/Dockerfile:

نص

FROM debian:bookworm-slim
RUN echo 'deb http://deb.debian.org/debian bookworm-backports main' >> /etc/apt/sources.list
RUN apt-get update && \
apt-get install -y \
xserver-xorg-core \
xserver-xorg-input-libinput \
openbox chromium \
x11-xserver-utils xinit \
fonts-noto-core && \
apt-get install -y -t bookworm-backports libgl1-mesa-dri && \
rm -rf /var/lib/apt/lists/*
COPY xorg.conf /etc/X11/xorg.conf
COPY entrypoint.sh /entrypoint.sh
RUN chmod +x /entrypoint.sh
ENTRYPOINT ["/entrypoint.sh"]

لماذا نستخدم backports لـ Mesa؟ معالج Intel N100 (Alder Lake-N، معرف PCI 0x46d4) مدعوم فقط من Mesa 23.0+. توزيعة Debian bookworm تأتي مع 22.3. توفر backports إصدار 25.x.

/DATA/AppData/kiosk/xorg.conf:

نص

القسم "الجهاز"
المعرف "إنتل"
السائق "modesetting"
الخيار "طريقة التسريع" "لا شيء"
EndSection

القسم "الشاشة"
المعرف "الافتراضي"
الجهاز "إنتل"
EndSection

القسم "جهاز الإدخال"
المعرف "شاشة اللمس"
السائق "libinput"
الخيار "الجهاز" "/dev/input/event8"
EndSection

القسم "تخطيط الخادم"
المعرف "الافتراضي"
الشاشة "الافتراضية"
جهاز الإدخال "شاشة لمس" "المؤشر الأساسي"
EndSection

ابحث عن رقم حدث جهاز اللمس الخاص بك باستخدام:

bash

cat /proc/bus/input/devices | grep -A3 -i touch

/DATA/AppData/kiosk/entrypoint.sh:

نص

#!/bin/sh
Xorg :0 vt1 -s 0 -dpms -nolisten tcp &
sleep 4
export DISPLAY=:0
xset s off && xset -dpms && xset s noblank
openbox --sm-disable &
sleep 1
exec chromium \
--kiosk --no-sandbox --disable-gpu \
--disable-dev-shm-usage \
--touch-events=enabled \
--no-first-run --disable-infobars \
"${KIOSK_URL:-http://localhost:8888}"

/DATA/AppData/kiosk/nginx.conf:

نص

server {
listen 8888;
root /usr/share/nginx/html;
index index.html;
}

ضع ملفات HTML/CSS/JS الخاصة بلوحتك في /DATA/AppData/kiosk/dashboard/.

عرض علوي لخادم ZimaBoard ذو اللوحة الواحدة، يبرز فتحة التوسعة PCIe، منفذي إيثرنت، وموصلات SATA لتكامل مشاريع DIY.

الخطوة 3 — البناء والتشغيل

بناء (ملاحظة: يحتاج docker build إلى --config /tmp على ZimaOS):

bash

docker --config /tmp build -t kiosk:latest /DATA/AppData/kiosk

خادم الويب للوحة التحكم:

bash

docker --config /tmp run -d \
--name dashboard-server \
--restart unless-stopped \
--network host \
-v /DATA/AppData/kiosk/dashboard:/usr/share/nginx/html:ro \
-v /DATA/AppData/kiosk/nginx.conf:/etc/nginx/conf.d/default.conf:ro \
nginx:alpine

عرض الكشك:

bash

docker --config /tmp run -d \
--name jarvis-kiosk \
--restart unless-stopped \
--privileged \
--network host \
-e KIOSK_URL=http://localhost:8888 \
-v /DATA/AppData/kiosk/xorg.conf:/etc/X11/xorg.conf:ro \
-v /DATA/AppData/kiosk/entrypoint.sh:/entrypoint.sh:ro \
-v /run/udev:/run/udev:ro \
kiosk:latest

كلا الحاويتين تحتويان على --restart unless-stopped لذا تبقى تعمل تلقائيًا بعد إعادة التشغيل.

تصحيح نقر شاشة اللمس (مهم!)

تقوم مكتبة libinput الخاصة بـ Xorg بتحويل اللمس إلى أحداث مؤشر (ماوس). ثم يطبق Chromium عتبة حركة صغيرة للنقر — حتى تحريك الإصبع بمقدار 1px يمنع النقر من التنفيذ. إذا كان لوحتك تستخدم معالجات onclick، أضف هذا الجافا سكريبت لاستبدالها بـ pointerup مع عتبة 20px:

js

(دالة touchFix() {
ثابت downs = {};
document.addEventListener('pointerdown', e => {
downs[e.pointerId] = { x: e.clientX, y: e.clientY };
}, { passive: true });
دالة isTap(e) {
ثابت d = downs[e.pointerId];
إرجاع !d || (Math.abs(e.clientX - d.x) < 20 && Math.abs(e.clientY - d.y) < 20);
}
دالة run(fn) { حاول { دالة جديدة(fn)(); } التقاط(ex) {} }
دالة patchButtons(root) {
root.querySelectorAll('button[onclick]').forEach(btn => {
ثابت oc = btn.getAttribute('onclick');
btn.removeAttribute('onclick');
btn.addEventListener('pointerup', e => { e.stopPropagation(); إذا (isTap(e)) run(oc); });
});
}
window.addEventListener('load', () => {
document.querySelectorAll('.widget[onclick]').forEach(el => {
ثابت oc = el.getAttribute('onclick');
el.removeAttribute('onclick');
el.addEventListener('pointerup', e => { إذا (isTap(e) && !e.target.closest('button')) run(oc); });
});
patchButtons(document.body);
});
مراقب التغييرات الجديد MutationObserver(muts => muts.forEach(m =>
m.addedNodes.forEach(n => { إذا (n.nodeType === 1) patchButtons(n); })
)).observe(document.body, { childList: true, subtree: true });
})();

أضف أيضًا إلى CSS الخاص بك لإخفاء مؤشر الماوس على شاشة اللمس:

css

{ cursor: none !important; touch-action: manipulation; }

شاشة لمس Pisichen بحجم 22 بوصة متصلة بـ ZimaBoard عبر HDMI وUSB، تعرض لوحة تحكم ذكية مخصصة للمنزل مع أدوات تفاعلية.

استكشاف الأخطاء وإصلاحها

مشكلة إصلاح
فشل بناء docker بسبب علم غير معروف استخدم docker --config /tmp build …
شاشة سوداء / فشل اختبار الإخراج الأساسي استخدم Xorg modesetting، وليس Wayland/cage
Mesa لا تدعم N100 قم بتثبيت libgl1-mesa-dri من bookworm-backports
لم يتم اكتشاف إدخال اللمس تحقق من رقم الحدث باستخدام /proc/bus/input/devices، وقم بتحديث xorg.conf
لوحة التحكم تعرض تسجيل دخول ZimaOS المنفذ 80 مستخدم من قبل ZimaOS — استخدم منفذًا مختلفًا (888 يعمل)

إعداد المساعد المنزلي الدائم الخاص بي (رد)

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

الكمبيوتر الرئيسي

إليك ما بداخل الجهاز الرئيسي:

المعالج: AMD Ryzen 9 9950X3D

اللوحة الأم: ASUS ROG Crosshair X870E Glacial

الذاكرة العشوائية: Acer Predator Hermes RGB DDR5 96GB (2×48GB) 6000MHz CL28

التخزين: Crucial T710 4TB NVMe M.2 PCIe 5.0 Gen5

بطاقة الرسوميات (الألعاب): ASUS ROG Astral GeForce RTX 5080 16GB

بطاقة الرسوميات (الذكاء الاصطناعي): Intel Arc Pro B70 32GB (بانتظار الإصدار)

مزود الطاقة: Corsair RM1200x

الصندوق: Thermaltake Tower 900

إعداد Zima (المركز الدائم التشغيل)

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

الأجهزة الطرفية المتصلة مباشرة بـ Zima:

شاشة لمس Pisichen 22" عبر HDMI → محول miniDP + كابل USB-C واحد لإدخال اللمس

مكبرات صوت Edifier G1000 II عبر بطاقة صوت خارجية USB-A إلى 3.5 مم

ميكروفون DAMAO DGM20S عبر USB-A

التخزين:

Seagate IronWolf Pro 20TB — قرص NAS "الثقب الأسود"

Seagate IronWolf Pro 1TB — القرص الرئيسي لـ NAS

الشبكات:

Zima متصل بالموجه عبر إيثرنت

كابل إيثرنت ثاني يربط مباشرة من Zima إلى الكمبيوتر لنقل بيانات محلي سريع

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

الجزء الذكي: Wake-on-LAN

إليك السحر — عندما يطرح شخص ما سؤالًا معقدًا جدًا بحيث لا يستطيع Gemini التعامل معه جيدًا، يرسل Zima حزمة Wake-on-LAN لإيقاظ الكمبيوتر الرئيسي من وضع السكون. بمجرد استيقاظه، يتصل بـ نموذج لغوي كبير 70B معلمات يعمل محليًا على Intel Arc Pro B70. بعد الانتهاء من المهمة، يعود الكمبيوتر إلى النوم.

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

تحية كبيرة لـ Claude Code و Perplexity — بصراحة، بدون مساعدتهما لما كنت قادرًا على إنجاز هذا المشروع بأكمله بمفردي. لقد كانا لا يقدران بثمن طوال العملية بأكملها.

آمل أن تساعد هذه المعلومات أي شخص مجنون بما يكفي لخوض مشروع مماثل — لا تتردد في مشاركتها أينما شئت!

مركز حملة Zima

المزيد للقراءة

Get More Builds Like This

Stay in the Loop

Get updates from Zima - new products, exclusive deals, and real builds from the community.

Stay in the Loop preferences

We respect your inbox. Unsubscribe anytime.