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. Разве вы не получили никаких сообщений об ошибках!
Вы пробовали использовать библиотеку 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
- ATTINY85 - Радиочастотный передатчик (RH ASK)
- 1 МГц Attiny85 RF с библиотекой MANCHESTER
- Радиочастотный пакетный импульс 433 МГц с микросхемой ATTiny85
- RF Keyfob простой код кнопки
- Attiny85 с 433 МГц вч, работал отлично нано к нано, не attiny85 к нано