هذا المقال مقدّم من @Erez Zukerman
أستمتع كثيرًا باستخدام الراسم iDraw 2.0، لكنني أحب تشغيله ببطء – ولذلك قد تستغرق رسوماتي بعض الوقت. استخدمت إعداد Inkscape الجاهز لفترة طويلة، لكن كان عليّ إبقاء حاسوبي الرئيسي قيد التشغيل ومتصلًا بالراسم أثناء عمله. لم يكن ذلك مثاليًا – لذلك قررت معرفة ما إذا كان بإمكاني إعداد نظام «بلا واجهة» باستخدام Raspberry Pi.
اتضح أن الأمر أسهل بكثير مما توقعت، وكان ممتعًا أيضًا. إليك ما سنفعله:
●إعداد جهاز Pi نفسه.
●تثبيت CNCjs وتبعياته. فهذا ما سنستخدمه للتحكم فعليًا في الراسم، عبر إرسال GCode إليه من خلال الشبكة.
●سنخصص أيضًا لحظة لإعداد الأمور بحيث يبدأ CNCjs تلقائيًا عند كل إقلاع لجهاز Pi، من دون الحاجة إلى تسجيل الدخول أو القيام بأي شيء.
●معرفة كيفية تحويل ملفات SVG إلى GCode (مع التحكم في سرعة القلم).
يرجى ملاحظة أن هذا الدليل يفترض أنك مرتاح في استخدام سطر أوامر Linux. إذا كنت تتبعه بعد أشهر أو سنوات من نشره لأول مرة، فقد تواجه أخطاء مختلفة على طول الطريق – فهذه طبيعة الأمر. في وقت الكتابة، كان النظام الموضح يعمل جيدًا بالنسبة لي.
لنبدأ!
إعداد جهاز Pi
من الأفضل أن تتمكن من تخصيص جهاز Pi لهذا المشروع وحده، ليكون «وحدة تحكم الراسم» لديك. وإن لم تفعل، فلا مشكلة – سيظل يعمل، لكنه قد يكون أقل راحة بمرور الوقت.
من الأسباب الجيدة الأخرى لتخصيص جهاز Pi لهذا المشروع وحده أنك تستطيع إعداده من الصفر بإعدادات افتراضية منطقية. وهذا ما فعلته تمامًا: أحضرت بطاقة SD بسعة 32GB واستخدمت أداة Raspberry Pi Imager الرسمية لتهيئتها بنظام Raspberry Pi OS.
يتيح لك البرنامج أيضًا ضبط بعض الإعدادات الافتراضية فور إخراجه من الصندوق، وهو أمر أوصي به. استخدمت أداة التثبيت لتهيئة ما يلي:
●اسم المستخدم وكلمة المرور
●اسم مضيف محلي لوحدة تحكم الراسم (plotter.local في حالتي)
●مفتاح SSH العام الخاص بي، لكي أتمكن من الاتصال بالجهاز عبر SSH فورًا
●معرّف SSID لشبكة WLAN وكلمة مرورها، لكي يتصل جهاز Pi بشبكتي عند الإقلاع
قمت بتهيئة كل ذلك، ثم تركت أداة التصوير تؤدي مهمتها. وعندما انتهت، أخرجت بطاقة microSD وأدخلتها في جهاز Pi. ولأجل الإقلاع الأول فقط، أوصلت جهاز Pi بلوحة مفاتيح وشاشة – لكن ذلك لم يكن ضروريًا تمامًا. استغرق اسم المضيف plotter.local الذي اخترته بضع لحظات حتى يُسجَّل على شبكتي، لذا استخدمت لوحة المفاتيح والشاشة للحصول على عنوان IP الحالي (بتشغيل ifconfig من الطرفية).
اتصلتُ بالجهاز عبر SSH، وحان وقت الانتقال إلى الخطوة التالية: تثبيت CNCjs
تثبيت CNCjs
كما قد تتوقع من الاسم، يعتمد CNCjs على Node. لذلك نحتاج أولًا إلى تثبيت Node.
●اتصل بجهاز Pi عبر SSH
●لنثبّت NVM:
○curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.1/install.sh | bash
●اخرج من الطرفية ثم اتصل عبر SSH مرة أخرى. يؤدي ذلك إلى تحميل NVM.
●والآن لنثبّت Node:
○nvm install node
●رائع! حان وقت تثبيت CNCjs:
○npm install -g cncjs
●بافتراض أن كل شيء سار جيدًا حتى الآن، لنشغّل CNCjs مرة واحدة فقط. سيؤدي ذلك إلى إنشاء ملف الإعدادات ~/.cncrc:
○من سطر الأوامر، في مجلدك الرئيسي، شغّل cncjs
○اخرج منه بالضغط على Ctrl+C
●أصبحت الآن مالكًا فخورًا لملف ~/.cncrc جديد تمامًا؛ تهانينا. لنحرّره، وذلك أساسًا للسماح بالوصول عن بُعد:
○vi .cncrc
{
"allowRemoteAccess": true
"state": {
"allowAnonymousUsageDataCollection": false
"checkForUpdates": true,
"controller": {
"exception": {
"ignoreErrors": false
}
}
},
"secret": YOUR_SECRET HERE
}
السطر المهم الذي يجب إضافته هنا هو السطر الأول، allowRemoteAccess.
●شغّل cncjs على جهاز Pi مرة أخرى.
●باستخدام المتصفح على جهازك الرئيسي، انتقل إلى plotter.local:8000. من المفترض أن يفتح CNCjs.

