Всем доброго.. Помогите разобраться с передачей данных. У меня мистика!!! Есть 2 шт ардуино которые работают 1 на передачу данных с GPS - 2 на приём. Когда передатчик (1) подключен непосредственно к ПК то прийом данных на 2-ой идет без проблем и без перерывов (2 работает со своим питанием без ПК). НО!!!! Когда включаю передатчик к Источнику питания и отключаю от ПК ТО!!! передачи данных нет!!!. (грешу в сторону Библиотек на передатчике). ПОМОГИТЕ РАЗОБРАТЬСЯ, ТКНИТЕ НОСОМ. Всем спасибо. Скетч Передатчика: Код (C++): #include <SPI.h> #include <TinyGPS++.h> #include <SoftwareSerial.h> #include <nRF24L01.h> #include <RF24.h> RF24 radio(8, 9); uint16_t raw_bandgap = 0; char Point[50],q[50]; int channel1 = 4; int Channel1; String i; static const int RXPin = 11, TXPin = 10; static const uint32_t GPSBaud = 9600; TinyGPSPlus gps; int k; SoftwareSerial ss(RXPin, TXPin); void setup() { Serial.begin(4800); ss.begin(GPSBaud); radio.begin(); radio.setChannel(5); radio.setDataRate (RF24_250KBPS); RF24_1MBPS, RF24_2MBPS). radio.setPALevel (RF24_PA_HIGH); radio.openWritingPipe (0xAABBCCDD11LL); } void loop () { SPUT(); if (millis() / 50 % 2) {if (radio.write(&Point, sizeof(Point))){}} HDOP(); if (millis() / 50 % 2) {if (radio.write(&Point, sizeof(Point))){}} TD(); if (millis() / 50 % 2) {if (radio.write(&Point, sizeof(Point))){}} Sped(); if (millis() / 50 % 2) {if (radio.write(&Point, sizeof(Point))){}} LKoor(); if (millis() / 50 % 2) {if (radio.write(&Point, sizeof(Point))){}} NKoor(); if (millis() / 50 % 2) {if (radio.write(&Point, sizeof(Point))){}} KANAL(); if (millis() / 50 % 2) {if (radio.write(&Point, sizeof(Point))){}} } void SPUT() { while (ss.available() > 0) gps.encode(ss.read()); i=String(gps.satellites.value()); Point[0]='S'; for (int t=0; t<=i.length();t++) {Point[t+1]=i[t];}} void HDOP() { while (ss.available() > 0) gps.encode(ss.read()); i=String(gps.hdop.hdop()); Point[0]='H'; for (int t=0; t<=i.length();t++) { {Point[t+1]=i[t];}}} void TD() { while (ss.available() > 0) gps.encode(ss.read()); if ((gps.time.hour()+3)<10) {i="0"+(String(gps.time.hour()+3));} else {i=String(gps.time.hour()+3);} if (gps.time.minute()<10) {i=i+":0"+String(gps.time.minute());} else i=i+":"+String(gps.time.minute()); if (gps.time.second()<10) {i=i+":0"+String(gps.time.second());} else i=i+":"+String(gps.time.second()); Point[0]='T'; for (int t=0; t<=i.length();t++) { {Point[t+1]=i[t];}}} void Sped() { while (ss.available() > 0) gps.encode(ss.read()); { i=String(gps.speed.kmph()); Point[0]='L'; for (int t=0; t<=i.length();t++) {Point[t+1]=i[t];}}} void LKoor() { while (ss.available() > 0) gps.encode(ss.read()); { i=String(gps.location.rawLat().deg)+"."+(gps.location.rawLat().billionths); Point[0]='F'; for (int t=0; t<=i.length();t++) {Point[t+1]=i[t];}} } void NKoor() { while (ss.available() > 0) gps.encode(ss.read()); { i=String(gps.location.rawLng().deg)+"."+(gps.location.rawLng().billionths); Point[0]='N'; for (int t=0; t<=i.length();t++) {Point[t+1]=i[t];}}} void KANAL() { Channel1 = (pulseIn (channel1, HIGH)); i=String(Channel1); Point[0]='K'; for (int t=0; t<=i.length();t++) {Point[t+1]=i[t];}}
перво-наперво давайте схему подключения передатчика к источнику питания. Какое напряжение источника? как вы его подключаете к ардуине(к каким пинам?) от чего питается NRF где логика? Библиотеки разве разные в этих двух случаях?
1. Плата Leonardo: Источник NRF - 3.3В от платы ардуино Leonardo. Источник питания - 7.4 V на VIN на плату приходит 2. Получаеться что так: Поскольку на передатчике использую библиотеку: <SoftwareSerial.h> которую не использую на приёмнике. Вот и грешу на эту библиотеку. Возможно я не прав!
ну вот и первая догадка. При включении БП через вход VIN у вас питание дважды проходит через регуляторы - сначала понижается с 7.4 до 5в, а потом с 5в до 3.3 для NRF. Мощность каждого регулятора довольно маленькая. едва на саму ардуину хватает. А NRF24 в моменты связи потребляет до 200-300мА Ах да, еще забыл - у вас же небось еще и GPS от ардуины запитан? - удивительно как это вообще все работает... Возьмите источник питания 5в током не менее 0.5А и подключите напрямую на пин "5в" ардуины. Если все заработает - значит дело в этом, будете думать как переделать питание Еще полезно припаять конденсатор 10мкФ прямо на пины питания модуля NRF
Уже пробовал напрямую с источником питания 5в током 2А - не помогло. У меня ВОПРОС почему передатчик - при источнике от ПК работает и передает данные, а от ОТДЕЛЬНОГО Источника питания НЕТ? Где собака зарыта? И еще - подключаю к другому ПК где не стоит Ардуино - передачи нет. Возвращаю назад где установлено Ардуино - Передача идет.
ВСЕМ ОГРОМНОЕ СПАСИБО!!!!!! Проблему решил!!! . Все дело в том что в случае с Leonardo лучше использовать аппаратный UART. Перекинул пины на RX и TX ардуины + скачал библиотеку которая работает с аппаратным UART (их в нэте полно!!!!). ВСЕ РАБОТАЕТ!!. ЕЩЕ РАЗ ВСЕМ СПАСИБО.