Мучаю модуль NRF24 - очередной вопрос..
- Войдите на сайт для отправки комментариев
Сб, 07/11/2020 - 12:36
Где ошибся не подскажете? Код в таком виде не хочет работать..
Передатчик:
#include <SPI.h> #include <RF24.h> #include <nRF24L01.h> RF24 radio(10, 9); const uint64_t pipe = 0xF0F0F0F0D2L; struct data { uint8_t angle; }; struct data packet; void setup() { radio.begin(); radio.setAutoAck(1); radio.setRetries(0, 15); radio.setPayloadSize(32); radio.openWritingPipe(pipe); radio.setChannel(0x60); radio.setPALevel (RF24_PA_MAX); radio.setDataRate (RF24_250KBPS); radio.powerUp(); radio.stopListening(); } void loop() { int potValue = analogRead(A0); packet.angle = map(potValue, 0, 1023, 1700, 350); int potValue2 = analogRead(A1); packet.angle = map(potValue2, 0, 1023, 1700, 350); radio.write((uint8_t *)&packet, sizeof(struct data)); }
Приемник:
#include <SPI.h> #include <nRF24L01.h> #include <RF24.h> #include "BMC_SBUS.h" BMC_SBUS mySBUS; RF24 radio(10, 9); const uint64_t pipe = 0xF0F0F0F0D2L; const int sbusWAIT = 7; int PanChannel = 1; int TiltChannel = 2; struct data { uint8_t angle; }; struct data packet; void setup() { radio.begin(); radio.setAutoAck(1); radio.setRetries(0, 15); radio.setPayloadSize(32); radio.openReadingPipe(1, pipe); radio.setChannel(0x60); radio.setPALevel (RF24_PA_MAX); radio.setDataRate (RF24_250KBPS); radio.powerUp(); radio.startListening(); mySBUS.begin(); } void loop() { if (radio.available()) { radio.read((uint8_t *)&packet, sizeof(struct data)); mySBUS.Servo(PanChannel, packet.angle); mySBUS.Servo(TiltChannel, packet.angle); mySBUS.Update(); mySBUS.Send(); delay(sbusWAIT); } }
Нам самим догадываться, что Вы имели в виду под
Код в таком виде не хочет работать..
или Вы всё-таки объясните в чём проблема?
Потрудитесь пожалуйста по такой схеме
1. Что он должен делать?
2. Что реально делает?
3. Чем (1) отличается от (2)?
Где ошибся не подскажете? Код в таком виде не хочет работать..
Ошибок нет.
1. Джойстик должен управлять по двум осям (X,Y) удаленным устройством по протоколу SBUS.
2. В реале никаких команд от джойстика на устройство не поступает.
3. (1) - первый канал (X), (2) - второй канал (Y) внутри протокола SBUS.
Почему-то приходящие в пакете данные с джойстика не считываются (
packet.angle). Вбиваю данные
в ручную- команды выполняются. Пример:
mySBUS.Servo(PanChannel, 1600); ускоренно вращает ось(Х) вправо и т.д. Не знаю как быть.
Где ошибся не подскажете? Код в таком виде не хочет работать..
Ошибок нет.
Так я и сам не возьму в толк почему команды не выполняются.( Что делать ума не приложу..
Параллельно воткнул серву - вращается. Может библиотека кривая, но тогда почему в проводном режиме все работает как надо?
1. Джойстик должен управлять по двум осям (X,Y) удаленным устройством по протоколу SBUS.
Описывайте в терминах Вашей программы, а не общими словами.
2. В реале никаких команд от джойстика на устройство не поступает.
Откуда это видно? Что не поступает? В коде нет никаких отладочных печатей, так откуда сделан такой вывод?
2. В реале никаких команд от джойстика на устройство не поступает.
Откуда это видно? Что не поступает? В коде нет никаких отладочных печатей, так откуда сделан такой вывод?
Спасибо Евгений за наводящие вопросы. Подключил сериал порт и тут-же обозначилась проблема в приемнике. Сериал выводит крякозябры. У передатчика значения потенциометра отображаются правильно. Похоже что с приемником проблема. Вроде ошибок в коде приемника нет, но почему тогда данные не поступают?
Подключил сериал порт и тут-же ....
Так всегда и поступайте - нельзя работать вслепую.
почему тогда данные не поступают?
Показывайте код и то, что он печатает. Печатей побольше наставьте, чтобы всё отследить можно было.
Приемник:
const
uint64_t pipe = 0xF0F0F0F0D2L;
Наводящий вопрос: что за L на конце числа? и сколько их должно быть?
Печатей побольше наставьте, чтобы всё отследить можно было.
Не знаю куда ещё вставить печати, чтобы понять, где проблема. Странно, я подключал в параллель серву (выше писал уже) та работала как ни в чем не бывало, по идее тоже ведь не должна..
const
uint64_t pipe = 0xF0F0F0F0D2L;
Наводящий вопрос: что за L на конце числа? и сколько их должно быть?
Спасибо, исправил, но ничего не поменялось..(
А модули точно работают? У меня в одной посылке из 5 один только рабочий был.
23
radio.stopListening();
22
radio.powerUp();
не уверен , что эти команды необходимы.
Да, модули рабочие 100%. Я пробовал и без этих команд, оставлял только трубу и листинг - тоже самое.
Спасибо, исправил, но ничего не поменялось..(
Выкладывайте свежий код (откуда нам знать, что и как Вы исправили) и содержимое вывода. Только не картинкой, а текстом - на картинке я лично НИХРЕНА не разглядел
Евгений, вчера был измотан экспериментами и голова уже не соображала. Сейчас на свежую голову благодаря в том числе и вашим бесценным советам кое в чем разобрался, но проблема пока не решена. Надеюсь с вашей помощью мне удастся её победить - уверен.
Теперь на чем собственно остановился. После рядов экспериментов с кодом, выяснилось, что пакеты исправно передаются и принимаются (благодаря печатям, уверен), но как только я прописываю в сетапе "mySBUS.begin();" все - появляются кракозябры. Вот с этим думаю и предстоит разобраться. Я выше несколько раз упоминал, что подключал сервопривод к каналу и он успешно реагировал на манипуляции потенциометра - это ещё одно свидетельство того, что прием/передача налажена верно и исправно работает. Я подозреваю, что передача по SBUS протоколу должна осуществляться по иному принципу, т.к. этот протокол содержит в себе 16 каналов "PWM" и является пакетом данных, а не конкретным каналом с одной единицей команд как в случае с сервоприводом. Думаю в этом и кроется корень "зла". Какие шаги предпринять дальше я не знаю, ибо для этого у меня знаний маловато. Мне думается, что надо как-то распаковывать SBUS на составляющие и потом поканально передавать эти данные по трубе, или что-то в этом роде. Что вы думаете по этому поводу?
Евгений, разобрался! Оказывается все дело в том, что SBUS работает на больших скоростях передачи, чем стояло в сериал мониторе (9600 против 1000000) по этой причине и кракозябры. Теперь сериал показывает вменяемые переменные. Там все ок! Прием/передача данных налажена о чем свидетельствуют цифры на приемопередающих устройствах.
Sent: 89
Спасибо всем за помощь - советы помогли.. отладочный монитор - сила!