Форум обсуждения систем  

Вернуться   Форум обсуждения систем "Умный дом", проектов Ардуино, OpenWRT и других DIY устройств > Форум умного дома > Сделай сам > Открытый проект умного дома

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
Старый 23.11.2012, 16:21   #1
Admin
Administrator
 
Аватар для Admin
 
Регистрация: 12.04.2010
Адрес: Москва
Сообщений: 9,616
Вес репутации: 9820
Admin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant future
По умолчанию Тестовый код для управления по шине RS485

По просьбе mebitek, выкладываю тестовые скетчи
УУ - Удаленный узел
ЦУ - Центральный узел
Для тестирования светодиода D13 на УУ, ЦУ должен быть подключен к ПК или любому роутеру с OpenWrt
По UART из терминалки или из сериал монитора, в ЦУ отправляем цифру 1 и светодиод на УУ засветится, что бы его потушить отправьте 0 и т.д.

Код для ЦУ, в роли ЦУ Arduino Mega
PHP код:
 #include <avr/delay.h>
byte inByte;
#define DE 3
byte outdata[9]={255,35,83,87,11,0,1,1,255};
byte indata[4];

void setup() 
{
   
pinMode(19INPUT);
   
digitalWrite(19HIGH);
  
pinMode(DEOUTPUT);
  
driver_recive(); //переводим драйвер в режим приемника 
  
Serial.begin(115200);
  
Serial1.begin(57600);
  
digitalWrite(19,HIGH);  //подключить внутренний подтягивающий резистор UART1
}
 
void loop() 

  if(
Serial.available())//ждем команды с компьютера
    
