أداة تحميل لعلامة اسم LED مع واجهة USB-HID
تمت إضافة الأحرف الفرنسية البارزة

الأنواع التي يدعمها هذا المشروع لديها مجموعة من
44 × 11 المصابيح أو
48 × 12 المصابيح.
الشركة المصنعة على الأرجح هي https://lesun-led.en.alibaba.com/
في كلا التكوينين، تُعرّف الشارة نفسها على USB بأنها
idVendor=0416, idProduct=5020 Mfr=1, Product=2, SerialNumber=0 LSicroelectronics LS32 Custm HID
هناك العديد من الإصدارات المختلفة لشارات LED في السوق. يستخدم هذا الجهاز واجهة USB-HID، بينما يستخدم البعض الآخر USB-Serial (انظر المراجع أدناه).
سيقوم ما يلي بتثبيت قاعدة udev التي تسمح لأي شخص بالوصول للقراءة/الكتابة إلى الشارة عبر USB.
sudo cp 99-led-badge-44x11.rules /etc/udev/rules.d/ sudo udevadm control --reload-rules && sudo udevadm trigger
sudo apt install python3-usb python3-pil
سيسمح استخدام venv باستخدام النقطة لتثبيت التبعيات دون التعرض لخطر تداخل الوحدات المثبتة مع الوحدات المثبتة في النظام. في بعض الأنظمة (خاصة تلك التي تم تثبيت Python 2 و 3 عليها)، يجب عليك التعامل مع Python 3 بشكل صريح باستخدام الأمر python3 / pip3 بدلاً من python / pip .
sudo apt install python3-venv python -m venv ledtag source ledtag/bin/activate pip install pyhidapi pyusb pillow # this should now work: # python led-badge-11x44.py -m 6 -s 8 "Hello" "World!"
إذا تم تثبيت قواعد udev، فمن المفترض أن تكون قادرًا على الوصول إلى الشارة دون امتيازات sudo/root.
لإعادة استخدام venv مرة أخرى في وقت لاحق:
source ledtag/bin/activate python led-badge-11x44.py …
sudo dnf install hidapi python3-hidapi python3-pillow python3-pyusb
بالنسبة لبعض التوزيعات، هناك تناقض بين المكان الذي يبحث فيه pyhidapi عن lib والمكان الذي تضعه فيه الحزمة hidapi. الحل البسيط هو ربط المكتبة بالمكان المطلوب، على سبيل المثال
ln -s /usr/lib/libhidapi-hidraw.so.0 /usr/local/lib/
في بعض الأنظمة (خاصة تلك التي تم تثبيت Python 2 و 3 عليها)، يجب عليك معالجة Python 3 بشكل صريح باستخدام الأمر pip3 بدلاً من pip .
sudo easy_install pip pip install pyhidapi pip install pillow ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" < /dev/null 2> /dev/null brew install hidapi
بالنسبة لنظام التشغيل Windows، نحتاج إلى إعداد واجهة برمجة التطبيقات libusb لجهاز شارة LED. الطريقة الموضحة هنا تستخدم libusb-win32 بطريقة منخفضة المستوى جدًا وفي إصدار قديم جدًا:
الرجاء استخدام الإصدار 1.2.6.0 من 'libusb-win32'. لا يزال متاحًا في مستودع المشروع القديم على SourceForge
ثم
قم باستخراج الملف المضغوط الذي تم تنزيله وانتقل إلى الدليل libusb-win32-bin-1.2.6.0bin
انقر بزر الماوس الأيمن على inf-wizard.exe ثم Run as Administrator
Next -> حدد 0x0416 0x5020 LS32 Custm HID (أو ما شابه ذلك بنفس المعرفات)
Next -> Next -> حفظ باسم مربع الحوار LS32_Sustm_HID.inf -> Save (للمتابعة فقط، لا نحتاج إلى هذا الملف)
Install Now... -> اكتمل تثبيت برنامج التشغيل -> OK
هناك طرق أخرى - موصى بها في الوقت نفسه، ولكن لم يتم اختبارها هنا - لتثبيت وإعداد إصدارات أحدث من libusb-win32 : استخدم Zadig (وهو متاح أيضًا من repo libusb-win32 القديم على GitHub repo للإصدارات الأحدث) أو libusbK
وبطبيعة الحال، هناك حاجة إلى بايثون:
قم بتنزيل أحدث إصدار من لغة python من python.org، أو إصدارات محددة من هنا
[x] تثبيت Launcher لجميع المستخدمين
[x] أضف Python XY إلى PATH
ضع علامة اختيار على الخيارات التالية
انقر فوق Install Now ... رسالة نصية.
اختياريًا، انقر فوق الرسالة النصية "تعطيل حد طول المسار". هذا هو دائما شيء جيد للقيام به.
التثبيت يحتاج إلى حزم بايثون. في بعض الأنظمة (خاصة تلك التي تم تثبيت Python 2 و 3 عليها)، يجب عليك معالجة Python 3 بشكل صريح باستخدام الأمر pip3 بدلاً من pip .
قم بتشغيل cmd.exe كمسؤول، وأدخل:
pip install pyusb pip install pillow
لتشغيل هذه الأمثلة على نظام التشغيل Linux، قد يتعين عليك إضافة sudo مسبقًا للوصول إلى جهاز USB أو تثبيت قاعدة udev كما هو مذكور أعلاه. في نظام التشغيل Windows، ربما يتعين عليك تشغيل cmd.exe ، حيث تقوم بإدخال الأوامر، باستخدام Run as administrator ، والذي يشبه sudo على Linux.
في بعض الأنظمة (خاصة تلك التي تم تثبيت Python 2 و 3 عليها)، يجب عليك معالجة Python 3 بشكل صريح باستخدام python3 بدلاً من python . قم بتشغيل python -V لمعرفة إصدار python الذي تم تكوينه كإعداد افتراضي.
python ./led-badge-11x44.py "Hello World!"
يقوم بتحميل النص "Hello World!" كرسالة أولى، وتمريرها من اليمين إلى اليسار (وضع التمرير الافتراضي = 0) والسرعة 4 (افتراضي). بعد التحميل، يعرض الجهاز الرسالة الأولى مرة واحدة ويعود إلى شاشة الشحن إذا كان لا يزال متصلاً بـ USB. إما أن تسحب القابس أو تضغط على الزر الصغير الموجود بجوار موصل USB.
python ./led-badge-11x44.py -m 6 -s 8 "Hello" "World!"
يقوم بتحميل النص "Hello" كرسالة واحدة و"World!" كرسالة اثنين. قارن الفرق في الاقتباس بالمثال السابق. يمكن تحميل ما يصل إلى 8 رسائل. يستخدم هذا المثال الوضع 6، الذي يسقط الكلمات ذات الرسوم المتحركة الصغيرة اللطيفة عموديًا في منطقة العرض. تم ضبط السرعة على الحد الأقصى هنا، من أجل السلاسة.
بشكل افتراضي، سترى فقط "مرحبًا". لرؤية جميع الرسائل، اضغط على الزر الصغير بجوار موصل USB عدة مرات، حتى ترى لفترة وجيزة "M1-8". الآن يتم عرض حلقات العرض عبر جميع الرسائل التي تم تحميلها.
python ./led-badge-11x44.py -m 5 :gfx/fablabnbg_logo_44x11.png:
يقوم بتحميل صورة ثابتة بملء الشاشة. تجنب المسافة البيضاء بين النقطتين والاسم. إذا تلقيت رسالة ImportError: cannot import name '_imaging' ، فحاول تحديث الحزمة المقابلة: sudo pip install -U pillow
python ./led-badge-11x44.py "I:HEART2:my:gfx/fablab_logo_16x11.png:fablab:1:"
يستخدم صورة مدمجة وصورة واحدة محملة. تم بناء القلب، ويتم تحميل شعار fablab من الملف. يتم استخدام شعار fablab مرتين، مرة قبل كلمة "fablab" ومرة أخرى خلفها من خلال المرجع ":1:" (الذي يشير إلى أول صورة تم تحميلها).

