Go Down

Topic: Codice arduino rc-car ? (Read 477 times) previous topic - next topic

danielspc

Mar 06, 2014, 04:07 pm Last Edit: Mar 06, 2014, 06:02 pm by danielspc Reason: 1
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 :)

code :

Code: [Select]
// 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();
 
}

 

nid69ita

#1
Mar 06, 2014, 04:15 pm Last Edit: Mar 06, 2014, 04:21 pm by nid69ita Reason: 1
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?   :smiley-eek-blue:
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
Code: [Select]
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;
}

 
my name is IGOR, not AIGOR

danielspc

guarda il compilatore non mi da errori :)
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 :)
sapresti magari darmi una dritta su cosa potrebbe esserci in questo codice di sbagliato ?
grazie :)

nid69ita


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

vedi sopra
my name is IGOR, not AIGOR

danielspc

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

Code: [Select]

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


danielspc

secondo te il problema dove può trovarsi ? :)

nid69ita

Qui un problema:
Code: [Select]
myservo4.attach(6);  // 2° servo telecamera
...
pinMode (6,OUTPUT);

usi lo stesso pin
my name is IGOR, not AIGOR

nid69ita


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

Sei sicuro questo hardware funzioni?


..., 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?
my name is IGOR, not AIGOR

danielspc

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 :)
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 ? :)

gpb01


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 ? :)


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

"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
Search is Your friend ... or I am Your enemy !

danielspc

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

danielspc

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

Code: [Select]


#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();
 

}


gpb01


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


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

Guglielmo
Search is Your friend ... or I am Your enemy !

danielspc

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 ? :)

Go Up