Welcome to Hackster!
Hackster is a community dedicated to learning hardware, from beginner to pro. Join us, it's free!
MisterBotBreak
Published

How to Make an Arduino Submarine Part.1

This project will show you how to make an Arduino submarine.

IntermediateWork in progress1 hour3,460

Things used in this project

Hardware components

Arduino Nano R3
Arduino Nano R3
×1
Female/Female Jumper Wires
Female/Female Jumper Wires
×1
Arduino Nano extension board
×1
nRF24l01 PA-LNA
×1
SG90 Micro-servo motor
SG90 Micro-servo motor
×2
MG996R
×1
Power adapter 5-36V
×1
9V battery (generic)
9V battery (generic)
×4
Battery wires
×1
Glass Jar
Hull of submarine. Glass Jar 2L "Korken" LInk related : IKEA US IKEA France : https://www.ikea.com/fr/fr/p/korken-bocal-avec-couvercle-verre-transparent-90213549/
×1
Syringe
×1
Curved Magnet
×1
Magnets
Magnets used for this project aren't available so you'll make some modifications to adapt 3D files.
×1
Machine Screw, M3
Machine Screw, M3
Depends on what you have. If you need to buy them, M3x30 or/and M3x10
×1
Weights
×1

Software apps and online services

Arduino IDE
Arduino IDE
Fusion
Autodesk Fusion
(optional : not mandatory but recommended) SolidWorks, Tinkercad can be used too

Hand tools and fabrication machines

3D Printer (generic)
3D Printer (generic)
Soldering iron (generic)
Soldering iron (generic)
Solder Wire, Lead Free
Solder Wire, Lead Free

Story

Read more

Code

Emmitter Code | Check up "How to make a RC Controller"

Arduino
#include <Mirf.h>
#include <nRF24L01.h>
#include <MirfHardwareSpiDriver.h>
#include <SPI.h>
#include <RF24.h>
#include <Elegoo_GFX.h>
#include <Elegoo_TFTLCD.h>
#include <TouchScreen.h>


#define LCD_CS A3
#define LCD_CD A2
#define LCD_WR A1
#define LCD_RD A0
#define LCD_RESET A4