python ./led-badge-11x44.py -s7 -m0,1 :bicycle: :bicycle_r:
تعرض دراجة تعبر الشاشة من اليسار إلى اليمين ومن اليمين إلى اليسار (كرسالة ثانية). إذا قمت بتحديد الوضع "M1-8"، فإن الدراجة تعمل بشكل دائم ذهابًا وإيابًا على الشاشة. يمكنك إضافة رسالة قصيرة إلى أحدهما أو كليهما، لتظهر أن الدراجة تقوم بتحريك النص.

python ./led-badge-11-x44.py -b0,1 -s1 -m5 " :heart2: :HEART2:" " :HEART2:"
يُظهر رسمًا متحركًا بسيطًا لقلب ينبض ببطء في الرسالة الأولى، وقلبًا وامضًا في الرسالة الثانية.
./led-badge-11x44.py -B 50 -m 0 -s 8 "Bonjour à toutes et à tous" "Bienvenu(e)s en Master 2 EEA ISHM" "Ingénierie des systèmes Humains Machines" "Bonne réussite à votre promotion 2023-2024"

python ./led-badge-11x44.py --list-names
طباعة قائمة بأسماء الأيقونات المضمنة، بما في ذلك :happy: :happy2: ❤️ :HEART: :heart2: :HEART2: :fablab: :bicycle: :cycle_r: :owncloud: ::
python ./led-badge-11x44.py --help
يسرد كافة أساليب الكتابة. لا يكتب شي على الجهاز
python ./led-badge-11x44.py -M list "dummy message"
يسرد جميع الأجهزة المتاحة بطريقة الكتابة "hidapi". لا يكتب شي على الجهاز
python ./led-badge-11x44.py -M hidapi -D list "dummy message"
برمجة جهاز معين بطريقة كتابة محددة.
python ./led-badge-11x44.py -M hidapi -D "3-1:1.0" "Hello World!"
يطبع بعض المساعدة المكثفة:
python ./led-badge-11x44.py -h
الاستخدام: lednamebadge.py [-h] [-t TYPE] [-H HID] [-M METHOD] [-D DEVICE_ID]
[-s SPEED] [-B BRIGHTNESS] [-m MODE] [-b وميض]
[-النمل] [-ل]
رسالة [رسالة ...]
قم بتحميل الرسائل أو الرسومات إلى شارة LED مقاس 11 × 44 عبر USB HID.
الإصدار 0.14 من https://github.com/jnweiger/led-badge-ls32
- انظر هناك لمزيد من الأمثلة وللحصول على التحديثات.
الحجج الموضعية:
رسالة ما يصل إلى 8 رسائل نصية مع أيقونات مدمجة أو
الصور المحملة داخل النقطتين (:) - راجع -l للحصول على قائمة
بنيتينس.
خيارات:
-h, --help في إظهار رسالة المساعدة هذه والخروج
-t TYPE، --type TYPE نوع العرض: القيم المدعومة هي 12x48 أو
(افتراضي) 11x44. إعادة تسمية البرنامج إلى led-
شارة-12x48، للتبديل الافتراضي.
-H HID، --hid HID مهمل، فقط من أجل التوافق مع الإصدارات السابقة، من فضلك
استخدم -M! اضبط على 1 لضمان الاتصال عبر HID API،
لن يعود البرنامج بعد ذلك إلى مكتبة usb.core.
- طريقة M، - طريقة الطريقة
فرض استخدام طريقة الكتابة المحددة. استخدم واحدًا من "تلقائي" ،
"قائمة" أو أي قائمة تتم طباعتها.
-D DEVICE_ID، --device-id DEVICE_ID
فرض استخدام معرف الجهاز المحدد، إذا كان غامضا. يستخدم
واحدة من "تلقائي" أو "قائمة" أو أي قائمة تتم طباعتها.
- السرعة، - السرعة السرعة
سرعة التمرير (المدى 1..8). ما يصل إلى 8 مفصولة بفواصل
قيم.
-B السطوع، - السطوع السطوع
سطوع الشاشة بالنسبة المئوية: 25، 50، 75، أو
100.
-m MODE، --mode MODE ما يصل إلى 8 قيم للوضع: Scroll-left(0) -right(1) -up(2)
-أسفل(3); لا يزال متمركزًا (4) ؛ الرسوم المتحركة(5); يسقط-
أسفل(6); ستارة(7); الليزر (8)؛ راجع "--mode-help" لـ
مزيد من التفاصيل.
-b وميض، --blink وميض
1: وامض، 0: عادي. ما يصل إلى 8 مفصولة بفواصل
قيم.
-a النمل، --النمل النمل 1: حدود متحركة، 0: عادي. ما يصل إلى 8 مفصولة بفواصل
قيم.
-l, --list-names list أيقونات مسماة ليتم تضمينها في الرسائل والخروج.
مثال على الجمع بين الصورة والنص:
sudo lednamebadge.py "I:HEART2:you"هناك بعض الخيارات التي تحدد النوع الافتراضي:
استخدم lednamebadge.py مباشرة: النوع الافتراضي هو 11x44
أعد تسمية lednamebadge.py إلى شيء يحتوي على 12 (على سبيل المثال، badge12.py ) واستخدم ذلك: النوع الافتراضي هو 12x48
استخدم led-badge-11x44.py : النوع الافتراضي هو 11x44
استخدم led-badge-12x48.py : النوع الافتراضي هو 12x48
بالنسبة لجميع هذه الخيارات، يمكنك تجاوز النوع الافتراضي باستخدام خيار سطر الأوامر -t
هناك خياران للتحكم في الجهاز الذي سيتم برمجته باستخدام الطريقة. توجد حاليًا طريقتان للكتابة: إحداهما تستخدم حزمة بايثون pyusb ( libusb ) والأخرى تستخدم pyhidapi ( hidapi ).
اعتمادًا على بيئة التنفيذ لديك، يمكن استخدام كلتا الطريقتين، لكن في بعض الأحيان لا تعمل إحداهما كما هو متوقع. ثم يمكنك اختيار الطريقة التي سيتم استخدامها بشكل صريح مع الخيار -M . باستخدام -M list يمكنك طباعة قائمة بطرق الكتابة المتاحة. إذا قمت بتوصيل أجهزة متعددة، فيمكنك إدراج المعرفات باستخدام -D list أو إعطاء أحد معرفات الأجهزة المدرجة لبرمجة هذا الجهاز المحدد. الإعداد الافتراضي لكلا الخيارين هو auto ، وهو البرنامج الذي تم العثور عليه في الجهاز الأول فقط ويفضل استخدام طريقة الكتابة hidapi . تختلف المعرفات الخاصة بنفس الجهاز وفقًا لطريقة الكتابة. كما يمكنهم أيضًا التغيير بين بدء تشغيل الكمبيوتر أو إعادة الاتصال.
راجع المجلد gfx/starfield للحصول على أمثلة. يتم توفير رسم متحرك لإطارات N كصورة بعرض N*48 بكسل، لكل من الأجهزة بعرض 48 و44 بكسل.
يمكنك استخدام lednamebadge.py كوحدة في كود إنشاء المحتوى الخاص بك لكتابة المشاهد التي تم إنشاؤها على الجهاز.
إنشاء الرأس
إلحاق المحتوى الخاص بك
الكتابة إلى الجهاز
يأخذ header() عددًا من المعلمات:
ما يصل إلى 8 أطوال كمجموعة من الأرقام
كل طول هو عدد أعمدة البايت لبيانات الصورة النقطية المقابلة، وهو عدد البايتات لبيانات الصورة النقطية المقابلة مقسومًا على 11 (للأجهزة 11x44) على التوالي 12 (للأجهزة 12x48)، حيث البايت الواحد هو 8 بكسل واسعة.
وسيطات قابلة للمقارنة لوسائط سطر الأوامر: ما يصل إلى 8 سرعات، وأوضاع، وأعلام وميض، وأعلام النمل، كل منها كمجموعة من الأرقام، وسطوع (اختياري) كرقم.
اختياريًا، يمكنك إعطاء طابع زمني كتاريخ/وقت. تتم كتابته على الجهاز كجزء من الرأس، ولكنه غير مرئي على شاشة الجهاز.
يجب أن يكون المحتوى الخاص بك عبارة عن مصفوفة بايت تحتوي على بيانات الصورة النقطية لجميع المشاهد. وبطبيعة الحال، يجب أن تناسب الأطوال المحددة.
انظر الرسم التالي لفهم أفضل:


