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

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

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

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

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

إعدادي

ZimaBoard 2 1664 (إنتل 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 منفصلة تخدم ملفات لوحة التحكم.

الخطوة 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:

text

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"]

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

/DATA/AppData/kiosk/xorg.conf:

text

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

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

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

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

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

bash

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

/DATA/AppData/kiosk/entrypoint.sh:

text

#!/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:

text

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

(function touchFix() {
const downs = {};
document.addEventListener('pointerdown', e => {
downs[e.pointerId] = { x: e.clientX, y: e.clientY };
}, { passive: true });
function isTap(e) {
const d = downs[e.pointerId];
return !d || (Math.abs(e.clientX - d.x) < 20 && Math.abs(e.clientY - d.y) < 20);
}
function run(fn) { try { new Function(fn)(); } catch(ex) {} }
function patchButtons(root) {
root.querySelectorAll('button[onclick]').forEach(btn => {
const oc = btn.getAttribute('onclick');
btn.removeAttribute('onclick');
btn.addEventListener('pointerup', e => { e.stopPropagation(); if (isTap(e)) run(oc); });
});
}
window.addEventListener('load', () => {
document.querySelectorAll('.widget[onclick]').forEach(el => {
const oc = el.getAttribute('onclick');
el.removeAttribute('onclick');
el.addEventListener('pointerup', e => { if (isTap(e) && !e.target.closest('button')) run(oc); });
});
patchButtons(document.body);
});
new MutationObserver(muts => muts.forEach(m =>
m.addedNodes.forEach(n => { if (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 لإيقاظ الكمبيوتر الرئيسي من وضع السبات. بمجرد استيقاظه، يتصل بـ نموذج LLM محلي بمعاملات 70 مليار يعمل على 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.