Нет данных.

ingener.solovyev
Offline
Зарегистрирован: 12.02.2013

Тестирую слудующую связку:

радиоуправляемый выключатель (NRF24L01+)

трансивер Ethernet - NRF24L01+

Processing  кнопка.

Выключатель работает, трансивер вроде как то же, а вот процессинг сигнал передает, но ответ что то не принимает. 

Выкладываю все 3 скетча для анализа:

Выключатель: 

#include <SPI.h>
#include "RF24.h"

RF24 radio(9, 10);

const uint64_t pipes[2] = {0xF0F0F0F000LL, 0xF0F0F0F0FFLL};
// адреса каналов приема и передачи

int i=0;
int buttonstate = LOW;
int buttonState = LOW;
long interval = 500;
long previousMillis = 0;


void setup() {
  Serial.begin (9600);
  radio.begin();  
  radio.setDataRate(RF24_250KBPS);
  radio.setChannel(100);
  radio.setRetries(15,15);
  radio.openWritingPipe(pipes[0]);
  radio.openReadingPipe(1, pipes[1]);
  radio.startListening();
  pinMode (3, OUTPUT);
  digitalWrite (3, LOW);
  pinMode(2, INPUT);
}

void loop () {
  if(radio.available()){
    char data[7] = "";
    radio.read(&data, 6); //RM[0-9][0-9][0-9][0-2]
    delay (50);
    if (data[0] == 'R' && data[1] == 'M' && data[2] =='0' && data[3] =='1' && data[4] =='1' && data[5] =='1') {
        Serial.println (data);
        buttonstate = digitalRead(2);
        High ();
    } else {
        if (data[0] == 'R' && data[1] == 'M' && data[2] =='0' && data[3] =='1' && data[4] =='1' && data[5] =='0') {
          Serial.println (data);
          buttonstate = digitalRead(2);
          Low ();
        } else {
          if (data[0] == 'R' && data[1] == 'M' && data[2] =='0' && data[3] =='1' && data[4] =='1' && data[5] =='2') {
            switch (i) {
              case 0: 
              radio.stopListening();
              radio.write(&"$RM0110>", 8);
              radio.startListening();
              break;
              case 1:
              radio.stopListening();
              radio.write(&"$RM0111>", 8);
              radio.startListening();
              break;
            }
            Serial.println (data);
          } else { }
        }
      }
  }
  unsigned long currentMillis = millis();
  if (currentMillis < previousMillis) {previousMillis = millis();}
  if(currentMillis - previousMillis > interval) {
    previousMillis = currentMillis;
    buttonState = digitalRead(2);
    if (buttonState != buttonstate) {
      buttonstate = digitalRead(2);
      switch (i) {
        case 0: High ();       
        break;
        case 1: Low ();  
        break;
      }
    }
  }
}

Трансивер Ethernet - NRF24L01+



#include <SPI.h>
#include "RF24.h"
#include <Ethernet.h>
RF24 radio(7, 8);
byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xFE };
IPAddress ip(192,168,1,10);
EthernetServer server(85);

const uint64_t pipes[2] = {0xF0F0F0F000LL, 0xF0F0F0F0FFLL};
// адреса каналов приема и передачи
char data[32] = "";
int n, k;

void setup(){
  Serial.begin(9600);
  Ethernet.begin(mac, ip);
  radio.begin();  
  radio.setDataRate(RF24_250KBPS); // Скорость передачи
  radio.setChannel(100); // Номер канала от 0 до 127
  radio.setRetries(15,15); // Кол-во попыток и время между попытками
  radio.openWritingPipe(pipes[1]);  // Открываем канал передачи
  radio.openReadingPipe(1, pipes[0]); // Открываем один из 6-ти каналов приема
  radio.startListening(); // Начинаем слушать эфир
}

void loop(){
 EthernetClient client = server.available();//создаем сервер
  if (client){  //если сервер создан
    if(client.available()){ //если клиент подключен
      for (int i=0; i<32; i++) {
        data [i] = client.read (); //записываем информацию с интернета
        delay (10);
        if (data [i] == '>') { //если в ячеке записан >
          k = i;  //запоминаем номер предыдущей ячейки
        }
    }
    for (int i=0; i<=k; i++) {
      Serial.print (data [i]);
    }
    Serial.println ();
    radio.stopListening();  
    radio.write(&data, k);//отправляем в эфир значение с
    radio.startListening();
    }
  }
  
  if(radio.available()){  //если в эфире есть значение
    radio.read(&data, 32); //читаем его
//    Serial.println (data);
    if (data [0] == '$') { //если первый символ в полученных данных $
      for (int i=1; i<32; i++) { 
        if (data[i] == '>'  //ищем конец данных
        ) {
          n=i+1;  //записываем количесвто принятых данных
        }
      }
/*      for (int i=1; i<=n; i++) {
        Serial.print(data[i]);
      }
*/      Serial.println ();
    }
    else {  //иначе, если первый символ не $, стираем все данные в data
      for (int i=0; i<32; i++) {
        data [i] = ' ';
      }
    }
   if (client) {  //если есть сервер
    if (client.available()) {  //если клиент подключен
  //    for (int i=1; i<n; i++) {
        client.write(data); //отправляем данные в Ethernet
        Serial.print(data);
 //     }
      Serial.println ();
    }
    for (int i=0; i<32; i++) {
        data [i] = ' '; //после того, как все отправили, стрираем data
      }
   }
  }
}

 

