Paso 3: El control remoto Código
Si fue la manera dura y sucia y había fabricado un tablero del PWB como mina y si todo ha ido bien entonces este código siguiente debería funcionar como un encanto. Si usted fue la manera fácil con fuera de la los tableros fabricados por estante, algunos menores a la edición de código medio podrían necesitar. Este paso asume que estás familiarizado con la programación de Arduino C. Sin importar el código tiene un montón de comentarios que creo que podría ser útil para recorrerlo.---EL CÓDIGO DE CONTROL REMOTO---
incluir el código de biblioteca:
#include < LiquidCrystal.h >
#include < SPI.h >
#include "nRF24L01.h"
#include "RF24.h"
/ *---MI ESTRUCTURAS A LA MEDIDA 'ENVOLVENTE'---* /
estructura para llevar mensajes a
typedef struct {}
int X;
int Y;
Boolean botones [4];
}
Capacidad de carga;
estructura para conseguir
datos telemétricos
typedef struct {}
int rudderAng;
int Z;
int S;
}
Retroalimentación;
/ *---CONTROL VARIABLES RELACIONADAS DE LA BATERÍA---* /
pin analógico lectura V_out/V2 de divisor de tensión
const int battPin = A5;
referencia por defecto en el circuito utilizado (5.0, 3.3, 1.1)
const refV doble = 5.0;
¿Cuántos voltios se enciende 1 medida ADC?
V_incr doble const = refV/1024.0;
valores de las resistencias que se utiliza para el divisor de tensión
const doble R1 = 68,4;
const doble R2 = 46,6;
determinar la relación del divisor de tensión
const doble voltageRatio = (R2 /(R1 + R2));
/ *---VARIABLES DE BOTÓN---* /
botón pin 'pad'
const int buttonPin = A3;
Esquemas de configuración de botón
Pin analógico 5
// |
//Ground--1K--|--------|--------|-------|
// | | | |
btn1 btn2 btn3 btn4
// | | | |
220 Ohmios Ohm 390 680 Ohm de 2,2 K
// |--------|--------|-------|-- +5V
int j = 1;
'j' es el número entero utilizado en análisis de la matriz que designa el número de columna
estas gamas a continuación dependen de los esquemas de arriba y pueden
deben ajustarse manualmente para compensar los varios factores
int tecla [15] [3] = {{1, 836, 840}, / / botón 1
{2, 732, 738,} / / botón 2
{3, 600, 625}, / / botón 3
{4, 310, 335,} / botón 4 /
{5, 890, 900}, / / botón 1 + 2
{6, 870, 880,} / / botón 1 + 3
{7, 840, 860,} / / botón 1 + 4
{8, 810, 830,} / / botón 2 + 3
{9, 760, 780,} / / botón 2 + 4
{10, 665, 685} / / botón de 3 + 4
};
etiqueta de int = 0; por informar de la etiqueta del botón
int contador = 0; Cuántas veces hemos visto un nuevo valor
tiempo = 0; la última vez que el pin de salida fue muestreado
int debounce_count = 5; número de millis, muestras a considerar antes de declarar una entrada debounced
current_state int = 0; el valor de entrada debounced
int ButtonVal;
/* ---------------------------------------------------------------------------------------------------- */
inicializar la biblioteca con los números de los pines de interfaz
LiquidCrystal lcd (8, 7, 5, 4, 3, 2);
inicializar el radio con el CE, números de pin CN
Radio(9,10) de RF24;
const uint64_t tubos [2] = {}
0xF0F0F0F0E1LL, 0xF0F0F0F0D2LL};
OUT-'Paloma'
Paquete de carga útil;
IN-'Paloma'
Telemetría de respuesta;
previousMillis largo = 0;
largo intervalo de tiempo = 25;
/* ---------------------------------------------------------------------------------------------------- */
/ * CONFIGURACIÓN * /
void setup() {}
Serial.Begin(57600);
radio.Begin();
radio.openWritingPipe(pipes[0]);
radio.openReadingPipe(1,pipes[1]);
radio.startListening();
pinMode (buttonPin, entrada);
fijar número la pantalla del LCD de filas y columnas:
LCD.Begin (16, 2);
}
/* ------------------------------------------------------------------------ */
/ *---BIENVENIDO AL BUCLE---* /
/* ------------------------------------------------------------------------ */
void loop() {}
monitor voltaje de la batería mando a distancia
int val = analogRead(battPin);
doble battV = VoltageCheck(val);
paquete. X = analogRead(A0);
Delay(1);
paquete. Y = analogRead(A1);
Delay(1);
/ *---PULSAR UN BOTÓN MANGO---* /
Si hemos ido al siguiente milisegundo
Si (millis()! = tiempo)
{
verificar pin analógico para el valor del botón y guardarlo en ButtonVal
ButtonVal = analogRead(buttonPin);
Delay(1);
Serial.println(ButtonVal); DE DEPURACIÓN
Si (ButtonVal == current_state & & contador > 0)
{
contador--;
}
Si (ButtonVal! = current_state)
{
contador ++;
}
Si ButtonVal ha demostrado lo suficiente vamos al mismo valor para cambiarlo
Si (contador > = debounce_count)
{
Contador = 0;
current_state = ButtonVal;
Comprueba qué botón o combinación de botón ha sido presionado
Si (ButtonVal > 100) {}
ButtonCheck();} Else {}
Package.Buttons[0] = 0;
Package.Buttons[1] = 0;
Package.Buttons[2] = 0;
Package.Buttons[3] = 0;}
}
tiempo = millis();
}
/ *---RADIO 'TORRE' GROUND CONTROL---* /
Si (radio.available())
{
bool = false;
mientras (! hecho)
{
= radio.read (& telemetría, sizeof(telemetrics));
}
radio.stopListening();
bool ok = radio.write (& paquete, sizeof(package));
radio.startListening();
}
/ *---PANTALLA DE LCD DE MANGO---* /
/ * LÍNEA 1 * /
lcd.setCursor(0,0);
hack codificado sucia abajo
if(telemetrics. Z < 100) {}
lcd.setCursor(2,0);
LCD.Print("");
lcd.setCursor(0,0);
}
LCD.Print (telemetría. Z);
lcd.setCursor(6,0);
hack codificado sucia abajo
Si (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 (telemetría. S);
/ * LÍNEA 2 * /
lcd.setCursor (0, 1);
LCD.Print ("X:");
lcd.setCursor (2, 1);
LCD.Print (paquete. X);
lcd.setCursor (6, 1);
LCD.Print ("Y:");
lcd.setCursor (8, 1);
LCD.Print (paquete. Y);
lcd.setCursor(12,1);
LCD.Print(battV);
/* --------------------------------------------------------------------------- */
} / / cierre loop()
/* ------------------------------ HELPING FUNCTIONS ------------------------------ */
leer ese voltaje de la batería
doble VoltageCheck (int v) {}
doble pinV = v * V_incr;
doble volts_in = pinV * 1/voltageRatio;
volver volts_in;
}
comprueba qué botón (o combinación de 2) ha sido presionada, si cualquier...
void ButtonCheck()
{
lazo para el análisis de la matriz de botón.
para (int i = 0; i < = 10; i ++)
{
comprueba la ButtonVal contra los vales altos y bajos en la matriz
Si (ButtonVal > = tecla [i] [j] & & ButtonVal < = Button[i][j+1])
{
almacena el número de botón a una variable
etiqueta = tecla [i] [0];
interruptor (etiqueta) {}
caso 1:
Package.Buttons[0] = 1;
Package.Buttons[1] = 0;
Package.Buttons[2] = 0;
Package.Buttons[3] = 0;
Serial.println ("botón 1");
rotura;
caso 2:
Package.Buttons[0] = 0;
Package.Buttons[1] = 1;
Package.Buttons[2] = 0;
Package.Buttons[3] = 0;
Serial.println ("botón 2");
rotura;
caso 3:
Package.Buttons[0] = 0;
Package.Buttons[1] = 0;
Package.Buttons[2] = 1;
Package.Buttons[3] = 0;
Serial.println ("botón 3");
rotura;
caso 4:
Package.Buttons[0] = 0;
Package.Buttons[1] = 0;
Package.Buttons[2] = 0;
Package.Buttons[3] = 1;
Serial.println ("botón 4");
rotura;
caso 5:
Serial.println ("botón 1 + 2");
Package.Buttons[0] = 1;
Package.Buttons[1] = 1;
Package.Buttons[2] = 0;
Package.Buttons[3] = 0;
rotura;
caso 6:
Serial.println ("botón 1 + 3");
Package.Buttons[0] = 1;
Package.Buttons[1] = 0;
Package.Buttons[2] = 1;
Package.Buttons[3] = 0;
rotura;
caso 7:
Serial.println ("botón 1 + 4");
Package.Buttons[0] = 1;
Package.Buttons[1] = 0;
Package.Buttons[2] = 0;
Package.Buttons[3] = 1;
rotura;
caso 8:
Serial.println ("botón 2 + 3");
Package.Buttons[0] = 0;
Package.Buttons[1] = 1;
Package.Buttons[2] = 1;
Package.Buttons[3] = 0;
rotura;
caso 9:
Serial.println ("botón 2 + 4");
Package.Buttons[0] = 0;
Package.Buttons[1] = 1;
Package.Buttons[2] = 0;
Package.Buttons[3] = 1;
rotura;
caso 10:
Serial.println ("botón 3 + 4");
Package.Buttons[0] = 0;
Package.Buttons[1] = 0;
Package.Buttons[2] = 1;
Package.Buttons[3] = 1;
rotura;
} / / cierre interruptor
}
}
}