#define BLACK 0x0000
#define BLUE 0x001F
#define RED 0xF800
#define GREEN 0x07E0
#define CYAN 0x07FF
#define MAGENTA 0xF81F
#define YELLOW 0xFFE0
#define WHITE 0xFFFF
#define ORANGE 0xFA60
#define LIME 0x07FF
#define ORANGE1 ((255 / 8) << 11) | ((165 / 4) << 5) | (0 / 8)
#define ORANGE2 ((255 / 8) << 11) | ((187 / 4) << 5) | (61 / 8)
#define ORANGE3 ((255 / 8) << 11) | ((201 / 4) << 5) | (102 / 8)
#define BLUE1 ((2 / 8) << 11) | ((9 / 4) << 5) | (219 / 8)
#define BLUE2 ((36 / 8) << 11) | ((43 / 4) << 5) | (253 / 8)
#define BLUE3 ((103 / 8) << 11) | ((108 / 4) << 5) | (254 / 8)
#define DARKBLUE1 ((2 / 8) << 11) | ((8 / 4) << 5) | (185 / 8)
#define DARKBLUE2 ((1 / 8) << 11) | ((5 / 4) << 5) | (118 / 8)
#define RED1 ((255 / 8) << 11) | ((0 / 4) << 5) | (0 / 8)
#define RED2 ((255 / 8) << 11) | ((61 / 4) << 5) | (61 / 8)
#define RED3 ((255 / 8) << 11) | ((122 / 4) << 5) | (122 / 8)
#define CACTUS1 ((196 / 8) << 11) | ((235 / 4) << 5) | (20 / 8)
#define CACTUS2 ((217 / 8) << 11) | ((242 / 4) << 5) | (103 / 8)
#define CACTUS3 ((231 / 8) << 11) | ((247 / 4) << 5) | (158 / 8)
#define YELLOW1 ((235 / 8) << 11) | ((254 / 4) << 5) | (1 / 8)
#define YELLOW2 ((239 / 8) << 11) | ((254 / 4) << 5) | (62 / 8)
#define YELLOW3 ((244 / 8) << 11) | ((254 / 4) << 5) | (123 / 8)
#define MAGENTA1 ((245 / 8) << 11) | ((0 / 4) << 5) | (245 / 8)
#define MAGENTA2 ((255 / 8) << 11) | ((82 / 4) << 5) | (255 / 8)
#define MAGENTA3 ((255 / 8) << 11) | ((184 / 4) << 5) | (255 / 8)
#define CYAN1 ((0 / 8) << 11) | ((255 / 4) << 5) | (255 / 8)
#define CYAN2 ((122 / 8) << 11) | ((255 / 4) << 5) | (255 / 8)
#define CYAN3 ((204 / 8) << 11) | ((255 / 4) << 5) | (255 / 8)
#define PINK1 ((230 / 8) << 11) | ((7 / 4) << 5) | (92 / 8)
#define PINK2 ((249 / 8) << 11) | ((60 / 4) << 5) | (132 / 8)
#define PINK3 ((251 / 8) << 11) | ((131 / 4) << 5) | (177 / 8)
#define GREEN1 ((15 / 8) << 11) | ((186 / 4) << 5) | (15 / 8)
#define GREEN2 ((36 / 8) << 11) | ((238 / 4) << 5) | (36 / 8)
#define GREEN3 ((103 / 8) << 11) | ((243 / 4) << 5) | (103 / 8)
#define GREY1 ((128 / 8) << 11) | ((128 / 4) << 5) | (128 / 8)
#define GREY2 ((168 / 8) << 11) | ((168 / 4) << 5) | (168 / 8)
#define GREY3 ((200 / 8) << 11) | ((200 / 4) << 5) | (200 / 8)
#define PURPLE1 ((92 / 8) << 11) | ((0 / 4) << 5) | (92 / 8)
#define PURPLE2 ((133 / 8) << 11) | ((0 / 4) << 5) | (133 / 8)
#define PURPLE3 ((173 / 8) << 11) | ((0 / 4) << 5) | (173 / 8)
#define BROWN1 ((41 / 8) << 11) | ((10 / 4) << 5) | (10 / 8)
#define BROWN2 ((73 / 8) << 11) | ((19 / 4) << 5) | (19 / 8)
#define BROWN3 ((106 / 8) << 11) | ((27 / 4) << 5) | (27 / 8)
#define BROWN4 ((138 / 8) << 11) | ((35 / 4) << 5) | (35 / 8)
#define BROWN5 ((171 / 8) << 11) | ((43 / 4) << 5) | (43 / 8)
#define BROWN6 ((203 / 8) << 11) | ((52 / 4) << 5) | (52 / 8)
#define BROWN7 ((212 / 8) << 11) | ((84 / 4) << 5) | (84 / 8)
#define BEIGE1 ((221 / 8) << 11) | ((221 / 4) << 5) | (136 / 8)
#define BEIGE2 ((230 / 8) << 11) | ((230 / 4) << 5) | (168 / 8)
#define BEIGE3 ((235 / 8) << 11) | ((235 / 4) << 5) | (184 / 8)


#define YP A2
#define XM A3
#define YM 8
#define XP 9

TouchScreen ts = TouchScreen(XP, YP, XM, YM, 400);
Elegoo_TFTLCD tft(LCD_CS, LCD_CD, LCD_WR, LCD_RD, LCD_RESET);

TSPoint p;

int data[6];
int infos[6];

int xjoy1, yjoy1, xjoy2, yjoy2;
float angley1 = 0;
float angley2 = 0;

short menu = 0;
short startingmenuvariable = 0;
short menulaunch = 0;

int timer = 0;
int timer2 = 0;
int delaybutton4, delaybutton5;
int avoidlag = 0;

double connecterror = 0;
double turn = 0;
double connectionvalue = 0;

//template C
int flaps = 0;
int pwmthrust = 0;

//template D
int dataOldValues = 0;


void setup() {
  Serial.begin(9600);

  tft.reset();
  tft.begin(0x9341);
  tft.fillScreen(BLACK);
  tft.setRotation(3);

  Mirf.cePin = 10;
  Mirf.csnPin = 11;
  Mirf.spi = &MirfHardwareSpi;
  Mirf.init();

  Mirf.channel = 1;
  Mirf.payload = sizeof(int) * 6;
  Mirf.config();

  Mirf.setTADDR((byte *)"nrf02");
  Mirf.setRADDR((byte *)"nrf01");

  data[4] = 0;
  data[5] = 0;
}


