Skocz do zawartości

Obsługa przycisków po 2,4 Ghz


Pomocna odpowiedź

Napisano

Witam Serdecznie

Zbudowałem sobie nadajnik i odbiornik 2,4 Ghz z modółem NRF24l01 , sterowanie serwomechanizmami wszystko ładnie pięknie działa , lecz chodzi mi jeszcze o zastosowanie bezprzewodowo 2 przełączników i za nic w świecie nie wiem w jaki sposób to zrobić , przeglądałem fora , kursy i ni jak nie mam pojęcia w jaki sposób to wykonać. Czy moglibyście mi w jakiś sposób wytłumaczyć jak to zrobić , jak wkleić do kodu nadajnika i odbiornika obsługę przycisków ,poniżej podaję kody może komuś się także przyda.

NADAJNIK


#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>

/*Create a unique pipe out. The receiver has to 
 wear the same unique code*/

const uint64_t pipeOut = 0xE8E8F0F0E1LL;

RF24 radio(9, 10); // select  CSN  pin

// The sizeof this struct should not exceed 32 bytes
// This gives us up to 32 8 bits channals
struct MyData {
 byte throttle;
 byte yaw;
 byte pitch;
 byte roll;
 byte AUX1;
 byte AUX2;
};

MyData data;

void resetData() 
{
 //This are the start values of each channal
 // Throttle is 0 in order to stop the motors
 //127 is the middle value of the 10ADC.

 data.throttle = 0;
 data.yaw = 0;
 data.pitch = 0;
 data.roll = 0;
 data.AUX1 = 0;
 data.AUX2 = 0;
}

void setup()
{
 //Start everything up
 radio.begin();
 radio.setAutoAck(false);
 radio.setDataRate(RF24_250KBPS);
 radio.openWritingPipe(pipeOut);
 resetData();
}

/**************************************************/

// Returns a corrected value for a joystick position that takes into account
// the values of the outer extents and the middle of the joystick range.
int mapJoystickValues(int val, int lower, int middle, int upper, bool reverse)
{
 val = constrain(val, lower, upper);
 if ( val < middle )
   val = map(val, lower, middle, 0, 128);
 else
   val = map(val, middle, upper, 128, 255);
 return ( reverse ? 255 - val : val );
}

void loop()
{
 // The calibration numbers used here should be measured 
 // for your joysticks till they send the correct values.
 data.throttle = mapJoystickValues( analogRead(A0), 34, 544, 1020, true );
 data.yaw      = mapJoystickValues( analogRead(A1),  34, 545, 1020, true );
 data.pitch    = mapJoystickValues( analogRead(A2), 12, 544, 1021, true );
 data.roll     = mapJoystickValues( analogRead(A3), 34, 522, 1020, true );
 data.AUX1     = digitalRead(7);
 data.AUX2     = digitalRead(8);

 radio.write(&data, sizeof(MyData));
}

ODBIORNIK




#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
#include <Servo.h>

//Define widths
int pwm_width_2 = 0;
int pwm_width_3 = 0;
int pwm_width_4 = 0;
int pwm_width_5 = 0;
int pwm_width_6 = 0;
int pwm_width_7 = 0;

Servo PWM2;
Servo PWM3;
Servo PWM4;
Servo PWM5;
Servo PWM6;
Servo PWM7;

                   //We could use up to 32 channels
struct MyData {
byte throttle;      //We define each byte of data input, in this case just 6 channels
byte yaw;
byte pitch;
byte roll;
byte AUX1;
byte AUX2;
};
MyData data;


const uint64_t pipeIn = 0xE8E8F0F0E1LL;     //Remember that this code is the same as in the transmitter
RF24 radio(9, 10); 



void resetData()
{
//We define the inicial value of each data input
//3 potenciometers will be in the middle position so 127 is the middle from 254
data.throttle = 1;
data.yaw = 127;
data.pitch = 0;
data.roll = 127;
data.AUX1 = 0;
data.AUX2 = 0;
}

/**************************************************/

void setup()
{
 //Set the pins for each PWM signal
 PWM2.attach(2);
 PWM3.attach(3);
 PWM4.attach(4);
 PWM5.attach(5);
 PWM6.attach(6);
 PWM7.attach(7);

 //Configure the NRF24 module
 resetData();
 radio.begin();
 radio.setAutoAck(false);
 radio.setDataRate(RF24_250KBPS);  
 radio.openReadingPipe(1,pipeIn);

 //we start the radio comunication
 radio.startListening();
}

/**************************************************/

unsigned long lastRecvTime = 0;

void recvData()
{
while ( radio.available() ) {
radio.read(&data, sizeof(MyData));
lastRecvTime = millis(); //here we receive the data
}
}

/**************************************************/

void loop()
{
recvData();
unsigned long now = millis();
//Here we check if we've lost signal, if we did we reset the values 
if ( now - lastRecvTime > 1000 ) {
// Signal lost?
resetData();
}

pwm_width_2 = map(data.throttle, 0, 255, 1000, 2000);     //PWM value on digital pin D2
pwm_width_3 = map(data.yaw,      0, 255, 1000, 2000);     //PWM value on digital pin D3
pwm_width_4 = map(data.pitch,    0, 255, 1000, 2000);     //PWM value on digital pin D4
pwm_width_5 = map(data.roll,     0, 255, 1000, 2000);     //PWM value on digital pin D5
pwm_width_6 = map(data.AUX1,     0, 255, 1000, 2000);     //PWM value on digital pin D6
pwm_width_7 = map(data.AUX2,     0, 255, 1000, 2000);     //PWM value on digital pin D7


//Now we write the PWM signal using the servo function
PWM2.writeMicroseconds(pwm_width_2);
PWM3.writeMicroseconds(pwm_width_3);
PWM4.writeMicroseconds(pwm_width_4);
PWM5.writeMicroseconds(pwm_width_5);
PWM6.writeMicroseconds(pwm_width_6);
PWM7.writeMicroseconds(pwm_width_7);


}//Loop end
/**************************************************/

Wiem że można zastosować ten kod poniżej ale jak go wpisać w nadajnik czy w odbiornik

tego juz nie wiem

PRZYKŁAD


const byte ledPin = 13;
const byte interruptPin = 2;
volatile byte state = LOW;

void setup() {
 pinMode(ledPin, OUTPUT);
 pinMode(interruptPin, INPUT_PULLUP);
 attachInterrupt(digitalPinToInterrupt(interruptPin), blink, CHANGE);
}

void loop() {
 digitalWrite(ledPin, state);
}

void blink() {
 state = !state;
}

Pozdrawiam i proszę w miarę możliwości o pomoc

Na razie to zapomnij w ogóle o WIFI/RF, zajrzyj do podstaw w przykładach Arduino - cały katalog 02 Digital, podepnij sobie dwa przyciski do Arduino (opis podłączenia rezystorów jest w komentarzach), dwa ledy i na takim zestawie potrenuj - wciśnięty, puszczony, długo wciśnięty, dwa wciśnięte, a ledy pokazują co się wydarzyło. Na bazie takiej pierdoły można napisać kilkadziesiąt różnych szkiców. Po kolei szkice Button, Debounce, DigitalInputPullup, po co rezystory podciągające, jakie są wbudowane i jak ich używać. Jak już zrozumiesz jak to działa to możesz sobie użyć biblioteki debouce2 do obsługi przycisków, a potem po prostu rozbudowujesz strukturę MyData o zmienną/zmienne do przycisków (do 8 przycisków wystarczy 1 bajt, możesz też różne klawisze trzymać w różnych bajtach). I tak jak teraz przesyłasz to jednym poleceniem razem z Joyem "radio.write(&data, sizeof(MyData));", po prostu w MyData dodaj sobie kolejne zmienne, ich zapis i odczyt będzie analogiczny jak innych zmiennych tam siedzących, np. data.button1= 0;.

Button to jest naprawdę podstawa podstaw, jak tego nie ogarniesz to każdy kolejny projekt będzie Cię ciurał po glebie.

kaczakat, to walka z wiatrakami więc przygotuj sobie takich tekstów jeszcze wiele na zapas. Specyfika Arduino przyciąga ludzi którzy myślą, że gdy znaleźli jeden gotowy program wykonujący czynność A oraz drugi wykonujący czynność B to teraz już tylko wystarczy je razem połączyć żeby otrzymać obie funkcje działające jednocześnie. Żadna z tych osób nie puknie się w głowę i nie zastanowi, że to może być trudne, że do modyfikacji cudzego kodu trzeba mieć spore umiejętności programowania w danym języku a więc także projektowania programów od zera z uwzględnieniem ograniczeń platformy. I wszystkie te kursy, tłumaczenia i zachęty do własnych prób i samokształcenia jak przysłowiowa krew w piach. Bo przecież to jest proste, gość widział na YT jak dwoma ruchami ktoś zrobił quadrokopter albo co tutaj mamy?.. acha, zdalne przyciski z modułem NRF. Mówi, że "Zbudowałem sobie.. wszystko ładnie pięknie działa" ale zapomniał napisać, że to było kopiowanie na głupa jednocześnie z rozbrajającą szczerością oświadczając, że fora i kursy tylko "przeglądał" zamiast usiąść i poświęcić na to kilka tygodni by zrozumieć. Nie marnuj swojego czasu. Skoro szkoła i dotychczasowe doświadczenia nie nauczyły go jak zdobywać wiedzę, nie ma dla niej szacunku wiec albo podaj gotowca albo jesteś z punktu widzenia Autora bezużyteczny.

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...