Problema di Alimentazione o di Codice?

Buongiorno a tutti!
Sono tornato con una nuova domanda.. :stuck_out_tongue_closed_eyes:
Ho scritto il codice per il mio robottino in cui dovrebbe evitare gli ostacoli e girare per la stanza..
Il problema è questo.. Lasciando perdere che c'e' ancora qualche bug, il codice funziona..
Perchè quando faccio l'upload del codice sull'arduino tramite USB ed il robottino è attaccato tramite USB mi ritorna tutto.. ovvero sulla seriale tutti i controlli sono OK e il robottino (nelle mie mani perchè se lo appoggiassi al tavolo partirebbe xD) fa quello che dovrebbe fare ovvero andare sempre dritto e quando metto la mano (l'ostacolo) davanti al sensore girare per poi tornare ad andare dritto..

Quando poi però stacco l'alimentazione USB e lo metto a terra con l'alimentazione a 6v delle pile lui sembra leggere sempre di dover girare e appunto indietreggia e gira all'infinito! Ho cambiato pile perchè pensavo fossero scaricare e dava problemi ma niente.. Come mai questa cosa? XD non posso tenerlo sempre attaccato all'USB!

Grazie dell'aiuto ragazzi!
Samuele

Dimenticavo il codice!

// Impostazioni dei Motori
#define PWMA 11
#define PWMB 9
#define AIN1 4
#define AIN2 7
#define BIN1 8
#define BIN2 12
#define STBY 13
#define SensInfrarossi 200

#define motoreA 0
#define motoreB 0
#define AVANTI  0
#define INDIETRO  0

// Variabili dei sensori

int Bottone = 2; // Input del Touch / Bottone.
int Faretto = 3; // Output del faretto.
int Grigio = 4; // Input del sensore grigio.
int Infrarossi = 5; // Input sensore ad infrarossi.
int LedArduino = 13; // LED sull'Arduino.

static int conta = 1;
static int resto = 0;

// ------------------ METODO SETUP ----------------------------------

void setup(){

Serial.begin(9600); // Apro porta seriale e setto Boud Rate a 9600 bps

// Setto le impostazioni per i motori
pinMode( STBY,OUTPUT );
pinMode( PWMA,OUTPUT );
pinMode( PWMB,OUTPUT );
pinMode( AIN1,OUTPUT );
pinMode( AIN2,OUTPUT );
pinMode( BIN1,OUTPUT );
pinMode( BIN2,OUTPUT );
 
digitalWrite( STBY,HIGH );

// Setto le impostazioni dei sensori
pinMode(Faretto, OUTPUT); // Dichiaro Faretto come Output
pinMode(Bottone, INPUT); // Dichiaro Bottone come Input
pinMode(LedArduino, OUTPUT);
pinMode(Infrarossi , INPUT);
pinMode(Grigio , INPUT); // Dichiaro Sensore di Grigi come Input

}

// ------------------- METODO LOOP [ MAIN ] -----------------------------

void loop(){

int ValBottone = digitalRead(Bottone);  // Leggo Valore del Bottone

if ( ValBottone == HIGH ){  // Metto LOW per il bottone e HIGH per il touch
  
  conta++;
  resto = conta % 2;
  
  Serial.println("### Richiesta Cambio Algoritmo.. ");
  
  /* Faccio stampare conta per controllare.
  Serial.println(conta);
  */
  
}
  
  if ( resto == 0) {
 
      Serial.println("### Algoritmo Num 1");
     
      // Richiamo il primo metodo
      Algoritmo1();

    } 
  
  else {
    
      Serial.println("### Algoritmo Num 2");
    
      // Richiamo secondo metodo
      Algoritmo2();

  }

} 
  
  
  
  
  
  
// ------------------ METODO NUMERO 1 ----------------------------------------------------------------------------------

void Algoritmo2(){
  
int ValoreLuce;

Serial.println("### Valore luce d'ambiente: ");
ValoreLuce = analogRead(0); // Entrata analogica Numero 0

Serial.println(ValoreLuce,DEC); 

  
// ----------- ACCENSIONE LED SE E' BUIO  ----------------

if(ValoreLuce<650){
  
  Serial.println("### LED Spento");

  digitalWrite(Faretto, HIGH);  // Accendo il faretto.

 } 
  
else {

  Serial.println("### LED Acceso");
  
  digitalWrite(Faretto, LOW); // Spengo il faretto.

  }


// ----------- Accensione LED per identificare l'algoritmo.

  digitalWrite(LedArduino, HIGH);  
  delay(1300);              
  digitalWrite(LedArduino, LOW);   
  delay(1300);
  
  
// ----------- Codice Algoritmo 1 --------------

// Da Scrivere


}




// ------------------ METODO NUMERO 2 ----------------------------------------------------------------------------------

void Algoritmo1(){
  
int ValoreLuce;

Serial.println("### Valore luce d'ambiente: ");
ValoreLuce = analogRead(0); // Entrata analogica Numero 0

Serial.println(ValoreLuce,DEC); 


// ----------- ACCENSIONE LED SE E' BUIO  ----------------

if(ValoreLuce<650){
  
  Serial.println("### LED Spento");

  digitalWrite(Faretto, HIGH);  // Accendo il faretto.

 } 
  
  
else {

  Serial.println("### LED Acceso");
  
  digitalWrite(Faretto, LOW); // Spengo il faretto.

  }



// ----------- Accensione LED per identificare l'algoritmo.

  digitalWrite(LedArduino, HIGH);  
  delay(100);               
  
  
// ----------- CODICE DEI MOTORI [ Algoritmo 2 ] ------------

      int ValoreGrigio;   // Valore Medio Normale: 340
                          // Valore Medio Grigio: 410
                          // Valore Medio Nero : 420-30
      ValoreGrigio=analogRead(Grigio);   
      Serial.println("### Valore Grigio:"); 
      Serial.println(ValoreGrigio,DEC);   

      
      if( ValoreGrigio > 50){
        
        Serial.println("### Sensore Infrarossi: ");
        Serial.println( analogRead(Infrarossi) );
        
        int Distanza = analogRead(Infrarossi);
        
        if ( Distanza > SensInfrarossi ) { 
                
              Serial.println("### Sto Sterzando..");
              gira(); 
            
          }
        
        else{ 
              Serial.println("### Andando Avanti!");
              avanti(); 
          }
        
 
      }
      
      else if( ValoreGrigio < 135 ){
      
        Serial.println("### MISSIONE OK");
        //fermo();
      
      }

}





// ---------------------------------   CODICE AZIONAMENTO MOTORI   -----------------------------------------

void avanti(){
  
    digitalWrite( AIN2,HIGH );
    digitalWrite( AIN1,LOW );
    digitalWrite( BIN2,HIGH );
    digitalWrite( BIN1,LOW );
   
    analogWrite( PWMA,246 );
    analogWrite( PWMB,240 ); // Motore di destra
    
}

void indietro(){
  
    digitalWrite( AIN2,LOW );
    digitalWrite( AIN1,HIGH );
    digitalWrite( BIN2,LOW );
    digitalWrite( BIN1,HIGH );
   
    analogWrite( PWMA,246 );
    analogWrite( PWMB,240 );
    
}

void fermo(){
  
    analogWrite( PWMA,50 );
    analogWrite( PWMB,50 );
   
    digitalWrite( AIN2,LOW );
    digitalWrite( AIN1,LOW );
    digitalWrite( BIN2,LOW );
    digitalWrite( BIN1,LOW );
    
}

void gira(){
  
  // Stop per 1/2 secondo
  fermo();
  delay( 400 );
 
  // Indietro
  indietro();
  delay( 600 );
 
  // Stop per 1/2 secondo
  fermo();
  delay( 400 );
 
  // Gira
  digitalWrite( AIN2,LOW );
  digitalWrite( AIN1,HIGH );
  digitalWrite( BIN2,HIGH );
  digitalWrite( BIN1,LOW );
 
  analogWrite( PWMA,146 );
  analogWrite( PWMB,140 );
  delay (1000);
  
}

6V? E da dove glieli dai i 6V?
Ricordati che dal jack nero ci devono entrare minimo 7V per esser certi di avere sulla scheda 5V stabili (hai un diodo ed un regolatore di tensione in serie) mentre se passi dal pin Vin scavalchi il diodo ma hai sempre il regolatore.

Inoltre non è che la batteria non riesce a fornire necessaria corrente di spunto ai motori per cui l'Arduino va in deficit e si comporta in modo strano per questo?

Ok praticamente 6v glieli do con 4 batterie da 1.5v! :slight_smile:
Dopo proverò con una batteria da 9V (quelle rettangolari) a vedere cosa succede! :slight_smile:
In effetti può essere che non arrivi abbastanza tensione.. dopo provo e vi faccio sapere :slight_smile:
Ma quanta alimentazione butta fuori l'usb del pc?

E ok! Ora ho capito come funziona l'alimentazione! Grazie mille!

Apache93:
Ma quanta alimentazione butta fuori l'usb del pc?

La USB fornisce 5V e massimo 500mA; però non passano dal regolatore di tensione e sono utilizzati direttamente dal microcontrollore.

Apache93:
Ok praticamente 6v glieli do con 4 batterie da 1.5v! :slight_smile:

La domanda era: "da DOVE gliela dai", non "COME gliela dai" :wink:
Cioè, passi dal jack oppure dal pin Vin?
Se passi dal jack, togli circa ~2V, se passi dal pin Vin, togli ~1,5V

Ok grazie mille! :slight_smile: domani vedo e vi so dire ma credo sia un problema di codice cmq! :wink:

Oggi ho provato! Batteria da 9v.. e ho provato ancora con quelle da 6v.. il codice funziona perchè fa quello che deve fare.. ma ogni tanto va in tilt per 2-3 secondi e fa cose a caso (penso sia dovuto all'alimentazione visto che fa quello che gli viene detto da codice) e i motorini sono di una qualita scarsissima! ho fatto una funzione per farli andare dritti e andavano verso destra.. allora ho regolato la potenza dei motori e andava dritto.. poi dopo aver ricollegato l'alimentazione la potenza cambiava ancora... praticamente fa quello che voglio io ma il motore di sinistra ha più potenza di quello di destra e mi gira praticamente in tondo.. quando gli metto la mano ovviamente si gira e ricomincia a girare come da codice XD
Dite che devo comprare dei motorini nuovi e più precisi? Come posso fare? Non pretendo la perfezione ma per l'esame a scuola un minimo di decenza si! Almeno che vada dritto!

Ho trovato anche questo video dove come potete vedere i motorini fanno curvare il robottino sempre a destra.. ASD
E' con netduino ma è lo stesso.. Robot Beginner Kit Netduino - YouTube

RISOLTO! Essendo motori a spazzola hanno un verso.. semplicemente erano storti XD :smiley:

Potete chiudere questo! :slight_smile:

Ottimo ! Avevo un problema simile !

Comunque se hai risolto, scrivilo nel titolo principale !!

Andrea