RC Boat

Published

Introduction: RC Boat

Hello all,

This is my first instructable, I hope you enjoy :)

in advance sorry for my bad english skill :(

The goal of this project is to have a remote control for a RC boat very fun for children

Vote for me please :)

Step 1: Component and Tools

Component

  • Arduino nano
  • Arduino pro mini 8mhz
  • 2 NRF24L01
  • wire
  • proto board
  • melamine board
  • 2 red LED
  • 2 orange LED
  • 2 green LED
  • 1 blue LED
  • 2 white LED
  • 1 Yellow LED
  • 3 toggle switch
  • 1 Push button
  • Boat bar
  • compressed polystyrene
  • micro servo 9g
  • small brushed motor

Tools

  • soldering Iron
  • Small Cutting pliers
  • Hot glue gun
  • sandpaper
  • cutter
  • wood saw

Step 2: Boat

I wanted a big difference in size between the boat and the remote control

The boat is build around an arduino pro mini 8Mhz

This choice allows me to connect it to a LIPO 3.7 volt

From the polystyrene I cut a rectangle and cut it roughly with the cutter to get the shape of the boat.

Once the rough form is obtained, with sandpaper refine the shape of the boat to have a clean result.

Dig a hole big enough to fit the battery and electronics.

Coming soon: electrical schema

<p>/* Includes ------------------------------------------------------------------*/<br>#include 
#include 
#include 
#include </p><p>/* Ports ---------------------------------------------------------------------*/
//#define CE_PIN 9
//#define CSN_PIN 10
#define CE_PIN 4
#define CSN_PIN 5</p><p>#define LED_ORANGE 2
#define LED_WHITE 3</p><p>#define PIN_GOUVERNAIL 8
#define PIN_MOTEUR 6</p><p>/* nRF24l01 ------------------------------------------------------------------*/
// NOTE: the "LL" at the end of the constant is "LongLong" type
const uint64_t pipe = 0xE8E8F0F0E1LL; // Define the transmit pipe
RF24 radio(CE_PIN, CSN_PIN); // Create a Radio
/* Joystick ------------------------------------------------------------------*/
int joystick[5]; // 2 element array holding Joystick readings
/* ---------------------------------------------------------------------------*/
Servo monServo; </p><p>int counter = 0;
void setup(){
  Serial.begin(9600);
  delay(1000);
  Serial.println("nRF24l01 Receiver Starting");
  radio.begin();
  radio.setRetries(0, 15);
  radio.setPALevel(RF24_PA_HIGH);
  radio.openReadingPipe(1,pipe);
  radio.startListening();</p><p>  monServo.attach(PIN_GOUVERNAIL);
  pinMode(PIN_MOTEUR,OUTPUT);
  pinMode(LED_ORANGE,OUTPUT);
  pinMode(LED_WHITE,OUTPUT);
  pinMode(10,OUTPUT); //on prépare le pin 3 en mode sortie
}
 </p><p>void loop(){
    
  if ( radio.available() )
  {
    // Read the data payload until we've received everything
    bool done = false;
    while (!done)
    {
    // Fetch the data payload
      done = radio.read(joystick, sizeof(joystick));
      Serial.print("X = ");
      Serial.print(joystick[0]);
      Serial.print(" Y = ");      
      Serial.println(joystick[1]);</p><p>      int dir = map(joystick[0], 0, 1024, 130, 80);
      //int acc = map(map(joystick[1], 512, 1024, 0, 512), 0,512, 0,200); //crawler radio
      int acc = map(joystick[1], 0, 100, 0, 200);
    
      monServo.write(dir);
      analogWrite(PIN_MOTEUR, acc);</p><p>      if(joystick[2] == 1) {
        analogWrite(LED_ORANGE, 200);
      } else {
        analogWrite(LED_ORANGE, 0);
      }
      
      if(joystick[3] == 1) {
        analogWrite(LED_WHITE, 200);
      } else {
        analogWrite(LED_WHITE, 0);
      }</p><p>      
      if(joystick[4] == 1) {
        buzzer();
      } else {
        digitalWrite(10, 0);
      }</p><p>      delay(50);
    }
    counter = 0;
  }
  else
  {    
    if(++counter>10) {
      Serial.println("No radio available");
      monServo.write(105);
      analogWrite(PIN_MOTEUR, 0);
      digitalWrite(10, 0);
    }else {
      delay(100);
    }
  }
}</p><p>int p=50;
void buzzer()
{
  p--; // on incémente p à chaque boucle de loop();
  if (p<10){ // teste la limite de p
    p=50; // on le remet à 10
  }
  digitalWrite(10,0); // état bas
  delayMicroseconds(p); //on attend p milli-secondes
  digitalWrite(10,1); // état haut
  delayMicroseconds(p); // on attend p millisecondes
}</p>

Step 3: Remote Control

The goal of the remote control is to offer a design same to a boat

A big Bar

A progressive accelerator

A bare graph bind to accelerator

push button and toggle switch for interact with boat

coming soon : electrical shema

/* Includes ------------------------------------------------------------------*/
#include #include #include #include

/* Ports ---------------------------------------------------------------------*/ #define CE_PIN 9 #define CSN_PIN 10 #define ACC_POTAR A1

/*threadhold*/ #define MIN_POTAR_VAL 48 #define MAX_POTAR_VAL 341

/* nRF24l01 ------------------------------------------------------------------*/ // NOTE: the "LL" at the end of the constant is "LongLong" type const uint64_t pipe = 0xE8E8F0F0E1LL; // Define the transmit pipe RF24 radio(CE_PIN, CSN_PIN); // Create a Radio /* Joystick ------------------------------------------------------------------*/ int joystick[5]; // 2 element array holding Joystick readings /* ---------------------------------------------------------------------------*/ Encoder myEnc(3, 4);

int barreValue = 512;

#define NB_LED 6 int ledPins[] = { A3, A2, 5, 6, 7, 8 };

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

radio.begin(); radio.setRetries(0, 15); radio.setPALevel(RF24_PA_HIGH); radio.openWritingPipe(pipe);

barreValue = 512;

for (int thisLed = 0; thisLed < NB_LED; thisLed++) { pinMode(ledPins[thisLed], OUTPUT); } } void loop(){ updateBarre();

joystick[0] = barreValue;// analogRead(JOYSTICK_X); joystick[1] = map(analogRead(ACC_POTAR), MIN_POTAR_VAL, MAX_POTAR_VAL, 0, 100); joystick[2] = 0; joystick[3] = 0; joystick[4] = 0; //joystick[1] = analogRead(ACC_POTAR); Serial.print("Valeur lue : "); Serial.println(joystick[1]); updateBarrGraph(); radio.write( joystick, sizeof(joystick) ); delay(100); }

void updateBarrGraph() { // map the result to a range from 0 to the number of LEDs: int ledLevel = (map(joystick[1], 0, 100, 0, NB_LED+1));

// loop over the LED array: for (int thisLed = 0; thisLed < NB_LED; thisLed++) { // if the array element's index is less than ledLevel, // turn the pin for this element on: if (thisLed < ledLevel) { digitalWrite(ledPins[thisLed], HIGH); } // turn off all pins higher than the ledLevel: else { digitalWrite(ledPins[thisLed], LOW); } } }

void updateBarre() { barreValue += 10 * getSensRotation();

if(barreValue > 1023) { barreValue = 1023; } else if(barreValue < 0){ barreValue = 0; } }

long oldPosition = -9999; int8_t getSensRotation() { long newPosition = myEnc.read(); if (newPosition != oldPosition) { Serial.println(newPosition); }

int val = oldPosition - newPosition; oldPosition = newPosition; return val;

if(newPosition > oldPosition){ oldPosition = newPosition; return 1; } else if(newPosition < oldPosition){ oldPosition = newPosition; return -1; } oldPosition = newPosition; return 0; }

Share

    Recommendations

    • Oil Contest

      Oil Contest
    • Water Contest

      Water Contest
    • Creative Misuse Contest

      Creative Misuse Contest

    6 Discussions

    Can you please upload photos of motor and shaft mounting?

    1 reply

    I have added two photos of motor and micro servo.

    The motor is directly in water

    That looks like a fun toy :) You should upload the code to program it

    1 reply

    thank for reply :) ,

    yes I planned to share the code . I need to polish it before.