Как связать два процессора?

axill
Offline
Зарегистрирован: 05.09.2011

Есть проект создания контроллера управления установкой приточной вентиляции. Есть идея разделить контроллер на части, в частности сделать отдельно контролер, который обеспечивает нужную можщность калорифера и вентилятора используя семисторы с контролем фазы (есть на форуме тема про то как это лучше сделать). Вопрос, если я сделаю отдельно контроллер который управляет мощностью калорифера и вентилятора (у него на входе будет контроль фазы и управление двумя семисторами), то как лучше его связать с основным контроллером? Можно ли два AVR-а связать по 1-wire, 2-wire или какому-нибудь другому двух-трех проводному стандарту? Нужно, чтобы основной контролле имел возможность в цифровом коде установить мощность отдельно для калорифера и для вентилятора

maksim
Offline
Зарегистрирован: 12.02.2012

Аппаратные интерфейсы: I2C, UART, SPI.

axill
Offline
Зарегистрирован: 05.09.2011

maksim пишет:

Аппаратные интерфейсы: I2C, UART, SPI.

Можно конкретнее, как это сделать? Буду признателен за ссылки на примеры

maksim
Offline
Зарегистрирован: 12.02.2012

Поиск по сайту и в гугле, там все это уже есть. 

std
Offline
Зарегистрирован: 05.01.2012

Батя работает в театре инженером по всякой бутафории и говорит, что весьма удобен DMX512. Для него нужен RS485 трансивер, например такой: platan.ru/cgi-bin/qwery.pl/id=410473952&group=101 (там же и datasheet). Вкратце сеть DMX - это сервак (пульт), раз в 22 с чем-то миллисекунды повторяющий блок из 512 байт, а также соединенные параллельно по одному кабелю исполнительные устройства (клиенты). В конце кабеля - терминатор, то есть резистор 120 Ом, 1/2 Вт. В театрах DMX приемники - это всякие фонарики для сцены, но вообще это может быть любое устройство с МК. Каждый байт от пульта предназначен для одного адреса, причем у одного исполнительного устройства может быть множество адресов.

В случае Arduino можно организовать DMX вместо Serial (библиотека DMXSerial, arduino.cc/playground/Learning/DMXSerial), либо на таймере T2 (DMXSimple, code.google.com/p/tinkerit/wiki/DmxSimple). В первом случае отвалится родной сериал, т. е. нельзя будет ничего принять, послать в сom-порт (т. к. DMXSerial это модифицированный Serial). Во втором случае используется таймер, то есть минимум 2 PWM выхода станут обычными цифровыми выходами (у меня уже были танцы с бубном из-за ИК-приемника; если он есть, то нормально работают только 4 PWM из 6). C DMXSimple есть также одно ограничение, на Atmega8 и 168 он понимает только первые 128 DMX-каналов. У Atmega328 достаточно памяти чтобы работать со всеми 512.

Теоретически, можно просто прицепить трансивер RS485 к Ардуино, и не думать насчет DMX протокола вообще. Но тогда надо мудрить и придумывать как с ним обращаться, а тут уже готовые библиотеки. Схема DMX-шилда для DMXSerial здесь: www.mathertel.de/Arduino/DMXShieldSchema.png, даже с оптронной развязкой (знатоки поправьте если я не прав, но вроде она уже есть в трансивере, т. к. от него идет только 3 провода к разъему). MAX481CPA на схеме это то же самое, что ADM485 в платане.

В изучении DMX'а также пригодится вот эта страница: arduino.cc/playground/Learning/DMX. Кроме DMXSerial и DMXSimple там есть и другие реализации. Кроме этого существует ArtNet, это DMX по UDP, то есть через обычный сетевой провод либо вайфай. Мало чем отличается от TCP управления через Ethernet/WiFi шилды, они дороги (по меркам стоимости калорифера) и ставить их туда имхо слишком круто. Поэтому и не рассматриваю это.

Кабель DMX представляет собой витую пару в оплетке. Если невозможно добыть его, можно использовать обычный сетевой (обязательно STP, UTP не годится т. к. не имеет экрана), в котором просто используется одна пара, а не все. Но STP обычно экранируют фольгой, ее невозможно паять, да и провода в витых парах одножильные. Так что родной кабель будет удачнее.

Небольшой дискурс - почему DMX? Дело в том что я как-то заморачивался организацией сети для управления светом. К тому времени я достаточно хорошо разобрался в IRRemote, поэтому решил сделать канал передачи именно ИК. Начал обдумывать протокол и понял, что сломаю голову при попытке организовать контроль транспорта. То есть, если я с пульта хочу включить люстру в другой комнате, то могу посветить на люстру в той комнате, где нахожусь (та ведь должна не только включаться/выключаться, но и работать как ретранслятор). Простейшая проблема, если не проверять, кто и что кому послал - люстры начнут бесконечно повторять друг другу коды. А кроме того, не сделаешь более 12-16 штук (в коде надо: источник, адресат, информация, битовое поле с уже посылавшими этот пакет, контрольная сумма). А код всего-то 4х-байтный.