void menuAstatis() {
  tft.fillCircle(40, 0, 100, MAGENTA);
  tft.fillCircle(280, 0, 25, YELLOW);
  tft.fillRect(21, 21, 79, 80, BLACK);
  tft.fillRect(121, 21, 79, 80, BLACK);

  tft.drawCircle(65, 170, 40, WHITE);
  tft.drawCircle(175, 170, 40, WHITE);
  tft.fillRect(10, 110, 200, 30, BLACK);
  tft.fillRect(10, 200, 200, 40, BLACK);
  tft.fillCircle(100, 240, 30, CYAN);

  tft.drawRect(20, 20, 80, 81, WHITE);
  tft.drawRect(120, 20, 80, 81, WHITE);
  tft.setCursor(220, 35);
  tft.setTextColor(RED);
  tft.setTextSize(1);
  tft.println("PWM5 :");
  tft.setCursor(220, 55);
  tft.println("PWM6 :");
  tft.setCursor(220, 75);
  tft.println("PWM9 :");
  tft.setCursor(215, 95);
  tft.println("PWM10 :");

  tft.setTextColor(GREEN3);
  tft.setCursor(45, 150);
  tft.println("Angle X");
  tft.setCursor(155, 150);
  tft.println("Angle Y");

  if (avoidlag == 0) {
    tft.fillRoundRect(245, 120, 55, 40, 3, RED);
    tft.fillRoundRect(248, 123, 49, 34, 3, BLACK);
  } else {
    tft.fillRoundRect(245, 120, 55, 40, 3, GREEN);
    tft.fillRoundRect(248, 123, 49, 34, 3, BLACK);
  }

  tft.fillRoundRect(245, 180, 55, 40, 3, RED);
  tft.fillRoundRect(248, 183, 49, 34, 3, BLACK);
  tft.setTextSize(1);
  tft.setCursor(263, 195);
  tft.setTextColor(CYAN);
  tft.println("Back ");
}

void menuA() {


  if (infos[0] > 179) {
    infos[0] = 179;
  }
  if (infos[1] > 179) {
    infos[1] = 179;
  }
  if (infos[2] > 179) {
    infos[2] = 179;
  }
  if (infos[3] > 179) {
    infos[3] = 179;
  }
  tft.fillCircle(xjoy1, yjoy1, 2, BLACK);
  tft.fillCircle(xjoy2, yjoy2, 2, BLACK);

  tft.fillRect(54, 170, 20, 10, BLACK);
  tft.fillRect(164, 170, 20, 10, BLACK);
  tft.fillRect(259, 34, 24, 71, BLACK);

  xjoy1 = map(data[1], 0, 1024, 31, 89);
  yjoy1 = map(data[0], 1024, 0, 31, 89);
  tft.fillCircle(xjoy1, yjoy1, 2, BLUE);
  xjoy2 = map(data[3], 0, 1024, 131, 189);
  yjoy2 = map(data[2], 1024, 0, 31, 89);
  tft.fillCircle(xjoy2, yjoy2, 2, BLUE);

  timer2++;
  if (timer2 > 30) {
    timer2 = 20;
  }

  if (p.z > ts.pressureThreshhold && p.x < 350 && p.y > 300) {
    if (avoidlag == 1 && timer2 >= 20) {
      avoidlag = 0;
      tft.fillRect(49, 119, 140, 10, BLACK);
      tft.fillRoundRect(245, 120, 55, 40, 3, RED);
      tft.fillRoundRect(248, 123, 49, 34, 3, BLACK);
      timer2 = 0;
    }
    if (avoidlag == 0 && timer2 >= 20) {
      avoidlag = 1;
      tft.setTextSize(1);
      tft.setCursor(50, 120);
      tft.setTextColor(RED3);
      tft.println("[Avoid lag] activated !");
      tft.fillRoundRect(245, 120, 55, 40, 3, GREEN);
      tft.fillRoundRect(248, 123, 49, 34, 3, BLACK);
      timer2 = 0;
    }
  }

  if (avoidlag == 0) {
    tft.setTextColor(GREEN1);
    tft.setCursor(60, 170);
    tft.println(infos[4]);
    tft.setCursor(170, 170);
    tft.println(infos[5]);

    tft.setCursor(260, 35);
    tft.setTextColor(RED);
    tft.setTextSize(1);
    tft.println(infos[0]);
    tft.setCursor(260, 55);
    tft.println(infos[1]);
    tft.setCursor(260, 75);
    tft.println(infos[2]);
    tft.setCursor(260, 95);
    tft.println(infos[3]);
  } else if (avoidlag == 1) {
  }
}


