هذه ترجمة. تم نشر المقالة بتاريخ 27 مايو 2018
تعقب اللياقة قبل وبعد التفكيكعندما جئت إلى الشركة الحالية ، في اليوم الأول أعطيت لي مجموعة من الهدايا. وكان من بينها هذا السوار مع جهاز تتبع اللياقة البدنية. بغض النظر عن حبك لممارسة الرياضة ، فهذه أداة رائعة بشكل لا يصدق من وجهة نظر فنية بحتة:
- عامل شكل صغير جدًا (حوالي 15 × 40 مم) ؛
- بلوتوث منخفض الطاقة (بليه) ؛
- شاشة OLED (96 × 32 بكسل) ؛
- البطارية
- شحن USB
- التسارع.
- محرك اهتزاز
- السعر حوالي $ 10 (!).
في الخارج ، المعرف الوحيد على اللوحة الخلفية هو الملصق "معرف FCC: 2AHFTID115". إذا كنت
تستخدمها على Google ، فيبدو أنها تتوافق مع جهاز
ID115 ويمكنك حتى العثور على
العديد من الصور الخاصة به. بالنظر إلى
إحدى هذه الصور الفوتوغرافية ، إذا حاولت جاهدًا ، يمكنك رؤية اسم أكبر دائرة متكاملة (IC): N51822. هذا يشير إلى أنه قد يكون هناك
nRF51822 متحكم
نورديك (MCU) ، وهو معالج ARM M0 32 بت مع دعم BLE مدمج ، وهو أمر نظريًا سهل البرمجة لأشياء أخرى يجب أن يقوم بها السوار.
قبل تفكيك الأداة ، ذهبت إلى Google أكثر قليلاً واكتشفت أنه في
بعض الأساور المماثلة تم تثبيت نفس الشريحة ، وبرمجها الناس بنجاح.
فتح القضية لم يكن بهذه السهولة. يتم لصق الغطاء البلاستيكي الأسود على الخلفية الرمادية. جربت مجففاً للشعر لتليين الصمغ وقصته بسكين صغير بصبر ، محاولاً عدم إتلاف البلاستيك كثيراً. بعد الافتتاح ، تأكدت من وجود nRF51822 بالفعل. في وقت لاحق اشتريت سوار MCU متطابق تقريبًا من Texas Instrument. ضع في اعتبارك أن هناك خيارات.
nRF51822 وقلم حبر جاف للمقياسإيجاد طريقة للتواصل
تقول
الوثائق أنه يمكن برمجة / تصحيح الرقاقة باستخدام واجهة ذات طرفين ARM
Serial Wire Debug (SWD). إذا أردنا إنشاء قناة اتصال بشريحة ، فهذا يعني شيئين:
- نحن بحاجة إلى مبرمج SWD (على سبيل المثال ، Segger J-Link ).
- سنحتاج إلى الوصول إلى دبابيس SWD على وحدة التحكم الدقيقة ، وهما SWDIO (البيانات) و SWDCLK (نبضات الساعة).
لحسن الحظ ، هناك عدة منصات متوفرة على اللوحة. على الرغم من أن وجودهم مفسر بوضوح بالحاجة إلى تصحيح الأخطاء والاختبار والتحقق ، إلا أنني أفضل أن أعتقد أن بعض المهندسين الرائعين تركوهم هناك كهدايا صغيرة لأشخاص مثلنا. لا يتم تصنيف كل منهم بشكل صحيح ، لذلك أقترح الرموز التالية:

الجانبين الأمامي والخلفي من لوحة الدائرة. قلم حبر جاف لأسماء المقياس وشبه التعسفي للوسادات المفتوحةباستخدام نفس
مجهر USB الرخيص
، التقطت عدة صور للجانبين الأمامي والخلفي للوحة وحاولت تتبع المسارات من وحدة التحكم الدقيقة إلى الوسادات.

المسارات إلى دبابيس SWDIO و SWDCLK في الجزء الأمامي والخلفي من اللوحةيرجى ملاحظة أن هذه لوحة دوائر مطبوعة متعددة الطبقات بها ثقوب ، لذلك يجب عليك التحقق من المسارات على جانبي اللوحة. من هذه الصور ، يمكنك تتبع المسارات من جهات الاتصال SWDIO و SWDCLK على الشريحة إلى منصات IO و CLK. لذا سنتأكد من أن علامة CLK على اللوحة تتوافق مع SWDCLK في MCU ، وأن جهة الاتصال غير المسماة هي دبوس SWDIO. يمكنك الآن إعداد جدول رسم الخرائط الأول:
NRF51822 دبوس | ملعب | الوصف |
---|
SWDIO | IO | إخراج البيانات لبرمجة SWD |
SWDCLK | CLK | إخراج الساعة لبرمجة SWD |
جراحة ما بعد الوفاة
بعد أن تمكنت من الوصول إلى وسادتين من مواقع التخلص من النفايات الصلبة ، قمت بتلحيم الأسلاك الرفيعة جدًا لهم وجميع جهات الاتصال الأخرى المتاحة.

رمش قليلا
المهمة التالية هي محاولة برمجة الجهاز لبعض المهام. لتشغيل أبسط برنامج ، نحتاج إلى التأكد مما يلي:
- لقد تتبعنا بشكل صحيح جهات اتصال SWDIO / SWDCLK.
- مبرمج SWD قيد التشغيل ويمكن للكمبيوتر إصدار أوامر.
- يمكننا تجميع برنامج Arm واستخدام Nordic SDK بشكل صحيح.
- يمكننا وميض البرنامج المترجم في الشريحة.
- تعمل الرقاقة بشكل صحيح وتحمل برنامجنا.
في هذه الحالة ، يمكن أن يكون "hello، world" برنامجًا يقوم بتشغيل وإيقاف تشغيل LED. وحتى هذا ليس أوليًا ، لأنه لا يوجد مصباح LED مدمج على اللوحة ، وإذا أضفت مصباحًا خارجيًا ، فلا تزال بحاجة إلى معرفة ما يتم توصيله به. وهذا يضيف بُعدًا آخر للنموذج المكاني للمشكلة. وفقًا لنقص نظرية الجبن المجانية ، قمت فقط بتوصيل مصباحين LED
P1
و
P2
على أمل أن نتمكن من الوصول إلى هذه الوسائد باستخدام MCU.
يوم سيءتوجد برامج التشغيل وبرامج سطر الأوامر لمبرمج J-Link SWD على
موقع Segger على الويب . إذا كنت تستخدم نظام
caskroom/drivers/segger-jlink
Homebrew ، فابحث عن صيغة Cask في
caskroom/drivers/segger-jlink
. يتم تأسيس التواصل مع مبرمج SWD من
JLinkExe
لسطر الأوامر
JLinkExe
.
ثم قمت بتنزيل
Nordic nRF5 SDK (أستخدم
الإصدار 12.3.0 ). من أمثلة SDK ، من الواضح أننا بحاجة إلى مترجم قادر على تجميع برامج Arm. لذلك قمت بتثبيت
gcc-arm-embedded
(متاح أيضًا على Homebrew).
بعد فحص وثائق SDK ومنتديات مطوري بلدان الشمال ، اكتشفت أن حزم SDK الخاصة بهم غالبًا ما يتم استخدامها مع لوحات التطوير
مثل هذه . تم تكوين SDK مسبقًا للعديد من المتغيرات الخاصة بهذه اللوحات. نظرًا لأننا على اتصال مباشر بوحدة التحكم ، فسيتعين عليك تكوين بعض معلمات SDK.
قضيت
الكثير من الوقت في فهم النظام البيئي nRF5 ، ولكن في النهاية كنت لا أزال قادرًا على تشغيل البرنامج على شريحة! يُظهر
الفيديو مصباحين وميضين. عند هذه النقطة ، أنشأت
مستودع Github وألقيت برنامجًا به ملف
Makefile
يعمل
Makefile
. أحد الأسرار الرئيسية هو أنه في الواقع هناك العديد من الخيارات لـ nRF51822 ، وفي الذاكرة الخاصة بي لا توجد سوى 16 كيلوبايت من الذاكرة. لذلك ما زلت بحاجة إلى
إصلاح البرنامج النصي للرابط .
المدخلات والمخرجات الرقمية
كما سبق أن قلت ، فإن مهمة LEDs الوامضة أعطت بعض الآمال وطريقة كزة ، أي من جهات اتصال MCU تؤدي إلى
P1
و
P2
، حيث يتم توصيل LEDs. أبسط استراتيجية هي توصيل جميع المخرجات بدورها وتطبيق الجهد العالي والمنخفض بدوره. لدهشتي ، أضاءت كل من المصابيح LED! لقد فوجئت أكثر عندما بدأ محرك الاهتزاز في العمل!
لذلك ، تم إضافة طريقة الوخز إلى الجدول:
NRF51822 دبوس | ملعب | الوصف |
---|
ص 30 | النقطة رقم 1 | GPIO الرقمي |
P0.00 | P2 | GPIO الرقمي |
P0.01 | - | محرك الاهتزاز |
printf
القدرة على نقل البيانات إلى جهاز كمبيوتر أمر لا غنى عنه لتصحيح الأخطاء. يدعم مبرمج J-Link
الإرسال في الوقت الحقيقي (RTT) لإرسال واستقبال البيانات من الشريحة. لاستخدام RTT ، تحتاج إلى
#include "SEGGER_RTT.h"
والاتصال بـ
SEGGER_RTT_WriteString()
. لتلقي البيانات على جهاز كمبيوتر ، اتصل
jlinkrttlogger
سطر الأوامر
jlinkrttlogger
، والتي يتم توفيرها مع J-Link.
OLED
التحدي الآخر هو تشغيل OLED. يعمل أكثر OLED شيوعًا في السوق برنامج التشغيل / وحدة التحكم
ssd1306 ، وعادة ما يكون التواصل مع MCU عبر واجهة تسلسلية باستخدام إما
SPI أو
I²C . هنا
مثال من Adafruit .
لم أجد مثل هذا العرض في أي من المتاجر العادية. وحجم 96 × 32 غير قياسي. البحث عن طريق المعرف QT1316P01A على الشاشة يعطي مواقع صينية مثل
Aliexpress ، ولكن لا توجد وثائق باستثناء أسماء الاستنتاجات:
تسمية دبوس OLED مع Aliexpressإذا كانت القائمة لا تكذب ، فإن جهات الاتصال
SCL
و
SDA
و
RES#
تخبرنا أن هذا خيار I²C. إذا كانت هناك مسارات بين دبابيس nRF51822 الثلاثة وهذه الدبابيس الثلاثة لـ OLED ، فسنخطو خطوة إلى الأمام. دعنا نعود إلى المجهر.

مسارات اتصال بيانات OLEDنقوم بتحديث جدول المراسلات:
NRF51822 دبوس | ملعب | الوصف |
---|
ص 21 | - | إخراج OLED SDA |
ص .22 | - | دبوس OLED SCL |
ص 24 | - | الناتج OLED RES # |
بروتوكول I²C أكثر تقدمًا من أي بروتوكول تسلسلي بسيط مثل
UART . واحدة من المزايا هي أنه يدعم العديد من الأجهزة الرئيسية والعبيد على نفس الناقل. هذا يعقد الأمور قليلاً: على الأقل تحتاج إلى إخبار MCU عن أوامر الرقيق التي تم إصدارها. لذلك على مستوى عالٍ ، بالإضافة إلى جهات الاتصال الفعلية ، هناك أيضًا عنوان "منطقي" لشاشة OLED.
لحسن الحظ ، أحد الأمثلة في nRF5 SDK هو الماسح الضوئي I²C. يستجوب من جميع العناوين والتقارير المنطقية الممكنة إذا تم تثبيت شيء هناك. إصداري المعدل
هنا . ينتج السجل التالي:
$ make
# ...
$ make flash
# ...
$ make log
# ...
TWI scanner.
TWI device detected at 0x3c.
نبأ عظيم! لدينا سبب وجيه للاعتقاد بأنه تم تحديد الشاشة بشكل صحيح وأنها بالفعل متغير I²C. يقول بحث
0x3c
أن
0x3c
هو عنوان نموذجي لمثل هذه الأجهزة.
الآن نحن على استعداد لإرسال بعض البكسل إلى الشاشة. في هذا المستوى ، لا يوجد تجريد من خلال المكتبة.
راجع وثائق
ssd1306 للحصول على طريقة منخفضة المستوى لنقل البيانات. تتكون العملية من سلسلة من أوامر التكوين التي تحدد اتجاه العرض ووضع التسجيل والحجم وما إلى ذلك. بعد ذلك ، يتم إرسال سلسلة من وحدات البايت التي يتم عرضها على الشاشة إلى ذاكرة عرض الرسومات (GDDRAM).
من أجل التكوين الصحيح ، درست
مكتبة ssd1306 من Adafruit وحاولت محاكاة أوامر مماثلة. هذا ما استغرقه جزء الأسد من الوقت في هذا المشروع. تبين أن العثور على جميع التفاصيل مهمة تستغرق وقتًا طويلاً ، وما زلت لا أستطيع شرح بعض الأشياء. ومع ذلك ، يعمل!
عرض صورة نقطية مضمنةرمز هذا المثال
هنا .
مع هذه الإعدادات ، يتم تقسيم الشاشة إلى 4 صفوف (صفحات) و 96 عمودًا. لذلك يبلغ طول الصفحات 8 بكسل. سيتم وضع البايت الأول المرسل "عموديًا" في العمود الأول من الصفحة الأولى. سيشغل البايت الثاني العمود الثاني ، ثم العمود الثالث وهكذا ، حتى العمود 96 ، عندما
يعود ويبدأ من العمود الأول في الصفحة الثانية.
هذا هو السلوك
المتوقع . كما
هو موضح في الفيديو ، يختلف السلوك
المرصود : أولاً يتم تعبئة الأعمدة الفردية ، ثم الأعمدة الزوجية ، وبعد ذلك فقط يعود إلى الصفحة الثانية.
لقد أمضيت الكثير من الوقت لفهم سبب مثل هذا السلوك الغبي في العرض ، ومن ثم بعض الوقت لتكوينه لإصلاحه. في النهاية ، ابتلعت كبريائي وما زلت أطبق منطق تقديم غريب في البرنامج لإنهائه.
السفر إلى اردوينو
عند الدخول
إلى مكتبة Adafruit ssd1306 لـ Arduino ، اعتقدت دائمًا أنه سيكون من الجيد أن يكون لديك طريقة "لمحاكاة" أجزاء Arduino محددة لاختبارها على nRF51822. اتضح أن الأشخاص الأكثر خبرة يفكرون أيضًا في هذا الموضوع - هذا ما يفعله مشروع
sandeepmistry / arduino-nRF5 المذهل . تنفذ مكتبات اردوينو الرئيسية باستخدام nRF5 SDK.
مع هذا المشروع ، يمكننا فتح Arduino IDE ، واختيار لوحة nRF5 ، واستخدام نظام Arduino البيئي الغني.
شوكة المشروع وأضفت الدعم للوحة من سوارنا. يمكنك تحديده من القائمة المنسدلة
Tools > Board > ID115 Fitness Bracelet (nRF51822)
.

مكتبة Adafruit ssd1306 في شكلها الأصلي (أعلاه) ومع رقعة (أدناه)هذا يعني أيضًا أنه يمكننا الآن استخدام
مكتبة Adafruit OLED . لدهشتي وارتياحي ، حدث نفس السلوك الغريب مع ملء الأعمدة الفردية وحتى حتى OLED أولاً!
سررت المكتبة بسرور وتنفيذ نفس الاختراق. مقارنة بالنهج منخفض المستوى ، لدينا الآن إمكانية الوصول إلى مجموعة متنوعة من التجريدات الرائعة ، مثل إخراج النص:
الأكثر مألوفة "مرحبًا ، العالم!"المدخلات / المخرجات التناظرية
بالإضافة إلى إشارات التشغيل / الإيقاف الرقمية ، يحتوي nRF51822 على 10 دبابيس للإدخال التناظري. هذا مفيد ، على سبيل المثال ، لقراءة شحن البطارية الحالية. إذا حكمنا من خلال الوثائق ، فإن قراءة جهات الاتصال التناظرية تنتج قيمة 10 بت. لذلك ، إذا كان هناك
0V
عند الإدخال ، فسنقرأ
0
، وإذا كان هناك
VCC
،
VCC
1023
بقيم وسيطة بينهما.
أقرأ بشكل دوري قيم المدخلات التناظرية ورسمت الإشارات الأكثر إثارة للاهتمام:

تأثير اهتزاز اللوحة وشحن البطارية وفقًا للبيانات الواردة من المدخلات التناظريةأنا مقتنع بأن الاتصال
P0.05
يشير إلى شحن البطارية ، لأن القيمة تزداد وتنقص أثناء الشحن والتفريغ. أظن أن دبوس
P0.26
متصل بأحد مخرجات مقياس التسارع ، لأنه يصبح مجنونًا عندما تهز اللوحة.
يمكن أيضًا توصيل جهات الاتصال
P0.03
و
P0.04
مختلفة لمقياس التسارع ، ولكن هنا يتم فرض تأثير معين من الدرجة الثانية على الإشارة من الإدخال. على سبيل المثال ، في الرسم البياني الأول ، لاحظ كيف يتغير مستوى البطارية (دبوس 5) عندما يحتاج مقياس التسارع إلى المزيد من الطاقة. هذا مثال لتأثير من الدرجة الثانية.
يمكن العثور على الرمز
في هذا الرسم . البيانات المصدر والرسومات البيانية
هنا . الآن يمكننا إضافة عدة صفوف إلى جدول مراسلاتنا:
NRF51822 دبوس | ملعب | الوصف |
---|
P0.05 | - | الإدخال التناظري - متصل بالبطارية |
ص .26 | - | المدخلات التناظرية - مقياس التسارع أحادي المحور |
P0.03 | - | المدخلات التناظرية - أحد محاور مقياس التسارع (مرجح) |
P0.04 | - | المدخلات التناظرية - أحد محاور مقياس التسارع (مرجح) |
زر
في البرنامج الثابت الأصلي ، يؤدي لمس السوار عند نقطة معينة إلى تشغيل الشاشة. يؤدي تثبيت هذه النقطة إلى بدء الكرونومتر ، إذا كنت أتذكر بشكل صحيح. هذا ليس زرًا ماديًا ، ولكن نوعًا من شيء اللمس السعوي الذي يعمل بشكل جيد بشكل مدهش. باستخدام نفس المنهج المستخدم في البحث عن المخرجات الرقمية ،
وجدت مكانًا للاتصال بوحدة MCU (فيديو) .
الكود
هنا .
NRF51822 دبوس | ملعب | الوصف |
---|
ص 10.10 | - | المدخلات الرقمية - زر مدمج |
بلوتوث منخفض الطاقة (بليه)
يتم تنفيذ وظيفة BLE على شرائح nRF5 من خلال شيء يسمى
SoftDevice . هذا هو ثنائي مترجم مسبقًا مع مكدس BLE. مخيط بغض النظر عن التطبيق. هناك العديد من إصدارات SoftDevice ، اعتمادًا على إصدار SDK وإصدار الشريحة.
توفر
الوثائق مصفوفة تبعية معينة (للأسف ، لا يمكنك وضع رابط مباشر لها). ويعرض أي SDK تأتي مع الإصدارات المختلفة من الشريحة - وما هو إصدار SoftDevice. في حالتنا ، تم وضع علامة QFAAH0 على الشريحة ، وتحتوي هذه الشريحة على 256 كيلوبايت من ذاكرة الفلاش ، و 16 كيلوبايت من ذاكرة الوصول العشوائي والتوافق مع SoftDevice s130.
يحتوي الإصدار 12.3 من SDK بالفعل على بعض الأمثلة على استخدام SoftDevice s130. مقارنة بالبرامج السابقة التي يتم توصيلها مباشرة في الرقائق الدقيقة من العنوان
0x0
، فأنت الآن بحاجة إلى فلاش SoftDevice من العنوان
0x0
، والبرنامج نفسه من العنوان
0x1b000
. بعد التحميل والتهيئة ، سينتقل الملف الثنائي SoftDevice إلى هذا العنوان وينقل التحكم إلى برنامجنا. للتوضيح ، أخذت نفس المثال مع مصابيح LED الوامضة ، لكني قمت بتغييره لـ SoftDevice البرامج الثابتة (
التعليمات البرمجية ). لم يتغير السلوك الذي تم ملاحظته ، باستثناء أنه يجب عليك فلاش SoftDevice مسبقًا:
$ make
# ...
$ make flash-softdevice
# ...
$ make flash
# ...
$ make log
# ...
Hello, world!
ربما يكون أبسط تطبيق لـ Bluetooth هو تحويل الجهاز إلى
منارة . الجهاز يبث حضوره فقط. أحد الأمثلة على ذلك موجود في SDK يسمى
ble_app_beacon
. يفترض أن FlashDevice
s130
بالفعل.
هنا أيضًا ، يؤدي الاتصال منخفض المستوى مع الشريحة إلى تعقيد كل شيء مقارنة بالبرمجة عبر SDK. بالإضافة إلى ضبط حجم ذاكرة الوصول العشوائي (كانت هذه المعرفة صعبة بالنسبة لي في المثال مع مصابيح LED) ، تم الكشف عن مشكلة أخرى يصعب تتبعها. كما اتضح ، فإن مكدس BLE يستخدم مولد ساعة لأداء المهام الحساسة للوقت. في أمثلة SDK ، يفترض مذبذب بلوري خارجي. عندما أدركت ذلك بعد آلاف محاولات
printf
، قمت بتغيير علامة التكوين لاستخدام مولد ساعة اصطناعي ، وتم حل المشكلة. الكود المصدري للمنارة موجود
هنا .
بليه + اردوينو
عندما عمل مثال BLE مع nRF5 SDK ، مع العلم بالفخاخ مع ذاكرة الوصول العشوائي ومولد ، نظرت مرة أخرى إلى بيئة Arduino. ومرة أخرى ، كان هناك مشروع
sandeepmistry / arduino-BLEPeripheral المجيد (من نفس الرجل مثل arduino-nRF5!) ، والذي يوفر تجريدًا ممتازًا في أعلى إعدادات BLE الداخلية.
لدهشتي ، لم يكن لدي حتى شوكة المكتبة. قضى مؤلف مشروع arduino-nrf5 الوقت وأضاف تكوين جميع اللوحات والإعدادات ، لذا فإن اختيار مولد الساعة المناسب لـ SoftDevice يأتي الآن لاختيار بسيط من القائمة المنسدلة
Tools > Low Frequency Clock > Synthesized
. رائع. لقد كتبت بسرعة
مثالًا باستخدام مصباح LED الأخضر عبر البلوتوث (مع
هذا التطبيق ). يظهر عمله
في الفيديو .
خطط أخرى
بعد الانزلاق مع هذا اللوح لساعات لا تحصى ، تشعر يدي بالحكة لعدة أسابيع لوضعها في الغسالة بعيدًا ونسيانها لفترة من الوقت.