Attiny85 не может распознать данные с 433 МГц с помощью VirtualWire.h
Основной план заключается в том, чтобы Attiny85 передавал информацию с модуля RF 433 МГц на другой чип/Arduino через I2C с использованием библиотек VirtualWire и Wire. Мне удалось заставить эту систему работать самостоятельно, используя Arudino Nano для отладки, но Attiny85 (A85), похоже, не может захватить данные с RF 433 МГц.
Поэтому я потратил несколько дней на дополнительные исследования и, по сути, на то, чтобы разместить каждый компонент отдельно, чтобы убедиться, что отправляемая информация верна.
- Передатчик 433 МГц работает, отправляя 9-значное число с помощью VirtualWire.h.
- Nano с приемником 433 МГц принимает 9-значный номер, VirtualWire.h.
- Attiny85 отправляет либо нулевые данные, либо 9-значное число на другой Nano с помощью Wire.h.
- Nano не получает никаких данных, поэтому I2C работает между A85 и Nano.
Attiny85 на контакте 1 (контакт 6 на чипе) не получает никаких данных от 433 МГц, который работает на (2). Я подключаю GND 433 RX к чипу.
Вот код приемника:
#include <VirtualWire.h>
#include <Wire.h>
void setup() {
pinMode(A3, OUTPUT);
Wire.begin(); // присоединяемся к шине i2c (адрес необязателен для мастера)
vw_set_ptt_inverted(true); // Требуется для DR3100
vw_setup(4000); // Бит в секунду
vw_set_rx_pin(1);
vw_rx_start(); // Запуск работы ФАПЧ приемника
}
void loop() {
uint8_t buf[15];
uint8_t buflen = 15;
if (vw_get_message(buf, &buflen)) // Неблокируемый
{
digitalWrite(A3, LOW);
Wire.beginTransmission(8); // передаем на устройство №8
for (int i = 0; i < buflen; i++) {
Wire.write(buf[i]);
}
Wire.endTransmission(); // остановить передачу
} else {
digitalWrite(A3, HIGH);
Wire.beginTransmission(8); // передаем на устройство №8
Wire.write("no DATA");
Wire.endTransmission(); // остановить передачу
}
}
Вот код передатчика:
#include <VirtualWire.h>
int xPin = A7;
int yPin = A6;
int buttonPin = 2;
int xPosition = 0;
int yPosition = 0;
int buttonState = 0;
const char *controller;
void setup() {
Serial.begin(9600);
pinMode(12,OUTPUT);
pinMode(10, OUTPUT);
pinMode(yPin, INPUT);
pinMode(xPin, INPUT);
pinMode(buttonPin, INPUT_PULLUP);
vw_set_ptt_inverted(true); //
vw_set_tx_pin(12);
vw_setup(4000);// speed of data transfer Kbps
}
void loop(){
xPosition = analogRead(xPin);
yPosition = analogRead(yPin);
buttonState = digitalRead(buttonPin);
if(xPosition > 0 || yPosition > 0) {
String Data = (xPosition + yPosition);
controller = Data;
vw_send((uint8_t *)controller, strlen(controller));
vw_wait_tx(); // Wait until the whole message is gone
} else {
digitalWrite(13, 0);
digitalWrite(4, 1);
controller = "#s0_0";
vw_send((uint8_t *)controller, strlen(controller));
vw_wait_tx(); // Wait until the whole message is gone
}
Serial.println(controller);
}
Таким образом, по сути, A85 не проходит if (vw_get_message(buf, &buflen)) { на выводе 1. Но проходит при использовании Nano на выводе D2, с того же передатчика, но, конечно, не в то же время.
Я использую неправильный пин на A85? Чиповые пины 5 и 7 используются для I2C, поэтому остаются только аналоговые пины, поэтому не уверен, что они тоже будут работать. Я также пробовал 8 МГц и 1 МГц при загрузке A85.
Я пробовал разные ядра, как предложил Google, разные версии VirtualWire и устанавливал тактовую частоту Attiny 1 МГц, 8 МГц и 16 МГц. Ни один из них не сработал.

Не уверен, что еще я упускаю?
@BadAddy, 👍0
Обсуждение2 ответа
Внутренний генератор ATtiny85 необходимо откалибровать для работы с VirtualWire, иначе придется использовать резонатор.
Эта ссылка предоставляет полезную информацию о том, как откалибровать внутренний генератор микроконтроллера ATtiny.
Я использовал кристалл на 16 МГц, подключенный к контактам 2 и 3, затем вам придется изменить тип на внешний и записать загрузчик, чтобы изменить предохранители.
Я не думаю, что вы можете использовать библиотеки Wire с attiny85. Разве вы не получили никаких сообщений об ошибках!
Не могли бы вы подробнее рассказать о своём ответе? Например, почему, по вашему мнению, он заработает после калибровки генератора? Как откалибровать внутренний генератор ATtiny..., @jfpoilpret
Ссылка на информацию о том, как выполнить каллибровку http://ernstc.dk/arduino/tinytuner.html У меня есть VirutalWire и attiny для работы с кварцевым резонатором или для калибровки внутреннего генератора., @Carlmikael
@Carlmikael Могу спросить, что ты сделал с кристаллами. Мне не очень удобно заниматься этими связями. Но я могу добавить кристалл. Есть ли у тебя ссылка на руководство по этому? У меня есть кристаллы на 12 МГц?, @BadAddy
@BadAddy точность часов вряд ли имеет какое-либо отношение к вашей проблеме, но совершенно другие часы, чем предполагалось, могут иметь к этому отношение., @Chris Stratton
@ChrisStratton Я видел много сообщений об этой проблеме и перепробовал множество библиотек, включая Tinycore, но ни одна из них не работает. Я видел сообщения, где люди предполагали, что это работает, но не предоставляли никаких подробностей. Возможно, я просто не могу этого добиться и, возможно, стоит попробовать ATtiny84., @BadAddy
Замена микросхем в надежде на лучший результат — не очень разумный подход. Если это не работает, нужно выяснить *причину*, что, вероятно, означает сочетание использования тестового оборудования для понимания происходящего и времени, потраченного на понимание того, что на самом деле делает код. При более низких частотах передачи данных вполне возможно использовать звуковую карту компьютера в качестве осциллографа, но логические анализаторы с интерфейсом USB, совместимые с Sigrok, стоят недорого и хорошо работают на низких тактовых частотах., @Chris Stratton
Вы пробовали использовать библиотеку Radiohead ? Я знаю, вы говорили, что пробовали разные версии Virtual Wire. Класс RH_ASK точно работает на 328p и nano, и они утверждают, что простая программа Rx может работать на ATTiny85. У них есть документация по RH_ASK относительно изменений, которые вам нужно внести в библиотеку. Другим возможным решением является редактирование файлов библиотеки Virtual Wire, в них могут быть переменные, такие как «Max_payload» (есть в Radiohead), размер которых можно уменьшить. На самом деле я не читал библиотеку Virtual Wire, но уверен, что Radiohead должны исправить ваши проблемы.
Если это не работает, у вас есть осциллограф? Может быть, мы можем попробовать отладить его таким образом.
Редактировать: Может быть, сначала попробуйте закомментировать строку vw_set_ptt_inverted. Я не думаю, что вы используете DR3100. Это может не иметь значения, поскольку вы на самом деле не установили пин для ptt.
Следующее, что вы можете попробовать, это просто подключить вывод данных Tx к Rx. С помощью этого вы сможете проверить, действительно ли модуль подключен к ATTiny.
- Контроллер радиоуправляемой машины с использованием библиотеки RC-switch
- Соединение ATTiny85 I2C с Arduino Nano
- Связь Arduino UNO/Nano с модулем SP1ML-868
- 1 МГц Attiny85 RF с библиотекой MANCHESTER
- Радиочастотный пакетный импульс 433 МГц с микросхемой ATTiny85
- ATTINY85 - Радиочастотный передатчик (RH ASK)
- RF Keyfob простой код кнопки
- Attiny85 с 433 МГц вч, работал отлично нано к нано, не attiny85 к нано
[Не публикуйте сообщения друг за другом.](https://meta.stackexchange.com/q/64068) Вы уже [задавали этот вопрос на SO](https://stackoverflow.com/q/49106112)., @gre_gor
Поскольку мне пришлось присоединиться к этому сообществу, я не считал это кросспостингом! Всё равно ТАК, но я наткнулся на это сообщение только сейчас, когда углублялся в изучение проблемы. Разные сообщества, разные люди — вот что я имел в виду., @BadAddy
Перекрёстный постинг запрещён. Более того, нет смысла задействовать дополнительный процессор и I2C. Просто дайте конечному получателю выполнить декодирование., @Chris Stratton
@ChrisStratton Привет, спасибо, что уделили время комментарию. Кажется, я объяснил, почему опубликовал это снова, хотя и более подробно. Что касается конечного продукта, то Nano предназначен только для отладки, а не для использования светодиодов, поскольку я хотел убедиться в правильности передаваемых данных. Конечным продуктом в конечном итоге будет Attiny84a. Проблема в том, что Servo.h и VirtualWire.h несовместимы (оба используют Timer1), поэтому и пришлось прибегнуть к обходному пути, чтобы уменьшить размер схемы., @BadAddy