Программное обеспечение 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 дня, пытаясь найти разницу.
@Smifff, 👍-1
Обсуждение1 ответ
Мои усилия по отладке были в бесконечном цикле DO, потому что я пытался понять, почему ATtiny не действует на полученные данные, как Trinket. Благодаря нескольким простым вопросам от #jsotola я посмотрел, как выглядят сигналы Trinket для сравнения. Оказывается, моя передача была сломана, и оба приемника имели дело с одним и тем же мусором. Теперь у меня нет разницы между двумя приемниками, и я могу вернуться и заставить TX делать то, что мне нужно. «Когда вы исключаете невозможное, все, что остается, каким бы невероятным оно ни было, должно быть правдой».
- Использование программного обеспечения Serial для библиотеки Adafruit Thermal и более общий вопрос cpp
- Attiny85 с 433 МГц вч, работал отлично нано к нано, не attiny85 к нано
- вопрос по трубке nRF24L01
- Связь последовательного порта Digispark
- Не нашел датчик отпечатков пальцев :( Arduino Mega 2560 Adafruit Fingerprint Sensor
- Почему Adafruit motor shield не крутит моторы?
- Как подключить NodeMCU к NRF24L01
- Библиотеки I2C для ATTiny85?
Вывод вспышки такой же, как и вывод CE?, @Gerben
Вывод CE привязан к Vcc, а вход Flash настроен на выход. Это работает на Trinket., @Smifff
измените последний
digitalWrite(flashPin, flashValue);
наdigitalWrite(flashPin, 1);
.... это сообщит вам, если выход становится низким из-за этой строки, @jsotolaЯ изменил линию, как вы предложили, и светодиод загорается (на штырьке высокий уровень) и остается включенным. Я поставил задержку в конце setup(), чтобы увидеть, когда она становится высокой, и она ждала низкую задержку, а затем стала высокой. На пульс естественно не реагирует. Справедливое предложение , хотя., @Smifff
поскольку вы разместили сигнал, я предполагаю, что у вас есть какой-то прицел. .... проверьте все остальные контакты nRF24L01+ .... посмотрите, есть ли разница между Trinket и ATtiny85 ..... может ли быть дело в напряжении питания? ... или, может быть, что-то делать с контактом CE, @jsotola
У меня есть, и я должен это сделать. Спасибо за предложения. Я займусь этим утром., @Smifff