בניית בקר תעשייתי בעלות נמוכה עם Raspberry Pi 3
באדיבות ‎DigiKey's North American Editors
2018-01-31
מספר פעילויות תעשייתיות של מפעלים קטנים דורשות שילוב של סביבות פעולה קשות, יכולת I/O גבוהה ודרישות פונקציונליות מורכבות, שנועדו במקור עבור בקרי לוגיקה ניתנים-לתכנות (PLC). בעוד שקיימות גרסות מוקטנות של בקרי PLC, למתכננים יש כעת גם את האפשרות לבחור מתוך מערך של פתרונות חומרה ותוכנה בעלות נמוכה ממקור-פתוח עבור ניטור ובקרה תעשייתיים יעילים.
דוגמה לפתרון כזה הוא ה- Raspberry Pi 3 הזעיר מבית Raspberry Pi Foundation ולוחות ההוספה הנלווים אליו. מאמר זה יתאר את המאפיינים העיקריים של ה- Raspberry Pi 3 לפני הדיון כיצד להשתמש בו עבור יישומי ניטור ובקרה.
מדוע Raspberry Pi עבור בקרה תעשייתית במפעלים קטנים
עבור מפעלים קטנים רבים, פלטפורמת Raspberry Pi 3 מציעה פתרון בעלות נמוכה עם יכולות ביצועים משמעותיות. מסוגלת להתמודד עם משימות אוטומציה תעשייתיות ייעודיות, לוח Raspberry Pi 3 משלב בין מעבד מבוסס- A53-®Cortex ®ARM מבית Broadcom, זיכרון RAM של Gbyte 1, Wi-Fi וחיבוריות Bluetooth. המעבד עצמו הוא התקן עם ביצועים עיליים על-השבב (SoC) המשלב מעבד ARM Cortex-A53 בעל ארבע ליבות עם זיכרון Cache L2 של Kbytes 512 ו- 54 נקודות-חיבור GPIO המאורגנות בשלושה מאגרים.
כל GPIO בודד תומך באופן שונה בלפחות שתיים ועד שש פונקציות חלופיות, כולל מאפנני רוחב-פולס, שעונים וממשקים טוריים. מפתחים יכולים להשתמש בכל נקודות-החיבור GPIO שלא הוקצו כקווי פסק (Interrupt), כניסות או יציאות המסוגלים לספק עד 16 מיליאמפר (mA) (סה"כ עד mA 50 לכל מאגר GPIO).
כמו עם חברים אחרים במשפחת Raspberry Pi, ה- Raspberry Pi 3 מתוכנן להפוך פיתוח משובץ למספיק פשוט עבור מתחילים, אך עדיין מספיק חזק כדי לענות על הצרכים של מפתחים מנוסים עם דרישות עיבוד יותר מורכב ורב-עוצמה.
כדי להתחיל, המפתחים פשוט מחברים את נקודות-חיבור הווידאו של הלוח לצגים שלהם ואת נקודות-חיבור ה- USB למקלדת ולעכבר שלהם. עבור תכנון התוכנה, מפתחים יכולים לבנות על מערכת-הסביבה הרחבה הנתמכת על ידי מערכת ההפעלה Raspbian מבית Raspberry Pi Foundation הנטענת מכרטיס זיכרון דרך ממשק micro-SD של הלוח.
הוספת יכולות תעשייתיות
מעבר לביצועים ולקלות הפיתוח שלה, הגישה המפושטת של Raspberry Pi להרחבת הפונקציונליות שלה הופכת אותה למתאימה היטב עבור הדרישות המגוונות של יישומי אוטומציה תעשייתית. כדי להוסיף יכולות חומרה, המפתחים צריכים רק לחבר לוח הוספה הנקרא HAT (Hardware Attached on Top) על לוח Raspberry Pi 3. כמו במערכות תעשייתיות מורכבות יותר, ה- HAT מספק גישה סטנדרטית עבור זיהוי ה- HAT ומגדיר אוטומטית את תצורת נקודות-החיבור GPIO והדוחפים לפי הצורך. כתוצאה מכך, המפתחים יכולים לשדרג מידית את מערכת Raspberry Pi עבור יישומים תעשייתיים פשוט על ידי תקיעת לוח Automation HAT PIM213 מבית Pimoroni (איור 1).
איור 1: המפתחים יכולים לשדרג את לוח Raspberry Pi 3 עבור אוטומציה תעשייתית על ידי חיבור לוחות הוספה מיוחדים כגון Automation HAT מבית Pimoroni. (מקור התמונה: Pimoroni)
תוכנן במיוחד עבור ניטור ובקרה של מערכות אוטומציה, ה- Automation HAT מבית Pimoroni משלב מספר ערוצי I/O, כולל כניסות אנלוגיות ודיגיטליות, יציאות הספקת-כוח ופקדי ממסרים. ביחד עם יכולת 24 וולט (V) שלהם, ערוצי ה- I/O מספקים חציצה (Buffering) משמעותית של כניסות ויציאות. לדוגמה, יציאות הממסר תומכות בעד 2 אמפר (A), מספיק כדי לדחוף חלקי 24 וולט בהספק נמוך, כגון שסתום סולנואיד 81 546 001 מבית Crouzet.
עבור פיתוח תוכנה עם ה- Automation HAT, חברת Pimoroni מספקת מודול Python נלווה הדורש רק כמה שורות קוד כדי להשתמש במאפייני החומרה של ה- HAT. כאשר הוא מיובא לתוך תוכנית Python, מודול Pimoroni יוצר אובייקטי תוכנה עבור כניסה אנלוגית, כניסה דיגיטלית, יציאה דיגיטלית, יציאת ממסר ופקד נורית LED, שכל אחד מהם כולל את פונקציות הקריאה/כתיבה המתאימות של הרמה הנמוכה יותר (רשימה 1).
:(class AnalogInput(object)
'type = 'Analog Input
:(def __init__(self, channel, max_voltage, led)
self._en_auto_lights = True
self.channel = channel
self.value = 0
(self.max_voltage = float(max_voltage
(self.light = SNLight(led
:(def auto_light(self, value
self._en_auto_lights = value
return True
:(def read(self
""Return the read voltage of the analog input"
(return round(self.value * self.max_voltage, 2)
:(def _update(self
(ads1015.read(self.channel =elf.value
:(def _auto_lights(self
:if self._en_auto_lights
adc = self.value
(((self.light.write(max(0.0,min(1.0,adc
רשימת קוד 1: מודול Python מבית Pimoroni עבור ה- Automation HAT מפשט את הפיתוח על ידי טיפול בטרנסאקציות מפורטות כגון קריאה מהממיר האנלוגי-לדיגיטלי (ADC) שעל-הלוח. (מקור התמונה: Pimoroni)
כל אובייקט מזהה את הערוץ המתאים ואת הנתונים הקשורים האחרים. לדוגמה, בעת היצירה, אובייקט הכניסה האנלוגית כולל את המתח המקסימלי עבור הפין המשויך (ראו את פונקציית init ברשימה 1). כדי לבצע המרה של ממיר אנלוגי-לדיגיטלי (ADC), אובייקט ADC קורא את מודול ADC שבבסיס (ads1015.read ברשימת קוד 1). המודול ADC, בתורו, מבצע את טרנסאקציות C2I ברמה-הנמוכה כדי להגדיר את ה- ADC ולבצע המרה לפני החזרת הערך בצורה שימושית (רשימת קוד 2).
:class ads1015
:(def __init__(self, i2c_bus=None, addr=ADDR
self._over_voltage = [False] * 4
self.i2c_bus = i2c_bus
:( if not hasattr(i2c_bus, "write_i2c_block_data") or not hasattr(i2c_bus, "read_i2c_block_data"
("raise TypeError("Object given for i2c_bus must implement write_i2c_block_data and read_i2c_block_data
self.addr = addr
:(def read(self, channel=0, programmable_gain=PGA_4_096V, samples_per_second=1600
sane defaults #
config = 0x0003 | 0x0100
[config |= SAMPLES_PER_SECOND_MAP[samples_per_second
[config |= CHANNEL_MAP[channel
[config |= PROGRAMMABLE_GAIN_MAP[programmable_gain
set "single shot" mode #
config |= 0x8000
write single conversion flag #
([self.i2c_bus.write_i2c_block_data(self.addr, REG_CFG, [(config >> 8) & 0xFF, config & 0xFF
delay = (1.0 / samples_per_second) + 0.0001
(time.sleep(delay
(data = self.i2c_bus.read_i2c_block_data(self.addr, REG_CONV
((value = ((data[0] << 4) | (data[1] >> 4
:if value & 0x800
value -= 1 << 12
value /= 2047.0 # Divide down to percentage of FS
(value *= float(programmable_gain
value /= 3300.0 # Divide by VCC
return value
...
רשימת קוד 2: פונקציה ברמה גבוהה יותר עבור שיחת ADC מפעילה רוטינת קריאה, המבצעת כתיבת אפיק C2I כדי להתחיל את ההמרה, ישנה מספיק זמן עד להשלמת ההמרה, ומבצעת קריאת אפיק C2I כדי לאסוף את התוצאה. (מקור התמונה: Pimoroni)
עם זאת, עבור המפתחים קריאת ערך אנלוגי פשוט מחייבת ביצוע פונקציית הקריאה ברמה-גבוהה (()read.) על הכניסה האנלוגית המוגדרת (one.) עבור האובייקט האנלוגי:
()value = automationhat.analog.one.read
הספרייה תומכת במודל פשוט זה עבור מאפייני HAT אחרים, כך שהפעלת או הפסקת ממסר היא קריאה פשוטה:
automationhat.relay.write(1) # 1 = ON, 0 = OFF
אפשרויות גמישות
ה- Automation HAT מבית Pimoroni מציעה את פונקציונליות IO הבסיסית הדרושה עבור יישומי אוטומציה תעשייתית קטנים, אך המפתחים יכולים לבחור מתוך סט עשיר של לוחות HAT קיימים עבור כל התנהלות המאפיינים הנדרשים עבור יישומים מיוחדים כגון אוטומציה תעשייתית. לדוגמה, ה- RTC HAT 3013 מבית Adafruit מספק פונקציונליות שעון זמן-אמת (RTC), שאינו מאפיין סטנדרטי של הלוח עצמו. מתכנני Raspberry Pi מצפים שהמפתחים ישאירו את הלוח מחובר לאינטרנט, שם הוא יכול להשתמש בפרוטוקול זמן רשת (NTP) סטנדרטי כדי לשמור על זמן השעון. כתוצאה מכך, דרוש RTC חיצוני כגון RTC HAT מבית Adafruit עבור תכנים העלולים לאבד את החיבור לאינטרנט באופן מתוכנן או באקראי.
הודות להוספת פונקציונליות כגון RTC, המפתחים אינם צריכים להגביל עצמם ללוח HAT יחיד במהלך תכנון אוטומציה תעשייתית. המפתחים יכולים לגבב מספר לוחות HAT על לוח Raspberry Pi. למרות שמרבית לוחות HATS נועדו עבור גיבוב, המפתחים עשויים להזדקק להוספת פסי-פינים כגון 2223 מבית Adafruit כדי להשלים את המכלל, או מרחיקי M2.5 כדי למנוע את הסיכוי שלוחות ה- HAT ייגעו אחד בשני או בלוח הבסיס.
באמצעות פסי-פינים ומרחיקים בגיבוב, המפתחים יכולים בקלות לגבב לוח HAT כגון לוח HAT למנועים 2348 מבית Adafruit כדי להוסיף דוחפי מנועים הדרושים ביישומי אוטומציה תעשייתית רבים. כל לוח HAT למנועים 2348 יכול לדחוף שני מנועי צעד או ארבעה מנועי DC. למעשה, המפתחים יכולים לגבב עד 32 לוחות הוספה כאלו כדי לתמוך בעד 64 מנועי צעד או 128 מנועי DC (איור 2).
איור 2: המפתחים יכולים לגבב מספר לוחות HAT למנועים 2348 מבית Adafruit כדי לתמוך בעד 64 מנועי צעד או 128 מנועי DC בתכן. (מקור התמונה: Adafruit)
כמו עם ה- Automation HAT מבית Pimoroni, לוח HAT למנועים 2348 מבית Adafruit ניתן לתכנות באמצעות מספר פקודות Python פשוטות. התוכנה לדוגמה מבית Adafruit עבור לוח HAT למנועים אפילו מדגימה תבניות תכנון בסיסיות עבור מודול Thread של Python להפעלת מספר מנועים במקביל (רשימת קוד 3).
from Adafruit_MotorHAT import Adafruit_MotorHAT, Adafruit_DCMotor, Adafruit_StepperMotor
import threading
create a default object, no changes to I2C address or frequency #
()mh
= Adafruit_MotorHAT
(# create empty threads (these will hold the stepper 1 and 2 threads
.st1 = threading()Thread
.st2 = threading()Thread
. . .
myStepper1 = mh.getStepper(200, 1) # 200 steps/rev, motor port #1
myStepper2 = mh.getStepper(200, 2) # 200 steps/rev, motor port #1
myStepper1.setSpeed(60) # 30 RPM
myStepper2.setSpeed(60) # 30 RPM
stepstyles = [Adafruit_MotorHAT.SINGLE, Adafruit_MotorHAT.DOUBLE, Adafruit_MotorHAT.INTERLEAVE, Adafruit_MotorHAT.MICROSTEP]
:(def stepper_worker(stepper, numsteps, direction, style
("!print("Steppin #
(stepper.step(numsteps, direction, style
("print("Done#
:(while (True
:()if not st1.isAlive
(randomdir = random.randint(0, 1
:(if (randomdir == 0
dir = Adafruit_MotorHAT.FORWARD
:else
dir = Adafruit_MotorHAT.BACKWARD
(randomsteps = random.randint(10,50
.st1 = threading Thread(target=stepper_worker, args=(myStepper1, randomsteps, dir, stepstyles[random.randint(0,3)],))
()st1.start
:()if not st2.isAlive
(randomdir = random.randint(0, 1
:(if (randomdir == 0
dir = Adafruit_MotorHAT.FORWARD
:else
dir = Adafruit_MotorHAT.BACKWARD
(randomsteps = random.randint(10,50
(print("%d steps" % randomsteps
.st2 = threading Thread(target=stepper_worker, args=(myStepper2, randomsteps, dir, stepstyles[random.randint(0,3)],))
() st2.start
רשימת קוד 3: מודולי Python HAT למנועים מבית Adafruit כוללים תוכנה לדוגמה כגון קוד Snippet זה המדגים שימוש בפקודות בקרה פשוטות ומשתמש במודול Thread של Python לבקרת זוג מנועי צעד. (מקור התמונה: Adafruit)
עבור פונקציונליות שאינה מוצעת בלוחות HAT קיימים, המפתחים אינם צריכים להגביל עצמם לפורמט HAT. לוח Shield Arduino DFR0327 מבית DFRobot, ערכת ההתחלה +GrovePi מבית Seeed Technology ולוח Shield Click MIKROE-2756 מבית MikroElektronika מעניקים למפתחים גישה למערך רחב של לוחות Arduino Shields, התקני Grove ולוחות Click MikroBUS קיימים, בהתאמה.
באמצעות לוחות אלו, המפתחים יכולים להוסיף במהירות תמיכה עבור ממשקי CAN סטנדרטיים על ידי חיבור לוח Click CAN MIKROE-988 מבית MikroElektronika, ועבור חוגי זרם של mA 20-4 עם לוח Click לחוג זרם mA 20-4 MIKROE-1296 מבית MikroElektronika.
השלמת התכנון למפעלים קטנים
גם לאחר הגדרת התצורה המהירה של התכן מבוסס ה- Raspberry Pi עם הפונקציונליות המוספת הדרושה, המפתחים מאבדים לעיתים קרובות זמן בבניית ממשק משתמש מתאים. עם Raspberry Pi 3, המפתחים יכולים לחבר את התכן לשירותי ענן I/O של Adafruit כדי לספק למשתמשים מושב גרפי ולשלוט בתהליכי האוטומציה. שירות הענן מאפשר למפתחים ליצור הזנות פשוטות של נתונים ופרטי תהליכים (רשימת קוד 4) ולבנות לוחות-מחוונים המאפשרים למשתמשים לנטר ולשלוט בפרויקטים מכל דפדפן אינטרנט שבשולחן העבודה, בסמארטפון או בהתקן נייד אחר (איור 3).
.Import library and create instance of REST client #
from Adafruit_IO import Client
("Client('YOUR ADAFRUIT IO KEY =
aio
.'Send the value 100 to a feed called 'Foo #
(aio.send('Foo', 100
רשימת קוד 4: המפתחים יכולים בקלות להזרים נתונים מיישומי האוטומציה התעשייתית שלהם לענן IO של Adafruit עבור תצוגה ובקרה. (מקור התמונה: Adafruit)
איור 3: המפתחים יכולים להציג מידע מיישומי האוטומציה התעשייתית מבוססי Raspberry Pi 3 שלהם ולספק בקרה באמצעות לוח-המחוונים IO של Adafruit. (מקור התמונה: Adafruit)
השילוב של פיתוח תוכנה פשוט, מגוון לוחות ההוספה וה- Raspberry Pi עם הביצועים העיליים מעניק פתרון מתאים עבור יישומי אוטומציה תעשייתית בקנה מידה קטן. עם זאת, בחלק מהיישומים הללו המפתחים עשויים להזדקק לבקרת תזמון הדוקה יותר מזו המסופקת בתצורות המשתמשות ב- RTC, כגון לוח HAT 3013 RTC מבית Adafruit.
לוח HAT RTC 3013 מבוסס על המעגל-המשולב (IC) של RTC DS3231 מבית Maxim Integrated, המספק שתי התרעות ניתנות-לתכנות ואות יציאה של גל ריבועי. המפתחים יכולים להשתמש בהתרעות כדי ליצור פסק (Interrupt) במספר מסוים של ימים, שעות, דקות ושניות, או להשתמש בגל הריבועי כדי ליצור פסק בקצב שלו של 1 הרץ (Hz). עבור יישומים הדורשים פסקים (Interrupts) מחזוריים מהירים יותר מ- Hz 1, המפתחים יצטרכו לפתח פונקציות תוכנה מותאמות-במיוחד באמצעות קוצב-זמן המערכת של המעבד, או לבנות מונים מותאמים-במיוחד בחומרה המסוגלים ליצור פסקים בקצב הרצוי.
ביישומים הדורשים רזולוציית תזמון מהירה יותר, דרישה חשובה באותה מידה הופכת להיות שיהוי Latency)) התגובה הדטרמינסטי. בקצבים גבוהים, השוני בשיהוי התגובה במערכת ההפעלה (OS) Raspbian הסטנדרטית עלול להשפיע לרעה על הדיוק. למרות שהמערכת הסטנדרטית עשויה לספק תגובה דטרמיניסטית במידה מספקת עם רזולוציה של מילישנייה, ייתכן שהמפתחים יצטרכו לפנות לגישות המשתמשות בתיקון PREEMPT_RT של Linux כדי לעמוד בדרישות רזולוציה מחמירות יותר ודטרמיניסטיות יותר.
סיכום
בקרי PLC קונבנציונליים מציעים יכולות שהן בדרך כלל מעבר לדרישות ולתקציבים של מרבית הפעילויות התעשייתיות הקטנות יותר במפעלים קטנים המייצרים, מעבדים-במכונה ויוצרים אבות-טיפוס בקנה מידה קטן. עבור יישומים אלו, המפעילים עומדים בדרך כלל בפני דרישות צנועות יותר הקיימות היטב בתוך היכולות של ה- Raspberry Pi 3.
באמצעות Raspberry Pi 3 ולוחות הוספה מתאימים, מפתחים יכולים ליישם במהירות מערכות אוטומציה תעשייתית ייעודיות המסוגלות לעמוד בדרישות עבור מגוון רחב של פעולות מפעלים קטנים.

מיאון אחריות: דעות, אמונות ונקודות מבט המובעות על ידי מחברים שונים ו/או משתתפי פורום באתר אינטרנט זה לא בהכרח משקפות את הדעות, האמונות ונקודות המבט של חברת DigiKey או את המדיניות הרשמית של חברת DigiKey.