Программное обеспечение Adadfruit Trinket не работает на ATtiny85

У меня есть приложение, в котором пара nRF24L01+ используется в качестве простого радиоканала между выходом синхронизации камеры с ПК и набором светодиодных вспышек. Важными факторами являются мощность и низкая задержка — отсюда и частота 2,4 ГГц.

Я разработал оба конца с помощью UNO, а затем перешел на Trinket 3 V. Система очень хорошо работает с Trinkets. Мой следующий шаг состоял в том, чтобы урезать это до ATtiny85, по крайней мере, на стороне приемника. Я преодолел трудности с программированием и целый день установки платы в Arduino IDE и теперь могу not запрограммировать ATtiny85 так же, как и Trinket.

Я поделюсь кодом ниже, но позвольте мне объяснить разницу в результате.

При использовании Trinket выходной сигнал триггера от приемника представляет собой простой импульс шириной передаваемого импульса (что и является целью).

 _________________________________________
_____________| |_________________________________

Импульс составляет от 5 мс до 50 мс.

На ATtiny85 связь от передатчика к приемнику работает, но вывод некрасивый. Что-то вроде этого:

 _____ _____ _____
________________| |____| |__________| |___________ 

Импульсы появляются (не всегда одинаковое количество) на длительность передаваемого импульса, а интервал может быть переменным. Сами импульсы имеют длительность 8 МГц.

Код:

#include "RF24.h"

// Примечание: эти включения казались необходимыми, когда я начинал, но во время отладки я
// удалили их без изменения функционала - странно!
//#включить <Mirf85.h>
//#include <MirfHardwareSpiDriver85.h>
//#include <MirfSpiDriver85.h>
//#include <nRF24L0185.h>
//#включить <SPI85.h>

/*    **ATtiny25/45/85 Pin map with CE_PIN 3 and CSN_PIN 4**
      nRF24L01 CE oins is tied high and pin3 is used as the trigger output.

                                   +-\/-+
                     NC      PB5  1|o   |8  Vcc --- nRF24L01  VCC, pin2 --- LED --- 5V
      nRF24L01  CE, pin3 --- PB3  2|    |7  PB2 --- nRF24L01  SCK, pin5
      nRF24L01 CSN, pin4 --- PB4  3|    |6  PB1 --- nRF24L01 MOSI, pin6
      nRF24L01 GND, pin1 --- GND  4|    |5  PB0 --- nRF24L01 MISO, pin7
                                   +----+
*/
*    **Trinket 3V Pin map with CE_PIN 3 and CSN_PIN 4 **
* @code
*                                 + -\ / - +
*                   NC      PB5  1 | o   | 8  Vcc -- - nRF24L01  VCC, pin2 -- - LED -- - 5V
*    nRF24L01  CE, pin3 -- - PB3  2 |    | 7  PB2 -- - nRF24L01  SCK, pin5
*    nRF24L01 CSN, pin4 -- - PB4  3 |    | 6  PB1 -- - nRF24L01 MOSI, pin6
*    nRF24L01 GND, pin1 -- - GND  4 |    | 5  PB0 -- - nRF24L01 MISO, pin7
*                                 +---- +


// (Создать экземпляр радио, указав выводы CE и CS. )
RF24 myRadio (3, 4); // "myRadio" - это идентификатор, который вы будете использовать в следующих методах
/*-----( Declare Variables )-----*/
byte addresses[][6] = {"1Node"}; // Создаем адрес для 1 канала.
int dataReceived;  // Данные, которые будут получены от передатчика
int flashPin = 3;
int flashValue = 0;
long flashStartMicros = micros();

void setup()
{
  pinMode (flashPin, OUTPUT);

  myRadio.begin();  // Запускаем физическое радио nRF24L01
  myRadio.setChannel(108);  // Выше большинства каналов Wi-Fi
  // Установите низкий уровень PA, чтобы предотвратить проблемы, связанные с питанием, так как это
  // скетч get_started и вероятность близкого расположения устройств. RF24_PA_MAX по умолчанию.
  myRadio.setPALevel(RF24_PA_MIN);
  // myRadio.setPALevel(RF24_PA_MAX); // Раскомментировать для большей мощности

  myRadio.openReadingPipe(1, addresses[0]); // Использовать первую запись в массиве «адреса» (сейчас только 1)
  myRadio.startListening();

  digitalWrite(flashPin, 0);
}//--(конец настройки)---


void loop()
{
  if ( myRadio.available()) // Проверяем наличие входящих данных от передатчика
  {
    flashStartMicros = micros();
    while (myRadio.available())  // пока данные готовы
    {
      myRadio.read( &dataReceived, sizeof(dataReceived) ); // Получить полезную нагрузку данных (вы, должно быть, уже определили это!)
    }
    if (dataReceived == 8) {
      flashValue = 1;
      digitalWrite(flashPin, flashValue);
    }
  }
  if ( micros() - flashStartMicros > 1500) {
    flashValue = 0;
    digitalWrite(flashPin, flashValue);
  } //END Радио доступно
}//--(конец основного цикла)---

Просто - я отправляю символ, получаю его и устанавливаю высокий уровень триггера. Затем тайм-аут и установить его низким. Существует только один оператор, устанавливающий на выводе 3 (flashPin) низкий уровень.

Я потратил 2 дня, пытаясь найти разницу.

, 👍-1

Обсуждение

Вывод вспышки такой же, как и вывод CE?, @Gerben

Вывод CE привязан к Vcc, а вход Flash настроен на выход. Это работает на Trinket., @Smifff

измените последний digitalWrite(flashPin, flashValue); на digitalWrite(flashPin, 1); .... это сообщит вам, если выход становится низким из-за этой строки, @jsotola

Я изменил линию, как вы предложили, и светодиод загорается (на штырьке высокий уровень) и остается включенным. Я поставил задержку в конце setup(), чтобы увидеть, когда она становится высокой, и она ждала низкую задержку, а затем стала высокой. На пульс естественно не реагирует. Справедливое предложение , хотя., @Smifff

поскольку вы разместили сигнал, я предполагаю, что у вас есть какой-то прицел. .... проверьте все остальные контакты nRF24L01+ .... посмотрите, есть ли разница между Trinket и ATtiny85 ..... может ли быть дело в напряжении питания? ... или, может быть, что-то делать с контактом CE, @jsotola

У меня есть, и я должен это сделать. Спасибо за предложения. Я займусь этим утром., @Smifff


1 ответ


0

Мои усилия по отладке были в бесконечном цикле DO, потому что я пытался понять, почему ATtiny не действует на полученные данные, как Trinket. Благодаря нескольким простым вопросам от #jsotola я посмотрел, как выглядят сигналы Trinket для сравнения. Оказывается, моя передача была сломана, и оба приемника имели дело с одним и тем же мусором. Теперь у меня нет разницы между двумя приемниками, и я могу вернуться и заставить TX делать то, что мне нужно. «Когда вы исключаете невозможное, все, что остается, каким бы невероятным оно ни было, должно быть правдой».

,