Передача между ардуинами по rs485/ Проблема с пониманием основ.

wenom86
Offline
Зарегистрирован: 04.11.2012

Здравствуйте. Есть такая задачка. Имеется 2 кнопки и 1 переменный резистор на пульте управления.

Необходимо будет передать сигнал о нажатии этих кнопок и изменении сопротивления переменного резистора на расстояние 30-40 метров. На другой стороне должны срабатывать реле (от кнопок) и менять свою яркость светодиод (от переменника)

Собственно как я все это вижу:

Планирую собрать все это на 2-х ардуинах. Ардуино Уно будет собирать информацию о кнопках и переменниках, каким-то образом пересылать это на 2-ю ардуину (уно или мега), где будет происходить расшифровка и выполняться соответствующее действие.

(пример упрощен, в реальности будет 8-10 кнопок и 4-5 переменников)

Предпочтение отдаю rs485, но прочитав статьи и посмотрев похожие проекты - совсем запутался.

За отправную точку взял статью http://rln.nnov.ru/index.php?ind=reviews&op=entry_view&iden=227 ,

Вопрос: 

Нет-ли более простого кода, чтобы передать состояние кнопки или значение переменника? А то разобраться в таком коде мне пока тяжело. (но если ничего другого не придумать- буду курить мануалы)

(Я не совсем дилетант- но далеко не все пока знаю)

 

 

 

 

olegab
Offline
Зарегистрирован: 09.04.2013

 

В примере реализация протокола, для обмена командами и данными мастера с несколькими слейвами.

Вам достаточно просто периодически получать данные 

Посмотрите эту библиотеку, достаточно простое и понятное API:

http://www.mathertel.de/Arduino/DMXSerial.zip

wenom86
Offline
Зарегистрирован: 04.11.2012

правильно-ли я понял, что этот протокол поддерживает передачу до 512 каналов, и для передачи моих 10-15 каналов его хватит с избытком?

И не могу понять, какие пины заберутся с ардуины под нужды преобразователя rs485

 

Snubist
Offline
Зарегистрирован: 18.02.2013

wenom86 пишет:

правильно-ли я понял, что этот протокол поддерживает передачу до 512 каналов, и для передачи моих 10-15 каналов его хватит с избытком?

И не могу понять, какие пины заберутся с ардуины под нужды преобразователя rs485

Если ты имеешь ввиду адресацию, то он поддерживает 32 устройства в одном сегменте (<1200метров). Для увеличения количества устройств или дальности нужны дополнительные примочки.

wenom86 пишет:

 

И не могу понять, какие пины заберутся с ардуины под нужды преобразователя rs485

Глядя как ты будешь организовывать, Какой конвертер и куда вешать , стандартно, пины сериалпорта.

 

olegab
Offline
Зарегистрирован: 09.04.2013

подробнее о протоколе:

http://www.mathertel.de/Arduino/DMXSerial.aspx

о подключении:

http://www.mathertel.de/Arduino/DMXShield.aspx

wenom86
Offline
Зарегистрирован: 04.11.2012

 

Допустил большую ошибку, не указав главное. Для передачи информации между ардуинами имеется в распоряжении 4-проводной неэкранированый UTP кабель. 2 жилы уже заняты под передачу видеосигнала. Осталось всего 2 жилы для связи. А в DMX требуется вроде как 3.

насколько я могу полагать, здесь http://www.youtube.com/watch?v=S9FSQaToVZ4&feature=endscreen&NR=1  представлено что-то похожее. Вроде собрано на микросхемах MAX485. Но не могу найти, как именно их подключить к ардуино. (без доп шилдов.)

Может где есть простой пример, как одна ардуина увидела нажатие кнопки или вращение переменника. отправила его по кабелю, а другая приняла и выполнила действие в зависимости от значения переменной. 

 

Сижу и туплю, как баран на новые ворота, уже 2 дня. (интерфейсы, переменые ко мне уже во сне приходят) Понимаю что нужно больше опыта иметь, но даже не знаю с чего подступиться.

-----------------------------------

Позже нашел по ссылке такой-то пример. Это может как-то помочь?

http://arduino-info.wikispaces.com/RS485-Brick

 

Код для мастера сети:



//Here is the code for the host S:

/* YourDuino RS485 Master Node S Example
 terry@yourduino.com */

/*-----( Declare Variables )-----*/
int EN = 2;

void setup() /****** SETUP: RUNS ONCE ******/
{
  pinMode(EN, OUTPUT );
  Serial.begin (19200);
}//--(end setup )---

void loop()    /****** LOOP: RUNS CONSTANTLY ******/
{
  // Send Data
  digitalWrite(EN, HIGH ); // enable send
  Serial.print ( 'A' );
  delay(1000);
  Serial.print ( 'B' );
  delay (1000);
}//--(end main loop )---

 

Код для слейва А



//Here is the code for the slave CA:

/* YourDuino RS485 Slave Node A Example
 terry@yourduino.com */

/*-----( Declare Variables )-----*/
int ledPin=13;
int EN = 2;
int Val;

void setup()/****** SETUP: RUNS ONCE ******/
{
  pinMode(ledPin, OUTPUT );
  pinMode(EN, OUTPUT );
  Serial.begin (19200);
}//--(end setup )---

void loop()  /****** LOOP: RUNS CONSTANTLY ******/
{
  // receive Data
  digitalWrite (EN, LOW ); // enable receive
  Val = Serial.read ();
  if (-1 != Val) 
  {
    if ( 'A' == Val) 
    {
      digitalWrite (ledPin, HIGH );
      delay (500);
      digitalWrite (ledPin, LOW );
      delay (500);
    }
  }

}//--(end main loop )---

 

Код для слейва Б

 

//Here is the code for the slave CB:

/* YourDuino RS485 Slave Node B Example
terry@yourduino.com */

/*-----( Declare Variables )-----*/
int ledPin=13;
int EN = 2;
int Val;

void setup()/****** SETUP: RUNS ONCE ******/
{
pinMode(ledPin, OUTPUT );
pinMode(EN, OUTPUT );
Serial.begin (19200);
}//--(end setup )---

void loop() /****** LOOP: RUNS CONSTANTLY ******/
{
// receive Data
digitalWrite (EN, LOW ); // enable receive
Val = Serial.read ();
if (-1 != Val)
{
if ( 'B' == Val)
{
digitalWrite (ledPin, HIGH );
delay (500);
digitalWrite (ledPin, LOW );
delay (500);
}
}

}//--(end main loop )---

Snubist
Offline
Зарегистрирован: 18.02.2013

wenom86 пишет:

Для передачи информации между ардуинами имеется в распоряжении 4-проводной неэкранированый UTP кабель. 2 жилы уже заняты под передачу видеосигнала. Осталось всего 2 жилы для связи. А в DMX требуется вроде как 3.

Не требует, как и не требует протокол 485 это раз, во вторых если вы передаете по одной паре простой видеосигнал, то у него один провод земля. То есть, можете использовать его в DMX. 

Сам еще не разбирался, да и железа нужного под рукой нет. Но я бы шагал так.

1 шаг) Соеденил бы две ардуины напрямую по серийному порту. RXпервой к TXвторой, TXпервой к RX второй, и земли у них обоих.

2 шаг) Написал бы скетчи в котором после нажатия кнопки на первой ардуине, загорался светик на второй. И наоборот.

3шаг) Добавил бы на пины №2 по светодиоду, и дописл бы скетч так что бы при нажатии кнопки, загорается светодиод, только после этого передаются данные, после передачи светодиод гасится.

4шаг) Вместо прямого соединения прикрутил бы например MAX485, RXардуины к ROмакс, TXардуины к DIмакс, пин 2 к RE и DE. землю с землей, ну и питание( у MAX485 оно 12в) к питанию.

5шаг) Соеденил бы устройства между собой линия A c A,ну а  B c B., и запустил бы скетчи, теперь при нажатии кнопки, пин 2 переключает микрасхему на передачу, после передачи опять переключает в прием. Вторая дуина находящаяся на приеме, получит данные ну и зажгет светодиод.

6шаг) Начал бы прописывать адресацию. Ну или залил бы код, как в приводимой выше статье http://rln.nnov.ru/index.php?ind=reviews&op=entry_view&iden=227

wenom86
Offline
Зарегистрирован: 04.11.2012

видеосигнал по 2 проводам будет прокинут через видеобалуны- они как-то хитро передают сигнал, так что земли там не взять. За последовательность действий спасибо. буду пробовать.