Arduino على Linux: تكوين Qt Creator كبيئة تطوير

تحظى منصة Arduino بشعبية كبيرة ، بغض النظر عما إذا كانت موبخة أو مشيدة. تمكن منشئوها من خفض عتبة الدخول إلى مستوى بضع نقرات الماوس + بضعة أسطر من التعليمات البرمجية و voila - هنا لديك مصباح LED وامض. وبشكل عام ، من أجل النماذج الأولية السريعة للحرف اليدوية على AVR ، فإن الشيء Arduino مريح للغاية. الشيء الوحيد الذي فشلوا فيه هو IDE ، والذي يصعب على IDE الاتصال به. من بين وظائف IDE ، فإنه يوفر شيئًا واحدًا فقط - أتمتة إنشاء وتجميع المشروع.

بالنسبة لمستخدمي Windows ، هناك بديل: MS Visual Studio Community + vMicro plugin الذي يسمح لك بكتابة الرسومات ، ولكن مع جميع الأشياء الجيدة التي يوفرها IDE. يتأرجح المكون الإضافي بدون مشاكل في الاستوديو نفسه من خلال قائمة "الأدوات" ويعمل كما تشاء في الإصدار التجريبي. النسخة المدفوعة من الناحية النظرية تدعم التصحيح خطوة بخطوة ، لكنهم ، بصفتهم مالك النسخة المرخصة من vMicro ، لم يكونوا معجبين للغاية.

بالنسبة لمستخدمي Linux ، كل شيء كما هو الحال دائمًا: نريد IDE جيدًا - حدد "الضحية" وحاول ربط الوظائف اللازمة له. هناك حلول قائمة على الكسوف ، لكني لا أحب كسوف الشمس ، الذي كتبته بالفعل عن مرة واحدة . أطرحه كشر لا مفر منه ، عندما لا يكون هناك شيء مناسب على الإطلاق. من بين جميع IDEs المجانية ، أحترم كثيرًا برنامج Qt Creator القوي والرائع ، حيث عملت أنا وفريقي منذ أكثر من عام. لذلك ، سأتحدث عن كيفية تحويلها إلى بيئة تطوير لاردوينو.

1. إعداد التربة


يتوفر Qt Creator في مستودعات أي توزيع Linux أكثر أو أقل يحترم نفسه. على سبيل المثال في archa احصل عليه مثل هذا

$ sudo pacman -S qtcreator 

بالإضافة إلى ذلك ، سنحتاج إلى حزم بشأن Arduino نفسها.

 $ sudo pacman -S arduino arduino-avr-core 

في اليوم الذي نسينا فيه Arduino أخيرًا ، سنحتاج إلى مترجم آخر ، ومجمع ، ورابط ومكتبة C قياسية لـ AVR ، لذلك نضعهم

 $ sudo pacman -S avr-gcc avr-binutils avr-libc 

سنقوم باختبار المصحح والمحاكي في هذه المقالة ، لذلك سنقوم بتثبيت هذه الحزم

 $ sudo pacman -S avr-gdb simavr 

2. إنشاء مشروع في Qt Creator


قم بتشغيل Qt Creator وإنشاء مشروع جديد بدون Qt في C ++



اختر موقعًا للمشروع وأطلق عليه اسمًا



كنظام بناء ، خذ qmake منتظم



نترك مجموعة العمل بشكل افتراضي ، ونصلحها لاحقًا



تحت التحكم في الإصدار ، أضف المشروع حسب الرغبة



نحصل على مشروع C ++ القياسي



هناك ملفان فقط في المشروع: main.cpp و led-blink.pro. يتم حذف الأول ، ويتم مسح الثاني من كل شيء مكتوب هناك ، والحصول على مشروع فارغ تمامًا



الآن مع الأقلام ، نبدأ في كتابة النص في ملف * .pro ، لتشكيل هيكل المشروع لاردوينو

 #     #    Arduino Core ARDUINO_DIR=/usr/share/arduino/hardware/archlinux-arduino/avr/ #    (Arduino Uno, Nano, Mini) ARDUINO_MCU=atmega328p #    ARDUINO_FCPU = 16000000L 

نستبعد كل ما يتعلق بـ Qt من المشروع ونختار قالب المشروع

 #  ,   Qt   ! QT -= gui core CONFIG -= qt #   - ,      ELF TEMPLATE = app 

قمنا بتعيين الدليل للثنائي المجمع واسمه

 DESTDIR = ../bin TARGET = led-blink 

بعد ذلك ، قم بتوصيل أدلة بحث الرأس

 #    INCLUDEPATH += $$ARDUINO_DIR/cores/arduino INCLUDEPATH += $$ARDUINO_DIR/variants/standard INCLUDEPATH += $$ARDUINO_DIR/libraries INCLUDEPATH += /usr/avr/include 

