передача данных по nrf24l01+

Тема в разделе "Arduino & Shields", создана пользователем sdvdio, 15 апр 2014.

  1. sdvdio

    sdvdio Нуб

    Прошу прощения если задал вопрос не в той ветке ! Нужна помощь ! Хочу собрать следующую конструкцию: PROCESSING берёт некую информацию из виртуального midi порта и отправляет её в serialport

    Код (Text):
    //Import libraries
    import processing.serial.*;
    import promidi.*;

    Serial myPort;
    MidiIO midiIO;
    //Message to be sent
    int message=0;

    void setup() {
      myPort = new Serial(this, "COM4", 9600);
      midiIO = MidiIO.getInstance(this);
      //Line that prints I/O devices in console
      midiIO.printDevices();
      //Receive input from Virtual MIDI Ports
      midiIO.openInput(0,0);
    }

    void draw() {}
    void noteOn(Note note, int deviceNum, int midiChan){
      int vel = note.getVelocity();
      int pitch = note.getPitch();
      if(vel>0){ // If velocity > 0 set message value to note's pitch
      if(pitch==60){ message=1; } else
      if(pitch==62){ message=2; } else
      if(pitch==64){ message=3; } else
      if(pitch==65){ message=4; } else
      if(pitch==67){ message=5; } else message=0;
        } else { message=0;}
      //Send message to Arduino
      myPort.write(message);
    }
    arduino с радио модулем NRF24I01+ на борту подключенная к ПК слушает serialport получает данные { message=1; }{ message=2; }{ message=3; }.... и отправляет их следующей arduino с такой же конструцией. Она получает данные и выполняет определённое действие (вкл/выкл LED).

    Теперь вопрос если не использовать радиомодуль а раотать непосредственно напрямую через serialport всё отлично работатет "PROCESSING ---->>> ARDUINO " (код arduino):

    Код (Text):
    // Data received from the serial port
    int val;
    //LEDs are connected to the following pins
    int pins[] = {2,3,4,5,6};
    void setup() {
      for(int i=0; i<5; i++){
      pinMode(pins[i], OUTPUT); // Set pins as OUTPUTs
      }
      Serial.begin(9600); // Start serial communication at 9600 bps
    }
    void loop() {
    if (Serial.available()) { // If data is available to read,
    val = Serial.read(); // read it and store it in val
    // Turn on LEDs, depending on pitches received
      if (val == 1) { digitalWrite(pins[0],HIGH); } else
      if (val == 2) { digitalWrite(pins[1],HIGH); } else
      if (val == 3) { digitalWrite(pins[2],HIGH); } else
      if (val == 4) { digitalWrite(pins[3],HIGH); } else
      if (val == 5) { digitalWrite(pins[4],HIGH); } else
      if (val==0) { resetLEDs(); }
    }
    }
    //Function that turns all the LEDs off
    void resetLEDs(){
      for(int i=0; i<5; i++){
      digitalWrite(pins[i],LOW);
      }
    }
    Тперь цепляю NRF24I01+ получаю следующую конструкцию "PROCESSING-->>ARDUINOпередаёт---->>ARDUINOпринимает" код processing оставляю тот же код ARDUINOперед:

    Код (Text):
    #include <SPI.h>
    #include "RF24.h"
    RF24 radio(9, 10);
    const uint64_t pipe= {
    0xF0F0F0F000LL};// адреса каналов приема и передачи
    void setup(){
    Serial.begin(9600);
    radio.begin();
    radio.setDataRate(RF24_250KBPS); // Скорость передачи
    radio.setChannel(100); // Номер канала от 0 до 127
    radio.setRetries(15,15); // Кол-во попыток и время между попытками
    radio.openWritingPipe(pipe); // Открываем канал передачи
    radio.startListening(); // Начинаем слушать эфир
    }

    void loop(){
    if(Serial.available()){
    char data[32] = "";
    byte i = 0;
    while(Serial.available()){
    data[i] = Serial.read(); //получаем данные из сериал.
    i++;
    delay(2);
    }
    data[i] = 0;
    radio.stopListening();
    radio.write(&data, 32); //и отправляем их в Arduino №2
    radio.startListening();
    }
    }
    код ARDUINOприемнка:

    Код (Text):
    #include <SPI.h>
    #include "RF24.h"
    RF24 radio(9, 10);
    //пины куда подключены светодиоды
    int pins[] = {1,2,3,4,5,6,7,8};
    const uint64_t pipe = {
    0xF0F0F0F000LL};// адреса каналов приема и передачи

    void setup(){
      for(int i=0; i<8; i++){
      pinMode(pins[i], OUTPUT); // Set pins as OUTPUTs
      }
    radio.begin();
    radio.setDataRate(RF24_250KBPS); // Скорость передачи
    radio.setChannel(100); // Номер канала от 0 до 127
    radio.setRetries(15,15); // Кол-во попыток и время между попытками
    radio.openReadingPipe(1,pipe); // Открываем один из 6-ти каналов приема
    radio.startListening(); // Начинаем слушать эфир
    }

    void loop(){
    if(radio.available()){
    char data[32] = "";
    radio.read(&data, 32); //принимает пакет с Arduino №1
    //Если пришла цифра 1 включаем светодиод
    if (data[0] == '1') { digitalWrite(pins[0],HIGH); } else
    if (data[0] == '2') { digitalWrite(pins[1],HIGH); } else
    if (data[0] == '3') { digitalWrite(pins[2],HIGH); } else
    if (data[0] == '4') { digitalWrite(pins[3],HIGH); } else
    if (data[0] == '5') { digitalWrite(pins[4],HIGH); } else
    if (data[0] == '6') { digitalWrite(pins[5],HIGH); } else
    if (data[0] == '7') { digitalWrite(pins[6],HIGH); } else
    if (data[0] == '8') { digitalWrite(pins[7],HIGH); } else
    if (data[0] == '0') { resetLEDs(); }
    }
    }

    void resetLEDs(){
    for(int i=0; i<8; i++){
    digitalWrite(pins[i],LOW);
      }
    }
    Запускаю и на приёмнике тишина. Работает только когда данные передаешь сам через

    novyy_tochechnyy_risunok_0-496x289.png

    Подскажите где ошибка в чем не прав ???? по возможности исправить код !
     
  2. Megakoteyka

    Megakoteyka Оракул Модератор

    С кодом передатчика что-то не то. Что приходит из порта и в каких количествах?
     
  3. sdvdio

    sdvdio Нуб

    Из порта приходит то что написано в первом примере кода для processing
    { message=1; } .......
     
  4. Megakoteyka

    Megakoteyka Оракул Модератор

    Т.е. 1 байт. Тогда при формировании пакета для передатчика цикл не нужен, нужно просто записывать данные в первый байт пакета и отправлять его.
     
  5. sdvdio

    sdvdio Нуб

    Вы можете поправить код так как он должен быть ?