בניית בקר תעשייתי בעלות נמוכה עם Raspberry Pi 3

באדיבות ‎DigiKey's North American Editors

מספר פעילויות תעשייתיות של מפעלים קטנים דורשות שילוב של סביבות פעולה קשות, יכולת 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).

תמונה של לוח הוספה HAT לאוטומציה מבית Pimoroni

איור 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, בתורו, מבצע את טרנסאקציות C‏2‏I ברמה-הנמוכה כדי להגדיר את ה- 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 מפעילה רוטינת קריאה, המבצעת כתיבת אפיק C‏2‏I כדי להתחיל את ההמרה, ישנה מספיק זמן עד להשלמת ההמרה, ומבצעת קריאת אפיק C‏2‏I‏ כדי לאסוף את התוצאה. (מקור התמונה: 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).

תמונה של לוחות HAT רבים למנועים 2348 מבית Adafruit

איור 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)

תמונה של לוח-מחוונים IO‏ של 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 logo

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

אודות מוציא לאור זה

DigiKey's North American Editors