Ви хочете використовувати USB для зв'язку з комп'ютером. Якщо у вас є декілька мікроконтролерів, ви, ймовірно, підключите лише один з мікроконтролерів безпосередньо до комп'ютера. Іншим мікроконтролерам потрібно буде отримати свої команди від основного мікроконтролера.
Вибір спілкування залежатиме від ряду факторів:
- необхідна пропускна здатність (будемо вважати, що ви працюєте на них 16 МГц)
- складність (проводка та кодування)
- двонаправлений, або господар-раб
Майже у всіх опціях є вбудована підтримка мікроконтролера AVR. Немає жодної опції, яку ви могли б віддати перевагу над вбудованими параметрами, які потребували б додаткового обладнання. Оскільки у них є вбудована підтримка, складність програмного забезпечення схожа на те, що ви просто налаштовуєте порт (використовуючи регістри), ставите дані для передачі в інший реєстр, а потім запускаєте передачу, встановивши трохи в інший реєстр. Будь-які отримані дані знаходяться в іншому реєстрі, і спрацьовує переривання, щоб ви могли обробляти його. Який би варіант ви не вибрали, єдиною різницею є зміна розташування реєстрів та деякі зміни регістрів конфігурації.
Цикл USART має такі функції:
- Максимальна швидкість передачі сигналу CLK / 16 = 1 МГц (при тактовій частоті 16 МГц), що є швидкістю передачі близько 90 КБ / с.
- повністю двонаправлені комунікації (без позначення головного чи підлеглого)
- потрібні окремі дроти між кожною парою мікроконтролерів - Atmega32u4 підтримує два порти USART спочатку, обмежуючи кількість мікроконтролерів, до яких ви можете підключитись у мережі на практиці (інакше у вас є довга струна мікроконтролерів - тобто підключена у зв'язаний список спосіб)
Примітка: це також те, що ви використовували б для отримання зв'язку RS232, за винятком того, що, оскільки RS232 вимагає 10В, він вимагає, щоб драйвер отримував ці рівні напруги. Для зв'язку між мікроконтролерами це не корисно (змінюються лише рівні напруги).
RS485:
- По суті, ви використовуєте порт USART в іншому режимі - немає переваги в пропускній здатності, і це може лише спростити електропроводку, але це також ускладнить її. Це не рекомендується.
Двопровідний інтерфейс:
Це також називається I2C. Це означає, що всі пристрої мають однакові два дроти.
Вам потрібен підтягуючий резистор обох проводів
Це повільно (оскільки резистори, що підтягуються, мають обмежене значення, а ємність збільшується, оскільки кількість пристроїв збільшується, а довжина проводу збільшується). Для цього мікроконтролера AVR швидкість до 400 кГц - повільніше, ніж USART (але ця швидкість залежить від обмеження вашої ємності). Причина полягає в тому, що, хоча пристрій приводить низький провід даних, протилежний перехід здійснюється, дозволяючи проводу знову плисти високо (підтягуючий резистор).
Це ще повільніше, якщо врахувати, що ВСІ комунікації мають однакову обмежену пропускну здатність. Оскільки всі комунікації мають однакову обмежену пропускну здатність, можливі затримки в спілкуванні, коли дані повинні чекати, поки мережа не працює, перш ніж її можна буде надіслати. Якщо інші дані постійно надсилаються, вони також можуть блокувати їх надсилання.
Він покладається на протокол master-slave, де ведучий звертається до підлеглого, потім надсилає команду / запит, а підлеглий відповідає після цього. Одночасно може спілкуватися лише один пристрій, тому раб повинен чекати, коли господар закінчить.
Будь-який пристрій може виступати як господарем і / або рабом, що робить його досить гнучким.
SPI
Це я б рекомендував / використовував для загальної комунікації між мікроконтролерами.
Це висока швидкість - до CLK / 2 = 8 МГц (для CLK на 16 МГц), що робить його найшвидшим методом. Це досягається завдяки окремому дроту виключно для годинника.
Дані MOSI, MISO та тактові годинники SCK поділяються по всій мережі, а це означає, що вона має більш просту проводку.
Це формат "ведучий-ведений", але будь-який пристрій може бути ведучим та / або підлеглому. Однак через ускладнення вибору підлеглого для спільного проводки (всередині мережі) слід використовувати його тільки в ієрархічному порядку (на відміну від двопровідного інтерфейсу). IE. якщо ви впорядковуєте всі пристрої на дереві, пристрій повинен бути господарем лише своїх дітей і лише рабом свого батька. Це означає, що в рабовласницькому режимі пристрій завжди матиме одного і того ж ведучого. Крім того, щоб зробити це правильно, вам потрібно додати резистори до MISO / MOSI / SCK до ведучого верхового потоку, так що якщо пристрій передаватиметься за низхідним потоком (коли не вибрано як підлеглий), зв’язок не вплине на комунікації в інших частинах мережа (зауважте, кількість рівнів, які ви можете зробити за допомогою резисторів обмежена, див. нижче для кращого рішення з використанням обох портів SPI).
Мікроконтролер AVR може автоматично тривиходити сигнал MOSI, коли він обраний веденим, і перейти в ведений режим (якщо він є головним).
Хоча це може потребувати ієрархічної мережі, більшість мереж можуть бути організовані у вигляді дерева, тому це, як правило, не є важливим обмеженням
Вищезазначене можна злегка розслабити, оскільки кожен мікроконтролер AVR підтримує два окремі порти SPI, тому кожен пристрій може мати різні позиції у двох різних мережах.
Сказавши це, якщо вам потрібно багато рівнів у вашому дереві / ієрархії (більше 2), вищевказане рішення з використанням резисторів надто хитро працює. У цьому випадку слід змінити мережу SPI між кожним шаром дерева. Це означає, що кожен пристрій підключатиметься до своїх дітей в одній мережі SPI, а його батько - в іншій мережі SPI. Хоча це означає, що у вас є лише одне дерево з'єднань, перевага полягає в тому, що пристрій може одночасно спілкуватися як з одним зі своїх дітей, так і з його батьком, і у вас немає чітко виражених резисторів (завжди важко вибрати правильні значення) .
Оскільки у нього є окремі проводки MOSI і MISO, одночасно і головний, і ведений можуть спілкуватися, надаючи йому потенційний фактор у два збільшення швидкості. Додатковий штифт потрібен для вибору рабовласників для кожного додаткового раба, але це не є великим тягарем, навіть 10 різних рабів потребують лише 10 додаткових штифтів, які можна легко розмістити на типовому мікроконтролері AVR.
CAN не підтримується вказаним вами мікроконтролером AVR. Оскільки є й інші хороші варіанти, це, мабуть, у цьому випадку все одно не важливо.
Рекомендація - SPI , оскільки це швидко, проводка не надто складна і не потребує прискіпливих резисторів. У рідкісному випадку, коли SPI не повністю відповідає вашим потребам (можливо, у складніших мережах), ви можете використовувати кілька варіантів (наприклад, використовувати обидва порти SPI разом із двопровідним інтерфейсом, а також спарити деякі мікроконтролери використовуючи цикл USART!)
У вашому випадку використання SPI означає, що, природно, мікроконтролер з USB-підключенням до комп'ютера може бути головним, і він може просто переслати відповідні команди з комп'ютера на кожен підлеглий пристрій. Він також може читати оновлення / вимірювання від кожного підлеглого і надсилати їх на комп'ютер.
При довжині дроту 8 МГц і 0,5 м, я не думаю, що це стане проблемою. Але якщо це так, постарайтеся бути більш уважними до ємності (тримайте заземлення та сигнальні дроти надто близько, а також будьте обережні щодо з'єднань між різними провідниками), а також припинення сигналу. У тому випадку, коли це залишається проблемою, ви можете зменшити тактову частоту, але я не вважаю це необхідним.