braccio robotico comandato da diverse schede arduino uno

ciao ragazzi sono nuovo e quest'anno ho l'esame di maturita e come tesina vorrei portare un braccio robotico costruito da me comandato da 3 schede arduino.
Nella scheda uno è presente il controllo del joistic e dei servo , nella seconda è presente il controllo per i motori e nella terza che devo ancora iniziare mettero una telecamera per l'andamento automatico del braccio!
Io pero ho un problema ovvero vorrei che quando riconosco il movimento del motore(motoriduttore messo come base comandato dalla secondo scehda) la scheda 1 mandasse tramite la libreria softwareserial alla seconda i comandi di avanti e indietro del motore! il problema è che non succede propio niente! i servo , e i motori sono funzionanti all 100%.
inoltre ho provato a vedere che caratterr arriva ed esso è strano e ogni volta che apro il monitor seriale si pianta l'IDE ARDUINO.

Questi sono i file

/*
    B R A C C I O    R O B O T I C O 
    
    Creato da : Alessandro Manfredi 
    
    T E S I N A   E S A M E   D I   M A T U R I T A
    
    */


#include "Arduino.h"
#include <SoftwareSerial.h>




const byte RX_SERIALE = 2;
const byte TX_SERIALE = 4;

SoftwareSerial Connessione ( RX_SERIALE , TX_SERIALE );  // RX , TX

// COSTANTI PER PORTE MOTORE CANALE A
const int DIREZIONE_A = 12;
const int BRAKE_A = 9;
const int VELOCITA_A = 3;

// CONSTENTE PER LA CONNESSIONE CON LA SCHEDA ARDUINO-SERVO-JOISTIC



// CONSTANTE PER I VALORI DELLA CONNESSIONE

const byte MOTORE_AVANTI =   0X33;
const byte MOTORE_INDIETRO =   0X53;



// COMMENTO I PIN PER IL CANALE DUE PERCHè USO SOLO UN MOTORE
/*const int DIREZIONE_B = 13;
const int BRAKE_A = 8;
const int VELOCITA_A = 11;*/

// vaiabile per leggere il valore del dato in arrivo sulla porta per la connessione
char Valore_Connessione;


void setup() {
  
  //Settaggi Canale A
  pinMode ( DIREZIONE_A , OUTPUT); //Initiates Motor Channel A pin
  pinMode ( BRAKE_A , OUTPUT); //Initiates Brake Channel A pin
  pinMode ( VELOCITA_A , OUTPUT );
  
  //Settaggio PORTA CONNESSIONE CON SCHEDA ARDUINO-SERVO-JOISTCI
  
 
  Serial.begin(4800);
  
  // setto i alori delle porte della seriale inventata
  
  pinMode ( RX_SERIALE , INPUT );
  pinMode ( TX_SERIALE , OUTPUT );
  
  Connessione.begin(4800);
  Connessione.flush();
  
}

// DIREZIONE : HIGH = AVANTI   &&  LOW ==

void loop(){
  
  if ( Connessione.available () ) 
  {
      Valore_Connessione = Connessione.read();
  
  
      if ( Valore_Connessione == MOTORE_AVANTI ) // motore avanti
      {
          Motore_Avanti();
          Serial.println ( "aaaaaaaa ");
      }
      else if ( Valore_Connessione == MOTORE_INDIETRO );
      {
          Motore_Indietro();
          Serial.println ( "iiiiiii");
      }  
  }
  
  Serial.println( Valore_Connessione );
  
  
  /*if ( Valore_Connessione == MOTORE_AVANTI ) Motore_Avanti();
  if ( Valore_Connessione == MOTORE_INDIETRO ) Motore_Indietro();
  
  Serial.println(Valore_Connessione + " C" );
  */
  //Motore_Avanti();  
  
  // resetto il
  Valore_Connessione = 0;
  Connessione.flush();
  
}