void menuBstatis() {
  tft.fillCircle(50, 0, 80, PINK1);

  tft.fillCircle(240, 20, 130, ORANGE);

  tft.fillRect(31, 31, 114, 115, BLACK);
  tft.fillRect(176, 31, 114, 115, BLACK);

  tft.drawRect(30, 30, 115, 116, WHITE);
  tft.drawRect(175, 30, 115, 116, WHITE);
  tft.setCursor(40, 160);
  tft.setTextColor(CYAN);
  tft.setTextSize(1);
  tft.println("X:");
  tft.setCursor(40, 175);
  tft.println("Y:");
  tft.setCursor(160, 160);
  tft.println("X:");
  tft.setCursor(160, 175);
  tft.println("Y:");
  tft.fillRoundRect(39, 199, 62, 32, 3, WHITE);
  tft.fillRoundRect(139, 199, 62, 32, 3, WHITE);

  if (data[4] == 1) {
    tft.fillRoundRect(41, 201, 58, 28, 3, GREEN);
  } else {
    tft.fillRoundRect(41, 201, 58, 28, 3, RED);
  }

  if (data[5] == 1) {
    tft.fillRoundRect(141, 201, 58, 28, 3, GREEN);
  } else {
    tft.fillRoundRect(141, 201, 58, 28, 3, RED);
  }

  tft.fillRoundRect(245, 180, 55, 40, 3, RED);
  tft.fillRoundRect(248, 183, 49, 34, 3, BLACK);
  tft.setTextSize(1);
  tft.setCursor(263, 195);
  tft.setTextColor(CYAN);
  tft.println("Back ");
}

void menuB() {
  tft.drawCircle(xjoy2, yjoy2, 4, BLACK);
  tft.drawCircle(xjoy1, yjoy1, 4, BLACK);
  tft.fillRect(54, 159, 26, 25, BLACK);
  tft.fillRect(174, 159, 26, 25, BLACK);


  xjoy1 = map(data[1], 0, 1024, 41, 134);
  yjoy1 = map(data[0], 1024, 0, 41, 134);
  tft.drawCircle(xjoy1, yjoy1, 4, BLUE);
  xjoy2 = map(data[3], 0, 1024, 186, 279);
  yjoy2 = map(data[2], 1024, 0, 41, 134);
  tft.drawCircle(xjoy2, yjoy2, 4, BLUE);
  tft.setCursor(55, 160);
  tft.setTextColor(CYAN);
  tft.setTextSize(1);
  tft.println(data[1]);
  tft.setCursor(55, 175);
  tft.println(data[0]);
  tft.setCursor(175, 160);
  tft.println(data[3]);
  tft.setCursor(175, 175);
  tft.println(data[2]);


  if (timer <= 100) {
    timer++;
  }
  if (p.z > ts.pressureThreshhold) {
    if (p.x > 700 && p.y < 300 && data[4] == 1 && timer >= 5) {
      data[4] = 0;
      tft.fillRoundRect(41, 201, 58, 28, 3, RED);
      timer = 0;
    } else {
    }
    if (p.x > 700 && p.y < 300 && data[4] == 0 && timer >= 5) {
      data[4] = 1;
      tft.fillRoundRect(41, 201, 58, 28, 3, GREEN);
      timer = 0;
    } else {
    }
    if (p.x < 700 && p.y < 300 && data[5] == 1 && timer >= 5) {
      data[5] = 0;
      tft.fillRoundRect(141, 201, 58, 28, 3, RED);
      timer = 0;
    } else {
    }
    if (p.x < 700 && p.y < 300 && data[5] == 0 && timer >= 5) {
      data[5] = 1;
      tft.fillRoundRect(141, 201, 58, 28, 3, GREEN);
      timer = 0;
    } else {
    }
  }
}

