RC svävare + Customized fjärrkontroll (3 / 8 steg)
Steg 3: Fjärrkontroll koden
Om du gick på hårt & rörigt sätt och tillverkat en PCB ombord som mig och om alla ja då gick denna koden nedan bör fungera som smort. Om du gick på enkelt sätt med off the kan shelf per-fabricerade styrelser några mindre till medelstora kodredigering krävas. Detta steg förutsätter att du är bekant med Arduino C-programmering. Oavsett har koden massor av kommentarer som jag tror kan vara bra att navigera den.---REMOTE CONTROLLER KODEN---
inkludera bibliotek-koden:
#include < LiquidCrystal.h >
#include < SPI.h >
#include "nRF24L01.h"
#include "RF24.h"
/ *---MIN SKRÄDDARSYDDA "KUVERT" STRUCTS---* /
struct att bära meddelanden
TypeDef struct {
int X;
int Y;
booleska knappar [4].
}
Nyttolast;
struct att få
telemetriska data
TypeDef struct {
int rudderAng;
int Z;
int S;
}
Feedback;
/ *---BATTERI ÖVERVAKNING RELATERADE VARIABLER---* /
analoga pin läser V_out/V2 från spänningsavdelare
CONST int battPin = A5;
standard referens på krets används (5.0, 3.3, 1.1)
CONST double refV = 5.0;
Hur många volt gör 1 ADC åtgärd?
CONST double V_incr = refV/1024.0;
värden av motstånd används för spänningsavdelare
CONST double R1 = 68,4;
CONST double R2 = 46,6;
bestämma spänningsavdelare förhållandet
CONST double voltageRatio = (R2 /(R1 + R2));
/ *---KNAPP-RELATERADE VARIABLER---* /
knappen 'pad' pin
CONST int buttonPin = A3;
Knappen Inställningar scheman
Analoga stift 5
// |
//Ground--1K--|--------|--------|-------|
// | | | |
Knp1 btn2 btn3 btn4
// | | | |
220 Ohm 390 ohms 680 Ohm 2.2K
// |--------|--------|-------|-- +5V
int j = 1;
"j" är det heltal som används i scanning matrisen utse kolumnnummer
dessa intervall nedan beroende på scheman över och kan
måste justeras manuellt för att kompensera för olika faktorer
int knappen [15] [3] = {{1, 836, 840}, / / knapp 1
{2, 732, 738}, / / knappen 2
{3, 600, 625,} / / knapp 3
{4, 310, 335}, / / knappen 4
{5, 890, 900}, / / knappen 1 + 2
{6, 870, 880}, / / knappen 1 + 3
{7, 840, 860}, / / knappen 1 + 4
{8, 810, 830}, / / knappen 2 + 3
{9, 760, 780}, / / knappen 2 + 4
{10, 665, 685} / / knapp 3 + 4
};
int etikett = 0; för rapportering av knappetiketten
int counter = 0; Hur många gånger har vi sett nya värdet
lång tid = 0; sista gången utgångsstiftet samplades
int debounce_count = 5; många millis/prov att tänka på innan om att förklara en debounced ingång
int current_state = 0; debounced indatavärdet
int ButtonVal;
/* ---------------------------------------------------------------------------------------------------- */
initiera bibliotek med numrerar av gränssnittet stiften
LiquidCrystal lcd (8, 7, 5, 4, 3, 2);
initiera radio med CE, CN pin-koder
RF24 radio(9,10);
CONST uint64_t rör [2] = {
0xF0F0F0F0E1LL, 0xF0F0F0F0D2LL};
UT-"duva"
Nyttolast paketet;
IN-"duva"
Feedback telemetrics;
lång previousMillis = 0;
långa intervall = 25;
/* ---------------------------------------------------------------------------------------------------- */
/ * SETUP * /
void setup() {
Serial.BEGIN(57600);
radio.BEGIN();
radio.openWritingPipe(pipes[0]);
radio.openReadingPipe(1,pipes[1]);
radio.startListening();
pinMode (buttonPin, ingång);
Ange den LCD antal kolumner och rader:
LCD.BEGIN (16, 2);
}
/* ------------------------------------------------------------------------ */
/ *---VÄLKOMMEN TILL SLINGAN---* /
/* ------------------------------------------------------------------------ */
void loop() {
övervaka batterispänningen på fjärrkontrollen
int val = analogRead(battPin);
Double battV = VoltageCheck(val);
paketet. X = analogRead(A0);
Delay(1);
paketet. Y = analogRead(A1);
Delay(1);
/ *---HANDTAG KNAPPTRYCKNINGAR---* /
Om vi har gått vidare till nästa millisekund
om (millis()! = tid)
{
Kolla analoga pin för värdet knapp och spara den på ButtonVal
ButtonVal = analogRead(buttonPin);
Delay(1);
Serial.println(ButtonVal); DEBUG
om (ButtonVal == current_state & & counter > 0)
{
räknaren--;
}
om (ButtonVal! = current_state)
{
räknaren ++;
}
Om ButtonVal har visat samma värde för tillräckligt länge låt oss byta det
om (counter > = debounce_count)
{
räknare = 0;
current_state = ButtonVal;
Kontrollerar vilka knappen eller knappen combo har tryckts
om (ButtonVal > 100) {
ButtonCheck();} annat {
Package.buttons[0] = 0;
Package.buttons[1] = 0;
Package.buttons[2] = 0;
Package.buttons[3] = 0;}
}
tid = millis();
}
/ *---RADIO "TORNET" GROUND CONTROL---* /
om (radio.available())
{
bool = false;
medan (! gjort)
{
klart = radio.read (& telemetrics, sizeof(telemetrics));
}
radio.stopListening();
bool ok = radio.write (& paketet, sizeof(package));
radio.startListening();
}
/ *---HANDTAG LCD UPPVISNING---* /
/ * LINJE 1 * /
lcd.setCursor(0,0);
smutsiga hårdkodade hacka nedan
IF(telemetrics. Z < 100) {
lcd.setCursor(2,0);
LCD.Print("");
lcd.setCursor(0,0);
}
LCD.Print (telemetrics. Z);
lcd.setCursor(6,0);
smutsiga hårdkodade hacka nedan
om (telemetrics.rudderAng < 100) {
lcd.setCursor(8,0);
LCD.Print("");
lcd.setCursor(6,0);
}
LCD.Print(telemetrics.rudderAng);
lcd.setCursor(12,0);
IF(telemetrics. S < 100) {
lcd.setCursor(14,0);
LCD.Print("");
lcd.setCursor(12,0);
}
LCD.Print (telemetrics. S);
/ * LINJE 2 * /
lcd.setCursor (0, 1);
LCD.Print ("X:");
lcd.setCursor (2, 1);
LCD.Print (paketet. X);
lcd.setCursor (6, 1);
LCD.Print ("y");
lcd.setCursor (8, 1);
LCD.Print (paketet. Y);
lcd.setCursor(12,1);
LCD.Print(battV);
/* --------------------------------------------------------------------------- */
} / / nära loop()
/* ------------------------------ HELPING FUNCTIONS ------------------------------ */
läsa att batterispänningen
dubbel VoltageCheck (int v) {
dubbel pinV = v * V_incr;
Double volts_in = pinV * 1/voltageRatio;
återvända volts_in;
}
kontrollerar vilka knappen (eller combo 2) har tryckts, om någon...
void ButtonCheck()
{
slinga för skanning knappen matrisen.
för (int jag = 0; jag < = 10; i ++)
{
kontrollerar ButtonVal mot höga och låga vales i matrisen
om (ButtonVal > = knappen [i] [j] & & ButtonVal < = Button[i][j+1])
{
sparar den knappen nummer till en variabel
etikett = knappen [i] [0];
Växla (etikett) {
fall 1:
Package.buttons[0] = 1;
Package.buttons[1] = 0;
Package.buttons[2] = 0;
Package.buttons[3] = 0;
Serial.println ("knappen 1");
bryta;
fall 2:
Package.buttons[0] = 0;
Package.buttons[1] = 1;
Package.buttons[2] = 0;
Package.buttons[3] = 0;
Serial.println ("knappen 2");
bryta;
fall 3:
Package.buttons[0] = 0;
Package.buttons[1] = 0;
Package.buttons[2] = 1;
Package.buttons[3] = 0;
Serial.println ("knapp 3");
bryta;
fall 4:
Package.buttons[0] = 0;
Package.buttons[1] = 0;
Package.buttons[2] = 0;
Package.buttons[3] = 1;
Serial.println ("knapp 4");
bryta;
fall 5:
Serial.println ("knappen 1 + 2");
Package.buttons[0] = 1;
Package.buttons[1] = 1;
Package.buttons[2] = 0;
Package.buttons[3] = 0;
bryta;
fall 6:
Serial.println ("knappen 1 + 3");
Package.buttons[0] = 1;
Package.buttons[1] = 0;
Package.buttons[2] = 1;
Package.buttons[3] = 0;
bryta;
fall 7:
Serial.println ("knappen 1 + 4");
Package.buttons[0] = 1;
Package.buttons[1] = 0;
Package.buttons[2] = 0;
Package.buttons[3] = 1;
bryta;
mål 8:
Serial.println ("knappen 2 + 3");
Package.buttons[0] = 0;
Package.buttons[1] = 1;
Package.buttons[2] = 1;
Package.buttons[3] = 0;
bryta;
mål 9:
Serial.println ("knappen 2 + 4");
Package.buttons[0] = 0;
Package.buttons[1] = 1;
Package.buttons[2] = 0;
Package.buttons[3] = 1;
bryta;
mål 10:
Serial.println ("knapp 3 + 4");
Package.buttons[0] = 0;
Package.buttons[1] = 0;
Package.buttons[2] = 1;
Package.buttons[3] = 1;
bryta;
} / / nära switch
}
}
}