Задать вопрос
@sdvdio

Как осуществить передачу данных по nrf24l01+?

Нужна помощь ! Это последнее место, куда могу обратиться за помощью, везде отказали! Хочу собрать следующую конструкцию: PROCESSING берёт некую информацию из виртуального midi порта и отправляет её в serialport
//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==61){ message=2; } else 
   if(pitch==62){ message=3; } else 
   if(pitch==63){ message=4; } else
   if(pitch==64){ message=5; } else 
   if(pitch==65){ message=6; } else
   if(pitch==66){ message=7; } else
   if(pitch==67){ message=8; } 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):

// Data received from the serial port
 int val; 
 //LEDs are connected to the following pins
 int pins[] = {1,2,3,4,5,6,7,8}; 
 
 void setup() {{
   pinMode(pins[1], OUTPUT); // Set pins as OUTPUTs
   pinMode(pins[2], OUTPUT); // Set pins as OUTPUTs
   pinMode(pins[3], OUTPUT); // Set pins as OUTPUTs
   pinMode(pins[4], OUTPUT); // Set pins as OUTPUTs
   pinMode(pins[5], OUTPUT); // Set pins as OUTPUTs
   pinMode(pins[6], OUTPUT); // Set pins as OUTPUTs
   pinMode(pins[7], OUTPUT); // Set pins as OUTPUTs
   pinMode(pins[8], 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[1],HIGH); } else
  if (val == 2) { digitalWrite(pins[2],HIGH); } else
  if (val == 3) { digitalWrite(pins[3],HIGH); } else
  if (val == 4) { digitalWrite(pins[4],HIGH); } else
  if (val == 5) { digitalWrite(pins[5],HIGH); } else
  if (val == 6) { digitalWrite(pins[6],HIGH); } else
  if (val == 7) { digitalWrite(pins[7],HIGH); } else
  if (val == 8) { digitalWrite(pins[8],HIGH); } else
  if (val==0) { resetLEDs(); }
 }
 }
 //Function that turns all the LEDs off
 void resetLEDs(){{
   digitalWrite(pins[1],LOW);
   digitalWrite(pins[2],LOW);
   digitalWrite(pins[3],LOW);
   digitalWrite(pins[4],LOW);
   digitalWrite(pins[5],LOW);
   digitalWrite(pins[6],LOW);
   digitalWrite(pins[7],LOW);
   digitalWrite(pins[8],LOW);
  } 
 }


Теперь цепляю NRF24I01+ получаю следующую конструкцию "PROCESSING-->>ARDUINOпередаёт---->>ARDUINOпринимает и исполняет" код processing оставляю тот же
код ARDUINOпередатчика:

#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приемнка:
#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);
  } 
 }


Запускаю, и на приёмнике тишина. Работает только когда данные передаешь сам через

4b5d6889595f4865a01b65a507b61516.pngПомогите исправить код !
  • Вопрос задан
  • 4943 просмотра
Подписаться 2 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 1
chernish2
@chernish2
Ruby-программист
А может дело не в коде?
Говорят что эти радиомодули чувствительны к питанию, на 3.3В работают а на 5В - нет.
У Вас какое питание?
Еще говорят что там конденастор надо впаивать: forum.amperka.ru/threads/nrf24l01-%D0%BF%D0%BE%D0%...
Сам с такими же бьюсь, пока не смогу заставить работать.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы