Aiuto modica codice.

Ciao raga, vorrei costruire una macchina bluetooth comandata da android racimolando una vecchia macchina rc cinese con due motori. Siccome non ho dimestichezza con il codice ho trovato questo progetto: Konstantinos Kokoras: Arduino Bluetooth Android Remote Control Car
Dovrei approdare delle modifiche al codice originale perchè il tizio usa 2 ponti ad H uno per il motore posteriore (avanti/indietro) e uno per quello anteriore (sterzata), io a casa dispongo di un solo ponte L298 che è capace di pilotare 2 motori e vorrei utilizzare solo quello è possibile?
Poi nel progetto ci sono led e buzzer per la musica, siccome non mi servono vorrei toglierli completamente. Il codice l'ho allegato al topic oppure è nel link del progetto.

Utilizzerei arduino Uno e bluetooth HC-05, però per quel bluetooth i pin rx e tx di arduino non funzionano e quindi devo usare la software serial su altri 2 pin. Chi può aiutarmi?

sketch_jan06a.ino (9.58 KB)

Nessuno sa aiutarmi? =(

Togli dal codice tutte le parti che non ti interessano e ripubblicalo.
Il L298 lo colleghi così --> http://pgdev.pighixxx.com/ABC/SET/s12.pdf
Ma l'L298 è sfuso o su shield?

Su quali pin è collegato il Bluetooth? Hai un modulo o una shield?

Allora il codice l'ho modificato e tolto tutta la parte riguardante buzzer e led.

L'298 è quello su shield uguale a quello che ho allegato.
Il bluetooth è su breackboard e porta i seguenti pin RX-TX-3.3V-5V-GND-KEY. Come si procede ora?

macchinina.ino (6.08 KB)

L298-schematic.pdf (159 KB)

datasheet.pdf (217 KB)

WarOfDevil:
Utilizzerei arduino Uno e bluetooth HC-05, però per quel bluetooth i pin rx e tx di arduino non funzionano e quindi devo usare la software serial su altri 2 pin. Chi può aiutarmi?

E dove è il problema ??? :astonished:

Dichiari una tua seriale virtuale con un qualche cosa tipo :

#define  BT_RX 10            // PIN to receive from bluetooth
#define  BT_TX 11            // PIN TO transmit to bluetooth

SoftwareSerial btSerial(BT_RX, BT_TX);

... al HC-05 dai il +5, il GND e attacchi il suo TX al RX che hai creato (es. pin 10) ed il suo RX al TX che hai creato (es. pin 11), dopo di che ... usi la seriale virtuale come una normale seriale ... es :

btSerial.begin(9600);
...
btSerial.println("test");
...

La sintassi per la SoftwareSerial la trovi QUI.

Guglielmo

Sisi la parte sul softare serial e sul bluetooth è fatta. Mi rimane solo da vedere se devo editare il codice per usare un solo L298.

No, devo solo impostare correttamente i collegamenti alla scheda
Ho modificato qualche virgola.

#include <SoftwareSerial.h>
#define RxD 10
#define TxD 11

int recvChar;
const int motor_forw_back1 = 5;
const int motor_forw_back2 = 6;
const int motor_left_right1 = 9;
const int motor_left_right2 = 10;

const int bat_Voltmeter_pin = A0;
float R1 = 4610.0;
float R2 = 4650.0;

int pwm_percent;
int pwm_value;
int pwm_steer;
int pwm_steer_delay;

unsigned long echo_millis, current_millis;

SoftwareSerial blueToothSerial(RxD,TxD);

void setup()
{
  Serial.begin(38400);
  pinMode(RxD, INPUT);
  pinMode(TxD, OUTPUT);

  pinMode(3,OUTPUT);
  pinMode(motor_forw_back1, OUTPUT);
  digitalWrite(motor_forw_back1,LOW);
  pinMode(motor_forw_back2, OUTPUT);
  digitalWrite(motor_forw_back2,LOW);

  pinMode(motor_left_right1, OUTPUT);
  digitalWrite(motor_left_right1,LOW);
  pinMode(motor_left_right2, OUTPUT);
  digitalWrite(motor_left_right2,LOW);

  pinMode(bat_Voltmeter_pin,INPUT);

  pwm_percent = 60;
  pwm_value = (int)((255 * pwm_percent)/100);
  pwm_steer = 150;
  pwm_steer_delay = 120;

  echo_millis=0;
  current_millis=0;

  blueToothSerial.begin(38400);
}


void loop()
{
  current_millis = millis();

  if (current_millis-echo_millis > 4000) {
    //recvChar=0;
    echo_millis = current_millis;
    Serial.println("Remote Control out of range...");
    digitalWrite(motor_forw_back1,HIGH);
    digitalWrite(motor_forw_back2,HIGH);
    digitalWrite(motor_left_right1,HIGH);
    digitalWrite(motor_left_right2,HIGH);
  }

  if (blueToothSerial.available()){  
    recvChar = blueToothSerial.read();
    //Serial.print(recvChar);

    switch(recvChar){
    case 0:
      // ALL STOP
      digitalWrite(motor_forw_back1,HIGH);
      digitalWrite(motor_forw_back2,HIGH);
      digitalWrite(motor_left_right1,HIGH);
      digitalWrite(motor_left_right2,HIGH);
      Serial.println("Stop - Straight");
      break;

    case 1:
      // FORWARD
      digitalWrite(motor_forw_back1,LOW);
      analogWrite(motor_forw_back2,pwm_value);
      digitalWrite(motor_left_right1,HIGH);
      digitalWrite(motor_left_right2,HIGH);
      Serial.print("Forward - Straight @ ");
      Serial.print(pwm_percent);
      Serial.println("%");
      break;

    case 2:
      // BACKWARD
      digitalWrite(motor_forw_back2,LOW);
      analogWrite(motor_forw_back1,pwm_value);
      digitalWrite(motor_left_right1,HIGH);
      digitalWrite(motor_left_right2,HIGH);
      Serial.print("Backward - Straight @ ");
      Serial.print(pwm_percent);
      Serial.println("%");
      break;

    case 4:
      // FORWARD - LEFT
      digitalWrite(motor_forw_back1,LOW);
      analogWrite(motor_forw_back2,pwm_value);
      digitalWrite(motor_left_right2,LOW);
      digitalWrite(motor_left_right1,HIGH);
      delay(pwm_steer_delay);
      analogWrite(motor_left_right1,pwm_steer);
      Serial.print("Forward - Left @ ");
      Serial.print(pwm_percent);
      Serial.println("%");
      break;

    case 7:
      // FORWARD - RIGHT
      digitalWrite(motor_forw_back1,LOW);
      analogWrite(motor_forw_back2,pwm_value);
      digitalWrite(motor_left_right1,LOW);
      digitalWrite(motor_left_right2,HIGH);
      delay(pwm_steer_delay);
      analogWrite(motor_left_right2,pwm_steer);
      Serial.print("Forward - Right @ ");
      Serial.print(pwm_percent);
      Serial.println("%");
      break;

    case 5:
      // BACKWARD - LEFT
      digitalWrite(motor_forw_back2,LOW);
      analogWrite(motor_forw_back1,pwm_value);
      digitalWrite(motor_left_right2,LOW);
      digitalWrite(motor_left_right1,HIGH);
      delay(pwm_steer_delay);
      analogWrite(motor_left_right1,pwm_steer);
      Serial.print("Backward - Left @ ");
      Serial.print(pwm_percent);
      Serial.println("%");
      break;

    case 8:
      // BACKWARD - RIGHT
      digitalWrite(motor_forw_back2,LOW);
      analogWrite(motor_forw_back1,pwm_value);
      digitalWrite(motor_left_right1,LOW);
      digitalWrite(motor_left_right2,HIGH);
      delay(pwm_steer_delay);
      analogWrite(motor_left_right2,pwm_steer);

      Serial.print("Backward - Right @ ");
      Serial.print(pwm_percent);
      Serial.println("%");
      break;

    case 3:
      // STOP - LEFT
      digitalWrite(motor_forw_back1,HIGH);
      digitalWrite(motor_forw_back2,HIGH);
      digitalWrite(motor_left_right2,LOW);
      digitalWrite(motor_left_right1,HIGH);
      delay(pwm_steer_delay);
      analogWrite(motor_left_right1,pwm_steer);
      Serial.println("Stop - Left");
      break;

    case 6:
      // STOP - RIGHT
      digitalWrite(motor_forw_back1,HIGH);
      digitalWrite(motor_forw_back2,HIGH);
      digitalWrite(motor_left_right1,LOW);
      digitalWrite(motor_left_right2,HIGH);
      delay(pwm_steer_delay);
      analogWrite(motor_left_right2,pwm_steer);
      Serial.println("Stop - Right");
      break;

    case 10:
      // 1st gear set pwm to 50%
      pwm_percent=50;
      pwm_value=int((255*pwm_percent)/100);
      break;

    case 20:
      // 2st gear set pwm to 75%
      pwm_percent=75;
      pwm_value=int((255*pwm_percent)/100);
      break;

    case 30:
      // 3st gear set pwm to 100%
      pwm_percent=100;
      pwm_value=int((255*pwm_percent)/100);
      break;

    case 66:
      //check Battery Voltage and Send it & check remote control if in range
      echo_millis=millis();
      bat_Voltmeter();
      break;

    case 254:
      //Bluetooth disconnect
      digitalWrite(motor_forw_back1,HIGH);
      digitalWrite(motor_forw_back2,HIGH);
      digitalWrite(motor_left_right1,HIGH);
      digitalWrite(motor_left_right2,HIGH);
      Serial.println("Stop - Straight");
      break;

    default:
      break;
    }

  }
} // End Loop

//-----------------------------------------------------//
void bat_Voltmeter()
{
  float bat_volt_read = 0.0;
  for(int i=0;i<30;i++){
    bat_volt_read += (analogRead(bat_Voltmeter_pin) * 5.0 / 1024.0);
  }
  bat_volt_read=bat_volt_read/30;
  float bat_Volt = bat_volt_read / (R2/(R1 + R2));
  Serial.println(bat_Volt,2);
  int int_bat_volt = (int)bat_Volt;
  int flt_bat_volt=(int)((bat_Volt-float(int_bat_volt))*100);
  blueToothSerial.flush();
  blueToothSerial.write(flt_bat_volt);
  blueToothSerial.write(int_bat_volt);
}

Per collegare il modulo L298 su arduino devo seguire i pin delle variabili?

Esempio:
const int motor_forw_back1 = 5; ---> IN1
const int motor_forw_back2 = 6; --->IN2
const int motor_left_right1 = 9; --->IN3
const int motor_left_right2 = 10; --->IN4

E' giusto così?

Credo di si.

Ricorda di collegare la batteria esterna sul modulo a +12V e GND.
Collega il GND di Arduino al GND del modulo.
Non collegare i 5V di Arduino ai 5V del Modulo. C'è un trasformatore integrato nel modulo che attivi col jumper.

Come batteria per arduino uso una batteria a 9V con il connettore e qui non ci sono problemi. Invece per i motori avevo pensato di usare una Lipo 7.5V 1800mha che usavo per il softair che dici andrebbe bene?

Potresti spiegarmi a cosa serve l'ingresso dei 5V sul modulo e il pulsante?

Pulsanti nel modulo non ne vedo. Ci sono dei Jumpers. (ponticelli)
L'ingresso serve per alimentare L298 che essendo un circuito elettronico ha bisogno di una sua alimentazione, in questo caso a 5V.
Per fortuna chi ha progettato il modulo ha inserito un trasformatore a 5V quindi l'ingresso 5V diventa inutile.
Se volessi utilizzarlo dovresti collegare i 5V di Arduino all'ingresso 5V e togliere il Jumper 5V_EN.
Ma ripeto, visto che c'è il trasformatore lascialo libero.