حدد المترجم C ومفاتيحه

 QMAKE_CC = /usr/bin/avr-gcc QMAKE_CFLAGS += -c -g -Os -w -ffunction-sections -fdata-sections QMAKE_CFLAGS += -MMD -mmcu=$$ARDUINO_MCU -DF_CPU=$$ARDUINO_FCPU QMAKE_CFLAGS += -DARDUINO_AVR_UNO -DARDUINO_ARCH_AVR 

ومترجم C ++ ومفاتيحه

 QMAKE_CXX = /usr/bin/avr-g++ QMAKE_CXXFLAGS += -c -g -Os -w -ffunction-sections -fdata-sections QMAKE_CXXFLAGS += -fno-exceptions -fno-threadsafe-statics QMAKE_CXXFLAGS += -MMD -mmcu=$$ARDUINO_MCU -DF_CPU=$$ARDUINO_FCPU QMAKE_CXXFLAGS += -DARDUINO_AVR_UNO -DARDUINO_ARCH_AVR 

تعيين الرابط ومفاتيحه

 QMAKE_LINK = /usr/bin/avr-gcc QMAKE_LFLAGS = -w -Os -Wl,--gc-sections -mmcu=$$ARDUINO_MCU QMAKE_LIBS = -lm 

نقوم بتهيئة المعالجة اللاحقة لملف ELF ، من أجل لفه في Intel HEX للبرامج الثابتة اللاحقة على اللوحة

 QMAKE_POST_LINK += /usr/bin/avr-objcopy -O ihex -j .text -j .data -S ${TARGET} ${TARGET}.hex 

حدد ملفات الرأس التي يتم تضمينها في المشروع.

 HEADERS += $$files($$ARDUINO_DIR/cores/arduino/*.h) HEADERS += $$files($$ARDUINO_DIR/variants/standard/*.h) 

تحديد ملفات المصدر Arduino Core

 SOURCES += $$files($$ARDUINO_DIR/cores/arduino/*.c) SOURCES += $$files($$ARDUINO_DIR/cores/arduino/*.cpp) 

حسنًا ، متى سنبدأ في الرسم؟ لنبدأ الآن ، ولكن ما قمنا به أيها السادة النبلاء ، هو الحد الأدنى الضروري لعمل كود الرسم.

أضف الآن مصدر الرسم التخطيطي إلى المشروع. انقر بزر الماوس الأيمن على المشروع في الشجرة وحدد "إضافة جديد ..." إضافة ملف المصدر C ++



لتنظيم المصادر داخل المشروع ، في النافذة التالية



انقر على "تصفح" وقم بإنشاء مجلد src لملفات * .cpp



الآن قم بتسمية الملف



انقر فوق النافذة التالية "إنهاء". نحصل على مثل هذه الصورة



سيضيف IDE هذا الملف إلى البرنامج النصي لبناء led-blink.pro

 HEADERS += $$files($$ARDUINO_DIR/cores/arduino/*.h) HEADERS += $$files($$ARDUINO_DIR/variants/standard/*.h) #  Arduino Core SOURCES += $$files($$ARDUINO_DIR/cores/arduino/*.c) \ src/led-blink.cpp SOURCES += $$files($$ARDUINO_DIR/cores/arduino/*.cpp) 

ولكن من أجل عدم عمل قوائم مصادر طويلة ، عادة ما أحب ذلك

 #  Arduino Core HEADERS += $$files($$ARDUINO_DIR/cores/arduino/*.h) HEADERS += $$files($$ARDUINO_DIR/variants/standard/*.h) #  Arduino Core SOURCES += $$files($$ARDUINO_DIR/cores/arduino/*.c) SOURCES += $$files($$ARDUINO_DIR/cores/arduino/*.cpp) #   SOURCES += $$files(./src/*.cpp) 

سنفعل الآن ما لن يوفره Arduino IDE مطلقًا: إضافة ملف رأس إلى الرسم التخطيطي ، والقيام بنفس الخطوات المذكورة أعلاه



في هذا الملف ، أضف الرؤوس اللازمة للمشروع.

 #ifndef LED_BLINK_H #define LED_BLINK_H #include <Arduino.h> #endif // LED_BLINK_H 

تكوين المسارات للرؤوس والمصادر

 #  INCLUDEPATH += ./include HEADERS += $$files(./include/*.h) #   SOURCES += $$files(./src/*.cpp) 

والآن نكتب رسمًا أخيرًا

 #include "led-blink.h" //------------------------------------------------------------------------------ // //------------------------------------------------------------------------------ void setup() { } //------------------------------------------------------------------------------ // //------------------------------------------------------------------------------ void loop() { } 

الآن ننقر بزر الماوس الأيمن على شجرة المشروع ونختار "تجميع"



نذهب إلى مجلد المشروع. لدينا الآن سلة / الدليل ، الذي يحتوي على منتجات عمل المترجم



كل شيء على ما يرام ، هناك ELF ، وهو أمر مفيد عند التصحيح وسداسي البرامج الثابتة في وحدة التحكم. الآن دعنا نكتب وميضًا آخر مع مؤشر LED على دبوس 13

 #include "led-blink.h" #define LED_STAND_PIN 13 unsigned long time = 0; unsigned long DELAY = 500000; bool on = false; //------------------------------------------------------------------------------ // //------------------------------------------------------------------------------ void setup() { pinMode(LED_STAND_PIN, OUTPUT); } //------------------------------------------------------------------------------ // //------------------------------------------------------------------------------ void loop() { if ( micros() >= time + DELAY ) { time = micros(); on = !on; } uint8_t state = on ? HIGH : LOW; digitalWrite(LED_STAND_PIN, state); } 

نجمع المشروع ، نذهب إلى بن /. نحن نتمسك في لوحة USB الخاصة بك. في حالتي هو Uno ، على نظامي يقوم بإعداد منفذ باسم / dev / ttyACM0 للبرمجة. تنفيذ الأمر

 $ avrdude -c arduino -p m328p -P /dev/ttyACM0 -b 115200 -U flash:w:led-blink.hex:i 

هنا

  • -P / dev / ttyACM0 - منفذ مبرمج
  • -p m328p - نموذج تحكم
  • -c arduino - نوع المبرمج: مدمج في لوحة Uno
  • -ب 115200 - سرعة الميناء
  • -U flash: w: led-blink.hex: i - تشير إلى منطقة البرنامج الثابت ونوع العملية (الكتابة) وملف البرنامج الثابت

عادم مشابه لهذا

 avrdude: AVR device initialized and ready to accept instructions Reading | ################################################## | 100% 0.00s avrdude: Device signature = 0x1e950f (probably m328p) avrdude: NOTE: "flash" memory has been specified, an erase cycle will be performed To disable this feature, specify the -D option. avrdude: erasing chip avrdude: reading input file "led-blink.hex" avrdude: writing flash (2838 bytes): Writing | ################################################## | 100% 0.47s avrdude: 2838 bytes of flash written avrdude: verifying flash memory against led-blink.hex: avrdude: load data flash data from input file led-blink.hex: avrdude: input file led-blink.hex contains 2838 bytes avrdude: reading on-chip flash data: Reading | ################################################## | 100% 0.38s avrdude: verifying ... avrdude: 2838 bytes of flash verified avrdude: safemode: Fuses OK (E:00, H:00, L:00) avrdude done. Thank you. 

يخبرنا أن العملية سارت على ما يرام. سيومض مصباح LED بتردد 2 هرتز.

من حيث المبدأ ، يمكنك تكوين البرامج الثابتة في IDE. للقيام بذلك ، قم بإعداد إعدادات التشغيل مثل



وباختيار بدء المشروع (بالضغط على Ctrl + R) ، سنقوم بتنفيذ البرنامج الثابت وإطلاقه تمامًا كما يفعل Arduino IDE.

الاستنتاجات


عملية الإعداد الموصوفة هي عملية مستهلكة للوقت. ولكن في المقابل ، نحصل على القوة الكاملة لواحدة من أبرز IDE الموجودة على أنظمة تعتمد على نواة Linux (وينطبق Windows أيضًا). Autodescription ، إعادة البيع ، التنقل المريح في الكود - يمكن الآن استخدام كل هذا بنجاح.

هذا المثال مصنوع ، كما يقولون ، "في الجبين". في الواقع ، يقوم Arduino IDE بتجميع Arduino Core في مكتبة ثابتة منفصلة. روابط وروابط إلى الملف القابل للتنفيذ. ونتيجة لذلك ، يكون حجم البرامج الثابتة التي تم جمعها في البيئة القياسية أصغر من الطريقة الموضحة في المقالة. لا يزال يتعين علي معرفة هذه الفروق الدقيقة. وفي نفس الوقت في المقالة التالية حول هذا الموضوع سنتحدث عن:

  • هيكل المشروع ، اكتشف أين توجد الوظيفة الرئيسية () وأظهر لماذا التكرار المفرط على Arduino سيئًا
  • التصحيح خطوة بخطوة باستخدام المحاكيات
  • سنتعامل مع خيارات المترجم المستخدمة في التجميع

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

Source: https://habr.com/ru/post/ar408261/


All Articles