nRF24L01 + attiny85

Noobeum
Offline
Зарегистрирован: 27.08.2018
Новое

Драсти.

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

Сейчас задач малость забавная. Пытаюсь запилить связку attiny85 от дигиспарк с рф24 модулем. Делал согласно "трехпиновому подключению" (можно нагуглить в прицнипе).
На быстроразводной макетной плате (баребоард) даная схема функционирует успешно. Данные передаются (я передаю в одну сторону, принимает мега, принимает успешно).

А вот распаять на pcb ту же схему мне пока не удалось. Дважды уже пытался и дважды не удалось. Питание идет через 1117 3в3 регулятор с 5в (там до ампера вроде бы). Используется типичная
https://tmrh20.github.io/RF24/ATTiny.html
там в числе прочего упрощенная софтварная спи-реализация, успешно работающиая с трехпиновым подключением.

Вопрос в том - куда вообще говоря смотреть...
Осцилографа нет.

А пока пытаюсь припилить сериал к аттини, пока не очень успешно =(
Идеи кончились...

Код собсн...

 

 
#include <nRF24L01.h>
#include <RF24.h>
#include <RF24_config.h>



#if defined (__AVR_ATtiny85__)
#define CE_PIN 3
#define CSN_PIN 3
#endif

#if defined(__AVR_ATmega328P__) || defined(__AVR_ATmega168__) || defined(__AVR_ATmega2560__)
#define CE_PIN 48
#define CSN_PIN 49
#endif


RF24 radio(CE_PIN, CSN_PIN);


byte radio_pipes[2][6] = {"1Node", "2Node"};

struct SRadioData {
  int32_t counter;
  int16_t pins[3];
  int16_t radio_ms;
  int16_t value;
  int16_t angle;
};


void setup() {
  radio.begin();
  radio.setPALevel(RF24_PA_LOW);
  radio.setChannel(98);
  radio.setDataRate(RF24_2MBPS);
  radio.setCRCLength(RF24_CRC_8);
  radio.setAutoAck(0);
  radio.setRetries(7, 7);
  radio.setPayloadSize(sizeof(SRadioData));
  //radio.powerUp();

#if defined (__AVR_ATtiny85__)
  // spammer
  radio.openWritingPipe(radio_pipes[1]);
  radio.openReadingPipe(1, radio_pipes[0]);
  //radio.startListening();
  radio.stopListening();
#endif
#if defined(__AVR_ATmega328P__) || defined(__AVR_ATmega168__) || defined(__AVR_ATmega2560__)
  // reciever
  radio.openWritingPipe(radio_pipes[0]);
  radio.openReadingPipe(1, radio_pipes[1]);
  radio.startListening();

  Serial.begin(19200);
  Serial.println("SETUP...");
  Serial.print("PAYLOAD=");
  Serial.print(sizeof(SRadioData));
  Serial.println();
#endif
}





#if defined (__AVR_ATtiny85__)
int spam_index = 0;
long spam_m = 0;
SRadioData spam_dat = {0};
#endif
#if defined(__AVR_ATmega328P__) || defined(__AVR_ATmega168__) || defined(__AVR_ATmega2560__)
int recv_index = 0;
long recv_timer = 0;
#endif

void loop() {
#if defined (__AVR_ATtiny85__)
  // spammer
  spam_m = millis();
  spam_dat.counter = spam_index++;
  spam_dat.pins[0] = 1; //analogRead(IR0_PIN);
  spam_dat.pins[1] = 2; //analogRead(IR1_PIN);
  spam_dat.pins[2] = 3; //analogRead(ENC_PIN);
  spam_dat.value = 50;
  spam_dat.angle = 90;

  //radio.stopListening();
  //delay(10);
  radio.write( &spam_dat, sizeof(spam_dat) );
  //radio.startListening();

  spam_dat.radio_ms = millis() - spam_m;
#endif



#if defined(__AVR_ATmega328P__) || defined(__AVR_ATmega168__) || defined(__AVR_ATmega2560__)
  // reciever
  int read_bad = 1;
  if ( radio.available() > 0 ) {

    struct SRadioData di = {0};
    radio.read( &di, sizeof(di) );

    uint8_t *u = (uint8_t *)&di;
    uint8_t uu = 0;
    for (int i = 0; i < sizeof(di); ++i)
      uu |= u[i];


    read_bad = 0;
    if (read_bad == 0) {
      if (1) {
        Serial.print("RADIO_MON_");
        Serial.print(recv_index++);

        Serial.print("(counter=");
        Serial.print(di.counter);

        Serial.print(", pin0=");
        Serial.print(di.pins[0]);
        Serial.print(", pin1=");
        Serial.print(di.pins[1]);
        Serial.print(", pin2=");
        Serial.print(di.pins[2]);
        Serial.print(", radio_ms=");
        Serial.print(di.radio_ms);

        Serial.print(", value=");
        Serial.print(di.value);
        Serial.print(", angle=");
        Serial.print(di.angle);
        Serial.print(")");
        Serial.println();
      };
      recv_timer = millis();

      radio.startListening();
    };
    delay(20);
  };

  if (read_bad) {
    // no radio available
    if (millis() - recv_timer > 2000) {
      recv_timer = millis();
      Serial.print("RADIO_MON_");
      Serial.print(recv_index++);
      Serial.print(": NO DATA ");
      Serial.print(read_bad);
      Serial.println();
    };
  };
#endif


};


 

 

indevor
Offline
Зарегистрирован: 10.11.2018

Доброго времени суток. Вы решили свою проблему?. Так же мучаюсь с переносом на печатку.
Последнее что не пробовал, это убрать все колодки напрочь (запаять приёмник на плату) и развернуть антену (т.е плату в другую сторону, что бы платы не лежали бутербродом.)
Про кондер по питанию слышал, а вот про установку всех параметров можно по подробнее?

Делал по этой печатке: 

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