attiny85 и приемник 433 МГц

forfrends
Offline
Зарегистрирован: 24.02.2015

Всем привет! Не получается объединить 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...

Может у вас есть какие-то идеи? Очень нужна ваша помощь

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Не знаю, что за Manchester, и умеет ли он с тинькой работать.А что за приёмник?

forfrends
Offline
Зарегистрирован: 24.02.2015

Самые простые приемник и передатчик на 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 МГЦ (внутренний генератор)

больше ничего не менял.

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Я в своё время переделывал VirtualWire на тиньку, причём только приёмник. Можете попробовать на передатчик поставить оригинальную VirtualWire, а на приёмник - мою, переделанную. У меня вроде уж годами работает, но я могу завтра, перед тем как Вам выкладывать, непосредственно проверить и выложить с проверочными примерами. Надо?

forfrends
Offline
Зарегистрирован: 24.02.2015

Да, это очень помогло бы!

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Хорошо, только когда я писал "завтра", я почему-то считал, что сегодня пятница. Имелась в виду суббота. В субботу выложу.

forfrends
Offline
Зарегистрирован: 24.02.2015

Ок, спасибо

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Хорошо, када есть люди, у которых всегда пятница. :)

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

я бы для начала добавил перед 9 строкой приемника

pinMode(RX_PIN, INPUT);

Update: не надо, там все есть

void Manchester::setRxPin(uint8_t pin)
{
  ::RxPin = pin; // user sets the digital pin as output
  pinMode(::RxPin, INPUT); 
}
 

 

b707
Offline
Зарегистрирован: 26.05.2017

andycat пишет:

Update: не надо, там все есть

кстати - именно в тему "там все есть" - ТС. проверьте код библиотеки Манчестор, которую вы используете - мне попадались версии библиотеки. где тупо нет приемного кода, только передача
forfrends
Offline
Зарегистрирован: 24.02.2015

b707, на других платах работает прием. Именно с attiny85 что-то не получается

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

А дайте ссылку - гляну на библиотеку

forfrends
Offline
Зарегистрирован: 24.02.2015

Библиотеку брал здесь: https://github.com/mchr3k/arduino-libs-manchester

b707
Offline
Зарегистрирован: 26.05.2017

forfrends пишет:

b707, на других платах работает прием. Именно с attiny85 что-то не получается

Вы писали. что Аттини еще ШИМ должна генерить... правда в вашем коде я ШИМа не вижу. 

Может в этом и дело? Манчестер на Тини использует Таймер1. если вы на этом же таймере генерите ШИМ - Манчестер работать не будет. Попрбуйте убрать ШИМ из кода - может приемник заработает?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Про ШИМ Вам правильно написали, а если у Вас нет ШИМа, то попробуйте в файле "Manchester.cpp" сделать следующее

1. Строку 314 (OCR1A = 0;) закомментируйте

2.  в строках 300, 303, 306 и 309 (они все начинаются с "OCR1C = ...") добавьте в самое начало "OCR1A = ", т.е. они должны начинаться с "OCR1A = OCR1C = ..."

3. Перед строкой 298 добавьте "cli();"

4. После строки 312 добавьте "sei();"

Скажите заработает или нет. 

forfrends
Offline
Зарегистрирован: 24.02.2015

Дело не в ШИМ-е. Я пробовал просто включать светодиод как только есть хоть какой-то сигнал:

void loop()
{
    if (man.receiveComplete()) {
        digitalWrite(port1, HIGH);
        uint16_t m = man.getMessage();
        man.beginReceive(); //start listening for next message right
    }
}
 
Но реакции нет. В тоже время этот код работает на любой Ардуино.
Но все равно попробую то что вы советуете.
ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

ЕвгенийП пишет:

Про ШИМ Вам правильно написали, а если у Вас нет ШИМа, то попробуйте в файле "Manchester.cpp" сделать следующее

1. Строку 314 (OCR1A = 0;) закомментируйте

2.  в строках 300, 303, 306 и 309 (они все начинаются с "OCR1C = ...") добавьте в самое начало "OCR1A = ", т.е. они должны начинаться с "OCR1A = OCR1C = ..."

3. Перед строкой 298 добавьте "cli();"

4. После строки 312 добавьте "sei();"

Скажите заработает или нет. 


Вы как хорший охотник бьёте скетчи с ходу в лёт )))

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

forfrends пишет:
В тоже время этот код работает на любой Ардуино.

Но все равно попробую то что вы советуете.

Пробуйте. потому, что тот кусок, что я предлагаю менять - компилируется только для тини 25/45/85 Если Вы понимаете смысл слов #ifdef, #elif то легко в этом убедитесь, глядя на код.