void Motore_Avanti ( )
{
  
  digitalWrite( DIREZIONE_A , HIGH);
  digitalWrite( BRAKE_A , LOW);   
  analogWrite ( VELOCITA_A, 255);   
  
  return;
  
}


void Motore_Indietro  ()
{
  
  digitalWrite( DIREZIONE_A, LOW); 
  digitalWrite( BRAKE_A, LOW);   
  analogWrite(  VELOCITA_A, 255);  
  
}

questo è il mittente e quello prima è il destinatario

#include "Arduino.h"
#include <Servo.h>
#include <SoftwareSerial.h>
const byte RX_SERIALE = 13;
const byte TX_SERIALE = 7;
SoftwareSerial Connessione = SoftwareSerial( RX_SERIALE , TX_SERIALE );
Servo Spalla , Gomito , Polso , Mano;
const int X_SOGLIA_ALTA = 550;
const int X_SOGLIA_BASSA = 450;
const int Y_SOGLIA_ALTA = 550;
const int Y_SOGLIA_BASSA = 450;
const byte ANALOGICO_X = A0;
const byte ANALOGICO_Y = A1;
const byte BTN_SU = 4;
const byte BTN_DESTRA = 3;
const byte BTN_SINISTRA = 6;
const byte BTN_GIU = 5;
const byte BTN_ANALOGICO = 2;
const byte BUZZER = A2;
const int PREMUTO = 0;
const int AVANTI = 1;
const int INDIETRO = -1;
const int FERMO = 0;
const int DESTRA = 1;
const int SINISTRA = -1;
const int S_CENTRO = 90;
const int S_DESTRA = 0;
const int S_SINISTRA = 180;
const int MOTORE_AVANTI = 254;
const int MOTORE_INDIETRO = 255;
const byte SERIALE_MOTORE_AVANTI =   0X33;
const byte SERIALE_MOTORE_INDIETRO =   0X53;
int x_direzione , y_direzione;
int x_posizione , y_posizione;
int gradi_spalla , gradi_gomito , gradi_polso , gradi_mano;
int regola_gradi( int gradi  );
void Suono_Accensione ( );
void Polso_Avanti ();
void Polso_Indietro ();
void Spalla_Avanti ();
void Spalla_Indietro ();
void Gomito_Avanti ();
void Gomito_Indetro();
void Motore_Avanti ();
void Motore_Indietro ();
void setup ()
{
  pinMode ( ANALOGICO_X , INPUT );
  pinMode ( ANALOGICO_Y , INPUT );
  pinMode ( BTN_SU , INPUT );
  digitalWrite(BTN_SU, HIGH);
  pinMode ( BTN_GIU , INPUT );
  digitalWrite(BTN_GIU, HIGH);
  pinMode ( BTN_DESTRA , INPUT );
  digitalWrite(BTN_DESTRA, HIGH);
  pinMode ( BTN_SINISTRA , INPUT );
  digitalWrite(BTN_SINISTRA, HIGH);
  pinMode ( 9 , OUTPUT);
  pinMode ( 10 , OUTPUT);
  pinMode ( 11 , OUTPUT);
  pinMode ( 12 , OUTPUT); 
  gradi_spalla = gradi_gomito = gradi_polso = S_CENTRO;
  gradi_mano = S_DESTRA;
  Spalla.attach(9);
  Spalla.write(gradi_spalla); 
  Gomito.attach(10);
  Gomito.write(gradi_gomito); 
  Polso.attach(11);
  Polso.write(gradi_polso); 
  Mano.attach(12);
  Mano.write(gradi_mano); 
  
  //settaggio del buzzer sulla porta 7
  pinMode ( BUZZER , OUTPUT );
  
  Serial.begin(9600);
  // imposto al baud.rate a 9600 sulla seriale inventata
  
  pinMode ( RX_SERIALE , INPUT );
  pinMode ( TX_SERIALE , OUTPUT );
  
 Connessione.begin(4800);
  
  // settaggio della porta per il collegamento con la schda ARDUINO-MOTORI
  
  Connessione.flush();
  
  Suono_Accensione();
}