void menuCstatis() {

  tft.fillRoundRect(245, 180, 55, 40, 3, RED);
  tft.fillRoundRect(248, 183, 49, 34, 3, BLACK);
  tft.setTextSize(1);
  tft.setCursor(263, 195);
  tft.setTextColor(CYAN);
  tft.println("Back ");


  tft.drawRoundRect(245, 30, 55, 30, 7, WHITE);
  tft.drawRoundRect(245, 60, 55, 30, 7, WHITE);
  tft.drawRoundRect(245, 90, 55, 30, 7, WHITE);
  tft.drawRoundRect(245, 120, 55, 30, 7, WHITE);
  tft.fillRect(255, 58, 35, 70, BLACK);
  tft.setTextSize(1);
  tft.setTextColor(WHITE);
  tft.setCursor(270, 42);
  tft.println("0");
  tft.setCursor(270, 72);
  tft.println("1");
  tft.setCursor(270, 102);
  tft.println("2");
  tft.setCursor(270, 132);
  tft.println("3");

  tft.setTextSize(1);
  tft.setTextColor(YELLOW);
  tft.setCursor(260, 10);
  tft.println("Flaps");

  tft.drawRoundRect(160, 30, 60, 40, 5, WHITE);
  tft.setCursor(172, 13);
  tft.println("Thrust");

  tft.drawRoundRect(160, 100, 60, 40, 5, WHITE);
  tft.setCursor(179, 83);
  tft.println("Roll");

  tft.drawRoundRect(160, 170, 60, 40, 5, WHITE);
  tft.setCursor(176, 153);
  tft.println("Pitch");
  
  
  tft.drawRoundRect(30, 180, 60, 40, 5, WHITE);
  tft.setCursor(30, 162);
  tft.println("Connection");

  tft.drawRect(30, 30, 110, 110, WHITE);
}

void menuC() {

  tft.fillCircle(xjoy1, yjoy1, 2, BLACK);
  tft.fillRect(181, 44, 18, 8, BLACK);
  tft.fillRect(181, 114, 18, 8, BLACK);
  tft.fillRect(181, 184, 18, 8, BLACK);
  tft.fillRect(49, 195, 25, 8, BLACK);

  if (p.z > ts.pressureThreshhold) {
    if (p.x < 430 && p.x > 280) {
      if (p.y > 720 && p.y < 830) {
        flaps = 0;
        tft.drawRoundRect(249, 124, 47, 23, 5, BLACK);
        tft.drawRoundRect(249, 94, 47, 23, 5, BLACK);
        tft.drawRoundRect(249, 64, 47, 23, 5, BLACK);
        tft.drawRoundRect(249, 34, 47, 23, 5, BLUE3);
      }
      if (p.y > 610 && p.y < 719) {
        flaps = 1;
        tft.drawRoundRect(249, 124, 47, 23, 5, BLACK);
        tft.drawRoundRect(249, 94, 47, 23, 5, BLACK);
        tft.drawRoundRect(249, 34, 47, 23, 5, BLACK);
        tft.drawRoundRect(249, 64, 47, 23, 5, BLUE3);
      }
      if (p.y > 500 && p.y < 609) {
        flaps = 2;
        tft.drawRoundRect(249, 124, 47, 23, 5, BLACK);
        tft.drawRoundRect(249, 64, 47, 23, 5, BLACK);
        tft.drawRoundRect(249, 34, 47, 23, 5, BLACK);
        tft.drawRoundRect(249, 94, 47, 23, 5, BLUE3);
      }
      if (p.y > 380 && p.y < 499) {
        flaps = 3;
        tft.drawRoundRect(249, 34, 47, 23, 5, BLACK);
        tft.drawRoundRect(249, 64, 47, 23, 5, BLACK);
        tft.drawRoundRect(249, 94, 47, 23, 5, BLACK);
        tft.drawRoundRect(249, 124, 47, 23, 5, BLUE3);
      }
    }
  }

  xjoy1 = map(data[1], 0, 1024, 33, 137);
  yjoy1 = map(data[0], 1024, 0, 33, 136);
  tft.fillCircle(xjoy1, yjoy1, 2, BLUE);

  tft.setTextColor(YELLOW);
  tft.setCursor(182, 45);
  tft.println(infos[3]);  //pwmthrust infos[0]
  tft.setCursor(182, 115);
  tft.println(infos[4]);  //Roll infos[1]
  tft.setCursor(182, 185);
  tft.println(infos[5]);  // Pitch infos[2]
  if(connectionvalue>=0.75){
  tft.setTextColor(GREEN);
  }
  if(connectionvalue<0.75 && connectionvalue>=0.40){
  tft.setTextColor(YELLOW);
  }
  if(connectionvalue<0.40){
  tft.setTextColor(RED);
  }
  tft.setCursor(50, 196);
  tft.println(connectionvalue);  // Pitch infos[2]

  data[3] = 0;
  data[4] = flaps;
  data[5] = 0;
}

