aiuto per programma robot

Salve a tutti, volevo un aiuto dalla community, avrei due piccoli programmini, davvero piccoli, fanno funzionare un robot (che a me piace chiamare rover :slight_smile: ). Ognuno dei programmini, funzionanti tramite bluetooth, gestisce funzioni diverse del robot. Il primo gestisce motori e luci l'altro gestisce due servocomandi che devono ruotare una action cam. Posso postarli qui e chiedere a voi se potete unirli? Io mi son dedicato alla meccanica e all'elettronica del progetto, ma purtroppo non so programmare fino a questo punto. Spero di non essere indiscreto,ma praticamentee vi sto chiedendo di fare per me quello che io non so fare.

Grazie

darinho9:
... Spero di non essere indiscreto,ma praticamentee vi sto chiedendo di fare per me quello che io non so fare.

Purtroppo qui NON funziona così ... ti prego di leggere con attenzione il punto 16.1 del REGOLAMENTO ...
... TU devi fare il lavoro, NOI aiutiamo a correggere, ma nessuno qui fa il lavoro per gli altri, mi spiace ... :confused:

Guglielmo

Ho letto il regolamento e credo di rispettarlo. Ho due codici miei, che uso distintamente su due dispositivi diversi, ora vorrei aiuto per unirli in un solo codice, ottimizzato. Io inserisco i due programmi e attendo che qualcuno mi aiuti, anche solo con spiegazioni, perchè io ho provato da solo ma non son riuscito nell’intento, funzionano solo alcuni comandi e non tutti. Grazie a tutti

Programma motori:

int LED=0;
char data = 0;

#define input1     2 //motore sinistra
#define input2     4 //motore sinistra
#define enable   3 //motore destra e sinistra
#define input3    17 //motore destra
#define input4    18 //motore destra
#define fari   6
#define IR 5

void setup() {
 digitalWrite(13, HIGH); //led indicazione accensione arduino
  Serial.begin(9600);
  pinMode (enable, OUTPUT); 
  pinMode (input1,  OUTPUT);
  pinMode (input2,  OUTPUT);
   pinMode (input3,  OUTPUT);
  pinMode (input4,  OUTPUT);
  pinMode( fari, OUTPUT); 
  pinMode(13, OUTPUT);
  }
   
void loop(){
  if(Serial.available() > 0){
    data = Serial.read();        //Legge il dato in arrivo e lo mette in data
    Serial.print(data);          //Stampa il valore del dato nel Serial monitor (per vederlo ricordate di impostare il baund a 38400)

 if(data == 's'){     // SE RICEVI 4 GIRA A SINISTRA
    analogWrite(enable, 150);
    
    digitalWrite(input1, LOW);
    digitalWrite(input2, HIGH);
    digitalWrite(input3, HIGH);
    digitalWrite(input4, LOW);    
  
 }
  if(data == 'd'){   // SE RICEVI 6  GIRA  A DESTRA
    analogWrite(enable, 150);
    
    digitalWrite(input1, HIGH);
    digitalWrite(input2, LOW);
    digitalWrite(input3, LOW);
    digitalWrite(input4, HIGH);  
       }
if(data == 'a'){   // SE RICEVI 8 VAI AVANTI
 
analogWrite(enable, 150);

    digitalWrite(input1, HIGH); //MOTORI DI SINISTRA
    digitalWrite(input2, LOW);  //MOTORI DI SINISTRA
    digitalWrite(input3, HIGH); // MOTORI DI DESTRA
    digitalWrite(input4, LOW);// MOTORI DI DESTRA
  }

if(data == 'r'){   // SE RICEVI 2 VAI RETRO
 
analogWrite(enable, 150);
  digitalWrite(input1, LOW);
 digitalWrite(input2, HIGH);  
 digitalWrite(input3, LOW);
 digitalWrite(input4, HIGH);
 }
  
  if(data == 'p'){   // SE RICEVI 5 ALLORA STOP

   digitalWrite(enable,LOW);
   
 }
  if((data == 'L')and(LED==0)){   // SE RICEVI "L" E I LED SONO SPENTI ALLORA ACCENDI FARI
      digitalWrite(fari,HIGH);    //ACCENDI I FARI
      LED=1;                      //I FARI SONO NELLO STATO 1 OVVERO ACCESI
      }
      
  else if((data == 'L') and (LED==1)){   // SE RICEVI "L" E I FARI SONO ACCESI ALLORA SPEGNILI
    digitalWrite(fari,LOW);              //SPEGNI I FARI
    LED=0;                               // I FARI SONO NELLO STATO 0 OVVERO SPENTI
  }
  }
}

Programma servi :

#define bluetooth Serial
#include <Servo.h>


Servo myServo1, myServo2;

char cmd[100];
int cmdIndex;



boolean cmdStartsWith(char *st) {
  for(int i=0; ; i++) {
    if(st[i]==0) return true;
    if(cmd[i]==0) return false;
    if(cmd[i]!=st[i]) return false;;
  }
  return false;
}



void exeCmd() {
  
  // "servo1" is the id for servo motor 1
  // "servo2" is the id for servo motor 2
  
  if( cmdStartsWith("servo1 ") ) { // example: if cmd is "servo1 1500"
    int val = atoi(cmd+7);  // val will be 1500
                            // cmd+7, because value comes after "servo1 " which is 7 characters
    myServo1.writeMicroseconds(val);      
  } 
 
  if( cmdStartsWith("servo2 ") ) { 
    int val = atoi(cmd+7); 
    myServo2.writeMicroseconds(val);      
  } 
 
  
}



void setup() {
  pinMode(13, OUTPUT);
  delay(500); // wait for bluetooth module to start

  bluetooth.begin(115200); // Bluetooth default baud is 115200
  Serial.begin(9600);
  myServo1.attach(19, 1000, 2000); //asse z servo inferiore
  myServo2.attach(16, 1000, 2000); //asse y servo superiore
  
  cmdIndex = 0;
}


void loop() {
  digitalWrite(13, HIGH);
  if(bluetooth.available()) {
    
    char c = (char)bluetooth.read();
    Serial.print(c);
    if(c=='\n') {
      cmd[cmdIndex] = 0;
      exeCmd();  // execute the command
      cmdIndex = 0; // reset the cmdIndex
    } else {      
      cmd[cmdIndex] = c;
      if(cmdIndex<99) cmdIndex++;
    }
   
    
  }
  
}

Ciao. Alla prima riga del setup in entrambi gli sketch usi il pin 13 credo per 2 cose diverse.
Per prima cosa secondo me dovresti verificare tutti i pin e controllare che non siano in conflitto nei 2 sketch.
Poi sarebbe molto utile anche definire ogni pin con una #define che "spieghi" cosa fa il pin. Capire lo sketch con i numeri di pin sparsi in giro è dura.

fratt:
Ciao. Alla prima riga del setup in entrambi gli sketch usi il pin 13 credo per 2 cose diverse.
Per prima cosa secondo me dovresti verificare tutti i pin e controllare che non siano in conflitto nei 2 sketch.
Poi sarebbe molto utile anche definire ogni pin con una #define che ‚Äúspieghi‚ÄĚ cosa fa il pin. Capire lo sketch con i numeri di pin sparsi in giro √® dura.

Ciao fratt, grazie. Vedi un po se cosi son pi√Ļ chiaro, ho modificato credo per quanto possibile il codice.
In pratica con una app bluetooth riesco distintamente ad usare i due programmi, quello dei motori lo uso con dei semplici pulsanti sulla app, quello dei servi lo uso con due slider sulla app, muovendo questi slider riesco a ruotare i servi. Bene dovrei unire queste funzioni in un unico programma.

//* i pin input1,input2, enable, pilotano un ponte H per il motore di sinistra
//i pin input3, input4, enable pilotano l'altro ponte H per il motore di destra 
//in particolare il pin enable serve ad impostare la velocità desiderata su entrambi i ponti H
//di cui ho collegato in parallelo il pin della regolazione di velocità.Quindi regolando la velocità
// su enable con analogwrite,lo faccio indistitamente su entrambi i ponti H


int statoFari=0; //da uno stato ai fari, se statoFari =0 allora i fari spenti, se statoFari = 1 allora i fari sono accesi

char data = 0;

#define input1     2 //ponte H sinistra
#define input2     4 //ponte H sinistra

#define enable     3 //ponti H destra e sinistra

#define input3    17 //ponte H destra
#define input4    18 //ponte H destra
#define fari      6  // fari
#define LedArduinoON 13 // Led che si accende non appena Arduino sarà alimentato

void setup() {
pinMode (LedArduinoON, OUTPUT);
  digitalWrite(LedArduinoON, HIGH); //led indicazione accensione arduino
 
  Serial.begin(9600);
  pinMode (enable, OUTPUT); //da la velocità ad entrambi i motori con un analogwrite che pilota il ponte H
  pinMode (input1,  OUTPUT);//  ponte H sinistra
  pinMode (input2,  OUTPUT);//  ponte H sinistra
  
   pinMode (input3,  OUTPUT);//ponte H destra
  pinMode (input4,  OUTPUT);// ponte H destra
  pinMode( fari, OUTPUT); 
  
  }
   
void loop(){

    if(Serial.available() > 0){
    data = Serial.read();        //Legge il dato in arrivo e lo mette in data
    Serial.print(data);          //Stampa il valore del dato nel Serial monitor (per vederlo ricordate di impostare il baund a 38400)

 if(data == 's'){     // SE RICEVI s GIRA A SINISTRA
    analogWrite(enable, 150); // velocità impostata a 150
    
    digitalWrite(input1, LOW); 
    digitalWrite(input2, HIGH);
    digitalWrite(input3, HIGH);
    digitalWrite(input4, LOW);    
      
 }
  if(data == 'd'){   // SE RICEVI d  GIRA  A DESTRA
    
    analogWrite(enable, 150);  // velocità impostata a 150
    
    digitalWrite(input1, HIGH);
    digitalWrite(input2, LOW);
    digitalWrite(input3, LOW);
    digitalWrite(input4, HIGH);  
      
   }
if(data == 'a'){   // SE RICEVI a VAI AVANTI
 
analogWrite(enable, 150); // velocità impostata a 150

    digitalWrite(input1, HIGH); 
    digitalWrite(input2, LOW);  
    digitalWrite(input3, HIGH); 
    digitalWrite(input4, LOW);
 
  }

if(data == 'r'){   // SE RICEVI r VAI RETRO
 
analogWrite(enable, 150); // velocità impostata a 150
  digitalWrite(input1, LOW);
 digitalWrite(input2, HIGH);  
 digitalWrite(input3, LOW);
 digitalWrite(input4, HIGH);
 }
  
  if(data == 'p'){   // SE RICEVI p ALLORA STOP

   digitalWrite(enable,LOW); // poni il pin enable a livello basso per spegnere i ponti H
   
 }
  if((data == 'L')and(statoFari==0)){   // SE RICEVI "L" E I LED SONO SPENTI ALLORA ACCENDI FARI
      digitalWrite(fari,HIGH);    //ACCENDI I FARI
      statoFari=1;                      //I FARI SONO NELLO STATO 1 OVVERO ACCESI
      }
  else if((data == 'L') and (statoFari==1)){   // SE RICEVI "L" E I FARI SONO ACCESI ALLORA SPEGNILI
    digitalWrite(fari,LOW);              //SPEGNI I FARI
    statoFari=0;                               // I FARI SONO NELLO STATO 0 OVVERO SPENTI
  }
  }
}
#define bluetooth Serial
#include <Servo.h>

Servo myServo1, myServo2;
//myservo1 = servo rotazione camera asse z
//myServo2 = servo rotazione camera asse y

char cmd[100];
int cmdIndex;

boolean cmdStartsWith(char *st) {
  for(int i=0; ; i++) {
    if(st[i]==0) return true;
    if(cmd[i]==0) return false;
    if(cmd[i]!=st[i]) return false;;
  }
  return false;
}

void exeCmd() {
  
 if( cmdStartsWith("servo1 ") ) { // example: if cmd is "servo1 1500"
    int val = atoi(cmd+7);  // val will be 1500
                            // cmd+7, because value comes after "servo1 " which is 7 characters
    myServo1.writeMicroseconds(val);      
  } 
 
  if( cmdStartsWith("servo2 ") ) { 
    int val = atoi(cmd+7); 
    myServo2.writeMicroseconds(val);      
  } 
 
  }

void setup() {
 
  delay(500); // wait for bluetooth module to start

  bluetooth.begin(115200); // Bluetooth default baud is 115200
  Serial.begin(9600);
  myServo1.attach(19, 1000, 2000); //19 = pin del servo1, servo asse z
  myServo2.attach(16, 1000, 2000); //16 = pin del servo2, servo asse y
  
  cmdIndex = 0;
}


void loop() {
  
  if(bluetooth.available()) {
    
    char c = (char)bluetooth.read();
    Serial.print(c);
    if(c=='\n') {
      cmd[cmdIndex] = 0;
      exeCmd();  // execute the command
      cmdIndex = 0; // reset the cmdIndex
    } else {      
      cmd[cmdIndex] = c;
      if(cmdIndex<99) cmdIndex++;
    }
   
    }
  
}

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.