电脑与水枪通信的下位机T端程序

发布于: Mon 21 April 2025
作者 zzcko

类别 Python.

这是下位机的发送端程序,原来的遥控器程序:P

#!python

// 6 Channel Transmitter | 6 Kanal Verici
// KendinYap Channel

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

String res;
int oldangle = 0;
const uint64_t pipeOut = 0xABCDABCD71LL;  // NOTE: The address in the Transmitter and Receiver code must be the same "0xABCDABCD71LL" | Verici ve Alıcı kodundaki adres aynı olmalıdır
RF24 radio(9, 10);                        // select CE,CSN pin | CE ve CSN pinlerin seçimi

struct Signal {
  byte throttle;
  byte pitch;
  byte roll;
  byte yaw;
  byte aux1;
  byte aux2;
};
Signal data;
void ResetData() {
  data.throttle = 0;
  data.pitch = 127;
  data.roll = 127;
  data.yaw = 127;
  data.aux1 = 0;
  data.aux2 = 0;
}
void setup() {
  // Configure the NRF24 module  | NRF24 modül konfigürasyonu
  Serial.begin(115200);
  Serial.println("setup().");
  radio.begin();
  radio.openWritingPipe(pipeOut);
  radio.setChannel(100);
  radio.setAutoAck(false);
  radio.setDataRate(RF24_250KBPS);  // The lowest data rate value for more stable communication  | Daha kararlı iletişim için en düşük veri hızı.
  radio.setPALevel(RF24_PA_MAX);    // Output power is set for maximum range  |  Çıkış gücü maksimum menzil için ayarlanıyor.
  radio.stopListening();            // Start the radio comunication for Transmitter | Verici için sinyal iletişimini başlatır.
  ResetData();
}
// Joystick center and its borders | Joystick merkez ve sınırları
int Border_Map(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() {

  data.roll = Border_Map(analogRead(A3), 0, 512, 1023, true);     // CH1   Note: "true" or "false" for signal direction | "true" veya "false" sinyal yönünü belirler
  data.pitch = Border_Map(analogRead(A0), 0, 512, 1023, true);    // CH2
  data.throttle = Border_Map(analogRead(A2), 0, 340, 570, true);  // CH3   Note: For Single side ESC | Tek yönlü ESC için
  // data.throttle = Border_Map( analogRead(A2),0, 512, 1023, true );  // CH3   Note: For Bidirectional ESC | Çift yönlü ESC için
  data.yaw = Border_Map(analogRead(A1), 0, 512, 1023, false);  // CH4
  data.aux1 = digitalRead(0);                                  // CH5
  data.aux2 = digitalRead(3);                                  // CH6

  // Serial.println(analogRead(A1));
  // Serial.println(data.yaw);
  delay(100);
  if (Serial.available() > 0) res = "";
  while (Serial.available() > 0) {
    // Serial.println(Serial.available(), DEC);
    res += char(Serial.read());
    // Serial.println(res);
  }

  int angle = res.toInt();
  // Serial.println(angle);
  if (angle != oldangle) {
    Serial.println(angle);
    oldangle = angle;
  }

  data.yaw = angle;
  radio.write(&data, sizeof(Signal));
}

链接