void loop ()
{
  x_direzione = FERMO;
  y_direzione = FERMO;
 
  x_posizione = analogRead(ANALOGICO_X);
  y_posizione = analogRead(ANALOGICO_Y);
 
 
 //CONTROLLO POSIZIONE
 
  if (x_posizione > X_SOGLIA_ALTA) x_direzione = DESTRA;
    
  else if (x_posizione < X_SOGLIA_BASSA)  x_direzione = SINISTRA;
   
  if (y_posizione > Y_SOGLIA_ALTA) y_direzione = AVANTI;
    
  else if (y_posizione < Y_SOGLIA_BASSA) y_direzione = INDIETRO;
    
  if ( x_direzione == DESTRA && y_direzione == AVANTI &&  digitalRead ( BTN_SU ) == LOW )
  {
    
    
        
        Polso_Avanti();
        Motore_Avanti();
    
  }
  if ( x_direzione == SINISTRA && y_direzione == AVANTI &&  digitalRead ( BTN_SU ) == LOW )
  {
    
        
        Polso_Avanti();
        Motore_Indietro();
       
  }
  if ( x_direzione == DESTRA && y_direzione == INDIETRO &&  digitalRead ( BTN_SU ) == LOW )
  {
    
   
        
        Polso_Indietro();
        Motore_Avanti();
     
  }
  if ( x_direzione == SINISTRA && y_direzione == INDIETRO &&  digitalRead ( BTN_SU ) == LOW )
  {
    
    
      
        Polso_Indietro();
        Motore_Indietro();
       
  }
  
  if ( y_direzione == AVANTI && digitalRead ( BTN_SU ) == LOW )
  {
       
       
        Polso_Avanti();
  }
  
  if ( y_direzione == INDIETRO && digitalRead ( BTN_SU ) == LOW )
  {
        Serial.println ( "  POLSO INDIETRO " );
        
        Polso_Indietro();
  }
  
   
  
  // C O M A N D I   P E R   I L   G O M I T O
  
  
  if ( x_direzione == DESTRA && y_direzione == AVANTI &&  digitalRead ( BTN_DESTRA ) == LOW )
  {     
        Gomito_Avanti();
        Motore_Avanti();
       
  }
  
  if ( x_direzione == SINISTRA && y_direzione == AVANTI &&  digitalRead ( BTN_DESTRA ) == LOW )
  {
        
        Gomito_Avanti();
        Motore_Indietro();
        // devo anche fare andare il motore indietro
  }
  
  if ( x_direzione == DESTRA && y_direzione == INDIETRO &&  digitalRead ( BTN_DESTRA ) == LOW )
  {
    
    // POLSO AVANTI DESTRA GIU
        Serial.println("DESTRA GIU GOMITO AVANTI");
      
        Gomito_Indietro();
        Motore_Avanti();
       // devo anche fare andare il motore avanti 
  }
  
  if ( x_direzione == SINISTRA && y_direzione == INDIETRO &&  digitalRead ( BTN_DESTRA ) == LOW )
  {
    
    // POLSO AVANTI SINISTRA SU
        Serial.println("SINISTRA GIU GOMITO AVANTI");
        
        Gomito_Indietro();
        Motore_Indietro();
        // devo anche fare andare il motore indietro
  }
  
  if ( y_direzione == AVANTI && digitalRead ( BTN_DESTRA ) == LOW )
  {
        Serial.println ( "  GOMITO AVANTI " );
        Gomito_Avanti();
  }
  
  if ( y_direzione == INDIETRO && digitalRead ( BTN_DESTRA ) == LOW )
  {
        Serial.println ( "  GOMITO INDIETRO " );
        Gomito_Indietro();
  }
   
  
  
  
  // C O M A N D I   P E R   L A   S P A L L A
  
  if ( x_direzione == DESTRA && y_direzione == AVANTI &&  digitalRead ( BTN_GIU ) == LOW )
  {
    
    // POLSO AVANTI DESTRA SU
        Serial.println("DESTRA SU SPALLA AVANTI");
       
        Spalla_Avanti();
        Motore_Avanti();
       // devo anche fare andare il motore avanti 
  }
  
  if ( x_direzione == SINISTRA && y_direzione == AVANTI &&  digitalRead ( BTN_GIU ) == LOW )
  {
    
    // POLSO AVANTI SINISTRA SU
        Serial.println("SINISTRA SU SPALLA AVANTI");
        
        Spalla_Avanti();
        Motore_Indietro();
        // devo anche fare andare il motore indietro
  }
  
  if ( x_direzione == DESTRA && y_direzione == INDIETRO &&  digitalRead ( BTN_GIU ) == LOW )
  {
    
    // POLSO AVANTI DESTRA GIU
        Serial.println("DESTRA GIU SPALLA AVANTI");
        //Serial.println("A");
        Spalla_Indietro();
        Motore_Avanti();
       // devo anche fare andare il motore avanti 
  }
  
  if ( x_direzione == SINISTRA && y_direzione == INDIETRO &&  digitalRead ( BTN_GIU ) == LOW )
  {
    
    // POLSO AVANTI SINISTRA SU
        Serial.println("SINISTRA GIU SPALLA AVANTI");
        //Serial.println("I");
        Spalla_Indietro();
        Motore_Indietro();
        // devo anche fare andare il motore indietro
  }
  
  if ( y_direzione == AVANTI && digitalRead ( BTN_GIU ) == LOW )
  {
        Serial.println ( "  SPALLA AVANTI " );
        Spalla_Avanti();
  }
  
  if ( y_direzione == INDIETRO && digitalRead ( BTN_GIU ) == LOW )
  {
        Serial.println ( "  SPALLA INDIETRO " );
        Spalla_Indietro();
  }
   
   
  // C O M A N D I   P E R   I L   M O T O R E
  if ( x_direzione == AVANTI )
  {
       
        // MOTORE AVANTI
        Serial.println( "MOTORE AVANTI" );
        Motore_Avanti();
  }
  
  if ( x_direzione == INDIETRO  )
  {
        
        //MOTORE INDIETRO
        Serial.println ( "MOTORE INDIETRO" );
        Motore_Indietro();
  }
  
    
    
  
  // C O M A N D I   P E R   L A   M A N O  ( A P E R T U R A   D E L L A   P I N Z A )    
  // !!!!!!!!RICORDARSI DI FARLO
  
 }

