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

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

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
Старый 24.03.2015, 00:39   #191
cyberbot
Member
 
Регистрация: 10.03.2015
Сообщений: 40
Вес репутации: 0
cyberbot is an unknown quantity at this point
По умолчанию Re: Подключаем CarDuino Nano V.7 к USB порту роутера с OpenWrt

Вообщем с убранной секцией default все заработало. В связи с этим возникло сильное подозрение на то, что из роутре сыплется больше чем нужно. Или какой-то мусор на UART приводит к ложному срабатыванию. Для того чтобы исключить я решил сделать пакетную команду. Вообщем повсидев и подумав, а так же изрядно походив по граблям я написал следующий скетч.


PHP код:
//setup
const int LEDpin 13//пин вывода сигнала на светодиод
const long UART_Speed 57600//Скорость UART

const byte Byte_Start byte('a'); //старт-байт в пакете по UART
const byte Byte_Stop byte('b'); //стоп-байт в пакете по UART
const byte Byte_LEDoff byte('0'); //команда выключающая светодиод
const byte Byte_LEDon byte('1'); //команда зажигающая светодиод
const byte Byte_LEDbl byte('2'); //команда включающая мигание светодиода

const byte all_delay 10//задержка выполнения повтора программы, [мс]
const byte UART_delay_max 100//таймаут сброса приёмника по UART = all_delay * cnt_delay_max [мс]
const byte led_delay 1000//время задержки между фазами (вкл/откл) мигания светодиода [mс]


byte Din[3] = {000};
byte Data 0;
byte cnt 0//счетчик кол-ва пришедших байт по UART
byte led_cnt_delay 0//счетчик кол-во раз выполнения программы для управления миганием светодиода
byte UART_delay 0//счетчик для таймаута по UART
byte ctrl B00000100//управляющий регистр, инициализирован на мигание светодиода после запуска МК
//ctrl[0]: =1 - в структуре собранного пакета обнаружены ошибки
//ctrl[1]: =1 - получена команда
//ctrl[2]: =1 - включен режим мигания светодиода
//ctrl[3]: уровень на светодиод

void setup() {
  
pinMode(LEDpinOUTPUT);
  
Serial.begin(UART_Speed);
}

void loop() {
  if (
Serial.available() != 0) {
    
UART_delay 0;
    
Din[cnt] = Serial.read();
          
    if (
cnt 2) { //приём байтов и сборка пакета
      
cnt++;
    } else { 
//если собрали пакет по UART, то проверяем его структуру
      
cnt 0;
      
      
int i;
      for (
03i++) {
        switch (
i) {
          case 
0:
            if (
Din[i] != Byte_Start) {
            
ctrl |= 1<<0;
            }
            break;
          
          case 
1:
            break;
            
          case 
2:
            if (
Din[i] != Byte_Stop) {
            
ctrl |= 1<<0;
            }                
            break;
        }
      }
      
      if ((
ctrl & (1<<0)) == 0) { //анали результат проверки пакета
        
ctrl |= 1<<1//пакет собран и он без ошибок
        
Data Din[1]; //данные полученные по UART
      
}
      
ctrl &= ~(1<<0);
    }
  } else {
    if (
UART_delay != UART_delay_max) {
      
UART_delay++;
    } else { 
//сброс схемы приема по таймауту, ресет схемы UART
      
UART_delay 0;
      
cnt 0;
    }
  }
  
  if ((
ctrl & (1<<1)) != 0) { //если есть пакет по UART
    
switch (Data) {
      case 
Byte_LEDoff:
        
ctrl &= ~(1<<2);
        
digitalWrite(LEDpinLOW);
        
Serial.println("LED OFF");
        break;

      case 
Byte_LEDon:
        
ctrl &= ~(1<<2);
        
digitalWrite(LEDpinHIGH);
        
Serial.println("LED ON");
        break;

      case 
Byte_LEDbl:
        
ctrl |= 1<<2;
        
Serial.println("LED BLINK");
        break;

      default:
        
Serial.print("BAD COMMAND: ");
        
Serial.println(DataHEX);
        break;
    }
    
ctrl &= ~(1<<1); //сбрасываем бит регистра управления после отработки пришедшего пакета
  
}
    
  
delay(all_delay);
  
  if (
led_cnt_delay != led_delay/all_delay) {
    
led_cnt_delay++;
  } else {
    
led_cnt_delay 0;
    if ((
ctrl & (1<<3)) == 0) {
      
ctrl |= 1<<3;
    } else {
      
ctrl &= ~(1<<3);
    }
  }
  
_blink();    
}