void menuDstatis() {
   tft.fillRoundRect(245, 180, 55, 40, 3, RED);
  tft.fillRoundRect(248, 183, 49, 34, 3, BLACK);
  tft.setTextSize(1);
  tft.setCursor(263, 195);
  tft.setTextColor(CYAN);
  tft.println("Back ");

tft.drawRoundRect(30, 30, 150, 60, 3, WHITE);
tft.drawRoundRect(30, 110, 150, 20, 3, WHITE);
tft.setTextSize(1);
 
  tft.setTextColor(YELLOW);
  tft.drawRoundRect(30, 170, 60, 40, 5, WHITE);
  tft.setCursor(30, 152);
  tft.println("Connection");

  tft.drawRoundRect(250, 30, 20, 88, 2, WHITE);

 
}

void menuD() {


tft.fillCircle(map(data[1], 0, 1024, 34, 176), 120, 2, BLACK);
tft.fillCircle(map(data[1], 0, 1024, 34, 176), 120, 2, CYAN);

  data[1] = map(data[1], 0, 1024, -5, 5);//horizontal
  data[0] = map(data[0], 0, 1024, -5, 5);//vertical
  data[2] = map(data[2], 0, 1024, 2, -3);
if(dataOldValues!=data[2]){
 switch(dataOldValues){
    case -2 : 
    tft.fillRoundRect(252, 32, 16, 15, 2, BLACK); break;
    case -1 : 
    tft.fillRoundRect(252, 49, 16, 15, 2, BLACK); break;
    case 0 : 
    tft.fillRoundRect(252, 66, 16, 15, 2, BLACK); break;
    case 1 : 
    tft.fillRoundRect(252, 83, 16, 15, 2, BLACK); break;
    case 2 : 
    tft.fillRoundRect(252, 100, 16, 15, 2, BLACK); break;
    default:
    break;
  }

  switch(data[2]){
    case -2 : 
    tft.fillRoundRect(252, 32, 16, 15, 2, CYAN); break;
    case -1 : 
    tft.fillRoundRect(252, 49, 16, 15, 2, CYAN); break;
    case 0 : 
    tft.fillRoundRect(252, 66, 16, 15, 2, CYAN); break;
    case 1 : 
    tft.fillRoundRect(252, 83, 16, 15, 2, CYAN); break;
    case 2 : 
    tft.fillRoundRect(252, 100, 16, 15, 2, CYAN); break;
    default : 
    break;
  }
}






dataOldValues = data[2];
}



void menuCharactsstatis() {

  tft.fillScreen(BLACK);

  tft.fillCircle(320, 0, 150, BLUE);
  tft.fillCircle(0, 160, 80, GREEN);
  tft.fillCircle(140, 240, 50, RED);

  tft.setCursor(60, 20);
  tft.setTextColor(CYAN);
  tft.setTextSize(1);
  tft.println("Remote Controller Characteristics");
  tft.setCursor(10, 50);
  tft.setTextColor(WHITE);
  tft.println("This controller transmits data using a");
  tft.setCursor(245, 50);
  tft.setTextColor(RED);
  tft.println("nRF24l01");
  tft.setCursor(10, 65);
  tft.setTextColor(RED);
  tft.println("radio module.");
  tft.setCursor(10, 90);
  tft.setTextColor(WHITE);
  tft.println("Packet sent : data, array (6 * int) ");
  tft.setCursor(10, 105);
  tft.println("Packet received : infos, array (6 * int) ");

  tft.setCursor(10, 125);
  tft.println("By default, infos[0,1,2,3] are associated with PWMs");
  tft.setCursor(10, 140);
  tft.println("while infos[4,5] are angles (gyroscope).");
  tft.setCursor(10, 155);
  tft.println("Template A is especially for drone driving.");

  tft.setCursor(10, 175);
  tft.println("CE : D10");
  tft.setCursor(10, 190);
  tft.println("CSN : D11");
  tft.setCursor(100, 175);
  tft.println("MOSI : D51");
  tft.setCursor(100, 190);
  tft.println("MISO : D50");
  tft.setCursor(10, 205);
  tft.println("SCK : D52");


  tft.fillRoundRect(245, 180, 55, 40, 3, RED);
  tft.fillRoundRect(248, 183, 49, 34, 3, BLACK);
  tft.setTextSize(1);
  tft.setCursor(263, 195);
  tft.setTextColor(CYAN);
  tft.println("Back ");
}


