Codice arduino rc-car ?

ciao a tutti sto facendo un progetto in cui con un pc controllo la mia rc car che ha due motori in continua e così per gestirli ho utilizzato un driver motore (fatto da me) , una shield ethernet , un router ,arduino e due servo motori per controllare la webcam ( uno gira destra- sinistra e l'altro alto-basso) .
ora io ho provato a creare un programma ma non vuole funzionare.
mi potete dire dove è che ho sbagliato ?
grazie mille a tutti quanti voi :slight_smile:

code :

// Terzo programma di trasmissione seriale con Ethernet
int ena =2;         // driver motore
int a = 3;           // driver motore
int b = 4;         // driver motore
int enb = 5;   // driver motore
int c = 6;      // driver motore
int d = 7;     // driver motore
#include <Servo.h> 
Servo myservo3; // servo webcam 1 (destra - sinistra)
Servo myservo4; // servo webcam 2 (alto-basso)
int lettura;
int stato1;
int stato2;
int pos_o = 100;
//unsigned long int currentMillis;
//unsigned long int previousMillis;
int interval = 500;
 
void setup() 
{
 myservo3.attach(11); // 1° servo telecamera
 myservo4.attach(6);  // 2° servo telecamera
 //pinMode(2, OUTPUT);
 //pinMode(12, OUTPUT);
 
 Serial.begin(9600);
}

void loop() 
{  

 // currentMillis = millis();
  
  if (Serial.available()>0)   // Se c'è un dato disponibile sulla seriale
  {
    lettura = Serial.read();
  }
  
  if(lettura =='8')
  {
    digitalWrite(ena,HIGH);    // con queste 3 istruzioni il motore 1 va avanti
    digitalWrite(a,HIGH);
   digitalWrite(b,LOW); 
    
 //   lampeggio();
  }
  
  if(lettura =='5')
  {
    digitalWrite(ena,HIGH);             
    digitalWrite(a,HIGH);               // motore 1 fermo
    digitalWrite(b,HIGH);
   
          
  }
  
  if(lettura =='2')
  {
    digitalWrite(ena,HIGH);              
    digitalWrite(a,LOW);             // motore 1 indietro
   digitalWrite(b,HIGH); 
 
   // lampeggio(); 
  }
  
  if(lettura =='6')
  {
    digitalWrite(enb,HIGH);              
    digitalWrite(c,HIGH);         // motore 2 gira destra
    digitalWrite(d,LOW);
   
  }
  
  if(lettura =='4')
  {
    digitalWrite(enb,HIGH);              
    digitalWrite(c,HIGH);         // motore 2 gira sinitra
   digitalWrite(d,HIGH); 
  
  }
 
 // MODIFICA
 
  if(lettura =='1')
  {
    digitalWrite(ena,HIGH);
     digitalWrite(a,HIGH);
      digitalWrite(b,HIGH);
    
    pos_o = pos_o - 5;    
    if ( pos_o >= 0 && pos_o <= 180 )
    {
      myservo3.write( pos_o );
      lettura = 0;   
    }
    
 } 
 
 
 if(lettura =='3')
 {
      digitalWrite(ena,HIGH);
     digitalWrite(a,HIGH);
      digitalWrite(b,HIGH);
   
      pos_o = pos_o + 5;
      if ( pos_o >= 0 && pos_o <= 180 )
    {
      myservo3.write( pos_o );
      lettura = 0; 
    }
       
  }
 
 // MODIFICA
 
  if(lettura =='7')
 {
     digitalWrite(enb,HIGH);
     digitalWrite(c,HIGH);
      digitalWrite(d,HIGH);
   
      pos_o = pos_o + 5;
      if ( pos_o >= 0 && pos_o <= 180 )
    {
      myservo4.write( pos_o );
      lettura = 0; 
    }
       
  }
 
 
   if(lettura =='9')
 {
     digitalWrite(enb,HIGH);
     digitalWrite(c,HIGH);
      digitalWrite(d,HIGH);
   
      pos_o = pos_o -5;
      if ( pos_o >= 0 && pos_o <= 180 )
    {
      myservo4.write( pos_o );
      lettura = 0; 
    }
       
  }
 
 
 
  Serial.flush();
  
}
  1. il codice, da regolamento, deve essere racchiuso nei tag code. Vedi regolamento, sezione 7, ti spiega come si fa.
  2. cosa vuol dire che non vuole funzionare? :fearful:
    Quando compili ti da errore? Il programma parte ma i motori non si muovono?
  3. nella setup() non fai pinMode(x, OUTPUT); dei pin ena,a,b,enb,etc.

P.S. per snellire un pò il programma potresti usare switch invece di innumerevoli if

switch(lettura)
{ case '8':   //   lampeggio();
    digitalWrite(ena,HIGH);    // con queste 3 istruzioni il motore 1 va avanti
    digitalWrite(a,HIGH);
    digitalWrite(b,LOW); 
    break;
  case '5': 
    digital....
    break;
 }

guarda il compilatore non mi da errori :slight_smile:
quando lo carico su arduino poi i motori non si muovono non fa nulla in pratica.
l'uso di switch non lo conosco molto e preferirei usare if :slight_smile:
sapresti magari darmi una dritta su cosa potrebbe esserci in questo codice di sbagliato ?
grazie :slight_smile:

nid69ita:
3. nella setup() non fai pinMode(x, OUTPUT); dei pin ena,a,b,enb,etc.

vedi sopra

si scusami mi ero scordato di dirti comunque anche ora che ho messo i pinMode e non funziona.
è così giusto ? :slight_smile:

//Terzo programma di trasmissione seriale con Ethernet
int ena =2;
int a = 3;
int b = 4;
int enb = 5;
int c = 6;
int d = 7;
#include <Servo.h> 
Servo myservo3; 
Servo myservo4;
int lettura;
int stato1;
int stato2;
int pos_o = 100;
//unsigned long int currentMillis;
//unsigned long int previousMillis;
int interval = 500;
 
void setup() 
{
 myservo3.attach(11); // 1° servo telecamera
 myservo4.attach(6);  // 2° servo telecamera
 pinMode (2,OUTPUT);
 pinMode (3,OUTPUT);
 pinMode (4,OUTPUT);
 pinMode (5,OUTPUT);
 pinMode (6,OUTPUT);
 pinMode (7,OUTPUT);
  
 Serial.begin(9600);
}

void loop() 
{  

 // currentMillis = millis();
  
  if (Serial.available()>0)   // Se c'è un dato disponibile sulla seriale
  {
    lettura = Serial.read();
  }
  
  if(lettura =='8')
  {
    digitalWrite(ena,HIGH);             
    digitalWrite(a,HIGH);
   digitalWrite(b,LOW); 
    
 //   lampeggio();
  }
  
  if(lettura =='5')
  {
    digitalWrite(ena,HIGH);             
    digitalWrite(a,HIGH);
    digitalWrite(b,HIGH);
    
  //  digitalWrite(2, LOW);
  //  digitalWrite(12, LOW);
        
  }
  
  if(lettura =='2')
  {
    digitalWrite(ena,HIGH);              
    digitalWrite(a,LOW);
   digitalWrite(b,HIGH); 
 
   // lampeggio(); 
  }
  
  if(lettura =='6')
  {
    digitalWrite(enb,HIGH);              
    digitalWrite(c,HIGH); 
    digitalWrite(d,LOW);
   // lampeggio();
  }
  
  if(lettura =='4')
  {
    digitalWrite(enb,HIGH);              
    digitalWrite(c,HIGH);
   digitalWrite(d,HIGH); 
  //  lampeggio();
  }
 
 // MODIFICA
 
  if(lettura =='1')
  {
    digitalWrite(ena,HIGH);
     digitalWrite(a,HIGH);
      digitalWrite(b,HIGH);
    
    pos_o = pos_o - 5;    
    if ( pos_o >= 0 && pos_o <= 180 )
    {
      myservo3.write( pos_o );
      lettura = 0;   
    }
    
 } 
 
 
 if(lettura =='3')
 {
      digitalWrite(ena,HIGH);
     digitalWrite(a,HIGH);
      digitalWrite(b,HIGH);
   
      pos_o = pos_o + 5;
      if ( pos_o >= 0 && pos_o <= 180 )
    {
      myservo3.write( pos_o );
      lettura = 0; 
    }
       
  }
 
 // MODIFICA
 
  if(lettura =='7')
 {
     digitalWrite(enb,HIGH);
     digitalWrite(c,HIGH);
      digitalWrite(d,HIGH);
   
      pos_o = pos_o + 5;
      if ( pos_o >= 0 && pos_o <= 180 )
    {
      myservo4.write( pos_o );
      lettura = 0; 
    }
       
  }
 
 
   if(lettura =='9')
 {
     digitalWrite(enb,HIGH);
     digitalWrite(c,HIGH);
      digitalWrite(d,HIGH);
   
      pos_o = pos_o -5;
      if ( pos_o >= 0 && pos_o <= 180 )
    {
      myservo4.write( pos_o );
      lettura = 0; 
    }
       
  }
 
 
 
  Serial.flush();
  
}

secondo te il problema dove può trovarsi ? :slight_smile:

Qui un problema:

myservo4.attach(6);  // 2° servo telecamera
...
pinMode (6,OUTPUT);

usi lo stesso pin

danielspc:
... così per gestirli ho utilizzato un driver motore (fatto da me)

Sei sicuro questo hardware funzioni?

danielspc:
..., una shield ethernet

Ma per ora non la usi, vero?

Ma se hai driver, motori, servi, ethernet. Tutto assieme, come alimenti il tutto? Basta la corrente?

ok per il pin ho risolto e ho cambiato mettendo 10.
l'hardware funziona in quanto l'ho provato con il digital lab e va alla grande :slight_smile:
si la shield la uso infatti è collegata sopra l'arduino .
per l'alimentazione il driver motore è collegato ad arduino ed anche la shield ed ho una batteria da 9v per alimentare arduino.
per il resto invece ho acquistato una batteria a lipo da 11.4 v e 1300 mah.

per me comunqe il problema rimane nella shield in quanto ho sentito dire che usa dei pin per la comunicazione con arduino non ricordo però quali.. può essere questo il problema ? :slight_smile:

danielspc:
per me comunqe il problema rimane nella shield in quanto ho sentito dire che usa dei pin per la comunicazione con arduino non ricordo però quali.. può essere questo il problema ? :slight_smile:

Leggere il reference .. si fa fatica ??? ]:smiley: ]:smiley: ]:smiley:

"Arduino communicates with both the W5100 and SD card using the SPI bus (through the ICSP header). This is on digital pins 10, 11, 12, and 13 on the Uno and pins 50, 51, and 52 on the Mega. On both boards, pin 10 is used to select the W5100 and pin 4 for the SD card. These pins cannot be used for general I/O. On the Mega, the hardware SS pin, 53, is not used to select either the W5100 or the SD card, but it must be kept as an output or the SPI interface won't work."

Guglielmo

ok grazie e scusami .. quindi arduino uno utilizza i pin 10, 11 , 12, 13 per comunicare con la shield giusto ? :slight_smile:

ho provato a fare anche questo altro tipo di codice ma niente :frowning:

#include <SPI.h>
#include <Ethernet.h>
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ip(192,168,0,239);
EthernetServer server(272);

int ena =2;
int a = 3;
int b = 4;
int enb = 5;
int c = 6;
int d = 7;
#include <Servo.h> 
Servo myservo3; 
Servo myservo4;
int lettura;
int stato1;
int stato2;
int pos_o = 100;
//unsigned long int currentMillis;
//unsigned long int previousMillis;
int interval = 500;
 
void setup()
{
 myservo3.attach(11); // 1° servo telecamera
 myservo4.attach(10);  // 2° servo telecamera
 pinMode (2,OUTPUT);
 pinMode (3,OUTPUT);
 pinMode (4,OUTPUT);
 pinMode (5,OUTPUT);
 pinMode (6,OUTPUT);
 pinMode (7,OUTPUT);
//Serial.begin(9600);
 
  Ethernet.begin(mac, ip);
  server.begin();
}