QUESTE SONO LE FUNZIONE DEL PROGRAMMA SOPRA SCUSATE SE LE HO MESSE QUA MA SUPERAVO I 9500 CARATTERI

int regola_gradi( int gradi  )
{
  if ( gradi > S_SINISTRA) 
  {
    
    gradi = S_SINISTRA;
    
    // Faccio suonoare il buzzer per avvertire della posizione massima raggiunta
    
    analogWrite ( BUZZER , 255 );
    delay (50);
    analogWrite ( BUZZER , 0 );
  }
  if ( gradi < S_DESTRA )
  {
  
     gradi = S_DESTRA;
     
     // Faccio suonoare il buzzer per avvertire della posizione minima raggiunta
     
     analogWrite ( BUZZER , 255 );
     delay (50);
     analogWrite ( BUZZER , 0 );
  }
  return gradi;
  
}

void Suono_Accensione ( )
{
    
    for ( int i = 0; i < 4; i++ )
    {
      analogWrite ( BUZZER , 255 );
      delay (200);
      analogWrite ( BUZZER , 0 );
      delay (200);
    }
      
    
    
    return;
}



void Polso_Avanti ()
{
        
        gradi_polso+=2;
        gradi_polso = regola_gradi ( gradi_polso  );
        Polso.write(gradi_polso);   
        
        return;
}

void Polso_Indietro ()
{
  
        gradi_polso-=2;
        gradi_polso = regola_gradi ( gradi_polso  );
        Polso.write(gradi_polso);   
        
        return;
}

void Spalla_Avanti ()
{
  
        gradi_spalla+=2;
        gradi_spalla = regola_gradi ( gradi_spalla  );
        Spalla.write(gradi_spalla);
        
        return;
}

void Spalla_Indietro ()
{
  
       gradi_spalla-=2;
       gradi_spalla = regola_gradi ( gradi_spalla  );
       Spalla.write(gradi_spalla);
        
        return;
}

void Gomito_Avanti ()
{
  
        gradi_gomito+=2;
        gradi_gomito = regola_gradi ( gradi_gomito  );
        Gomito.write(gradi_gomito);
        
        return;
}
 
void Gomito_Indietro ()
{
  
        gradi_gomito-=2;
        gradi_gomito = regola_gradi ( gradi_gomito  );
        Gomito.write(gradi_gomito);
        
        return;
}


void Motore_Avanti ( )
{
  if ( Connessione.available() )   Connessione.print ( SERIALE_MOTORE_AVANTI );
  return;
}

void Motore_Indietro ()
{
  if ( Connessione.available() ) Connessione.print ( SERIALE_MOTORE_INDIETRO );
  return;
}

alle588:
nella terza che devo ancora iniziare mettero una telecamera per l'andamento automatico del braccio!

Lo sai che Arduino, non importa se UNO o DUE, non è in grado di gestire una telecamera ?

Ma supponiamo che ce la faccia, alle, non per smontarti ma saresti in grado di sviluppare un software che acquisisca un video da una telecamera e che ne riconosca le informazioni? Guarda, mi fermo prima, saresti anche solo in grado di scrivere il driver per la telecamera?
Ti dico questo perché tu non ti imbatta in qualcosa che potenzialmente potrebbe risultare più grande di te proprio per il progetto della maturità, poi magari mi smentisci, nel qual caso mi complimenterei con te... :wink:

1.Non ho capito alcuni commenti nel mittente:

  Serial.begin(9600);
  // imposto al baud.rate a 9600 sulla seriale inventata
  pinMode ( RX_SERIALE , INPUT );
  pinMode ( TX_SERIALE , OUTPUT );
  Connessione.begin(4800);
   // settaggio della porta per il collegamento con la schda ARDUINO-MOTORI

Perchè la prima riga è seriale inventata? La seriale che, diciamo, hai "inventato" non è Connessione?

2.Inoltre, usando la SoftwareSerial e dichiarando:
SoftwareSerial Connessione = SoftwareSerial( RX_SERIALE , TX_SERIALE );
dubito molto che servano le 2 righe pinMode su RX_SERIALE e TX_SERIALE, presumo lo faccia già la libreria internamente.

3.Le funzioni tue che ritornano void non necessitano di return. Togliele così accorci il codice.

