Attiny85 не может распознать данные с 433 МГц с помощью VirtualWire.h

Основной план заключается в том, чтобы Attiny85 передавал информацию с модуля RF 433 МГц на другой чип/Arduino через I2C с использованием библиотек VirtualWire и Wire. Мне удалось заставить эту систему работать самостоятельно, используя Arudino Nano для отладки, но Attiny85 (A85), похоже, не может захватить данные с RF 433 МГц.

Поэтому я потратил несколько дней на дополнительные исследования и, по сути, на то, чтобы разместить каждый компонент отдельно, чтобы убедиться, что отправляемая информация верна.

  1. Передатчик 433 МГц работает, отправляя 9-значное число с помощью VirtualWire.h.
  2. Nano с приемником 433 МГц принимает 9-значный номер, VirtualWire.h.
  3. Attiny85 отправляет либо нулевые данные, либо 9-значное число на другой Nano с помощью Wire.h.
  4. 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 МГц. Ни один из них не сработал.

Не уверен, что еще я упускаю?

, 👍0


2 ответа


-2

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

Эта ссылка предоставляет полезную информацию о том, как откалибровать внутренний генератор микроконтроллера ATtiny.

Я использовал кристалл на 16 МГц, подключенный к контактам 2 и 3, затем вам придется изменить тип на внешний и записать загрузчик, чтобы изменить предохранители.

Я не думаю, что вы можете использовать библиотеки Wire с attiny85. Разве вы не получили никаких сообщений об ошибках!

,

2

Вы пробовали использовать библиотеку 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.

,