بالنسبة لجهاز 12×48، يجب أن يكون هناك 12 بايت لكل عمود بايت بدلاً من 11 بالطبع.

مثال:
لنفترض أن لديك مشهدين، أحدهما 11 × 32 بكسل، والآخر 11 × 60 بكسل. لذلك، الأول يحتوي على 4 أعمدة بايت و44 بايت، والثاني يجب أن يكون مبطنًا بأربعة أعمدة بت فارغة في عمود البايت الأخير إلى 11x64 بكسل وبالتالي يحتوي على 8 أعمدة بايت و88 بايت.
نود أن نعرض كلاهما في الوضع 4، الأول بالسرعة 3 والثاني بالسرعة 2 والثاني مع النمل. ونود أن نضبط السطوع الأولي على 50%.
وسيتم تحقيق ذلك من خلال هذه الدعوات:
من استيراد lednamebadge LedNameBadgebuf = array('B')buf.extend(LedNameBadge.header((4, 8), (3, 2), (4,), (0,), (0, 1), 50)) buf.extend(scene_one_bytes)buf.extend(scene_two_bytes)LedNameBadge.write(buf) هناك معلمتان إضافيتان لطريقة write : طريقة الكتابة ومعرف الجهاز. إنها تعمل تمامًا مثل خيار سطر الأوامر "-M" و"-D". كلاهما افتراضي إلى auto .
LedNameBadge.write(buf, 'libusb', '3:10:2')
حتى مع list يمكنك الحصول على القائمة الخاصة بالاختيارات المتاحة المطبوعة على stdout، وهي أقل فائدة، إذا تم استخدامها كوحدة نمطية. ولذلك، هناك طريقتان لاسترداد هذه المعلومات ككائنات بيانات عادية:
get_available_methods() الذي يُرجع جميع أساليب الكتابة المطبقة كإملاء مع أسماء الطرق كمفاتيح وقيمة منطقية كقيم. يشير المنطقي إلى ما إذا كانت الطريقة قابلة للاستخدام بشكل أساسي (يعني نجاح الاستيراد المقابل)
get_available_device_ids(method) الذي يُرجع معلومات حول جميع الأجهزة المتصلة/المتاحة، وأيضًا كإملاء مع معرفات الجهاز كمفاتيح وسلسلة وصفية لكل منها كقيم.
>>> import lednamebadge
>>> lednamebadge.LedNameBadge.get_available_methods()
{'hidapi': True, 'libusb': True}
>>> lednamebadge.LedNameBadge.get_available_methods('hidapi')
{'3-6:1.0': 'LSicroelectronics - LS32 Custm HID (if=0)', '3-7.3:1.0': 'LSicroelectronics - LS32 Custm HID (if=0)', '3-1:1.0': 'wch.cn - CH583 (if=0)'}
>>> lednamebadge.LedNameBadge.get_available_methods('libusb')
{'3:20:1': 'LSicroelectronics - LS32 Custm HID (bus=3 dev=20 endpoint=1)', '3:21:1': 'LSicroelectronics - LS32 Custm HID (bus=3 dev=21 endpoint=1)', '3:18:2': 'wch.cn - CH583 (bus=3 dev=18 endpoint=2)'} بهذه الطريقة يمكنك توصيل أجهزة متعددة بجهاز كمبيوتر واحد وبرمجتها واحدة تلو الأخرى باستدعاءات مختلفة write .
إذا كان لديك أكثر من جهاز بنفس سلسلة الوصف، فمن الصعب التمييز بين الجهاز الحقيقي الذي ينتمي إلى أي معرف. إسبانا. بعد إعادة الاتصال أو إعادة التشغيل، قد تتغير المعرفات أو يتم تبادلها. إذا كان لديك نواقل USB مختلفة، فقم بتوصيل جهاز واحد فقط بالحافلة. لذا يمكنك أن تقرر حسب رقم الحافلة. أو احتفظ بترتيب اتصال محدد (أثناء تشغيل الكمبيوتر بالفعل)، ثم يمكنك أن تقرر حسب رقم الجهاز. ربما تكون طريقة hidapi أكثر موثوقية قليلاً. عليك أن تجرب قليلا.
يمكنك أيضًا استخدام إنشاء النص/الرمز/الرسم لهذه الوحدة للحصول على مخازن البايت المقابلة.
هذا بسيط جدًا تمامًا كما هو الحال مع استخدام سطر الأوامر. يوجد خيار إضافي لإنشاء صورة نقطية فقط وفقط من ملف صورة عن طريق إعطاء اسم الملف بدلاً من الرسالة.
من استيراد lednamebadge SimpleTextAndIconscreator = SimpleTextAndIcons()scene_a_bitmap = Creator.bitmap("مرحبًا :HEART2: العالم!")scene_b_bitmap = Creator.bitmap("كما أنت:gfx/bicycle3.png: مثل...")scene_c_bitmap = Creator.bitmap ("gfx/starfield/starfield_020.png")الصور النقطية الناتجة عبارة عن صفوف تحتوي على صفيف البايت وطول كل منها. يمكن استخدام هذه الأطوال في header() مباشرةً ويمكن ربط صفائف البايت بالرأس. مثال:
from lednamebadge import *creator = SimpleTextAndIcons()scene_x_bitmap = Creator.bitmap("مرحبًا :HEART2: العالم!")scene_y_bitmap = Creator.bitmap("المثال الكامل للأمام.")your_own_stuff = create_own_bitmap_data() lengths = (scene_x_bitmap[1], Scene_y_bitmap[1], your_own_stuff.len)buf = array('B')buf.extend(LedNameBadge.header(lengths, (3,), (0,), (0, 1, 0), (0, 0, 1), 100))buf.extend(scene_x_bitmap[0])buf.extend(scene_y_bitmap[0])buf.extend(your_own_stuff.bytes)LedNameBadge.write(buf)ستحتاج إلى PlantUML وربما نقطة GraphViz لإنشاء المخططات من ملفات *.puml.
فقط قم بتشغيل plantuml "*.puml" من دليل photos لإعادة إنشاء كافة المخططات.
قم بتشغيل python run_tests.py من دليل tests .
https://github.com/Caerbannog/led-mini-board
http://zunkworks.com/projects/programmablelednamebadges/ (غير متصل منذ 2019. اعتبارًا من 07-2024، لا يزال متاحًا على https://web.archive.org)
https://github.com/DirkReiners/LEDBadgeProgrammer
https://bitbucket.org/bartj/led/src
http://www.daveakerman.com/?p=1440
https://github.com/stoggi/ledbadge