4.Perchè poi nel codice tutte quelle righe vuote? Il programma sembra lungo un Km. Indenti bene, perciò basta quello per la leggibilità del codice. Al limite appesantisci i commenti (es. // *** POLSO AVANTI DESTRA GIU ***)

5.Una cosa che proverei a modificare nel ricevente è la dichiarazione di Valore_Connessione, la dichiarerei byte e non char. I comandi li dichiari byte.

6.Sei sicuro dei collegamenti tra le seriali dei due Arduino?

Premetto che la telecamera che prendo è la CMUCAM4 la quale ha gia le librerie scritte per arduino e che viene montata gia in cima ad una shield! cmnq per il fatto della seriale "Connessione", perchè sul pin13 non è possibile gestirci dati della seriale con SoftwareSerial?

alle588:
Premetto che la telecamera che prendo è la CMUCAM4

La CMUCAM 4 non è una telecamera, è un sistema, minimale, per la visione artificiale composto da un sensore cmos e un microprocessore di fascia medio/alta dedicato alla gestione dei dati.

Con un processore a 32bit con la bellezza di 8 core -_-

Ti posso chiedere una cosa? ma almeno sai cos'è? è stata fatta per arduino apposta! all'interno della cmucam4 c'è un microprocessore elabora lui stesso le immagini

Voglio chiedere un altra cosa che grazie alla quale ho dovuto buttare due arduino!..quando attacco arduino al joistcic shield arduino si scalda un po e poi quando tento di caricarci in cima il programma non mi riconosce piu la porta seriale e il LED "L" rimane sempre acceso

Hai il link dello shield Joistick ho l'hai creato tu? Nel caso hai lo schema elettrico?
Ci sono le resistenze per limitare la tensione?

alle588:
Ti posso chiedere una cosa? ma almeno sai cos'è?

Se la domanda era rivolta ad Astro, mi spiace tantissimo che non ci sia la faccina che si rotola per terra. :grin: :grin:

EDIT: quando gli sketch sono molto grandi puoi direttamente allegare il file .ino al post. :wink:

PaoloP:
Se la domanda era rivolta ad Astro, mi spiace tantissimo che non ci sia la faccina che si rotola per terra. :grin: :grin:

Infatti non gli ho nemmeno risposto, quando vedo simili cose mi passa completamente la voglia di aiutare.

alle588:
Ti posso chiedere una cosa? ma almeno sai cos'è? è stata fatta per arduino apposta! all'interno della cmucam4 c'è un microprocessore elabora lui stesso le immagini

A parte il fatto che astrobeed non apre la bocca a casaccio, 130 euro per quella schedina è un po' tantino.... Io userei un Raspberry PI oppure un' Aria G25.
Oppure se ne hai la possibilità potresti mettere una webcam che passa le immagini ad un portatile che passa via seriale ad Arduino i movimenti che deve compiere. (Spero che tu non risponda male anche a me)
Ciao
C

http://www.robotstore.it/product/293/Shield-Mini-Joystick-resistivo.html questo è il link della shield.
cmnq per il fatto delle faccine scusate ma io non sono pratico dei forum e poi io non ne metto mai! scusate ancora

Lo shield ha i pulsanti attaccati senza resistenza a GND, usandoli con le pull-up interne (come in effetti stai facendo) non ci sono problemi.
Se hai bruciato l'ATmega è per qualche altro motivo, ad esempio i collegamenti dei motori.

per adesso grazie mille a tutti! e mi scuso ancora!...comunque se non è la shield del joisic non saprei cosa potrebbe essere! perchè quando "funzionava" ancora tutto i motori ed i servo giravano perfettamente! da un giorno all' altro è successo tutto questo pasticcio!!!

Non ti resta che fare qualche prova, collegando solo i motori e la motor shield con uno sketck di prova minimale.
Inoltre ricorda che se monti più shield impilati essi non devo utilizzare gli stessi pin. Controlla i pin utilizzati dalle varie schede se sono montate sullo stesso Arduino.

Per il resto dovresti, oltre al codice già postato, indicarci i collegamenti e le schede o componentistica aggiuntiva utilizzata, magari anche con uno schema o una foto. Perché così non è facile capire com'è collegato il tutto e se è corretto.

E tranquillo!! Abbiano superato la 40-ina e sia già maturi. :grin: :grin: (tranne Cece)

I collegamenti non sono complicati...anzi!!! uso una scheda per la shield con il joistic , una per la shield dei motori e una per la cmucam....i collegamenti ei servo rosso (+) , nero(gnd) , giallo (segnale) come collegamenti non è un problema!! ho fatto anche quelle prove consli sketch minimali e tutto funziona ma quando è tutto attaccato ( al braccio ) fa dei macelli! puo essere che essendo un po pesante il servo (gomito) faccia fatica e allora si brucia! secondo me è impossibile ma a questo punto le penso tutte!! io uso il mac come pc non vorrei che sia quello però non penso! è un macbook pro