mercoledì 28 gennaio 2015

Macchinina telecomandata via Bluetooth:

I miei due nipoti hanno perso il telecomando e la batteria di una macchinina telecomandata e perso una molla dello sterzo, ricostruito la molla con del fil di ferro spesso ho buttato e ricostruito tutta la parte elettronica.

Ho utilizzato:

1 Arduino (io ho utilizzato il mini pro versione tarocca cinese dal costo irrisorio)
1 modulo bluetooth HC-06
1 ponte H (che arriva fino a 800 mA, insufficienti per alimentare il motore avanti/indietro che assorbe circa 2 Ampere)
1 ponte H costruito da me con 2 Relè e 2 transistor per il motore avanti/indietro
Nel mio caso anche la batteria (ho comprato due lipo da una cella ciascuna 300mAh 35C 3,7V da mettere in serie)
Breadboard, cavetteria, ecc
Per l'applicazione bluetooth da usare per pilotare la macchinina contattatemi e ve la spedirò in qualche modo.

Codice Arduino: Version 1.0 (stabile e testata)

#include <SoftwareSerial.h>
SoftwareSerial mySerial(3,2); //RX, TX

//per ricevere valori bluetooth
char val;
char badval;
char valCost; //valore costante che si mantiene, al contrario di val che poi torna ad essere quella specie di "y"

//pin collegati al modulo ultrasuoni
const int TRIG_PIN = 12;
const int ECHO_PIN = 13;

//motor driver
const int AIA = 5;  // (pwm) pin 9 connected to pin A-IA
const int AIB = 6;  // (pwm) pin 5 connected to pin A-IB
const int BIA = 11; // (pwm) pin 10 connected to pin B-IA
const int BIB = 10;  // (pwm) pin 6 connected to pin B-IB

boolean noresult = false;

//temporizzazione per muovere sx o dx
long unsigned int time = millis();
int intervallo = 1000;
boolean azionatotempo = false;
//per ricevere dati ultrasuoni (funzione antiurto)
long durata, distanza;

byte speed = 255;

void setup()
{
  Serial.begin(9600);
  mySerial.begin(9600);
  badval = mySerial.read();
 
  pinMode(AIA, OUTPUT); // set pins to output
  pinMode(AIB, OUTPUT);
  pinMode(BIA, OUTPUT);
  pinMode(BIB, OUTPUT);
}

void loop()
{
  riceviValori();
  if (val != badval)
  {
    valCost = val;
  }
 
  Serial.println("Valcost vale:");
  Serial.println(valCost);
 
  if (valCost == 's' || valCost == badval)
  {
    //disaziono motore avanti/indietro
    disazionoAR();
    disazionoDXSX();
    azionatotempo = false;
  }else if (valCost == 'a')
  {
    //muovo a sx temporizzato
    if (azionatotempo == false)
    {
      time = millis();
      azionatotempo = true;
    }
    if (millis()-time<intervallo)
    {
      //controllo che il motore non sia gia a sx
      sinistra();
    }else
    {
      disazionoDXSX();
    }
    avanti();
  }
  else if (valCost == 'b') //avanti
  {
    avanti();
  }
  else if (valCost == 'c') //avanti a destra
  {
    if (azionatotempo == false)
    {
      time = millis();
      azionatotempo = true;
    }
    if (millis()-time<intervallo)
    {
      //controllo che il motore non sia gia a dx
      destra();
    }else
    {
      disazionoDXSX();
    }
    avanti();
  }
  else if (valCost == 'd') //sinistra
  {
    if (azionatotempo == false)
    {
      time = millis();
      azionatotempo = true;
    }
    if (millis()-time<intervallo)
    {
      //controllo che il motore non sia gia a sx
      sinistra();
    }else
    {
      disazionoDXSX();
    }
  }
  else if (valCost == 'e') //destra
  {
    if (azionatotempo == false)
    {
      time = millis();
      azionatotempo = true;
    }
    if (millis()-time<intervallo)
    {
      //controllo che il motore non sia gia a sx
      destra();
    }else
    {
      disazionoDXSX();
    }
  }
  else if (valCost == 'f') //retro a sinistra
  {
    if (azionatotempo == false)
    {
      time = millis();
      azionatotempo = true;
    }
    if (millis()-time<intervallo)
    {
      //controllo che il motore non sia gia a sx
      sinistra();
    }else
    {
      disazionoDXSX();
    }
    retro();
  }
  else if (valCost == 'g') //retro
  {
    retro();
  }
  else if (valCost == 'h') // retro a destra
  {
    if (azionatotempo == false)
    {
      time = millis();
      azionatotempo = true;
    }
    if (millis()-time<intervallo)
    {
      //controllo che il motore non sia gia a sx
      destra();
    }else
    {
      disazionoDXSX();
    }
    retro();
  }else
  {
    //non faccio proprio niente
  }
 
  /*
  {
    if (velocita < 4)
    {
      velocita++;
      Serial.println(velocita);
    }
  }else if(results.value == 0x83B19366 && noresult == false)
  {
    if (velocita > 1)
    {
      velocita--;
      Serial.println(velocita);
    }
  }*/
}

void riceviValori(){
  val = mySerial.read();   // legge il valore e lo salva nella variabile 'val'
}

void avanti(){
    analogWrite(AIA, speed);
    analogWrite(AIB, 0);
}

void retro(){
    analogWrite(AIA, 0);
    analogWrite(AIB, speed);
}

void sinistra(){
    analogWrite(BIA, 0);
    analogWrite(BIB, speed);
}

void destra(){
    analogWrite(BIA, speed);
    analogWrite(BIB, 0);
}


void disazionoDXSX(){
    analogWrite(BIA, 0);
    analogWrite(BIB, 0);
}

// disaziono Avanti/Retro
void disazionoAR(){
    analogWrite(AIA, 0);
    analogWrite(AIB, 0);
}

void antiUrto(){
    digitalWrite(TRIG_PIN, LOW);
    delayMicroseconds(2);
    digitalWrite(TRIG_PIN, HIGH);
    delayMicroseconds(10);
    digitalWrite(TRIG_PIN, LOW);
    durata = pulseIn(ECHO_PIN,HIGH);
   
    // Converti il tempo in distanza:
    distanza = durata / 29.1 / 2 ;
   
   
    /*if (distanza <= 0){
    Serial.println("Out of range");
    }
    else {
    Serial.print(distanza);
    Serial.println("cm");
    Serial.println();
    }
    delay(1000);*/
}