{
     
outdata[5] = Serial.read()-48;
     
      
driver_send();
        
Serial1.write(outdata,9);
      
driver_recive(); //переводим драйвер в режим приемника 
    
}  
          
    if(
Serial1.available()>0//ждем данные из шины
     

       
inByte=Serial1.read();
        if (
inByte==255)
        {
          
inByte 0
            for(
uint16_t i=0i<65535i++)//ловим остальные данные
            
{     
              if(
Serial1.available()>7//если данные в буфере
               

                
inByte=Serial1.read();
                 if (
inByte==170//данные ликвидны
                  
{   
                    for(
uint8_t y=2y<9y++) outdata[y] = Serial1.read(); 
                    break; 
//если данные приняты то прервать цикл
                  
}
               }
            }   
       
digitalWrite(13,outdata[5]); //индикатор приема данных     }
     
}      
}

void driver_recive() 
{
  
_delay_us(350); 
digitalWrite(DELOW); //переводим драйвер в режим приемника
}

void driver_send() 

digitalWrite(DEHIGH); //переводим драйвер в режим передатчика
_delay_us(350);        //формируем старт бит
 
Serial1.flush();    //чистим входящий буфер

Код для УУ, в роли УУ Arduino Nano
PHP код:
#include <avr/delay.h>

byte outdata[9]={255,170,83,87,11,0,0,0,254};//исходящий буфер
byte indata[6];                              //входящий буфер
#define DE 8      //выход для переключения драйвера в режим прием/передача

void setup() 
{
  
pinMode(DEOUTPUT);   //выход для переключения драйвера в режим прием/передача
  
digitalWrite(DELOW);  //переводим драйвер в режим приемника
  
pinMode(13OUTPUT);    //выход для нагрузки
  
  
Serial.begin(57600);     //скорость обмена шины
  
digitalWrite(0,HIGH);    //подключить внутренний подтягивающий резистор
  
  
pinMode(2INPUT);      //кнопка выключателя 1
  
pinMode(3INPUT);      //кнопка выключателя 2 
  
digitalWrite(2HIGH);  //подключить внутренний подтягивающий резистор на выключатель 1
  
digitalWrite(3HIGH);  //подключить внутренний подтягивающий резистор на выключатель 2  
  
attachInterrupt(0Switch1FALLING);  //настроить прерывание по изменению уровня с низкого на высокий    
  
attachInterrupt(1Switch2FALLING);  //настроить прерывание по изменению уровня с низкого на высокий    
}
 
void loop() 
{   
      
Recive_Data();  //прочитать данные из шины если они пришли                
      
digitalWrite(13indata[3]);  //изменить состояние назрузки
}

void Switch1()
{
  if(
indata[3]>0)indata[3]=255;
  
indata[3]=~indata[3]; 
  while(
digitalRead(2) == HIGH){} //ждем отпускания кнопки


void Switch2()
{
  if(
indata[4]>0)indata[4]=255;
  
indata[4]=~indata[4];  
  while (
digitalRead(3)==HIGH){} //ждем отпускания кнопки
}  

boolean Recive_Data() 

   if(
Serial.available()>6)
      {   
        
byte pct=Serial.read(); //прочитать первое принятое знгачение
         
if (pct==35)        //если это индетефикатор пакета то принимаем весь пакет
          
{       
             for(
uint8_t y=0y<6y++) indata[y] = Serial.read(); //принимаем весь пакет
          
}         
      }    
}

void Send_Data() 
{
  
//_delay_us(350); //время  на то чтобы устаканился
  
digitalWrite(DEHIGH); //переводим драйвер в режим передатчика
  
_delay_us(2);      //время на то чтобы устаканился
  
Serial.write(outdata,9);  //передаем  данные
  
digitalWrite(DELOW); //переводим драйвер в режим приемника
  
_delay_us(350);       //формируем старт бит и время для отправки данных
 // Serial.flush();   //чистим входящий буфер

Admin вне форума   Ответить с цитированием
Старый 23.11.2012, 23:55   #2
NEXT
Member
 
Регистрация: 23.11.2012
Сообщений: 47
Вес репутации: 184
NEXT has much to be proud ofNEXT has much to be proud ofNEXT has much to be proud ofNEXT has much to be proud ofNEXT has much to be proud ofNEXT has much to be proud ofNEXT has much to be proud ofNEXT has much to be proud ofNEXT has much to be proud of
По умолчанию

Я так понимаю, ардуинки между собой соедены при помощи MAX485 например и витой парой, а если добавиться 3 ардуинка то будет так:
byte outdata[9]={255,170,83,87,11,0,0,0,253};//исходящий буфер или как?
Первый скетч не компилируется, ошибка закралась, подправьте.
Ну и конечно, схему подключения лучше бы выкладывать сразу с распиновкой....
Такие вещи попробывать сходу хочеться, а не гуглить...
NEXT вне форума   Ответить с цитированием
Старый 24.11.2012, 00:29   #3
Admin
Administrator
 
Аватар для Admin
 
Регистрация: 12.04.2010
Адрес: Москва
Сообщений: 9,616
Вес репутации: 9820
Admin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant future
По умолчанию

Схема находится рядом
Скетч тестовый и пока в нем не производится фильтрация ID УУ
Но для фильтрации достаточно добавить несколько строк кода
Проект находится пока в зачаточном состоянии. Все информация по проекту находится здесь
Первый скетч написан для Arduino Mega, возможно Вы пытаетесь скомпилировать его под другой контроллер
Admin вне форума   Ответить с цитированием
Старый 24.11.2012, 02:36   #4
stD
Senior Member
 
Аватар для stD
 
Регистрация: 02.04.2012
Адрес: Питер
Сообщений: 1,125
Вес репутации: 1310
stD has a brilliant futurestD has a brilliant futurestD has a brilliant futurestD has a brilliant futurestD has a brilliant futurestD has a brilliant futurestD has a brilliant futurestD has a brilliant futurestD has a brilliant futurestD has a brilliant futurestD has a brilliant future
По умолчанию

Цитата:
По просьбе mebitek, выкладываю тестовые скетчи
Спасиб!
stD вне форума   Ответить с цитированием
Старый 24.11.2012, 04:20   #5
stD
Senior Member
 
Аватар для stD
 
Регистрация: 02.04.2012
Адрес: Питер
Сообщений: 1,125
Вес репутации: 1310
stD has a brilliant futurestD has a brilliant futurestD has a brilliant futurestD has a brilliant futurestD has a brilliant futurestD has a brilliant futurestD has a brilliant futurestD has a brilliant futurestD has a brilliant futurestD has a brilliant futurestD has a brilliant future
По умолчанию

Я планирую так же делать:

В скетче у тебя вот так.
PHP код:
 pinMode(19INPUT); 
Я вот в этой http://www.mayak-bit.narod.ru/rs485.htmlстатье вычитал что можно так сделать.



И ещё вот так:



И ещё какое-то защитное смещение:



Rвх - входное сопротивление приемника (обычно 12 кОм);
Rc - согласующие резисторы (120 Ом);
Rзс - резисторы защитного смещения- 560 Ом.

Я подумал Тебе будет это интересно.

А вот некоторые вещи мне не понятны, поясни пожалуйста!
В скетче для Arduino Mega, Ты отправляешь 9 байт.

PHP код:
byte outdata[9]={255,35,83,87,11,0,1,1,255}; 
PHP код:
Serial1.write(outdata,9); 
А в скече для Arduino Nano принимаешь 7 байт.

PHP код:
boolean Recive_Data() 

   if(
Serial.available()>6)
      {   
        
byte pct=Serial.read(); //прочитать первое принятое знгачение
         
if (pct==35)        //если это индетефикатор пакета то принимаем весь пакет
          
{       
             for(
uint8_t y=0y<6y++) indata[y] = Serial.read(); //принимаем весь пакет
          
}         
      }    

Может это связано с вот этим:

PHP код:
 attachInterrupt(0Switch1FALLING); 
  
attachInterrupt(1Switch2FALLING); 
PHP код:
void Switch1()
{
  if(
indata[3]>0)indata[3]=255;
  
indata[3]=~indata[3]; 
  while(
digitalRead(2) == HIGH){} //ждем отпускания кнопки


void Switch2()
{
  if(
indata[4]>0)indata[4]=255;
  
indata[4]=~indata[4];  
  while (
digitalRead(3)==HIGH){} //ждем отпускания кнопки

Обьясни пожалуйста зачем там прерывания, что они делают?

И вот тут, для ардуино нано:

PHP код:
void Send_Data() 
{
  
//_delay_us(350); //время  на то чтобы устаканился
  
digitalWrite(DEHIGH); //переводим драйвер в режим приемника
  
_delay_us(2);      //время на то чтобы устаканился
  
Serial.write(outdata,9);  //передаем  данные
  
digitalWrite(DELOW); //переводим драйвер в режим передатчика
  
_delay_us(350);       //формируем старт бит и время для отправки данных
 // Serial.flush();   //чистим входящий буфер

digitalWrite(DE, HIGH); //переводим драйвер в режим приемника - это ты просто ошибся , да?

А вот _delay_us(350); -это 350 микросекунд пока данные долетят?

//формируем старт бит и время для отправки данных
А что значит формирует старт бит?

И ещё савсем последний вопросик)))

Для Ардуина Мега:

PHP код:
if(Serial1.available()>0//ждем данные из шины
     

       
inByte=Serial1.read();
        if (
inByte==255)
        {
          
inByte 0
            for(
uint16_t i=0i<65535i++)//ловим остальные данные 
Что это за остальные 65535 байт!!! Откуда они взялись?

Я извиняюсь за такое количество вопросов!!!!!!!!!!

Последний раз редактировалось stD; 24.11.2012 в 04:24.
stD вне форума   Ответить с цитированием
Старый 24.11.2012, 19:25   #6
Admin
Administrator
 
Аватар для Admin
 
Регистрация: 12.04.2010
Адрес: Москва
Сообщений: 9,616
Вес репутации: 9820
Admin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant future
По умолчанию

Цитата:
А вот некоторые вещи мне не понятны, поясни пожалуйста!
В скетче для Arduino Mega, Ты отправляешь 9 байт.
А в скече для Arduino Nano принимаешь 7 байт.
Потому что стартовый и стоповый байты нужны только для корректной работы Шины.
Они помогают повысить помехозащищенность шины

Цитата:
Что это за остальные 65535 байт!!! Откуда они взялись?
Это столько раз в цикле проверяется ответ от УУ, если сделать бесконечный цикл, а ответ потеряется то контроллер зависнет

Цитата:
Обьясни пожалуйста зачем там прерывания, что они делают?
Прерывания обрабатывают нажатия физических кнопок выключателя
Без прерываний контроллер может пропустить нажатие, а пользователь не сможет включить свет с первого раза

Цитата:
И вот тут, для ардуино нано:

void Send_Data()
{
//_delay_us(350); //время на то чтобы устаканился
digitalWrite(DE, HIGH); //переводим драйвер в режим приемника
_delay_us(2); //время на то чтобы устаканился
Serial.write(outdata,9); //передаем данные
digitalWrite(DE, LOW); //переводим драйвер в режим передатчика
_delay_us(350); //формируем старт бит и время для отправки данных
// Serial.flush(); //чистим входящий буфер
}
Это функция отправки данных(ответ УУ)
Я ее в скетче пока не использую

Цитата:
digitalWrite(DE, HIGH); //переводим драйвер в режим приемника - это ты просто ошибся , да?
Нет не ошибся, после отправки данных, УУ сразу же переводится в режим прослушивания шины
Если во время не перевести в режим прослушивания шины, то УУ может пропустить команду от ЦУ

Цитата:
А вот _delay_us(350); -это 350 микросекунд пока данные долетят?
Это требования производителя драйвера, в DS они пишут что после переключения драйвера из режима read в режим send или наоборот, нужно выдержать паузу

Цитата:
//формируем старт бит и время для отправки данных
А что значит формирует старт бит?
Они помогают повысить помехозащищенность шины
Admin вне форума   Ответить с цитированием
Старый 24.11.2012, 23:06   #7
stD
Senior Member
 
Аватар для stD
 
Регистрация: 02.04.2012
Адрес: Питер
Сообщений: 1,125
Вес репутации: 1310
stD has a brilliant futurestD has a brilliant futurestD has a brilliant futurestD has a brilliant futurestD has a brilliant futurestD has a brilliant futurestD has a brilliant futurestD has a brilliant futurestD has a brilliant futurestD has a brilliant futurestD has a brilliant future
По умолчанию

PHP код:
 digitalWrite(DEHIGH); //переводим драйвер в режим приемника
  
_delay_us(2);      //время на то чтобы устаканился
  
Serial.write(outdata,9);  //передаем  данные 
Я имел в виду ошибку в комментарии.
stD вне форума   Ответить с цитированием
Старый 25.11.2012, 00:05   #8
Admin
Administrator
 
Аватар для Admin
 
Регистрация: 12.04.2010
Адрес: Москва
Сообщений: 9,616
Вес репутации: 9820
Admin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant future
По умолчанию

Я не вижу ошибку
Admin вне форума   Ответить с цитированием
Старый 25.11.2012, 01:38   #9
stD
Senior Member
 
Аватар для stD
 
Регистрация: 02.04.2012
Адрес: Питер
Сообщений: 1,125
Вес репутации: 1310
stD has a brilliant futurestD has a brilliant futurestD has a brilliant futurestD has a brilliant futurestD has a brilliant futurestD has a brilliant futurestD has a brilliant futurestD has a brilliant futurestD has a brilliant futurestD has a brilliant futurestD has a brilliant future
По умолчанию

Ну как же, digitalWrite(DE, HIGH); "переводим драйвер в режим приёмника", я думал здесь должно быть написано "передатчика"
А потом, Serial.write(outdata,9); "передаём данные"
stD вне форума   Ответить с цитированием
Старый 25.11.2012, 01:44   #10
Admin
Administrator
 
Аватар для Admin
 
Регистрация: 12.04.2010
Адрес: Москва
Сообщений: 9,616
Вес репутации: 9820
Admin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant future
По умолчанию

Понял, а я скетч для ЦУ смотрел и не увидел ошибки
Admin вне форума   Ответить с цитированием
Ответ


Здесь присутствуют: 2 (пользователей: 0 , гостей: 2)
 
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход


Текущее время: 22:00. Часовой пояс GMT +3.


Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Яндекс.Метрика