Официальный сайт компании Arduino по адресу arduino.cc
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 то легко в этом убедитесь, глядя на код.