Introduction: Robot Radio RF With Joystick

A very simple robot commanded by RF remote controll, I use:

For joystik (transmitter)

-arduino nano

-RF module

-connectors

For robot (receiver)

Arduino UNO

-RF module

-Motor scheld

-connector

Step 1: Code for Robot - Reciver or RX

//***********************
// 2 motors and Joystik

// motors on motor sheld

//**********************

//Libbrerie e costanti

#include <VirtualWire.h>

//pin for led

#define LED_pin4 4 // avanti GIALLO go yellow

#define LED_pin5 5 // indietro BLU bo back BLU

#define LED_pin6 6 // destra VERDE right green

#define LED_pin7 7 // sinistra ROSSO left RED

// pin del ricevitore pin of RX

#define RX_pin 2

// pin direzione e velocità del motore sinistro, dir and power of left motor

int pinDirS = 13;

int pinVelS = 11;

// pin direzione e velocità del motore destro,dir and power of right motor

int pinDirD = 12;

int pinVelD = 3;

void setup()

{

Serial.begin(38400);

// PIN PER SEGNALARE QUELLO CHE ARRIVA DAL JOYSTIK ACCENDENDO I LED

// this pin is for see the signal from joystik

pinMode(LED_pin4, OUTPUT);

pinMode(LED_pin5, OUTPUT);

pinMode(LED_pin6, OUTPUT);

pinMode(LED_pin7, OUTPUT);

// spengo tutti i led, all led off

digitalWrite(LED_pin4, LOW);

digitalWrite(LED_pin5, LOW);

digitalWrite(LED_pin6, LOW);

digitalWrite(LED_pin7, LOW);

vw_set_rx_pin(RX_pin);

//Non servirebbe: il default è 11

vw_setup(3000); // Bits per sec vw_rx_start();

// Inizio il processo di ricezione

Serial.println("Ricevitore attivo: ");

// imposto i pin del motore sinistro, left motor

pinMode(pinDirS, OUTPUT);

pinMode(pinVelS, OUTPUT);

// imposto i pin del motore destro, right motor

pinMode(pinDirD, OUTPUT);

pinMode(pinVelD, OUTPUT);

}

void loop(){

uint8_t buf[VW_MAX_MESSAGE_LEN];

uint8_t buflen = VW_MAX_MESSAGE_LEN;

if (vw_get_message(buf, &buflen)) // Non-blocking

{ buf[buflen]='\0'; // Metto il terminatore di stringa

if (strncmp((char *)buf,"Alto",buflen)==0) { avanza();

}

if (strncmp((char *)buf,"Basso",buflen)==0) { indietro();

}

if (strncmp((char *)buf,"Destra",buflen)==0){ giraDX();

}

if (strncmp((char *)buf,"Sinistra",buflen)==0){ giraSX();

}

else if (strncmp((char *)buf,"Bottone",buflen)==0) ferma();

Serial.print("Comando Ricevuto (" +String(buflen)+" car.): ");

Serial.println((char *)buf+String("//"));

}

}

//function

void avanza(){
Serial.println("Avanzo");

digitalWrite(LED_pin4, HIGH); // Accendo il LED 4 giallo

digitalWrite(LED_pin5, LOW); // Spengo il LED 5

digitalWrite(LED_pin6, LOW); // Spengo il LED 6

digitalWrite(LED_pin7, LOW); // Spengo il LED 7

digitalWrite(pinDirS, HIGH);

digitalWrite(pinDirD, HIGH);

analogWrite(pinVelS, 255);

analogWrite(pinVelD, 255);

}

void indietro(){

Serial.println("Indietro");

digitalWrite(LED_pin4, LOW); // Spengo il LED

digitalWrite(LED_pin5, HIGH); // Accendo il LED 5 blu

digitalWrite(LED_pin6, LOW); // Spengo il LED 6

digitalWrite(LED_pin7, LOW); // Spengo il LED 7

digitalWrite(pinDirS, LOW);

digitalWrite(pinDirD, LOW);

analogWrite(pinVelS, 255);

analogWrite(pinVelD, 255);

}

void giraDX(){

Serial.println("Giro a DX");

digitalWrite(LED_pin4, LOW); // Spengo il LED 4

digitalWrite(LED_pin5, LOW); // Spengo il LED 5

digitalWrite(LED_pin6, HIGH); //Accendo il LED 6 verde

digitalWrite(LED_pin7, LOW); // Spengo il LED 7

digitalWrite(pinDirS, LOW);

digitalWrite(pinDirD, HIGH);

analogWrite(pinVelS, 255);

analogWrite(pinVelD, 255);

}

void giraSX(){

Serial.println("Giro a SX");

digitalWrite(LED_pin4, LOW); // Spengo il LED 4

digitalWrite(LED_pin5, LOW); // Spengo il LED 5

digitalWrite(LED_pin6, LOW); // Spengo il LED 6

digitalWrite(LED_pin7, HIGH); //Accendo il LED 7 rosso

digitalWrite(pinDirS, HIGH);

digitalWrite(pinDirD, LOW);

analogWrite(pinVelS, 255);

analogWrite(pinVelD, 255);

}

void ferma(){

Serial.println("Mi fermo");

digitalWrite(LED_pin4, LOW); // Spengo il LED 7

digitalWrite(LED_pin5, LOW); // Spengo il LED 4

digitalWrite(LED_pin6, LOW); // Spengo il LED 6

digitalWrite(LED_pin7, LOW); // Spengo il LED 5

digitalWrite(pinDirS, HIGH);

digitalWrite(pinDirD, HIGH);

analogWrite(pinVelS,0);

analogWrite(pinVelD,0);

}

Step 2: Code for Joystik or TX

#include <VirtualWire.h>

#define TX_pin 12 //pin del trasmettitore

#define LED_pin 10 // pin del led di conferma spedizione

#define asseX A0

#define asseY A1

#define bottone 3

const char *Alto = "Alto";

const char *Basso = "Basso";

const char *Destra = "Destra";

const char *Sinistra = "Sinistra";

const char *Bottone = "Bottone";

void setup() {

Serial.begin(38400);

pinMode(LED_pin,OUTPUT);

pinMode( asseX,INPUT );

pinMode( asseY,INPUT );

pinMode( bottone,INPUT );

digitalWrite(LED_pin, LOW);

vw_set_tx_pin(TX_pin); // Imposto il pin per la trasmissione

vw_setup(9000); // Bits per sec

}

void loop() {

if (analogRead(asseX)<100){ vw_send((uint8_t *)Alto, strlen(Sinistra));

Serial.println( "Sinistra" );

vw_wait_tx(); // Aspetta che il processo in background di spedizione sia completo }

else if (analogRead(asseX)>900){ vw_send((uint8_t *)Destra, strlen(Destra));

Serial.println( "Destra" );

vw_wait_tx(); // Aspetta che il processo in background di spedizione sia completo }

else if (analogRead(asseY)<100){ vw_send((uint8_t *)Basso, strlen(Basso));

Serial.println( "Basso" );

vw_wait_tx(); // Aspetta che il processo in background di spedizione sia completo }

else if (analogRead(asseY)>700){ vw_send((uint8_t *)Alto, strlen(Alto));

Serial.println( "Alto" );

vw_wait_tx(); // Aspetta che il processo in background di spedizione sia completo

digitalWrite(LED_pin, HIGH); }

else if (digitalRead(bottone)==0){ vw_send((uint8_t *)Bottone, strlen(Bottone));

Serial.println( "Bottone" );

vw_wait_tx(); // Aspetta che il processo in background di spedizione sia completo

digitalWrite(LED_pin, HIGH); }

delay( 200 );

}