Skip to content

Commit

Permalink
add
Browse files Browse the repository at this point in the history
  • Loading branch information
AlexGyver committed Oct 7, 2018
1 parent 4d2074b commit 9da6db5
Show file tree
Hide file tree
Showing 46 changed files with 8,321 additions and 0 deletions.
36 changes: 36 additions & 0 deletions RC_Turrel/README.md
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 added RC_Turrel/drawings/RX.fzz
Binary file not shown.
Binary file added RC_Turrel/drawings/RX_bb.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added RC_Turrel/drawings/TX.fzz
Binary file not shown.
Binary file added RC_Turrel/drawings/TX_bb.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
112 changes: 112 additions & 0 deletions RC_Turrel/firmware/pyroRX/pyroRX.ino
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");
}
}
}
97 changes: 97 additions & 0 deletions RC_Turrel/firmware/pyroTX/pyroTX.ino
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;
}
}

Loading

0 comments on commit 9da6db5

Please sign in to comment.