Pages: [1]   Go Down
Author Topic: Problema di Alimentazione o di Codice?  (Read 769 times)
0 Members and 1 Guest are viewing this topic.
Belluno
Offline Offline
Newbie
*
Karma: 0
Posts: 20
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Buongiorno a tutti!
Sono tornato con una nuova domanda..  smiley-yell
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? smiley-lol non posso tenerlo sempre attaccato all'USB!

Grazie dell'aiuto ragazzi!
Samuele
Logged

Belluno
Offline Offline
Newbie
*
Karma: 0
Posts: 20
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Dimenticavo il codice!

Code:
// 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);
 
}




Logged

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 313
Posts: 21624
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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?
Logged


Belluno
Offline Offline
Newbie
*
Karma: 0
Posts: 20
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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

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

Logged

Cagliari, Italy
Offline Offline
Tesla Member
***
Karma: 103
Posts: 6591
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

Code fast. Code easy. Codebender --> http://codebender.cc/?referrer=PaoloP

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 313
Posts: 21624
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Ok praticamente 6v glieli do con 4 batterie da 1.5v! smiley
La domanda era: "da DOVE gliela dai", non "COME gliela dai"  smiley-wink
Cioè, passi dal jack oppure dal pin Vin?
Se passi dal jack, togli circa ~2V, se passi dal pin Vin, togli ~1,5V
Logged


Belluno
Offline Offline
Newbie
*
Karma: 0
Posts: 20
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Ok grazie mille! smiley domani vedo e vi so dire ma credo sia un problema di codice cmq!  smiley-wink
Logged

Belluno
Offline Offline
Newbie
*
Karma: 0
Posts: 20
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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 smiley-lol
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.. http://www.youtube.com/watch?feature=player_embedded&v=VtH7G1N2khI
Logged

Belluno
Offline Offline
Newbie
*
Karma: 0
Posts: 20
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

RISOLTO! Essendo motori a spazzola hanno un verso.. semplicemente erano storti smiley-lol  smiley-grin

Potete chiudere questo! smiley
Logged

Capo d'Orlando
Offline Offline
God Member
*****
Karma: 0
Posts: 500
Electronics & Web Dev, Unix User, Ω LEO, Rock/Deep Music, Tech/Science/Finance addicted, Ski/Snowboard and much more …
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Ottimo ! Avevo un problema simile !

Comunque se hai risolto, scrivilo nel titolo principale !!

Andrea
Logged


Pages: [1]   Go Up
Jump to: