attiny85 и приемник 433 МГц
- Войдите на сайт для отправки комментариев
Всем привет! Не получается объединить attiny85 и приемник на 433 МГц. Передатчиком выступает UNO + передатчик. Приемником должна быть attiny85. Суть простая: в зависимости от передаваемой команды генерировать ШИМ на двух контактах. Но ничего не работает. точнее Attiny85 не принимает сигнал.
Вот тестовый код приемника:
#include <Manchester.h>
#define port1 1 //Left motor pin
#define RX_PIN 4 //= pin 6
void setup()
{
man.setupReceive(RX_PIN, MAN_1200);
man.beginReceive();
pinMode(port1, OUTPUT);
digitalWrite(port1, LOW);
}
void loop()
{
if (man.receiveComplete()) {
uint16_t m = man.getMessage();
man.beginReceive(); //start listening for next message right
//after you retrieve the message
if (m == 5)
{
digitalWrite(port1, HIGH);
}
}
}
код передатчика (UNO):
#include <Manchester.h>
const char *mx = "1"; //Max speed forward
const char *md = "2"; //Middle speed forward
const char *mn = "3"; //Minimum speed (off)
const char *lmd = "4"; //Left at middle speed
const char *rmd = "5"; //Right at middle speed
const char *lmx = "6"; //Left at max speed
const char *rmx = "7"; //Right at max speed
char *controller;
int v;
int s;
int x = 0;
int y = 1;
uint16_t transmit_data;
#define TX_PIN 8 //pin where your transmitter is connected
void setup()
{
Serial.begin(9600);
//man.workAround1MhzTinyCore(); //add this in order for transmitter to work with 1Mhz Attiny85/84
man.setupTransmit(TX_PIN, MAN_1200);
}
void loop()
{
v = analogRead(x); //Read x axis of joystick (throttle) (I held my joystick the opposite way so axes are inverted)
s = analogRead(y); //Read y axis of joystick (turn)
if(v >= 800) //If read max
{
Serial.println(((uint8_t *)mx, strlen(mx)));
if (s >= 500 && s <= 600) //if read middle at max
{
transmit_data=1;
Send();
}
if(s < 500) //if read left at max
{
transmit_data=6;
Send();
}
else //of not either of above, it must be right at max
{
transmit_data= 7;
Send();
}
}
else if (v <= 50) //if minimum throttle
{
transmit_data=3;
Send();
}
else //if not minimum throttle or max throttle, it must be middle
{
if (s >= 30 && s <= 1000) //middle at middle speed
{
transmit_data=2 ;
Send();
}
else if (s < 30) //left at middle speed
{
transmit_data=4 ;
Send();;
}
else //if not left or middle, it must be right at middle speed
{
transmit_data=5 ;
Send();
}
}
}
void Send(){
man.transmit(transmit_data);
delay(100);
}
Приемник должен зажечь светодиоды как только будет получен какой-то сигнал. Но на attiny85 ничего не происходит. Если код приемника зашить в MEGA2560 то все работает. Уже несколько часов бьюсь с этой attiny85! Не принимает сигнал и все! Может и принимает, но искаженный, проверить это никак. К тому же непонятно какие настройки выбирать в IDE для attiny85...
Может у вас есть какие-то идеи? Очень нужна ваша помощь
Не знаю, что за Manchester, и умеет ли он с тинькой работать.А что за приёмник?
Самые простые приемник и передатчик на 433mhz он же: fs1000a https://micro-pi.ru/xd-rf-5v-fs1000a-xd-fst-rc/
Библиотека Manchester в основном для Тинек и написана. Пробовал так же библиотеку VirtualWire. результат тот же. Склоняюсь к тому что attiny85 нужно как-то по особому настраивать.
attiny85 Прошиваю через Мегу (Arduino As ISP).
Плата: attiny85/45/25
Чип: attiny85
Частота: пробовал 1 МГц и 8 МГЦ (внутренний генератор)
больше ничего не менял.
Я в своё время переделывал VirtualWire на тиньку, причём только приёмник. Можете попробовать на передатчик поставить оригинальную VirtualWire, а на приёмник - мою, переделанную. У меня вроде уж годами работает, но я могу завтра, перед тем как Вам выкладывать, непосредственно проверить и выложить с проверочными примерами. Надо?
Да, это очень помогло бы!
Хорошо, только когда я писал "завтра", я почему-то считал, что сегодня пятница. Имелась в виду суббота. В субботу выложу.
Ок, спасибо
Хорошо, када есть люди, у которых всегда пятница. :)
я бы для начала добавил перед 9 строкой приемника
pinMode(RX_PIN, INPUT);
Update: не надо, там все есть
Update: не надо, там все есть
b707, на других платах работает прием. Именно с attiny85 что-то не получается
А дайте ссылку - гляну на библиотеку
Библиотеку брал здесь: https://github.com/mchr3k/arduino-libs-manchester
b707, на других платах работает прием. Именно с attiny85 что-то не получается
Вы писали. что Аттини еще ШИМ должна генерить... правда в вашем коде я ШИМа не вижу.
Может в этом и дело? Манчестер на Тини использует Таймер1. если вы на этом же таймере генерите ШИМ - Манчестер работать не будет. Попрбуйте убрать ШИМ из кода - может приемник заработает?
Про ШИМ Вам правильно написали, а если у Вас нет ШИМа, то попробуйте в файле "Manchester.cpp" сделать следующее
1. Строку 314 (OCR1A = 0;) закомментируйте
2. в строках 300, 303, 306 и 309 (они все начинаются с "OCR1C = ...") добавьте в самое начало "OCR1A = ", т.е. они должны начинаться с "OCR1A = OCR1C = ..."
3. Перед строкой 298 добавьте "cli();"
4. После строки 312 добавьте "sei();"
Скажите заработает или нет.
Дело не в ШИМ-е. Я пробовал просто включать светодиод как только есть хоть какой-то сигнал:
Про ШИМ Вам правильно написали, а если у Вас нет ШИМа, то попробуйте в файле "Manchester.cpp" сделать следующее
1. Строку 314 (OCR1A = 0;) закомментируйте
2. в строках 300, 303, 306 и 309 (они все начинаются с "OCR1C = ...") добавьте в самое начало "OCR1A = ", т.е. они должны начинаться с "OCR1A = OCR1C = ..."
3. Перед строкой 298 добавьте "cli();"
4. После строки 312 добавьте "sei();"
Скажите заработает или нет.
Вы как хорший охотник бьёте скетчи с ходу в лёт )))
Пробуйте. потому, что тот кусок, что я предлагаю менять - компилируется только для тини 25/45/85 Если Вы понимаете смысл слов #ifdef, #elif то легко в этом убедитесь, глядя на код.