void _blink() {
  if ((
ctrl & (1<<2)) != 0) {
    if ((
ctrl & (1<<3)) == 0) {
      
digitalWrite(LEDpinLOW);
    } else {
      
digitalWrite(LEDpinHIGH);
    }
  }

Этот скетч работоспособен. Позволяет принимать 3 команды управления в пакете с старт- и стоп-байтами и фильтрует пакеты с сломанной структурой, а так же неожидаемые команды. После запуска светодиод мигает.
echo a1b > /dev/ttyUSB0 - светодиод перестает мигать и горит постоянно
echo a0b > /dev/ttyUSB0 - светодиод гаснет
echo a2b > /dev/ttyUSB0 - светодиод начинает мигать

Хорошо было бы понять теперь почему cat /dev/ttyUSB0 ничего не отдает в консоль...

Последний раз редактировалось cyberbot; 24.03.2015 в 00:42.
cyberbot вне форума   Ответить с цитированием
Старый 24.03.2015, 13:25   #192
stD
Senior Member
 
Аватар для stD
 
Регистрация: 02.04.2012
Адрес: Питер
Сообщений: 1,125
Вес репутации: 1311
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
По умолчанию Re: Подключаем CarDuino Nano V.7 к USB порту роутера с OpenWrt

Цитата:
с убранной секцией default все заработало
Естественно заработало, ещё-бы оно не заработало)
...
А чем вот этот код не понравился?

PHP код:
if(Serial.available()>4)
   {
    if(
Serial.read()=='Y')
      {
        for (
uint8_t i=05i++)
         {
           
server[i] = Serial.read();    
         } 
 
     if((
server[0] =='+') && (server[1] =='=') && (server[2] =='Z')) // deskriptor
       
{   
         switch (
server[3]) // simvol
          
{
            case 
'O':  // obnovlenie
            
glavnaia();
            break; 
       
            case 
'A'// vkl D13
            
D13_High;
           
// R1 = 1;
           // glavnaia();
            
Serial.println("VKL 13");
            break;
      
            case 
'a'// otkl D13
            
D13_Low;
            
//R1 = 0;
            //glavnaia();
            
Serial.println("OTKL 13");
            break;
       
            
         }
       }
     else
       {
            for (
uint8_t i=0255i++)
              {
                 
server[i] = Serial.read();    
              }
       }  
     }
   }

 
void glavnaia()
    {
       
Serial.println(тут переменная с вашими данными); 
    } 
stD вне форума   Ответить с цитированием
Старый 25.03.2015, 21:36   #193
cyberbot
Member
 
Регистрация: 10.03.2015
Сообщений: 40
Вес репутации: 0
cyberbot is an unknown quantity at this point
По умолчанию Re: Подключаем CarDuino Nano V.7 к USB порту роутера с OpenWrt

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

В предложенном коде если будет сбой однократный, например, если придет за посылку 3 байта, а не 4, то это повлечет циклический сдвиг во всех других посылках же. При моей реализации у меня походу такая фигня и случилась, поэтому по таймауту я схему обресечиваю.

Последний раз редактировалось cyberbot; 25.03.2015 в 21:55.
cyberbot вне форума   Ответить с цитированием
Старый 26.03.2015, 00:36   #194
stD
Senior Member
 
Аватар для stD
 
Регистрация: 02.04.2012
Адрес: Питер
Сообщений: 1,125
Вес репутации: 1311
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
По умолчанию Re: Подключаем CarDuino Nano V.7 к USB порту роутера с OpenWrt

Цитата:
то это повлечет циклический сдвиг во всех других посылках же
Никакого циклического сдвига не будет, внимательно посмотрите на код.

Или поэксперементируйте в сериалмониторе...
stD вне форума   Ответить с цитированием
Старый 26.03.2015, 06:34   #195
cyberbot
Member
 
Регистрация: 10.03.2015
Сообщений: 40
Вес репутации: 0
cyberbot is an unknown quantity at this point
По умолчанию Re: Подключаем CarDuino Nano V.7 к USB порту роутера с OpenWrt

Согласен.
Если первый байт неожидаем, то по коду буфер вычитывается грантированно - как-то просмотрел)
cyberbot вне форума   Ответить с цитированием
Старый 25.04.2015, 17:49   #196
stD
Senior Member
 
Аватар для stD
 
Регистрация: 02.04.2012
Адрес: Питер
Сообщений: 1,125
Вес репутации: 1311
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
По умолчанию Re: Подключаем CarDuino Nano V.7 к USB порту роутера с OpenWrt

to MIKI

Разгадал я причины неполадок описаных вот здесь.

У вас в файле rc.local, строка инициализации:

PHP код:
stty -/dev/ttyUSB0 cs8 57600 ignbrk -brkint -icrnl -imaxbel -opost -onlcr -isig -icanon -iexten -echo -echoe -echok -echoctl -echoke noflsh -ixon -crtscts -hupcl 
Написана не одной строкой, а двумя, то есть вот так:

PHP код:
stty -/dev/ttyUSB0 cs8 57600 ignbrk -brkint -icrnl -imaxbel -opost -onlcr -isig -icanon -iexten -echo -echoe -echok 
-echoctl -echoke noflsh -ixon -crtscts -hupcl 
Поэтому чтение происходит с ошибкой.
stD вне форума   Ответить с цитированием
Ответ


Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 

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

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

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


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


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