Macchina telecondata con Arduino

Macchina Telecomandata con Arduino.

Lo scopo di questo progetto è quello di riciclare una vecchia macchinina telecomandata con telecomando rotto e di aggiornarla dotandola di una scheda di controllo Arduino in modo da poterla controllare tramite Bluetooth e Smartphone.

E’ stata rimossa la scheda originale e sono rimasti i due Motori CC, uno per le ruote posteriori e uno per lo sterzo.

Lo schema utilizzato è il seguente:

Per una guida dettagliata sul pilotaggio dei motori con Arduino potete leggere la nostra guida qui.

Per controllare i motori abbiamo utilizzato un L298N montato con un supporto sopra Arduino.

Questo è il supporto utilizzato (cliccate sulla foto per scaricarlo).

Abbiamo colto l’occasione anche per aggiungere dei Diodi Led per simulare le luci di STOP, Retromarcia e di Posizione.

Come Scheda è stato utilizzato un Funduino che ci permette di collegare direttamente i componenti senza passare per una protoshield.

Come App per lo Smartphone abbiamo utilizzato la nostra Makerslab Robot Control


Clicca sull’immagine per scaricare l’app da Google Play Store

Lo sketch da utilizzare per provarne il funzionamento è il seguente:

#include <SoftwareSerial.h>
#define ENA 11
#define IN1 10
#define IN2 9
#define IN3 8
#define IN4 7
#define ENB 6
#define RX_PIN 2  // arduino Rx   BT Tx
#define TX_PIN 3  // arduino Tx   BT Rx

#define LED_BIA_FR 15 // Pin A1 usato in digitale
#define LED_BIA_PO 17 // Pin A2 usato in digitale
#define LED_VERDE 18  // Pin A3 usato in digitale
#define LED_ROSSO 19  // Pin A4 usato in digitale

int velocita = 255; // velocità motori iniziale

char data;

SoftwareSerial bt =  SoftwareSerial(RX_PIN, TX_PIN);

void vaiAvanti () {
  analogWrite(ENA, velocita); // Attiva il motore A
  digitalWrite(IN1, 0);
  digitalWrite(IN2, 1);
  digitalWrite(IN3, 1);
  digitalWrite(IN4, 0);
  analogWrite(ENB, 0); // Attiva il motore B
  digitalWrite( LED_BIA_PO, LOW);
  digitalWrite( LED_ROSSO, LOW);
}

void vaiAvantiSx () {
  analogWrite(ENA, velocita); // Attiva il motore A
  digitalWrite(IN1, 0);
  digitalWrite(IN2, 1);
  digitalWrite(IN3, 0);
  digitalWrite(IN4, 1);
  analogWrite(ENB, 255); // Attiva il motore B
  digitalWrite( LED_BIA_PO, LOW);
  digitalWrite( LED_ROSSO, LOW);
}

void vaiAvantiDx () {
  analogWrite(ENA, velocita); // Attiva il motore A
  digitalWrite(IN1, 0);
  digitalWrite(IN2, 1);
  digitalWrite(IN3, 1);
  digitalWrite(IN4, 0);
  analogWrite(ENB, 255); // Attiva il motore B
  digitalWrite( LED_BIA_PO, LOW);
  digitalWrite( LED_ROSSO, LOW);
}

void vaiIndietro () {
  analogWrite(ENA, velocita); // Attiva il motore A
  digitalWrite(IN1, 1);
  digitalWrite(IN2, 0);
  digitalWrite(IN3, 0);
  digitalWrite(IN4, 1);
  analogWrite(ENB, 0); // Attiva il motore B
  digitalWrite( LED_BIA_PO, HIGH);
  digitalWrite( LED_ROSSO, LOW);
}

void vaiIndietroSx () {
  analogWrite(ENA, velocita); // Attiva il motore A
  digitalWrite(IN1, 1);
  digitalWrite(IN2, 0);
  digitalWrite(IN3, 0);
  digitalWrite(IN4, 1);
  analogWrite(ENB, 255); // Attiva il motore B
  digitalWrite( LED_BIA_PO, HIGH);
  digitalWrite( LED_ROSSO, LOW);
}

void vaiIndietroDx () {
  analogWrite(ENA, velocita); // Attiva il motore A
  digitalWrite(IN1, 1);
  digitalWrite(IN2, 0);
  digitalWrite(IN3, 1);
  digitalWrite(IN4, 0);
  analogWrite(ENB, 255); // Attiva il motore B
  digitalWrite( LED_BIA_PO, HIGH);
  digitalWrite( LED_ROSSO, LOW);
}

void vaiSinistra () {
  analogWrite(ENA, 0);
  digitalWrite(IN1, 1);
  digitalWrite(IN2, 0);
  digitalWrite(IN3, 0);
  digitalWrite(IN4, 1);
  analogWrite(ENB, 255);
  digitalWrite( LED_BIA_PO, LOW);
}

void vaiDestra () {
  analogWrite(0, velocita);
  digitalWrite(IN1, 0);
  digitalWrite(IN2, 1);
  digitalWrite(IN3, 1);
  digitalWrite(IN4, 0);
  analogWrite(ENB, 255);
  digitalWrite( LED_BIA_PO, LOW);
}

void setup() {
  bt.begin(9600);
  bt.flush();

  pinMode(ENA, OUTPUT);
  pinMode(ENB, OUTPUT);
  pinMode(IN1, OUTPUT);
  pinMode(IN2, OUTPUT);
  pinMode(IN3, OUTPUT);
  pinMode(IN4, OUTPUT);

  analogWrite(ENA, 0); // blocca il motore A
  analogWrite(ENB, 0); // blocca il motore B

  pinMode(LED_ROSSO, OUTPUT);
  pinMode(LED_VERDE, OUTPUT);
  pinMode(LED_BIA_PO, OUTPUT);
  pinMode(LED_BIA_FR, OUTPUT);
}

void loop() {
  if (bt.available() > 0) {
    data = bt.read();
    delay(3);
  }
  switch (data) {
    case'M':
      analogWrite(ENA, 0); // blocca il motore A
      analogWrite(ENB, 0); // blocca il motore B
      digitalWrite( LED_BIA_PO, LOW);
      digitalWrite( LED_ROSSO, HIGH);
      break;
    case 'U':
      vaiAvanti();
      break;
    case 'A':
      vaiAvantiSx();
      break;
    case 'F':
      vaiAvantiDx();
      break;
    case 'D':
      vaiIndietro();
      break;
    case 'C':
      vaiIndietroSx();
      break;
    case 'E':
      vaiIndietroDx();
      break;
    case 'L':
      vaiSinistra();
      break;
    case 'R':
      vaiDestra();
      break;
    case '0':
      velocita = 50;
      break;
    case '1':
      velocita = 100;
      break;
    case '2':
      velocita = 125;
      break;
    case '3':
      velocita = 155;
      break;
    case '4':
      velocita = 180;
      break;
    case '5':
      velocita = 195;
      break;
    case '6':
      velocita = 210;
      break;
    case '7':
      velocita = 225;
      break;
    case '8':
      velocita = 240;
      break;
    case '9':
      velocita = 255;
      break;
    case 'V':
      digitalWrite (LED_BIA_FR, HIGH);
      break;
    case 'v':
      digitalWrite (LED_BIA_FR, LOW);
      break;
    case 'W':
      digitalWrite (LED_VERDE, HIGH);
      break;
    case 'w':
      digitalWrite (LED_VERDE, LOW);
      break;
  }
  bt.flush();
}