-
Notifications
You must be signed in to change notification settings - Fork 109
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
46 changed files
with
8,321 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,36 @@ | ||
# DIY RC FPV rocket turrel | ||
|
||
|
||
## Schemes | ||
![TX](https://github.com/AlexGyver/RC_Turrel/blob/master/%D0%A1%D1%85%D0%B5%D0%BC%D1%8B/TX_bb.png) | ||
|
||
![RX](https://github.com/AlexGyver/RC_Turrel/blob/master/%D0%A1%D1%85%D0%B5%D0%BC%D1%8B/RX_bb.png) | ||
|
||
## Components | ||
* Arduino NANO x2 http://ali.pub/uxbqf | ||
|
||
* RF24 radio x2 http://ali.pub/2cmut | ||
* Power adapter x2 http://ali.pub/ynf1u | ||
* Or this http://ali.pub/uy67g | ||
|
||
* 18650 batteries http://alexgyver.ru/18650/ | ||
* 18650 holder http://ali.pub/0jumn | ||
* DC-DC booster http://ali.pub/m86vt | ||
|
||
* LEDs http://ali.pub/cgqui | ||
* Resistors 220 Ohm http://ali.pub/9suk0 | ||
* Toggles http://ali.pub/iv1p0 | ||
* Joystick http://ali.pub/96qlf | ||
|
||
* Prototype board http://ali.pub/v0rxe | ||
* Mosfets http://ali.pub/s58ow | ||
* Resistors 100 Ohm http://ali.pub/u4jqh | ||
* Terminal http://ali.pub/weq63 | ||
* Wire http://ali.pub/45sw9 | ||
* Servo 180 degree http://ali.pub/crigl | ||
* Servo 360 http://ali.pub/90qsn | ||
|
||
* FPV display http://ali.pub/ihw4c | ||
* FPV camera 3 in 1 http://ali.pub/b32a1 | ||
* Reciever http://ali.pub/mrwo9 | ||
* 3S battery http://ali.pub/u53i8 |
Binary file not shown.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file not shown.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,112 @@ | ||
/* Данный скетч делает следующее: передатчик (TX) отправляет массив | ||
данных, который генерируется согласно показаниям с кнопки и с | ||
двух потенциомтеров. Приёмник (RX) получает массив, и записывает | ||
данные на реле, сервомашинку и генерирует ШИМ сигнал на транзистор. | ||
by AlexGyver 2016 | ||
*/ | ||
|
||
#include <SPI.h> | ||
#include "nRF24L01.h" | ||
#include "RF24.h" | ||
#include <Servo.h> | ||
|
||
Servo servoX, servoY; | ||
|
||
byte MOSFET[12] = {4, 18, 5, 17, 7, 15, 3, 19, 6, 16, 8, 14}; //массив пинов, к которым подключены мосфеты | ||
boolean FLAGS[12]; // массив, хранящий время для таймера каждого мосфета? по умолчанию {0,0,0,0,0,0,0,0} | ||
unsigned long TIMES[12]; // массив, хранящий состояния мосфетов | ||
|
||
int fuse_time = 1800; // время в миллисекундах, которое ток будет подаваться на спираль | ||
byte fuse_number; | ||
boolean launch, launch_flag; | ||
int in_data[3] = {0, 512, 512}; | ||
byte pipeNo; | ||
|
||
RF24 radio(9, 10); // "создать" модуль на пинах 9 и 10 Для Уно | ||
|
||
byte address[][6] = {"1Node", "2Node", "3Node", "4Node", "5Node", "6Node"}; //возможные номера труб | ||
|
||
int posX0 = 1470; // начальное положение серво по оси Х (серво постоянного вращения, покоится на месте) | ||
int posY = 1500; // начальное положение серво по оси Х (серво постоянного вращения, покоится на месте) | ||
int posX; | ||
int errorX, errorY; // переменные для расчёта ошибки | ||
unsigned long last; | ||
|
||
void setup() { | ||
//Serial.begin(9600); //открываем порт для связи с ПК | ||
|
||
servoX.attach(1); | ||
servoY.attach(0); | ||
|
||
// настраиваем пины мосфетов как выходы по массиву | ||
for (int i = 0; i <= 11; i++) { | ||
pinMode(MOSFET[i], OUTPUT); | ||
} | ||
|
||
radio.begin(); //активировать модуль | ||
radio.setAutoAck(1); //режим подтверждения приёма, 1 вкл 0 выкл | ||
radio.setRetries(0, 15); //(время между попыткой достучаться, число попыток) | ||
radio.enableAckPayload(); //разрешить отсылку данных в ответ на входящий сигнал | ||
radio.setPayloadSize(6); //размер пакета, в байтах | ||
|
||
radio.openReadingPipe(1, address[0]); //хотим слушать трубу 0 | ||
radio.setChannel(0x60); //выбираем канал (в котором нет шумов!) | ||
|
||
radio.setPALevel (RF24_PA_MAX); //уровень мощности передатчика. На выбор RF24_PA_MIN, RF24_PA_LOW, RF24_PA_HIGH, RF24_PA_MAX | ||
radio.setDataRate (RF24_1MBPS); //скорость обмена. На выбор RF24_2MBPS, RF24_1MBPS, RF24_250KBPS | ||
//должна быть одинакова на приёмнике и передатчике! | ||
//при самой низкой скорости имеем самую высокую чувствительность и дальность!! | ||
|
||
radio.powerUp(); //начать работу | ||
radio.startListening(); //начинаем слушать эфир, мы приёмный модуль | ||
} | ||
|
||
void loop() { | ||
|
||
if (millis() - last > 3) { | ||
posX = posX0 - errorX / 3; // управляем скоростью вращения сервы по Х | ||
posY = posY - errorY / 300; // управляем скоростью вращения сервы по Y | ||
|
||
posX = constrain(posX, 900, 2000); // ограничиваем текущее положение серв, чтобы не выходило за пределы вращения | ||
posY = constrain(posY, 900, 2000); | ||
|
||
last = millis(); | ||
} | ||
|
||
while ( radio.available(&pipeNo)) { // слушаем эфир со всех труб | ||
radio.read( &in_data, sizeof(in_data) ); // читаем входящий сигнал | ||
|
||
errorX = in_data[0]; // расчёт ошибки, как начальное положение ручки - текущее | ||
errorY = in_data[1]; // расчёт ошибки, как начальное положение ручки - текущее | ||
|
||
servoX.writeMicroseconds(posX); | ||
servoY.writeMicroseconds(posY); | ||
|
||
launch = in_data[2]; | ||
|
||
if (launch == 1 && launch_flag == 0) { | ||
launch_flag = 1; | ||
|
||
if (FLAGS[fuse_number] == 0) { | ||
FLAGS[fuse_number] = 1; // поднять флаг для мосфета, по входящему сигналу | ||
TIMES[fuse_number] = millis(); // запомнить время прихода сигнала | ||
digitalWrite(MOSFET[fuse_number], HIGH); // подать питание на мосфет (на запал) | ||
//Serial.print("Fuse #"); Serial.print(fuse_number); Serial.println(" ON"); | ||
} | ||
fuse_number++; | ||
if (fuse_number > 11) fuse_number = 0; | ||
} | ||
if (launch == 0 && launch_flag == 1) { | ||
launch_flag = 0; | ||
} | ||
|
||
} | ||
|
||
for (int i = 0; i <= 11; i++) { // пройтись по всем 10ти мосфетам | ||
if (millis() - TIMES[i] > fuse_time && FLAGS[i] == 1) { // если время с момента открытия мосфета > заданного | ||
digitalWrite(MOSFET[i], LOW); // закрыть мосфет, погасить запал | ||
FLAGS[i] = 0; | ||
//Serial.print("Fuse #"); Serial.print(i); Serial.println(" OFF"); | ||
} | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,97 @@ | ||
/* | ||
Created 2017 | ||
by AlexGyver | ||
AlexGyver Home Labs Inc. | ||
*/ | ||
#include "Keypad.h" //библиотека клавиатуры | ||
#include <SPI.h> // библиотека для работы с шиной SPI | ||
#include "nRF24L01.h" // библиотека радиомодуля | ||
#include "RF24.h" // ещё библиотека радиомодуля | ||
|
||
RF24 radio(9, 10); // "создать" модуль на пинах 9 и 10 Для Уно | ||
byte address[][6] = {"1Node", "2Node", "3Node", "4Node", "5Node", "6Node"}; //возможные номера труб | ||
|
||
byte redLED = 2; | ||
byte greenLED = 3; | ||
byte ready_toggle = 4; | ||
byte launch_butt = 8; | ||
|
||
byte stickX = 0; | ||
byte stickY = 1; | ||
int stickX0, stickY0; | ||
int errorX, errorY; // переменные для расчёта ошибки | ||
|
||
int check = 111; | ||
|
||
boolean check_answer; | ||
boolean flag, flag_fuse, launch_flag, toggle_flag; | ||
|
||
int out_data[3]; // [номер запала, состояние, позиция Х сервы, позиция У сервы] | ||
|
||
unsigned long last; | ||
|
||
void setup() { | ||
Serial.begin(9600); | ||
|
||
pinMode(redLED, OUTPUT); | ||
pinMode(greenLED, OUTPUT); | ||
digitalWrite(greenLED, HIGH); // зажечь зелёный светодиод | ||
|
||
pinMode(launch_butt, INPUT_PULLUP); | ||
pinMode(ready_toggle, INPUT_PULLUP); | ||
|
||
delay(50); | ||
stickX0 = analogRead(stickX); | ||
delay(50); | ||
stickY0 = analogRead(stickY); | ||
|
||
radio.begin(); //активировать модуль | ||
radio.setAutoAck(1); //режим подтверждения приёма, 1 вкл 0 выкл | ||
radio.setRetries(0, 15); //(время между попыткой достучаться, число попыток) | ||
radio.enableAckPayload(); //разрешить отсылку данных в ответ на входящий сигнал | ||
radio.setPayloadSize(6); //размер пакета, в байтах | ||
|
||
radio.openWritingPipe(address[0]); //мы - труба 0, открываем канал для передачи данных | ||
radio.setChannel(0x60); //выбираем канал (в котором нет шумов!) | ||
|
||
radio.setPALevel (RF24_PA_MAX); //уровень мощности передатчика. На выбор RF24_PA_MIN, RF24_PA_LOW, RF24_PA_HIGH, RF24_PA_MAX | ||
radio.setDataRate (RF24_1MBPS); //скорость обмена. На выбор RF24_2MBPS, RF24_1MBPS, RF24_250KBPS | ||
//должна быть одинакова на приёмнике и передатчике! | ||
//при самой низкой скорости имеем самую высокую чувствительность и дальность!! | ||
|
||
radio.powerUp(); //начать работу | ||
radio.stopListening(); //не слушаем радиоэфир, мы передатчик | ||
} | ||
|
||
void loop() { | ||
if (abs(stickX0 - analogRead(stickX)) > 2) errorX = stickX0 - analogRead(0); else errorX = 0; | ||
if (abs(stickY0 - analogRead(stickY)) > 2) errorY = stickY0 - analogRead(1); else errorY = 0; | ||
|
||
out_data[0] = errorY; | ||
out_data[1] = errorX; | ||
radio.write(&out_data, sizeof(out_data)); | ||
|
||
boolean launch_butt_state = !digitalRead(launch_butt); | ||
boolean toggle_state = !digitalRead(ready_toggle); | ||
|
||
if (launch_butt_state == 1 && launch_flag == 0 && flag == 1) { | ||
out_data[2] = 1; | ||
radio.write(&out_data, sizeof(out_data)); | ||
out_data[2] = 0; | ||
launch_flag = 1; | ||
} | ||
if (launch_butt_state == 0 && launch_flag == 1) { | ||
launch_flag = 0; | ||
} | ||
if (toggle_state == 1) { | ||
digitalWrite(greenLED, LOW); | ||
digitalWrite(redLED, HIGH); | ||
flag = 1; | ||
} | ||
if (toggle_state == 0) { | ||
digitalWrite(greenLED, HIGH); | ||
digitalWrite(redLED, LOW); | ||
flag = 0; | ||
} | ||
} | ||
|
Oops, something went wrong.