NRF вроде как поддерживает аппаратно контроль целостности передаваемых данных, только не знаю поддерживается ли это ардуиновской библиотекой.необходимость контроля целостности передачи,
NRF вроде как поддерживает аппаратно контроль целостности передаваемых данных, только не знаю поддерживается ли это ардуиновской библиотекой.необходимость контроля целостности передачи,
Можно хоть 1мс. Лишь бы передача успевала отправлять.На глаз даже не заметно.Каждые 20мс, тогда задержка будет в +20мс.
Тут жеж получается что нажатие одной кнопки блокирует другие,ниже расположеные в коде.Код gamepad SEGA c nrf24l01
мерцания лампы накаливания вы не видите не потому, что не можете уловить 50 Гц, а в основном потому, что нить лампы за 20мс просто не успевает погаснуть.20мс это 50 Гц. Кто различит отдельные мерцания лампы накаливания?)))
150 мсек это 0,15 секунды. Если я Вас правильно понял. Это чуть менее 7 Герц. Человек различает картинку со сменой кадров вплоть до 300 герц. Но задержек в 20 мкс вполне достаточно для управления в рассматриваемом случае. А вот почему так, сильно долго объяснять и мало кому будет интересно.@te238s, 20мсек - за глаза. У человека средняя реакция на визуальный раздражитель - 150-300мсек, а если еще с распознаванием типа раздражителя - и того больше. Я не понимаю людей, которые гонятся за около-нулевой задержки ввода.
Именно. Коряво выражаясь,пальцы так не могут быстро на кнопки нажимать прибавить ещё энерцию механизмов.А в самодельном пульте оно мало критично и соответственно совсем не нужно.
В принципе так и выходит. Около 150мкс без подтверждения приёма на скорости 2 Мбит/с и spi на 10МГц(что нереально на авр). Да и то,в теории. Никто не знает какие там микросхемы,Китай или Китай В даташите есть подробнейшие и муторные расчёты всех таймингов. Другое дело что нам для "бытовухи" это излишне.Пишут что максимум у nrf24l01 около 6500 пакетов в секунду.
Да, я тоже печатаю 1534 знака в минуту, но такая хня выхордит! (с)Около 150мкс без подтверждения приёма на скорости 2 Мбит/с
Ну да, так и получается, пока одна зажата вторую не нажмёшьТут жеж получается что нажатие одной кнопки блокирует другие,ниже расположеные в коде.
#include <SPI.h>
#include "nRF24L01.h"
#include "RF24.h"
RF24 radio(9, 10);
#define UP_OR_Z 2
#define DOWN_OR_Y 3
#define LEFT_OR_X 4
#define RIGHT_OR_MODE 5
#define B_OR_A 6
#define SEL 7
#define C_OR_START 8
bool sega_up = false;
bool sega_down = false;
bool sega_left = false;
bool sega_right = false;
bool sega_start = false;
bool sega_mode = false;
bool sega_a = false;
bool sega_b = false;
bool sega_c = false;
bool sega_x = false;
bool sega_y = false;
bool sega_z = false;
byte up, down, left, right, start, mode, a, b, c, x, y, z;
byte batton_transmit[12];
void segaRead() {
digitalWrite(SEL, HIGH);
sega_up = (digitalRead(UP_OR_Z) == LOW);
sega_left = (digitalRead(LEFT_OR_X) == LOW);
sega_right = (digitalRead(RIGHT_OR_MODE) == LOW);
sega_down = (digitalRead(DOWN_OR_Y) == LOW);
sega_c = (digitalRead(C_OR_START) == LOW);
sega_b = (digitalRead(B_OR_A) == LOW);
digitalWrite(SEL, LOW);
sega_a = (digitalRead(B_OR_A) == LOW);
sega_start = (digitalRead(C_OR_START) == LOW);
digitalWrite(SEL, HIGH);
digitalWrite(SEL, LOW);
digitalWrite(SEL, HIGH);
digitalWrite(SEL, LOW);
digitalWrite(SEL, HIGH);
sega_x = (digitalRead(LEFT_OR_X) == LOW);
sega_y = (digitalRead(DOWN_OR_Y) == LOW);
sega_z = (digitalRead(UP_OR_Z) == LOW);
sega_mode = (digitalRead(RIGHT_OR_MODE) == LOW);
digitalWrite(SEL, LOW);
digitalWrite(SEL, HIGH);
}
void batton_byte () {
up = sega_up;
left = sega_left;
right = sega_right;
down = sega_down;
start = sega_start;
mode = sega_mode;
a = sega_a;
b = sega_b;
c = sega_c;
x = sega_x;
y = sega_y;
z = sega_z;
}
void setup() {
radio.begin();
radio.setChannel(0x70);
radio.setPALevel (RF24_PA_MAX);
radio.setDataRate (RF24_1MBPS);
radio.openWritingPipe(0x0123456789LL);
radio.powerUp();
radio.stopListening();
pinMode(SEL, OUTPUT);
pinMode(UP_OR_Z, INPUT);
pinMode(DOWN_OR_Y, INPUT);
pinMode(LEFT_OR_X, INPUT);
pinMode(RIGHT_OR_MODE, INPUT);
pinMode(B_OR_A, INPUT);
pinMode(C_OR_START, INPUT);
}
void loop() {
segaRead();
batton_byte();
{
batton_transmit[0] = up;
batton_transmit[1] = left;
batton_transmit[2] = right;
batton_transmit[3] = down;
batton_transmit[4] = start;
batton_transmit[5] = mode;
batton_transmit[6] = a;
batton_transmit[7] = b;
batton_transmit[8] = c;
batton_transmit[9] = x;
batton_transmit[10] = y;
batton_transmit[11] = z;
radio.write(&batton_transmit, sizeof(batton_transmit));
delay(20);
}
}
Ну зачем? Зачем долбить максимальной мощностью для устройства которое по сути находится на паре метров дистанции? Минимальной мощности для домашних устройств - за глаза, да и потребление гораздо меньше будет.radio.setPALevel (RF24_PA_MAX);
О,уже более унивесальный алгоритм. А что за нюансы?Вот что у меня получилось,
но есть нюансы.
Ну я не совсем для домашнего устройства делаю. Машинка RC и на улице может эксплуатироваться.Ну зачем? Зачем долбить максимальной мощностью для устройства которое по сути находится на паре метров дистанции? Минимальной мощности для домашних устройств - за глаза, да и потребление гораздо меньше будет.
Попробовал ещё дописать режим энергоэкономии, как у Гайвера в "заметках ардуинщика".О,уже более унивесальный алгоритм. А что за нюансы?
Пользуясь случаем,хочу замутить ещё алгоритм автоматического поиска наилучшего канала.
void segaRead() {
digitalWrite(SEL, HIGH);
sega_up = (digitalRead(UP_OR_Z) == LOW);
sega_left = (digitalRead(LEFT_OR_X) == LOW);
sega_right = (digitalRead(RIGHT_OR_MODE) == LOW);
sega_down = (digitalRead(DOWN_OR_Y) == LOW);
sega_c = (digitalRead(C_OR_START) == LOW);
sega_b = (digitalRead(B_OR_A) == LOW);
digitalWrite(SEL, LOW);
sega_a = (digitalRead(B_OR_A) == LOW);
sega_start = (digitalRead(C_OR_START) == LOW);
digitalWrite(SEL, HIGH);
digitalWrite(SEL, LOW);
digitalWrite(SEL, HIGH);
digitalWrite(SEL, LOW);
digitalWrite(SEL, HIGH);
sega_x = (digitalRead(LEFT_OR_X) == LOW);
sega_y = (digitalRead(DOWN_OR_Y) == LOW);
sega_z = (digitalRead(UP_OR_Z) == LOW);
sega_mode = (digitalRead(RIGHT_OR_MODE) == LOW);
digitalWrite(SEL, LOW);
digitalWrite(SEL, HIGH);
}
#include <SPI.h>
#include "nRF24L01.h"
#include "RF24.h"
RF24 radio(9, 10);
uint8_t pipe;
bool up, down, left, right, start, mode, a, b, c, x, y, z;
byte batton_transmit[12];
int total_battons;
void batton_bool () {
up = batton_transmit[0];
left = batton_transmit[1];
right = batton_transmit[2];
down = batton_transmit[3];
start = batton_transmit[4];
mode = batton_transmit[5];
a = batton_transmit[6];
b = batton_transmit[7];
c = batton_transmit[8];
x = batton_transmit[9];
y = batton_transmit[10];
z = batton_transmit[11];
}
void setup() {
Serial.begin(57600);
radio.begin();
radio.setChannel(0x70);
radio.setDataRate(RF24_1MBPS);
radio.setPALevel(RF24_PA_MAX);
radio.openReadingPipe(1, 0x0123456789LL);
radio.startListening();
}
void loop() {
batton_bool ();
if (radio.available(&pipe)) {
radio.read(&batton_transmit, sizeof(batton_transmit));
}
Serial.println ("TEST battons");
Serial.println ("SEGA game PAD");
Serial.println ("NRF 24L01 2.4Ghz");
for (int i; i < 12; i++) {
batton_transmit[i];
Serial.print(batton_transmit[i]);
}
Serial.println (" ");
if (up == 1) {
Serial.println ("UP");
} else if (left == 1)
{ Serial.println("LEFT");
} else if (right == 1)
{ Serial.println("RIGHT");
} else if (down == 1)
{ Serial.println("DOWN");
} else if (start == 1)
{ Serial.println("START");
} else if (mode == 1)
{ Serial.println("MODE");
} else if (a == 1)
{ Serial.println("A");
} else if (b == 1)
{ Serial.println("B");
} else if (c == 1)
{ Serial.println("C");
} else if (x == 1)
{ Serial.println("X");
} else if (y == 1)
{ Serial.println("Y");
} else if (z == 1)
Serial.println("Z");
delay(150);
Serial.println("Total buttons game pad");
total_battons = up + down + left + right + start + mode + a + b + c + x + y + z;
Serial.println(total_battons);
}