void menuCharacts() {
}

void menuXstatis() {
  //put all static elements of your patern here
}

void menuX() {
  //put all dynamic elements of your patern here
}

void startingmenustatis() {
  tft.drawRoundRect(20, 60, 130, 40, 3, WHITE);
  tft.drawRoundRect(170, 60, 130, 40, 3, WHITE);
  tft.drawRoundRect(20, 120, 130, 40, 3, WHITE);
  tft.drawRoundRect(170, 120, 130, 40, 3, WHITE);
  tft.drawRoundRect(20, 180, 205, 40, 3, WHITE);
  tft.setCursor(18, 20);
  tft.setTextColor(CYAN);
  tft.setTextSize(1);
  tft.println("Choose your template for this remote controler !");

  tft.setCursor(51, 67);
  tft.setTextColor(RED);
  tft.println("Template A");
  tft.setCursor(53, 85);
  tft.println("(standart)");
  tft.setCursor(203, 75);
  tft.setTextColor(ORANGE);
  tft.println("Template B");
  tft.setCursor(51, 135);
  tft.setTextColor(YELLOW);
  tft.println("Template C");
  tft.setCursor(203, 135);
  tft.setTextColor(GREEN);
  tft.println("Template D");
  tft.setCursor(51, 195);
  tft.setTextColor(MAGENTA);
  tft.println("Technical Characteristics");

  tft.fillRoundRect(245, 180, 55, 40, 3, RED);
  tft.fillRoundRect(248, 183, 49, 34, 3, BLACK);
  tft.setTextSize(1);
  tft.setCursor(263, 195);
  tft.setTextColor(CYAN);
  tft.println("Back ");
}



void loop() {

  data[0] = analogRead(A8);
  data[1] = analogRead(A9);
  data[2] = analogRead(A10);
  data[3] = analogRead(A11);



  digitalWrite(13, HIGH);
  p = ts.getPoint();
  digitalWrite(13, LOW);
  pinMode(XM, OUTPUT);
  pinMode(YP, OUTPUT);


  if (startingmenuvariable == 0 && menu == 0) {
    startingmenustatis();
    startingmenuvariable = 1;
  }
  if (menu > 0 && p.x < 350 && p.y < 300) {
    tft.fillScreen(BLACK);
    startingmenustatis();
    menu = 0;
    menulaunch = 0;
  }



  if (p.z > ts.pressureThreshhold) {
    if (menu == 0 || menulaunch == 0) {
      if (p.y > 550 && p.x > 600) {
        menu = 1;
      }
      if (p.y > 550 && p.x < 600) {
        menu = 2;
      }
      if (550 > p.y && p.y > 340 && p.x > 600) {
        menu = 3;
      }
      if (550 > p.y && p.y > 340 && p.x < 600) {
        menu = 4;
      }
      if (p.y < 340 && p.x > 400) {
        menu = 5;
      }
    }
  }


  if (menu == 1 && menulaunch != 1) {
    tft.fillScreen(BLACK);
    menuAstatis();
    menulaunch = 1;
  }
  if (menu == 1) {
    menuA();
  }
  if (menu == 2 && menulaunch != 2) {
    tft.fillScreen(BLACK);
    menuBstatis();
    menulaunch = 2;
  }
  if (menu == 2) {
    menuB();
  }
  if (menu == 3 && menulaunch != 3) {
    tft.fillScreen(BLACK);
    menuCstatis();
    menulaunch = 3;
  }
  if (menu == 3) {
    menuC();
  }
  if (menu == 4 && menulaunch != 4) {
    tft.fillScreen(BLACK);
    menuDstatis();
    menulaunch = 4;
  }
  if (menu == 4) {
    menuD();
  }
  if (menu == 5 && menulaunch != 5) {
    tft.fillScreen(BLACK);
    menuCharactsstatis();
    menulaunch = 5;
  }
  if (menu == 5) {
    menuCharacts();
  }


  /*PROGRAM YOUR OWN PATERN HERE : X = the patern' letter / x = the patern' number
  
   if(menu==x && menulaunch != x){
  tft.fillScreen(BLACK);
  menuBstatis();
  menulaunch = x;
 }
 if(menu==x){
  menuX();
 }
  */




  if (Mirf.dataReady()) {
    Mirf.getData((byte *)&infos);
   /* Serial.println(infos[0]);
    Serial.println(infos[1]);
    Serial.println(infos[2]);
    Serial.println(infos[3]);
    Serial.println(infos[4]);
    Serial.println(infos[5]);*/
  }
  else if(!Mirf.dataReady()){
  connecterror = connecterror + 1;
  }

  turn++;
  if(turn>=20.0){
  connectionvalue = 1-(connecterror/turn);
  turn=0;
  connecterror=0;
  Serial.println(connectionvalue);
  }
  delay(5);

  
  Mirf.send((byte *)&data);
  while (Mirf.isSending());
}