حان الوقت بعد ذلك لتوصيل الراسم ومعرفة ما إذا كان CNCjs يستطيع التواصل معه.
●صِل الراسم iDraw 2.0 بمنفذ USB في جهاز Pi.
●شغّل الراسم.
●في CNCjs، حدّد موقع أداة الاتصال (في الزاوية العلوية اليسرى افتراضيًا).
○اضغط على زر التحديث أسفل «المنفذ».
○افتح القائمة المنسدلة واختر المنفذ.

●انقر على فتح. إذا سار كل شيء كما ينبغي، فمن المفترض أن تعرض وحدة تحكم Gcode الآن بعض النص.

لنحرّك المحركات!
●باستخدام أداة المحاور، اضغط على + و- على المحاور المختلفة لتحريك المحركات. يمكنك أيضًا تفعيل «التحريك باستخدام لوحة المفاتيح» ثم استخدام مفاتيح الأسهم لتحريك الراسم. إذا وضعت قلمًا وخفضت المحور Z، فسيصبح أشبه بلعبة Etch-A-Sketch باهظة الثمن.

ملاحظة واحدة: موضع 0 على المحور Y معاكس لما قد تتوقعه؛ فهو ينتقل إلى أسفل منطقة الرسم. سنعود إلى هذا لاحقًا.
تشغيل CNCjs عند الإقلاع
نواصل الآن؛ نريد العودة إلى هذه النقطة المثالية كلما أعيد تشغيل جهاز Pi، من دون الحاجة إلى فعل أي شيء. لذلك:
●عُد إلى جلسة SSH على جهاز Pi، وأوقف CNCjs بالضغط على Ctrl-C.
●تأكد من توقفه تمامًا بتحديث المتصفح (plotter.local:8000، بافتراض أنه اسم المضيف الذي أعددته أعلاه). من المفترض أن يفشل هذا الآن.
●على Pi، ثبّت pm2: npm install -g pm2
●شغّل CNCjs باستخدام pm2: pm2 start cncjs --name cncjs
●تأكد من أنه بدأ فعلًا ويعمل كما تتوقع: انتظر لحظات قليلة، ثم انتقل إلى plotter.local:8000 وتحقق من تحميله.
●أنشئ نصًا برمجيًا لبدء التشغيل: pm2 startup. سيعرض هذا أمرًا تحتاج إلى تنفيذه باستخدام sudo، فافعل ذلك.
●احفظ قائمة العمليات: pm2 save
●أعد تشغيل Pi للتحقق من نجاح العملية: sudo reboot
●انتظر حتى يعاود التشغيل، ربما من 3 إلى 5 دقائق، ثم انتقل إلى http://plotter.local:8000/ لترى ما إذا كان بإمكانك الوصول إلى CNCjs مجددًا. إذا نفذت الخطوات بشكل صحيح، فمن المفترض أن يعود للعمل مباشرةً.
نجحنا! لقد أوشكنا على الانتهاء – أصبح CNCjs مُعدًا بالكامل الآن. لكن لرسم شيء ما، نحتاج إلى تزويده بملف GCode؛ فهو لا يتعامل مع ملفات SVG مباشرةً.
إنشاء مسار لتحويل ملفات SVG إلى Gcode
لتحويل ملف SVG إلى Gcode، سنستخدم Juicy-Gcode، وهي أداة صغيرة تعمل من سطر الأوامر.
أحد التغييرات المهمة هنا هو أننا نُصفّر الموضع بالنسبة إلى الزاوية السفلية اليسرى من ورقتك، وليس الزاوية العلوية اليمنى! قد يستغرق التعود على هذا التغيير بعض الوقت. وسأذكّرك بذلك مرة أخرى لاحقًا.
●على جهازك الرئيسي، نزّل الملف الثنائي لإصدار Juicy-Gcode الخاص بنظام التشغيل لديك: https://github.com/domoszlai/juicy-gcode/releases
●يُحفَظ إعداد Juicy-Gcode في ملف يُسمى «ملف نكهة». وهو مجرد ملف yaml. إليك ملف نكهة جيد للبدء؛ يمكنك نسخ هذا ولصقه في flavor.yaml على جهازك:
begin: |
G21 ; ضبط الوحدات على المليمترات
G17 ; ضبط اختيار المستوى على XY
G90 ; ضبط التموضع المطلق
F600 ; ضبط السرعة على 600 مم/دقيقة -- هذه سرعة بطيئة جدًا، وقد ترغب في تعديلها
G00 Z0 ; رفع القلم
G92 X0 Y0 ; اعتبار الموضع الحالي هو 0,0 -- هذه هي الزاوية السفلية اليسرى
end: |
G0Z0 ; رفع القلم
G00 X0 Y0 Z0
toolon: |
G0Z6 ; إنزال القلم على الورق
tooloff: |
G0Z0 ; رفع القلم
بعض الأمور المهمة التي يجب ملاحظتها بشأن ملف النكهة هذا:
●أُشغّل الراسم بسرعة 600 مم/دقيقة، وهي سرعة بطيئة جدًا. قد ترغب في زيادة هذه السرعة، بحسب أقلامك وتفضيلاتك.
●السطر الآخر الجدير بالملاحظة هو الذي يبدأ بـ G92. في هذا السطر، نخبر الراسم: «أينما كنت الآن، فهذا هو موضع البداية». لذلك، لمعايرة الرسم، نتوقع منك تحريك رأس الراسم يدويًا وبرفق إلى الزاوية السفلية اليسرى من الورقة.
يجب ضبط حجم الورق بشكل صحيح في ملف SVG، فهذا مهم.
لتشغيل Juicy-Gcode، يبدو الأمر كما يلي تقريبًا:
juicy-gcode -f flavor.yaml image.svg -o image.gcode
من المتعب قليلًا كتابة ذلك في كل مرة، لذا أنشأت هذا البرنامج النصي الصغير لجعل الأمور أكثر سهولة:
#!/bin/bash
# الاستخدام: ./run-juicy.sh input.svg [speed]
# إذا لم تُحدَّد السرعة، فستكون القيمة الافتراضية 600
# تحقّق من تقديم وسيطة واحدة على الأقل
if [ "$#" -lt 1 ] || [ "$#" -gt 2 ]; then
echo "الاستخدام: $0 <input-svg> [speed]"
echo " إذا لم تُحدَّد السرعة، فستكون القيمة الافتراضية 600"
exit 1
fi
inputfile="$1"
# عيّن السرعة الافتراضية إلى 600 إذا لم تُحدَّد
speed="${2:-600}"
# أنشئ اسم ملف النكهة
flavor_file="flavor-${speed}mm-speed.yaml"
# أنشئ اسم ملف الإخراج باستبدال امتداد .svg بامتداد .gcode
outputfile="${inputfile%.*}.gcode"
# شغّل الأمر juicy-gcode
juicy-gcode -f "$flavor_file" "$inputfile" -o "$outputfile"
يمكنك الآن امتلاك عدة ملفات بنُكهات مختلفة، لكل منها سرعة تشغيل مختلفة، وتحديد السرعة بسهولة عبر تمرير الرقم المطابق لاسم ملف النكهة.
والآن بعد أن أصبح لديك ملف GCode، حان وقت رفعه والرسم!
ارفع ملف GCode وارسم
يوفر لنا CNCjs طريقتين لإدخال ملف GCode: يمكننا رفعه عبر المتصفح بالنقر على «رفع G-code»، أو يمكننا إعداد مجلد مراقبة (بحيث يبدأ الراسم في العمل كلما ظهر فيه ملف GCode).
قد يبدو الخيار الأخير رائعًا من الناحية النظرية، لكنه لا يبدو منطقيًا كثيرًا: فأي عملية رسم تتطلب بعض الإعداد اليدوي على أي حال. علينا وضع الورق وتركيب القلم وغير ذلك. لذلك، من المنطقي أكثر بالنسبة إليّ رفع الملف يدويًا عبر المتصفح.
بعد أن تفعل ذلك، صغّر العرض لرؤية المعاينة.

وهذا يمنحنا فحصين مهمين للتأكد من سلامة الإعدادات:
●يُذكَّرنا مرة أخرى (…) بأن الرسم سيبدأ من الزاوية السفلية اليسرى لورقتنا.
●نرى القياسات على محوري X وY. يجدر بنا أن نأخذ لحظة لقراءة ذلك والتحقق من أنها لا تتجاوز مساحة الرسم. وإذا تجاوزتها، فهناك مشكلة في ملف SVG لديك—لا تبدأ رسمه، وإلا فستكون محركاتك المؤازرة غير سعيدة جدًا.
بافتراض أن قلمك في الزاوية السفلية اليسرى من ورقتك وأن القياسات منطقية، فقد حان وقت الرسم! اضغط على زر التشغيل وراقب الراسم. يمكنك الآن إيقاف تشغيل حاسوبك أو نقله إلى غرفة أخرى بينما يعمل Raspberry Pi والراسم. انتصار!