Skocz do zawartości

Obsługa przycisków po 2,4 Ghz


darex120

Pomocna odpowiedź

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

Link do komentarza
Share on other sites

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.

Link do komentarza
Share on other sites

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.

Link do komentarza
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.