Submarine Code

Arduino
#include "Servo.h"
#include <SPI.h>      
#include <Mirf.h>    
#include <nRF24L01.h> 
#include <MirfHardwareSpiDriver.h> 
#include "Wire.h"  
#include "I2Cdev.h"  

Servo servorightleft;
Servo servoballast;

int data[6];
int infos[6];
int pwmrightleft = 0;
int pwmballast = 0;
int iballast = 90;
int irightleft = 90;

float error = 0;
float turn = 0;



void setup() {
  
  //Serial.begin(9600);
  Wire.begin();  
  
  Mirf.cePin = 3; 
  Mirf.csnPin = 4; 
  Mirf.spi = &MirfHardwareSpi; 
  Mirf.init(); 

  Mirf.channel = 1; 
  Mirf.payload = sizeof(int) * 6; 
  Mirf.config(); 

  Mirf.setTADDR((byte *) "nrf01"); 
  Mirf.setRADDR((byte *) "nrf02"); 

  servorightleft.attach(6);
  servoballast.attach(5);

  pinMode(8,OUTPUT);
  
}

void loop() {

 
infos[0] = servoballast.read();
infos[1] = servorightleft.read(); 
infos[2] = 0;
infos[3] = 0;
infos[4] = 0;
infos[5] = 0;


Mirf.send((byte *) &infos); 
while(Mirf.isSending()); 
delay(20);

if(Mirf.dataReady()){
Mirf.getData((byte *) &data); 
}
else{
  error++;
}
turn++;


if(turn==50){
 if((error/turn)*100 >= 95){
  digitalWrite(8,0);
  delay(1000);
  Mirf.init();
  delay(1000);
  Mirf.config();
}
 turn=0;
 error=0;
}


if(data[2]>0){
   pwmballast = 145;
}
if(data[2]<0){
  pwmballast = 35;
}
if(data[2]==0){
  pwmballast = 90;
}
if(servoballast.read()<=pwmballast && iballast!=pwmballast){
  iballast++;
  servoballast.write(iballast);
}
if(servoballast.read()>=pwmballast && iballast!=pwmballast){
  iballast--;
  servoballast.write(iballast);
}



pwmrightleft = map(data[1], -5, 3, 45, 135);
if(data[1]==0){
  servorightleft.write(90);
}
if(servorightleft.read()<=pwmrightleft && irightleft!=pwmrightleft){
  irightleft++;
  servorightleft.write(irightleft);
}
if(servorightleft.read()>=pwmrightleft && irightleft!=pwmrightleft){
  irightleft--;
  servorightleft.write(irightleft);
}


if(data[0]>2){
  digitalWrite(8, 1);
}
else{
  digitalWrite(8,0);
}


if(data[4]==1){
  servoballast.write(35);
  servorightleft.write(90);
  digitalWrite(8,0);
}


}

Credits

MisterBotBreak
48 projects • 152 followers
I love electronics and cats :D !
Contact

Comments

Please log in or sign up to comment.