Код кнопки в Processing
 
import processing.net.*;
Client client;
PImage ON, OFF;

String IP = "192.168.1.10";
int port = 85;
boolean button = false;
int mode = 0;

void setup() {
  size(150, 150);
  client = new Client(this, IP, port);
  delay (1000);
  background(255);
  ON = loadImage("ON.png");
  OFF = loadImage("OFF.png");
  if (client != null) {
    client.write ("RM0110>");
  }
  image (OFF, 11, 11);  
}

void draw() {
    if (button == true) {  //esli nagata mish
      if (client != null) { //esli podkluchenie udalos
        if (mode == 0) {  // esli knopka bila vikluchena
          client.write ("RM0111>"); //otpravlaem komandu na vkluchenie
        }
        else {
          if (mode == 1) {  // esli knopka bila vkluchena
            client.write ("RM0110>"); //otpravlaem komandu na vkluchenie
          }
        }
      } else { //inache
        if (client == null) { //esli podkluchitsa ne udaetsa
          background(255);
          textSize(32);
          text("No connect", 50, 80); //pechataem soobshenie ob oshibke
        }
      }
      button = false;
    } else {
      if (button == false) { //esli mish ne nagata
        if (client != null) { //esli podkluchenie udalos
          String data = client.readString();
          if (data != null) {
          println (data);
          if (data == "RM0111") {
            mode = 1;
            background(255);
            image (ON, 11, 11);
          } else {
            if (data == "RM0110") {
              mode = 01;
              background(255);
              image (OFF, 11, 11); 
            } else {}
          }
        }
        } else {
          if (client == null) { //esli podkluchitsa ne udaetsa
            background(255);
            textSize(32);
            text("No connect", 50, 80); //pechataem soobshenie ob oshibke
          }
        }  
      }
    }
}
 

void mousePressed()
{
  if (mouseX >= (11) && mouseX <= (139) && mouseY >= (11) && mouseY <= (139)) {
   button = true; 
   } else {
     button = false;
   }
}

 

Как должно работать:

Нажимаю "кнопку", процессинг отправляет условную команду на IP адрес сервера Arduino, тот  в свою очередь принимает его, и без конвертаций кидает в эфир. Выключатель слушает эфир, как только там промелькнула знакомая команда, он совершает действие и отправляет ответ-подтверждение о том, что "да, я сделал это!". Трансивер читает эфир, видит "знакомые буквы", передает их в процессиг, ну а процессинг, увидев пришедшую команду меняет кнопку на результирующее положение.

Как получилось:

Нажал кнопку, трансивер принял - передал, лампочка загорелась (выключатель), выключатель передал ответ, трансивер его принял (100%, читал Serial порт), передает, но в процессинг приходят null.

Где беда? Или трансивер из ардуино и w5100 не передает, или же процессинг не принимает?

 
ingener.solovyev
Offline
Зарегистрирован: 12.02.2013

Хей! Все влюблены? да же тролл комента от Клапуция нет. 14 прошло, может ктони будь все же глянет тему?

toc
Offline
Зарегистрирован: 09.02.2013

1. в процессинге в 57 строке сделайте вывод на экран значения data.

2. в 45 строке readString - вы читаете, до того как ответ поступил. Добавьте проверку available http://www.processing.org/reference/libraries/net/Client_readString_.html

toc
Offline
Зарегистрирован: 09.02.2013

ваш метод draw запутан очень. Оставьте в начале одну проверку client как-то так  if(client==null) { ... ; ... ; return;}

ingener.solovyev
Offline
Зарегистрирован: 12.02.2013

toc пишет:

1. в процессинге в 57 строке сделайте вывод на экран значения data.

2. в 45 строке readString - вы читаете, до того как ответ поступил. Добавьте проверку available http://www.processing.org/reference/libraries/net/Client_readString_.html

]

спасибо, буду пробовать.

ingener.solovyev
Offline
Зарегистрирован: 12.02.2013

Проблема решена. Все дело в неправильных переменных.

com
Offline
Зарегистрирован: 06.09.2013

неправильные - это какие? типа неправильного меда? :)

ingener.solovyev
Offline
Зарегистрирован: 12.02.2013

com пишет:

неправильные - это какие? типа неправильного меда? :)

 

Тупо, там где должны передаваться данные n, я пытался передать данные i переменной.

На данный момент в боевых условиях проходит испытание выключатель на NRF24L01, на который данные идут с Ethernet, через трансив модуль.

 

com
Offline
Зарегистрирован: 06.09.2013

это клавиатура неправильная, а не переменные - ведь это она неправильно напечатала!