שְׁאֵלָה:
אפשרויות לתקשורת בין Arduinos
waspinator
2016-03-18 01:22:41 UTC
view on stackexchange narkive permalink

אני מחפש לתקשר בין ~ 5-10 Arduinos כדי לשלוח פקודות ונתונים ביניהם. על ידי "Arduino" אני מתכוון ל- ATmega328 שתוכנת באמצעות מסגרת התכנות Arduino.

כל אחד מהמכשירים יהיה על אותו PCB.

אני יודע ש- I2C ו- SPI יכולים לתקשר במידה מסוימת. , אלא שהם באמת מיועדים להתקני ציוד היקפי המחוברים לבקר מיקרו ולא לחיבור בקרי מיקרו מרובים זה לזה, וכי הם בדרך כלל שולחים רק כמה בתים של נתונים בכל פעם. מצד שני אני יודע שניתן להניע תצוגות LCD באמצעותן, והייתי מתאר לעצמי שיש הרבה נתונים שמועברים במקרים האלה.

האם יש משהו כמו I2C (רב-מאסטר, רב- אוטובוס מחשב סדרתי חד פעמי, לתקשורת בין בקרי מיקרו? מתן אפשרות לכל מכשיר לשלוח נתונים זה אל מכשיר אחר שלא רצוי. לדוגמא, אם לחצו על מתג במכשיר A, הוא יגיד למכשיר B, מבלי שהמכשיר B ישאל את A כל הזמן אם לחצו על מתג. ולהיפך.

ערוך : מצאתי כמה ספריות שעשויות לעשות מה שאני רוצה עם RS-485. האם זו האפשרות היחידה המועילה להעברת ~ 1k bps בין 5-10 מכשירים? הייתי מתאר לעצמי ש- TCP / IP דרך Ethernet יעבוד גם כן, אבל זה נראה יותר מדי. האם יש ספריות I2C המאפשרות שליחת כמות נתונים זו בין התקני מאסטר בלבד?

בדקתם חיבור סדרתי?
אתה מתכוון ל- RS-485?
יש כאן שאלה דומה מאוד: [כיצד לחבר בין ארדואינו מרובים עם Rpi כדי לשלוט באורות ביתיים / מתגים] (http://arduino.stackexchange.com/questions/15834/how-to-interconnect-multiple-arduinos- עם a-rpi-to-control-home-light-switch-switches - התעלמות מחלק ה- Rpi (זה לא היה ממש רלוונטי לשאלה) אני רואה את זה כמעט זהה למה שאתה רוצה לעשות. השבתי שם תגובה ארוכה לגבי ביצוע מערכת "מאסטר מתגלגל". אנא קרא את השאלה / תשובה האחרת וראה מה אתה חושב.
אתה זקוק לשכבה פיזית (כבלים או לוח), "סטנדרטית" אלקטרונית כמו RS-485 אך גם 5V TTL טוב. אז תצטרך לבחור איזה סוג של בוררות אוטובוסים (הודעות סביב-רובין, מאסטר-עבד או שידור) וכנראה ליישם איזו כתובת או בדיקת שגיאות.
על לוח לחם, לא הייתי משתמש ב- RS485, מכיוון שהוא זקוק למקלטים מקלטים. רק 5v עבור לוגיקה 1 ו -0 v עבור לוגיקה 0. אבל מאותה נקודה, האפשרויות הן אינסופיות. זה יהיה תלוי גם בדרישות המהירות וכו '.
לא הצהרת מדוע אתה רוצה ליצור דבר כזה. אם חסר לכם סיכות IO, תוכלו להשתמש במרחיבי IO. אולי יש פתרונות טובים יותר. אם זה תחביב / הוכחת מושג, אתה יכול לבדוק פרויקטים אחרים כמו זה ולנסות "לשפר / להתאים את זה".
@Paul אני רוצה שתהיה הפרדה בין חששות. אני יודע שאני יכול פשוט להשיג בקר גדול יותר עם הפרעות נוספות ופלט / פלט, אבל אני מעדיף לשמור על דברים פשוטים ברמת המכשיר. זה עוזר גם בשיתוף פעולה עם אחרים, שכן ניתן לתכנן ואף לבנות כל תת-מערכת באופן עצמאי ולחבר אותם יחד מאוחר יותר. יכול להיות קל יותר לבדיקת יחידה ולהחלפה / שדרוג.
אולי לא סתם מצאתי את זה, אבל לא קראתי את השאלה המהותית שהיא "מהי הטופולוגיה שאתה צריך"? אתה צריך שכולם ידברו עם כולם? גישה מרוכזת (כלומר כולם מדברים עם אחד)? פיתרון מעורב?
@frarugi87 אני חושב שטופולוגיית אוטובוסים תעבוד הכי טוב, כאשר כל מכשיר מתקשר עם כל מכשיר אחר ויוזם את החיבור. אז אין עבדים.
ובכן, בסדר לטופולוגיית האוטובוסים, אבל אני מאוד ממליץ לך להפוך למנהל אוטובוס אחד ולכל שאר העבדים. אחרת יהיו לך התנגשויות, וגילוי / מניעה של התנגשויות היא משימה "קשה". אם יש לך רק אדון אחד אתה יכול להימנע מכך, מכיוון שרק הוא יכול לתת אישור לדבר. אתה יכול ליצור אוטובוס סדרתי (UART), עם חוט אחד המחבר TX של מאסטר לכל עבד RX, וחוט אחד המחבר עבדים TX (אולי עם חיץ של 3 מצבים) ל- RX המאסטרים. אחרת אתה יכול ליצור שרשרת דייזי: TX1 מחובר ל- RX2, TX2 ל- RX3 ... TXn ל- RX1. זה קצת פחות יעיל, מאז לדבר איתו
מיקרו אחר אתה צריך להכין כשות, אבל זה עובד. הפיתרון האחרון הוא מה שאמרת, אז כולם מדברים באותו אוטובוס, אבל תזדקק לזיהוי התנגשות. במקרה זה אני מציע לך את אוטובוס ה- CAN, מכיוון שהוא כבר מטפל בהתנגשויות (אך יהיה עליך ליישם אותו בקוד שלך).
ארבע תשובות:
Majenko
2016-03-18 04:01:36 UTC
view on stackexchange narkive permalink

ישנם מספר מושגים שיכולים לעזור לך להגשים את חלומך. אני לא יכול, במסגרת התשובה הזו, לומר לך בדיוק כיצד ליישם את מה שאתה רוצה, אבל אני יכול להראות לך את המושגים שיעזרו לך ליישם אותו.

ראשית יש את הרעיון של ה אדון האוטובוסים . זה לא בהכרח המכשיר שמייצר תקשורת מיידית - במקום זאת זה המכשיר ש בבעלותו ו שולט באוטובוס.

כאשר מכשיר שאינו ' כאשר אדון האוטובוסים רוצה לתקשר באוטובוס הוא מבקש תחילה אישור ממנהל האוטובוסים. ה- Z80 הישן (טוב, אני אומר "ישן", אך הם עדיין נמצאים בשימוש בצורות רבות כיום) השתמש במושג זה כדי לאפשר לשבבים אחרים להשתמש בנתונים ולטפל באוטובוסים. הוא מורכב משני אותות - BUSRQ ו- BUSACK. תחילה מכשיר בודק אם אחד מ- BUSRQ או BUSACK פעיל, ואם גם הוא אינו מפעיל את BUSRQ. אם מנהל האוטובוסים מוכן לוותר על האוטובוס למכשיר השני (הוא לא משתמש בו באותו רגע) הוא מפעיל את BUSACK והמכשיר השני אז יודע שהוא יכול להשתמש באוטובוס. שום דבר אחר לא יכול להשתמש בו עד שפורסמו שניהם BUSRQ ו- BUSACK. נחמד ופשוט ואלגנטי.

אבל לא מושלם. אם שני מכשירים מחליטים לבקש את האוטובוס באותו רגע בדיוק אתה מקבל התנגשות . זו בעיה שכיחה בקרב מערכות אוטובוסים משותפות כמו זו, וגורמת לבעיות בלתי נספרות אלא אם כן אתה יודע כיצד לטפל בזה נכון.

הזן את המושג הקשב בזמן שאתה מדבר . זה כולל שהמכשיר שנשלח לאוטובוס מקשיב גם למה שנשלח באוטובוס דרך מקלט נפרד. לאחר מכן הוא יכול לדעת אם מה שהוא שלח באוטובוס הוא מה שבסופו של דבר הגיע לאוטובוס. למשל אם שני מכשירים מדברים בו זמנית והאחד שולח 10011001 והשני שולח 11001100 התוצאה שמופיעה באוטובוס עשויה בסופו של דבר להסתיים כמשהו אחר, כגון 11011101 או אולי 10001000 תלוי איך נוצרים אותות האוטובוס. אז אם אתה יודע מה ששלחת נפגם אתה יכול עכשיו לעשות משהו בקשר לזה.

המושג הבא: גיבוי . זה המקום בו שני השולחים ממתינים לתקופה קצרה ומנסים לשלוח שוב. כל עוד שניהם מתעכבים לפרק זמן שונה הראשון שניסה יקבל את האוטובוס ויוכל לתקשר. אבל איך מבטיחים ששניהם יתעכבו לזמנים שונים? אתה עשוי לחשוב שהתשובה פשוטה: השתמש במספר אקראי, כמו rand () או אקראי () . אבל זה גם בעייתי:

מושג אחר: ה פסאודו מחולל מספרים אקראיים

הארדואינו אינו מייצר מספרים אקראיים . הוא פשוט משתמש בנוסחה מתמטית מורכבת כדי ליצור רצף של מספרים ש נראה לנו אקראי. הם לא. כתוב תוכנית קטנה להדפסת 10 מספרים אקראיים דרך סדרתי והפעל אותה מספר פעמים (לחץ על כפתור האיפוס). תוכלו למצוא את אותם מספרים "אקראיים" באותו סדר בכל פעם. נסה את זה בארדואינו אחר ותקבל שוב את אותם המספרים. תמיד אותו הדבר.

אז מה לעשות? התשובה נקראת זריעה מחולל המספרים האקראיים. המספר הבא שנוצר על ידי rand () et al. תלוי במספר שנוצר לאחרונה. אז שנה את המספר הראשון וכל שאר המספרים ישתנו. עם זאת, יש לך מצב של 22 תפוס. אתה צריך מספר אקראי כדי לזרוע את מחולל המספרים האקראיים כדי שיהיה אקראי כדי להיות מסוגל ליצור מספר אקראי כדי לזרוע את מחולל המספרים האקראיים ... ad infinitum. אתה רואה לאן זה הולך? אינך יכול לזרוע מ- rand () מכיוון ש- rand () אינו אקראי עד שזרעת ממקור אקראי. אז אתה צריך למצוא מקור אקראי.

וזו לא משימה קלה. המקור הטוב ביותר ל אנטרופיה כידוע הוא רעש לבן . זה יכול להיווצר במספר דרכים עם מספר מעגלים שונים - מפירוק צומת דיודות ועד להגברת רווח גבוה מאוד של התנודות התרמיות בנגד.

כולם מורכבים למדי למה שאתה באמת רוצה, אבל יש שיטה פשוטה יותר, אם קצת פחות אקראית - קרא קרא קלט אנלוגי שאינו מחובר לשום דבר. לא יהיה לו טווח כמו מחולל אנטרופיה תקין, אך הוא אמור לספק מספיק אקראיות בכדי לתת סיכוי סביר שכל מכשיר יקבל זרע אחר.

מושג שימושי נוסף הוא ההפרעה.

זה טוב במצב שאתה לא רוצה את המורכבות של אוטובוס רב-מאסטר עם כל ההתנגשויות וכו '. יש לך מאסטר יחיד שעושה את כל העבודה באוטובוס, וכאשר עבד למכשיר יש משהו חשוב לומר שהוא דוחף את המאסטר בהפרעה. המאסטר אומר "כן? מה אתה רוצה?" עליו העבד עונה "מישהו לחץ על הכפתור שלי".

בדרך זו האדון לא סוקר את העבד כל הזמן כדי לראות אם הכפתור נלחץ. זה משמש לעתים קרובות בסידורי אוטובוסים כמו SPI ויש הרבה שבבים, כמו שבבי הרחבת IO, שיכולים להפריע כאשר אחד מסיכות הקלט שלהם משנה את המצב.

אבל אם יש לך 20 מכשירים עושה את זה כלומר יש לך 20 סיכות הפסקה? לא בהכרח. מושג חדש: חוטית או .

אפשר בהחלט שיהיו מספר עבדים שונים המשתמשים באותו סיכת הפסקה. הסיכה מוחזקת בדרך כלל HIGH עם נגד (זה יכול להיות נגד משיכה פנימי) ולכל עבד יש פלט ניקוז פתוח המחובר לסיכה זו. פלט ניקוז פתוח, כאשר הוא "כבוי", אינו מחובר לשום דבר - זה כאילו שהסיכה נמצאת במצב קלט (למעשה ניתן לחקות אותה על שבבים שאין להם ניקוז פתוח על ידי מעבר בין קלט למצב פלט). כאשר הפלט "פועל" הוא מחבר את הסיכה לקרקע, מושך את סיכת ה- IO כלפי מטה, בדיוק כמו שלחצן היה עושה.

אז על המאסטר לפלס את עבדיו שהוא יודע שהם קשור לאותה הפרעה כדי לראות מי צריך תשומת לב. ניתן כמובן ליישם מספר סיכות הפסקה שונות עם קבוצות שונות של עבדים על כל אחת - אולי בעדיפות גבוהה עם מכשיר אחד בלבד, ובעדיפות נמוכה יותר עם מספר מכשירים בכל אחת מהן, למשל.

ניתן להשתמש באותו מושג של חוטית OR ו פתוח ניקוז כדי לאפשר למכשירים מרובים לחלוק את אותם חוטים פיזיים. כך בדיוק עובד I2C - שני קווי האוטובוס נמשכים מעלה על ידי נגדים והמכשירים עליו משתמשים ביציאות ניקוז פתוחות כדי למשוך את הקו נמוך כדי לשחרר אותו חזרה לגובה כדי ליצור את רמות ההיגיון השונות. אם שני מכשירים מושכים אותו נמוך ביחד הוא פשוט יהיה נמוך. ללא שיטת הניקוז הפתוחה אם היה לך מכשיר אחד שמוציא 1 ואחר מוציא 0 אתה בעצם היה מקבל קצר בין השניים ובסופו של דבר אתה פוגע בשבבים.

ואז כמובן יש לך את הרעיון של תקשורת סינכרונית לעומת אסינכרונית, אבל זה קומקום דג אחר לגמרי. במילים פשוטות, פרוטוקולים עם שעון, כמו SPI ו- I2C, שמאסטר מייצר שעון זה, הם סינכרוניים. פרוטוקולים כמו UART ו- RS-232, RS-485 וכו 'הם א-סינכרוניים - הם מסתמכים על שני הקצוות המסכימים עד כמה נתונים נשלחים במהירות (קצב שידור), כך שהם יודעים לפרש את האותות כשהם מגיעים.

אני רק רוצה להוסיף ש- I2C הוא בעל יכולת תיאורטית מרובת-מאסטר ויש לו ערכת בוררות שאינה זקוקה למספרים אקראיים. עם זאת, נראה שיש בעיה ביישום Atmel. C.f. לדוגמא [מודול TWI נראה כרכב בתקשורת רב-מאסטית] (http://www.avrfreaks.net/forum/twi-module-seems-buggy-multi-master-communications) ו- [Multiple Master Problem with Atmel AVR Microcontrollers] (http://www.robotroom.com/Atmel-AVR-TWI-I2C-Multi-Master-Problem.html). יחיד יחיד + הפרעות נראה לי כמו הפיתרון הקל ביותר.
@EdgarBonet כמעט כל הפרוטוקולים יכולים להיעשות רב-אם אם מיושמת צורה כלשהי של מערכת בוררות באוטובוסים. חלקם מתאימים לכך יותר מאחרים, ולחלקם, כמו I2C, יש דרכים "רשמיות" לעשות זאת, חלקם עובדים טוב יותר מאחרים. הדרך האמינה ביותר, כמובן, היא שלא צריך מערכת רב-מאסטר בכלל :)
@EdgarBonet אתה יודע אם ספריית החוטים תומכת ברב-מאסטר? האם זה קל כמו https://michael.bouvy.net/blog/en/2013/05/25/arduino-multi-master-to-master-i2c/
@waspinator: אני לא יכול לדעת, כפי שמעולם לא ניסיתי. נראה כי [ספריית Wire מטפלת בבוררות באוטובוסים] (https://github.com/arduino/Arduino/blob/master/hardware/arduino/avr/libraries/Wire/src/utility/twi.c#L439), אבל אני לא יודע אם זה יכול להתמודד עם הנושאים עליהם הצבעתי קודם.
EllisGL
2016-04-15 09:34:53 UTC
view on stackexchange narkive permalink

בדוק את PJON - https://github.com/gioblu/PJON. זו אלטרנטיבה חד חוטית.

בבקשה תוכל לפרט על תשובתך ואולי דוגמה לשימוש או יתרונות וחסרונות, מכיוון שזו באמת תשובת קישור כרגע.
אנא הוסף קצת מידע מדוע זה טוב יותר מהאלטרנטיבות / מה גורם לו להתבלט. תודה!
PJON הועמד לרשות מספר פלטפורמות, לא רק לארדואינו. זה פשוט יותר מ- I2C / חוט אחד. זה מטפל טוב יותר ברעש. יש לו תמיכה ברב-מאסטר. קרא את הוויקי מהקישור.
AMADANON Inc.
2016-03-18 08:37:35 UTC
view on stackexchange narkive permalink

בנוסף לתשובה המצוינת של @ Majenko, אתה צריך לחשוב על מה שאתה מתקשר.

זה נשמע שאתה רוצה לתקשר קצת - אולי אתה יכול לברוח עם סיכות בודדות? אם יש לך אדון, ועד 13 עבדים, יכול להיות שסיכה אחת על המאסטר מחוברת לסיכה אחת בכל אחד מהעבדים (באמצעות נגד). אם העבד A היה רוצה לאותת על האות, הוא היה מרים את הסיכה; המאסטר יוכל אז לסקור כל סיכה בתורו, כדי להבין מי אמר מה.

מצטער, המעט האחרון היה רק ​​דוגמה לאופן שבו הייתי רוצה שמכשירים יוכלו "לדחוף" נתונים זה לזה במקום לסקור אותו. אני, למעשה, רוצה לשלוח עוד נתונים. ~ 100 בתים 10 פעמים בשנייה.
AMADANON Inc.
2016-03-18 09:09:12 UTC
view on stackexchange narkive permalink

אפשרות נוספת היא SPI.

ניתן להשתמש ב- SPI עם כל מספר מכשירים, בטבעת. הוסבר לי כדלקמן: כל משתתף יכול להחליף את קו השעון 8 פעמים, להעביר את הבייט במאגר של עצמו, למאגר המכשיר הבא, בטבעת; המכשיר מקבל בתים מהמכשיר הקודם. אם מישהו אחר מחליף את השעון 8 פעמים, תקבל הודעה שהבית החדש מוכן (זה נעשה בחומרה).

עליך לחשוב היטב על פרוטוקול לכך - "כתובת", " אורך "," פקודה "ואז מספר פרמטרים כלשהו. השולח שולח את בת "כתובת", מגדיר את בת "האורך" במאגר ומחזיק את השאר מוכן. המכשיר הבא קיבל את בית "הכתובת", ורואה אם ​​הוא הנמען המיועד. אם זה לא, זה מציין את זה למטה, דוחף את השרשרת סביב, מציין את האורך ומחכה עד שמישהו אחר דחף את כל כך הרבה בתים. אם הוא שלך, קרא את שאר הנתונים, דחף את הנתונים וסגר אותם תוך כדי נסיעה (כדי למנוע את חזרתם). כתובת ריקה (למשל 0) תישמר, כלומר "אל תעשו דבר עם זה, חכו שמישהו אחר ידחוף אותה, וקראו את הבית הבא ככתובת הבאה". כל המכשירים יצטרכו לבצע אתחול ל- 0 בעת ההפעלה.

אם עליך להגדיר כתובות באופן דינמי, הגדר בית מיוחד "כל התחנות", עם פקודה שמשמעותה "מספר המכשיר שלך הוא X, ואמור את במכשיר הבא מספר המכשיר שלו הוא X + 1 ". מישהו יצטרך ליזום את זה, כמובן.

אתה גם מסתכן בהתנגשויות, אם שני מכשירים מתחילים לשלוח במקביל, או אם משהו לא ממסר את מה שהוא אמור (למשל שבב מופעל). עליכם לחשוב כיצד תגלו / תתאוששו מכך.



שאלה ותשובה זו תורגמה אוטומטית מהשפה האנגלית.התוכן המקורי זמין ב- stackexchange, ואנו מודים לו על רישיון cc by-sa 3.0 עליו הוא מופץ.
Loading...