void loop()
 {
  // listen for incoming clients
  EthernetClient client = server.available();
  if (client) {
    // an http request ends with a blank line
  //  boolean currentLineIsBlank = true;
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
        if (c == '8') {
        digitalWrite(ena,HIGH);             
    digitalWrite(a,HIGH);
   digitalWrite(b,LOW); 
    }
       if(c=='5') {
     digitalWrite(ena,HIGH);             
    digitalWrite(a,HIGH);
    digitalWrite(b,HIGH);
    }
       if(c=='2') {
       digitalWrite(ena,HIGH);              
    digitalWrite(a,LOW);
   digitalWrite(b,HIGH); 
      }
    if(c='6') {
      digitalWrite(enb,HIGH);              
    digitalWrite(c,HIGH); 
    digitalWrite(d,LOW);
    }
    if(c='4'){
      digitalWrite(enb,HIGH);              
    digitalWrite(c,HIGH);
   digitalWrite(d,HIGH); 
    }
  if(c='1'){
    digitalWrite(ena,HIGH);
     digitalWrite(a,HIGH);
      digitalWrite(b,HIGH);
    
    pos_o = pos_o - 5;    
    if ( pos_o >= 0 && pos_o <= 180 )
    {
      myservo3.write( pos_o );
      lettura = 0;   
    }
  }
    
 if(lettura =='3')
 {
      digitalWrite(ena,HIGH);
     digitalWrite(a,HIGH);
      digitalWrite(b,HIGH);
   
      pos_o = pos_o + 5;
      if ( pos_o >= 0 && pos_o <= 180 )
    {
      myservo3.write( pos_o );
      lettura = 0; 
    }
       
  }
  
   if(lettura =='7')
 {
     digitalWrite(enb,HIGH);
     digitalWrite(c,HIGH);
      digitalWrite(d,HIGH);
   
      pos_o = pos_o + 5;
      if ( pos_o >= 0 && pos_o <= 180 )
    {
      myservo4.write( pos_o );
      lettura = 0; 
    }
       
  }
  
   if(lettura =='9')
 {
     digitalWrite(enb,HIGH);
     digitalWrite(c,HIGH);
      digitalWrite(d,HIGH);
   
      pos_o = pos_o -5;
      if ( pos_o >= 0 && pos_o <= 180 )
    {
      myservo4.write( pos_o );
      lettura = 0; 
    }
       
  }

}
}
}
      delay(1);
     // close the connection:
     client.stop();
       Serial.flush();
  

 }

danielspc:
ok grazie e scusami .. quindi arduino uno utilizza i pin 10, 11 , 12, 13 per comunicare con la shield giusto ? :slight_smile:

... leggi bene ! Anche il pin 4 è riservato ...

Guglielmo

un altra cosa che mi sta venendo in mente è :
se io creo una pagina in html che gestisca la macchinetta è possibile poi collegarsi e comandarla da li ? :slight_smile: