Esaminare codice per modellino

Buongiorno a tutti.
Volevo realizzare un modellino di aereo telecomandato (vi lascio il link per il tutorial forse potrebbe essere d'aiuto Cheap and Simple Radio Control Making for RC Models. DIY RC 4-Channel - YouTube) e mi sono ritrovato ad esaminare il codice (quello della trasmittente)

// 4 Channel Transmitter | 4 Kanal Verici
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
const uint64_t pipeOut = 0xE9E8F0F0E1LL;   //IMPORTANT: The same as in the receiver 0xE9E8F0F0E1LL | Bu adres alıcı ile aynı olmalı
RF24 radio(7, 8); // select CE,CSN pin | CE ve CSN pinlerin seçimi
struct Signal {
byte throttle;
byte pitch;
byte roll;
byte yaw;
};
Signal data;
void ResetData() 
{
data.throttle = 127; // Motor Stop (254/2=127)| Motor Kapalı (Signal lost position | sinyal kesildiğindeki pozisyon)
data.pitch = 127; // Center | Merkez (Signal lost position | sinyal kesildiğindeki pozisyon)
data.roll = 127; // Center | merkez (Signal lost position | sinyal kesildiğindeki pozisyon)
data.yaw = 127; // Center | merkez (Signal lost position | sinyal kesildiğindeki pozisyon)
}
void setup()
{
//Start everything up
radio.begin();
radio.openWritingPipe(pipeOut);
radio.stopListening(); //start the radio comunication for Transmitter | Verici olarak sinyal iletişimi başlatılıyor
ResetData();
}
// Joystick center and its borders | Joystick merkez ve sınırları
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()
{
// Control Stick Calibration | Kumanda Kol Kalibrasyonları
// Setting may be required for the correct values of the control levers. | Kolların doğru değerleri için ayar gerekebilir.
data.throttle = mapJoystickValues( analogRead(A0), 524, 524, 1015, true );
data.roll = mapJoystickValues( analogRead(A1), 12, 524, 1020, true );      // "true" or "false" for servo direction | "true" veya "false" servo yönünü belirler
data.pitch = mapJoystickValues( analogRead(A2), 12, 524, 1020, true );     // "true" or "false" for servo direction | "true" veya "false" servo yönünü belirler
data.yaw = mapJoystickValues( analogRead(A3), 12, 524, 1020, true );       // "true" or "false" for servo direction | "true" veya "false" servo yönünü belirler
radio.write(&data, sizeof(Signal));
}

E volevo sapere se qualcuno mi potesse spiegare l'ultima parte del codice (per intenderci questa)

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()
{
// Control Stick Calibration | Kumanda Kol Kalibrasyonları
// Setting may be required for the correct values of the control levers. | Kolların doğru değerleri için ayar gerekebilir.
data.throttle = mapJoystickValues( analogRead(A0), 524, 524, 1015, true );
data.roll = mapJoystickValues( analogRead(A1), 12, 524, 1020, true );      // "true" or "false" for servo direction | "true" veya "false" servo yönünü belirler
data.pitch = mapJoystickValues( analogRead(A2), 12, 524, 1020, true );     // "true" or "false" for servo direction | "true" veya "false" servo yönünü belirler
data.yaw = mapJoystickValues( analogRead(A3), 12, 524, 1020, true );       // "true" or "false" for servo direction | "true" veya "false" servo yönünü belirler
radio.write(&data, sizeof(Signal));
}

Soprattutto volevo esaminare attentamente tutta la funzione mapJoystickValues
Spero voi mi possiate aiutare.

La funzione mapJoystickValues() ti serve per mappare i valori del joystick in base ai limiti specificati. La funzione restituisce il valore mappato, eventualmente invertito se reverse è vero.
Nel blocco loop(), hai calibrato e mappato i valori dei joystick letti dai pin analogici (A0, A1, A2, A3) utilizzando la funzione mapJoystickValues(). I valori mappati li hai assegnati alle rispettive variabili di data. La funzione mapJoystickValues() prende in input cinque parametri:

val: il valore del joystick da mappare.
lower: il limite inferiore del range del joystick.
middle: il valore centrale utilizzato per la mappatura.
upper: il limite superiore del range del joystick.
reverse: un flag booleano che indica se il valore mappato deve essere invertito.

La funzione inizia vincolando il valore val all'interno dei limiti lower e upper utilizzando la funzione constrain(). Ciò garantisce che il valore mappato sia compreso all'interno dei limiti specificati.

1 Like

Ciao

Limita val fra lower e upper;
se val<middle, ricampiona val da 0 a 128;
altrimenti ricampiona val da 128 a 255;
reverse è vero? Sì: restituisce 255-val; No: restituisce val.

1 Like

Come dice Datman...
Se il valore vincolato val è inferiore al valore middle, viene utilizzata la funzione map() per mappare il valore da lower a middle nell'intervallo da 0 a 128. Questo significa che i valori inferiori a middle verranno mappati in un range che va da 0 a 128.

Se il valore val è maggiore o uguale a middle, viene utilizzata la funzione map() per mappare il valore da middle a upper nell'intervallo da 128 a 255. In questo caso, i valori maggiori o uguali a middle verranno mappati in un range che va da 128 a 255.

Grazie ma piuttosto quello che volevo sapere io era secondo voi perchè sono state inserite queste righe di codice?

In che senso? Dalla tua domanda mi verrebbe istintivamente di dirti: altrimenti non funziona. :thinking: :wink:

Ecco volevo arrivare qui anche se la domanda può sembrare stupida mettiamo caso che io metta semplicemente un Analogread() cosa dovrebbe succedere

analogRead(pin x) ritorna un valore da 0 a 1023 per le schede con risoluzione a 10 bit e da 0 a 4095 per le schede con risoluzione a 12 bit...nella funzione si fanno una serie di verifiche e quello che ritorna l'hanno già spiegato...poi il resto del programma invia dati e senza sapere cosa succede lato ricevente cosa possiamo dirti?...a te cosa serve?

NO grazie per ora credo di aver capito tutto grazie per la disponibilità😁

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.