Pages: 1 [2] 3   Go Down
Author Topic: Como comunicar dos arduinos ?  (Read 5775 times)
0 Members and 1 Guest are viewing this topic.
0
Offline Offline
Edison Member
*
Karma: 16
Posts: 1579
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

No se, ahora entras en fase de depuracion.... smiley-wink

Conecta ambos Arduinos directamente, a ver si el software esta bien. Es decir, el TX de tu Arduino transmisor, al RX del receptor. (con 232, sin usar rs485).  Asi aseguras que es algo con el bus y no nada del software.

Comparten masas ambos Arduinos????  Como estas alimentando ambas placas ??



« Last Edit: May 10, 2010, 06:07:06 am by igorreal » Logged


0
Offline Offline
Full Member
***
Karma: 0
Posts: 131
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Igor,

No tengo dos arduinos, lo que hecho a sido probar e lmaster sobre arduino, y me funciona pues el led parpadea.

Despues e sacado el master y he puesto el slave, y con el realterm envio 255 y el led se enciende, despues envio un zero y el led se apaga.

He notado una cosa un poco estraña con mis 75176,
cuando mido la tension sobre la resistencia de 120 ohms sin los Atmegas conectados, apenas los 75176 alimentados estoy midiendo 2.9V (con osciloscopio).

Esso es normal? no deberia ser algo como 200mV?

Cundo introduzco los Atmegas en el circuito, sigue lo mismo 2.9V de base y me aparecen pulsos a cada 500ms con amplitudaproximada  de 5Vpp.

Cual seria la aplitud normal? los pulsos deberian ser constantes, tren de pulsos no?
Logged

0
Offline Offline
Edison Member
*
Karma: 16
Posts: 1579
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Aqui puedes encontrar unas capturas de osciloscopio:
http://www.maxim-ic.com/app-notes/index.mvp/id/763

las masas son comunes en ambos micros???? (tienen que serlo)



Si no me equivoco, es algo como maximo +/-6 V si no hay carga, y como minimo +/-1.5V con carga.

Documento con capturas tipicas del bus RS485 (y como detectar problemas):
http://www.sbc-support.ch/faq/files/files.get.php?ZSESSIONID=n38bphov4ls4cdsvtbd8tl6jb4&fi_index=100179






« Last Edit: May 11, 2010, 03:43:12 am by igorreal » Logged


0
Offline Offline
Full Member
***
Karma: 0
Posts: 131
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Estupendo Igor,  

Con etas informaciones creo que consigo solucionar mi problema.

Cuando termine te informo.  Gracias por tu ayuda.

Cristal

PS. Las masas son las mismas, me havia olvidado de informarte  smiley-wink
« Last Edit: May 11, 2010, 03:47:05 pm by Cristal » Logged

0
Offline Offline
Edison Member
*
Karma: 16
Posts: 1579
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Como fue Cristal? Funciona?

He visto que sigues el ejemplo de aqui => http://modprobe.complex.ch/2010/03/13/hello-rs485-arduino/



Saludos


Logged


0
Offline Offline
Full Member
***
Karma: 0
Posts: 131
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Exatamente Igor,

Una prueba bien simples (del software), pero no estoy utilizando la configuracion de hardware sugerida por el, estoy utilizando los pines de control conforme el circuito enviado.

Infelizmente yo solo tengo el domingo para hacer pruebas, y no todos los domingos, pero en este domingo voy a seguir los documentos que me enviates y te cuento lo que paso.

He comprado el max485 para estar seguro que el problema no es el 75176.

Saludos,
Logged

0
Offline Offline
Full Member
***
Karma: 0
Posts: 131
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hola a todos,

Igor, finalmente la RS485 esta funcionando ;D pero parcialmente.  Me explico.

Tengo un amigo que se compro una casa y la casa nueva tiene una piscina.  El me preguntó si podía ayudarle a poner una iluminación diferente en la piscina y yo prontamnete empeze a trabajar en este proyeto.

La idea es utilizar un dip switch durantre el prototipo (interruptores en el proyeto final)  através de "arduino standalone" con comunicación RS485 comandar los leds RGB en los focos de la piscina.

Cuando cambié los 75176 con el MAX485, my circuito empezo a funcionar pero todavia tengo dos problemas:

Para leer el dip switch con los ascII sugeridas en tu programa ( 48 49 50 etc) solo llegó hasta 9 (que es igula a 57) pero el dip switch que estoy utilizando llega a 15.  

Puedo utilizar outros valores abajo de 48 sin problemas? (arriba de 66 el ckecksum es siempre el mismo)

Hecha una ojeada en las modificaciones que hecho para el master, me funciona perfectamente.


Maestro:

Code:
//----------------------------------
//RS 485
//By Igor Real
//24-06-09
//----------------------------------


byte            data[12];
unsigned long   previous_time;
unsigned long   previous_time2;
byte            times_repeat=5;
byte            times_repeat2=5;
int             dipState = 0;
byte            state=0;
byte            state2=0;
int             lastdipState = 20;
//pinos dos dips

const int Dip1 = 5;
const int Dip2 = 6;
const int Dip3 = 7;
const int Dip4 = 8;



#define  pinCONTROL    02
#define  myaddress     01
  

void setup() {

   pinMode(13,OUTPUT);
   pinMode(pinCONTROL,OUTPUT);
   //digitalWrite(13,HIGH);
   //digitalWrite(12,LOW);
   //pinMode(8,INPUT);
   //pinMode(9,INPUT);
   digitalWrite(pinCONTROL,LOW);
   // inicializar botoes input:
  pinMode(Dip1, INPUT);
  pinMode(Dip2, INPUT);
  pinMode(Dip3, INPUT);
  pinMode(Dip4, INPUT);  
  
   Serial.begin(9600);
   //Serial.println("Empezamos");
   state=0;
   state2=0;
}

void loop()
{
ledip();
  //if (digitalRead(8)==state){
   // state=!state;
   // times_repeat=0;  
 //}
 // if (digitalRead(9)==state2){
 //   state2=!state2;
 //   times_repeat2=0;  
 // }

  //if (dipState!=state){
  //  dipState=state;
  //  times_repeat=0;
  //}
  
  if (dipState != lastdipState) {
    // se o botao mudou, incrementa contador
    //Serial.println(dipState); //debug
    // salva o staus do botao,
    lastdipState = dipState;
    times_repeat=0;
    //Serial.println(dipState);
  }
  
  
  
  if (times_repeat<4){
    Serial.flush();  
    //(byte address1,byte address2,byte data_type,byte code1,byte code2,byte Sign,byte data1,byte data2,byte data3,byte data4)
    //Serial.println();
    //Serial.println(dipState);
    
    if (dipState==0){  
      sendMSG(48,50,68,48,48,32,48,48,48,48);
    }
    if (dipState == 1){
      
      sendMSG(48,50,68,48,48,32,48,48,48,49);
    }
     if (dipState == 2){
      
      sendMSG(48,50,68,48,48,32,48,48,48,50);
    }
     if (dipState == 3){
      
      sendMSG(48,50,68,48,48,32,48,48,48,51);
    }
     if (dipState == 4){
      
      sendMSG(48,50,68,48,48,32,48,48,48,52);
    }
     if (dipState == 5){
      
      sendMSG(48,50,68,48,48,32,48,48,48,53);
    }
     if (dipState == 6){
      
      sendMSG(48,50,68,48,48,32,48,48,48,54);
    }
     if (dipState == 7){
      
      sendMSG(48,50,68,48,48,32,48,48,48,55);
    }
     if (dipState == 8){
      
      sendMSG(48,50,68,48,48,32,48,48,48,56);
    }
     if (dipState == 9){
      
      sendMSG(48,50,68,48,48,32,48,48,48,57);
    }
     if (dipState == 10){
      
      //sendMSG(48,50,68,48,48,32,48,48,48,20);
    }
     if (dipState == 11){
      
      //sendMSG(48,50,68,48,48,32,48,48,48,21);
    }
     if (dipState == 12){
      
      //sendMSG(48,50,68,48,48,32,48,48,48,22);
    }
     if (dipState == 13){
      
      //sendMSG(48,50,68,48,48,32,48,48,48,23);
    }
     if (dipState == 14){
      
      //sendMSG(48,50,68,48,48,32,48,48,48,24);
    }
     if (dipState == 15){
      
      //sendMSG(48,50,68,48,48,32,48,48,48,25);
    }
    
    
    
    
    
    times_repeat=times_repeat+1;
  
    previous_time=millis();
    while (((millis()-previous_time)<500) && (Serial.available()!=15)){
      ;;
    }
  
    if (Serial.available()>=15){
      if (receiveMSG()==1){
        //Serial.println("Trama correcta");
        if (data[0]==48 && data[1]==49 && data[2]==6){
          //ACK  
          times_repeat=5;
          //Serial.println("ACK recibido");
        }
      }
     }
   }  
  
  

  //if (times_repeat2<4){
   // Serial.flush();  
    //(byte address1,byte address2,byte data_type,byte code1,byte code2,byte Sign,byte data1,byte data2,byte data3,byte data4)
  //  if (digitalRead(9)==HIGH){  
  //    sendMSG(48,50,68,48,48,32,48,48,48,49);
  //  }else {
  //    sendMSG(48,50,68,48,48,32,48,48,48,48);
  //  }
  //  times_repeat2=times_repeat2+1;
  
  //  previous_time2=millis();
  //  while (((millis()-previous_time2)<500) && (Serial.available()!=15)){
  //  ;;
  //  }
  
  //  if (Serial.available()>=15){
  //    if (receiveMSG()==1){
       //Serial.println("Trama correcta");
  //      if (data[0]==48 && data[1]==65 && data[2]==6){
          //ACK  
   //       times_repeat2=5;
          //Serial.println("ACK recibido");
   //     }
   //   }
  //  }
 // }
  
  
  
}


//------------------------
//FUNCIONES
//------------------------

void ledip()
{
  dipState=digitalRead(5) + (digitalRead(6)<<1) + (digitalRead(7)<<2) + (digitalRead(8)<<3);
  //delay(5);
  
}


byte receiveMSG(){

  byte  byte_receive;
  byte  state=0;
  byte  cont1=1;
  byte  trace_OK=0;

  unsigned int checksum;
  unsigned int checksum_trace;
  
  
  
  while (Serial.available() > 0){
    
     byte_receive=Serial.read();
     if (byte_receive==00){
       state=1;
       checksum_trace=0;
       checksum=0;
       trace_OK=0;
       cont1=1;
     }else if (state==1 && cont1<=12){
       data[cont1-1]=byte_receive;
       checksum=checksum+byte_receive;
       cont1=cont1+1;
     }else if (state==1 && cont1==13){
       checksum_trace=byte_receive<<8;
       cont1=cont1+1;
     }else if (state==1 && cont1==14){
       checksum_trace=checksum_trace+byte_receive;
       cont1=cont1+1;
       state=0;
       if (checksum_trace==checksum){
           trace_OK=1;
       }else{
         trace_OK=0;
       }
       break;
     }
  }
  return trace_OK;

}



void sendMSG(byte address1,byte address2,byte data_type,byte code1,byte code2,byte Sign,byte data1,byte data2,byte data3,byte data4){
  
  unsigned int checksum_ACK;
  checksum_ACK=address1+address2+5+data_type+code1+code2+Sign+data1+data2+data3+data4+3;
  
  UCSR0A=UCSR0A |(1 << TXC0);
  
  digitalWrite(pinCONTROL,HIGH);
  delay(1);

  Serial.print(0,BYTE);
  Serial.print(address1,BYTE);
  Serial.print(address2,BYTE);
  Serial.print(5,BYTE);
  Serial.print(data_type,BYTE);
  Serial.print(code1,BYTE);
  Serial.print(code2,BYTE);
  Serial.print(Sign,BYTE);
  Serial.print(data1,BYTE);
  Serial.print(data2,BYTE);
  Serial.print(data3,BYTE);
  Serial.print(data4,BYTE);  
  Serial.print(3,BYTE);
  Serial.print(((checksum_ACK>>8)&255),BYTE);
  Serial.print(((checksum_ACK)& 255),BYTE);
  while (!(UCSR0A & (1 << TXC0)));
  digitalWrite(pinCONTROL,LOW);

  
  
}



void sendACK(byte address1,byte address2,byte data_type,byte code1,byte code2,byte Sign,byte data1,byte data2,byte data3,byte data4){
  
  unsigned int checksum_ACK;
  checksum_ACK=address1+address2+6+data_type+code1+code2+Sign+data1+data2+data3+data4+3;
  
  UCSR0A=UCSR0A |(1 << TXC0);
  
  digitalWrite(pinCONTROL,HIGH);
  delay(1);

  Serial.print(0,BYTE);
  Serial.print(address1,BYTE);
  Serial.print(address2,BYTE);
  Serial.print(6,BYTE);
  Serial.print(data_type,BYTE);
  Serial.print(code1,BYTE);
  Serial.print(code2,BYTE);
  Serial.print(Sign,BYTE);
  Serial.print(data1,BYTE);
  Serial.print(data2,BYTE);
  Serial.print(data3,BYTE);
  Serial.print(data4,BYTE);  
  Serial.print(3,BYTE);
  Serial.print(((checksum_ACK>>8)&255),BYTE);
  Serial.print(((checksum_ACK)&255),BYTE);
  while (!(UCSR0A & (1 << TXC0)));
  digitalWrite(pinCONTROL,LOW);
  
  
}

void sendNAK(byte address1,byte address2,byte data_type,byte code1,byte code2,byte Sign,byte data1,byte data2,byte data3,byte data4){
  
  unsigned int checksum_ACK;
  checksum_ACK=address1+address2+6+data_type+code1+code2+Sign+data1+data2+data3+data4+3;
  
  UCSR0A=UCSR0A |(1 << TXC0);
  
  digitalWrite(pinCONTROL,HIGH);
  delay(1);

  Serial.print(0,BYTE);
  Serial.print(address1,BYTE);
  Serial.print(address2,BYTE);
  Serial.print(15,BYTE);
  Serial.print(data_type,BYTE);
  Serial.print(code1,BYTE);
  Serial.print(code2,BYTE);
  Serial.print(Sign,BYTE);
  Serial.print(data1,BYTE);
  Serial.print(data2,BYTE);
  Serial.print(data3,BYTE);
  Serial.print(data4,BYTE);  
  Serial.print(3,BYTE);
  Serial.print(((checksum_ACK>>8)&255),BYTE);
  Serial.print(((checksum_ACK)&255),BYTE);
  while (!(UCSR0A & (1 << TXC0)));
  digitalWrite(pinCONTROL,LOW);
  
  
}



byte hex2num(byte x){

  byte result;
  
  if (x>=48 && x<=57){
    result=x-48;  
  }else if (x>=65 && x<=70){
    switch(x){
      case 65:
        result=10;
        break;
      case 66:
        result=11;
        break;
      case 67:
        result=12;
        break;
      case 68:
        result=13;
        break;
      case 69:
        result=14;
        break;
      case 70:
        result=15;
        break;    
    }  
  }
  return result;  
}




Logged

0
Offline Offline
Full Member
***
Karma: 0
Posts: 131
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Continuación...
Para el esclavo, me funciona bien quando selecciono 1, 2 o 3 en el dip switch (del Maestro), pero cuando seleciono 4, por ejemplo, el led rojo deveria empezar un fade in y out, pero el led rojo queda apagado todo el tiempo.
Lo que podría estar mal ?  Gracia por la ayuda.

Esclavo:

Logged

0
Offline Offline
Full Member
***
Karma: 0
Posts: 131
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

codigo del esclavo:

Code:
//----------------------------------
//RS 485
//By Igor Real
//24-06-09
//----------------------------------


byte  data[12];
byte  address;
byte  function;
byte  function_code;
unsigned int data_received;
byte  byte_receive;
byte  state=0;
byte  cont1=1;
byte  trace_OK=0;
unsigned int checksum;
unsigned int checksum_trace;
int j=0; //para contador
int vel = 10; //para controle velocidade

//pinos dos leds
int redPin   = 9;   // Red LED,  
int greenPin = 10;  // Green LED
int bluePin  = 11;  // Blue LED

//valores iniciais
int redVal   = 255;
int greenVal = 1;  
int blueVal  = 1;


#define  pinCONTROL    02
#define  myaddress     02     //address da placa
  

void setup() {
   pinMode(redPin,   OUTPUT);   // sets os pins saida
   pinMode(greenPin, OUTPUT);  
   pinMode(bluePin,  OUTPUT);
    
   pinMode(pinCONTROL,OUTPUT);
   digitalWrite(2,LOW);
   Serial.begin(9600);
   }

void loop()
{
  checkSerial();
}

//------------------------
//FUNCIONES
//------------------------

void checkSerial()
  {
       while (Serial.available() > 0){
    
     byte_receive=Serial.read();
     if (byte_receive==00){
      
       state=1;
       checksum_trace=0;
       checksum=0;
       trace_OK=0;
       address=0;
       data_received=0;
       cont1=1;
     }else if (state==1 && cont1<=12){
       data[cont1-1]=byte_receive;
       checksum=checksum+byte_receive;
       cont1=cont1+1;
     }else if (state==1 && cont1==13){
       checksum_trace=byte_receive<<8;
       cont1=cont1+1;
       //Serial.print("Primer Byte Checksum");      
       //Serial.print(checksum_trace,HEX);
     }else if (state==1 && cont1==14){
       checksum_trace=checksum_trace+byte_receive;
       cont1=cont1+1;
       state=0;
      
       if (checksum_trace==checksum){
         trace_OK=1;
        
         address=(hex2num(data[0])<<4)+(hex2num(data[1]));
         function=data[3];
         function_code=(hex2num(data[4])<<4)+(hex2num(data[5]));
         data_received=(hex2num(data[7])<<12)+(hex2num(data[8])<<8)+(hex2num(data[9])<<4)+(hex2num(data[10]));
                
         execute();
       }
     }
    }
  }

void execute() //excita as funções programadas
{
          if (address==myaddress || address==7){  //address 7 geral para todas as placas broadband
           if ((function=='D') && (function_code==0) && data[2]==5){
              if (data_received==1){    //Dip 1 - Red
              ativaRgb(255,0,0);
               sendACK(data[0],data[1],data[3],data[4],data[5],data[6],data[7],data[8],data[9],data[10]);
             }if (data_received==0){  //Dip 0 -zera leds
               ativaRgb(0,0,0);
               sendACK(data[0],data[1],data[3],data[4],data[5],data[6],data[7],data[8],data[9],data[10]);
             }
             if (data_received==2){    //Dip 2 - Green
               ativaRgb(0,255,0);
               sendACK(data[0],data[1],data[3],data[4],data[5],data[6],data[7],data[8],data[9],data[10]);
             }
             if (data_received==3){    //Dip 3 - Blue
               ativaRgb(0,0,255);
               sendACK(data[0],data[1],data[3],data[4],data[5],data[6],data[7],data[8],data[9],data[10]);
             }
             if (data_received==4){    //Dip 4 - fade red
               sendACK(data[0],data[1],data[3],data[4],data[5],data[6],data[7],data[8],data[9],data[10]);
               fadeRed();
             }
             if (data_received==5){    //Dip 5 - fade green
             sendACK(data[0],data[1],data[3],data[4],data[5],data[6],data[7],data[8],data[9],data[10]);
             fadeGreen();
           }
             if (data_received==6){    //Dip 6 - fade blue
             sendACK(data[0],data[1],data[3],data[4],data[5],data[6],data[7],data[8],data[9],data[10]);
             fadeBlue();
           }
             if (data_received==7){    //Dip 7 - sete cores
             sendACK(data[0],data[1],data[3],data[4],data[5],data[6],data[7],data[8],data[9],data[10]);
             seteCores(5000);
           }
             if (data_received==8){    //Dip 8 - sete cores rapido
             sendACK(data[0],data[1],data[3],data[4],data[5],data[6],data[7],data[8],data[9],data[10]);
             seteCores(200);
           }
           if (data_received==9){    //Dip 9 - rgb
             sendACK(data[0],data[1],data[3],data[4],data[5],data[6],data[7],data[8],data[9],data[10]);
             fadeRGB();
           }
            
       }else{
         sendNAK(data[0],data[1],data[3],data[4],data[5],data[6],data[7],data[8],data[9],data[10]);
       }
 }
 }

void fadeRed()  //fade Red in out
{
  
  for (j=0;j<508;j++){
      if (j<256)
      {
      ativaRgb(j,0, 0);
      delay(200);
      }
       if (j>255){
        ativaRgb(510-j,0, 0);
        delay(200);
      }
       j++;
       checkSerial();
       //execute();
       if (data_received!=4)
   {
       break;
   }
      if(j>506)
       {
         j=1;
       }
   }
}

void fadeGreen()  //fade Blue in out
{
  for (j=0;j<508;j++){
      if (j<256)
      {
      ativaRgb(0,j, 0);
      delay(200);
      }
       if (j>255){
        ativaRgb(0,510-j, 0);
        delay(200);
      }
       j++;
       checkSerial();
       //execute();
       if (data_received!=5)
   {
       break;
   }
      if(j>506)
       {
         j=1;
       }
   }
}
  
void fadeBlue()  // fade Blue in out
{
 for (j=0;j<508;j++){
      if (j<256)
      {
      ativaRgb(0,0,j);
      delay(200);
      }
       if (j>255){
        ativaRgb(0,0,510-j);
        delay(200);
      }
       j++;
       checkSerial();
       //execute();
       if (data_received!=6)
   {
       break;
   }
      if(j>506)
       {
         j=1;
       }
   }
}  

void seteCores(int vel)   //sete cores
{
  j=1;
    for(;;) {
    switch (j) { //
        case 1: // Vermelho
        ativaRgb(255,0,0) ;
        break;
        case 2: // Verde
        ativaRgb(0,255,0) ;
        break;
        case 3: // Azul
        ativaRgb(0,0,255) ;
        break;
        case 4: // Amarelo
        ativaRgb(255,255,0);
        break;
        case 5: // Cyano
        ativaRgb(0,255,255) ;
        break;
        case 6: // Magenta
        ativaRgb(255,0,255) ;
        break;
        case 7: // Branco ( todos os leds acessos)
        ativaRgb(255,255,255);
       break;
    }
    delay(vel) ;
    j++;
    if( j > 7) j= 1 ;
    checkSerial();
    //Serial.println(data_received);
    if (data_received!=7 && data_received!=8){
      break;
    }
   }
}

void fadeRGB()  //RGB random
{
  //sendACK(data[0],data[1],data[3],data[4],data[5],data[6],data[7],data[8],data[9],data[10]);
  for (;;) {
       for (float f = 0; f < 1; f += 0.0005) {
    if(data_received!=9)
    {
      break;
    }
         hsv(f, 1, 1);
    delay(100);
    checkSerial();
       }
     }
 }

void hsv(float H, float S, float V)
{
  if (data_received==9)
  {
  int var_i;
  float R, G, B, var_1, var_2, var_3, var_h;

  if (S == 0) {
    R = V;
    G = V;
    B = V;
  }
  else {
    var_h = H * 6;
    if (var_h == 6) var_h = 0;  // H must be < 1
    var_i = int(var_h) ;          // or ... var_i = floor( var_h )
    var_1 = V * (1 - S );
    var_2 = V * (1 - S * (var_h - var_i));
    var_3 = V * (1 - S * (1 - (var_h - var_i)));
    if (var_i == 0) {
      R = V;
      G = var_3;
      B = var_1;
    }
    else if (var_i == 1) {
      R = var_2;
      G = V;
      B = var_1;
    }
    else if (var_i == 2) {
      R = var_1;
      G = V;
      B = var_3;
    }
    else if (var_i == 3) {
      R = var_1;
      G = var_2;
      B = V;
    }
    else if (var_i == 4) {
      R = var_3;
      G = var_1;
      B = V;
    }
    else {
      R = V;
      G = var_1;
      B = var_2;
    }
  }
   ativaRgb(255 * R, 255 * G, 255 * B);  // RGB results from 0 to 255
}

else
{
  for (int z=0;z<1;z++) {
  break;
  }
}
}

void ativaRgb(int redVal,int greenVal, int blueVal)
{      //RGB Ramdom Fade in out
    analogWrite(redPin, redVal); // Escreve o valor do PWM do led vermelho
    analogWrite(greenPin, greenVal); // Escreve o valor do PWM do led verde
    analogWrite(bluePin, blueVal); // Escreve o valor do PWM do led azul
}

byte receiveMSG(){
  //conforme original
}

void sendMSG(byte address1,byte address2,byte data_type,byte code1,byte code2,byte Sign,byte data1,byte data2,byte data3,byte data4){
  //conforme original
}

void sendNAK(byte address1,byte address2,byte data_type,byte code1,byte code2,byte Sign,byte data1,byte data2,byte data3,byte data4){
  //conforme original
 }
byte hex2num(byte x){
  //conforme original
}
Logged

0
Offline Offline
Edison Member
*
Karma: 16
Posts: 1579
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

La idea no es utilizarlo como lo haces (bueno, lo he mirado rápido)..... :o :o. (Si no te he entendido bien, me dices....)




Las tramas son de 15 bytes:

    * Byte 1: Byte de start ( 0 hexadecimal ).
    * Byte 2-3: ASCII de la dirección del arduino.
    * Byte 4: Byte ENQ, ACK ó NAK (0x05h, 0x06h y 0x15h) .
    * Byte 5: ASCII del comando petición.
    * Byte 6 y 7: ASCII del número de función.
    * Byte 8: Byte signo (Positivo 0x20h y Negativo 2D)
    * Byte 9-12: ASCII con el dato (0x00h-0xFFFFh)
    * Byte 13: Byte fin de texto (0x03h)
    * Byte 14-15: Checksum (suma de byte 2 al byte13)


El Byte 5, lo usas como Comando, 6 y 7 como numero de función y los Bytes 9-12 son el datos.

Ejemplo:
Establecemos que una D en comando, significa que vas a dar una orden de encendido de un pin Digital.
En los bytes de número de función, establecemos que es el número de pin de Arduino.
Y en los bytes de datos, envias la orden que deseas=> Encendido(1) ó Apagado (0)

D 13 0001 -> Significaría orden control digital, pin 13 a 1.
D 02 0000 -> Orden control digital, pin 2 a 0
P 04 0145 -> Podría ser PWM pin 4, valor 145.
A 01 0000 --> Petición de entrada analogica 1.
...
(a tu elección)

Ejemplo para D 13 0001, enviando a un esclavo cuya dirección es "01"
Las comillas indican caracter en ASCII y sin comillas, número en decimal.
Byte 1 = 0 (Byte Start)
Byte 2 = "0"  (El ASCII del cero es 48d)
Byte 3 = "1"
Byte 4 = 5  (ENQ le estas haciendo una peticion)
Byte 5 = "D"
Byte 6 = "1"
Byte 7= "3"
Byte 8= 32  (Signo, no lo utilizamos, pero mandamos positivo)
Byte 9= "0"
Byte 10="0"
Byte 11="0"
Byte 12="1"
Byte 13=3 (End Of Text)
Byte 14 y Byte 15= Checksum

Luego el esclavo, te podría contestar con el mismo mensaje que ha recibido, salvo que el Byte4=6 (ACK). [Ver tabla ASCII para las equivalencias]

Los datos van en ASCII, para hacer más fácil la trama. Si te fijas hay algunos bytes (Start, ACK ó NAK,...) que no son ASCII. Asi es muy sencillo saber lo que estas recibiendo en tu trama (todo lo que sea ASCII son datos y lo otro bytes de control).  Puedes ver ejemplos de un Variador industrial (http://www.cdautomation.com/download/ENG_L_M_FUJI_RS485_COMM_for_FRENIC-Mini.PDF).


¿Cómo lo ves? Se puede hacer algo más fácil, si no vas a implementar mucha cosa. La idea de ésto, era hacer una traza "universal". Si quieres, dime exactamente lo que quieres, y puedes empezar haciendote una trama sencilla.... Y luego vas poco a poco "profesionalizando" el tema..... smiley-wink




Igor R.
« Last Edit: May 21, 2010, 04:58:29 pm by igorreal » Logged


0
Offline Offline
Full Member
***
Karma: 0
Posts: 131
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Creo que lo has mirado super rápido, hehehe. (es una broma gracias por tu interes y ayuda)

Estoy utilizando el maestro exatamente como dices, ej

if (dipState==1){  
      sendMSG(48,50,68,48,48,32,48,48,48,49);

o sea si my dip switch esta en la posicion 1 envia "49" (1) al esclavo, el esclavo responde con el ACK y enciende el led, en este caso, rojo. Esto me funciona bien.

He descubiesrto cual era my problema cuando tengo el dip switch selecionado en la posición 4 y nada funciona, echa una ojeada:

Code:
for (j=0;j<508;j++){
      if (j<256)
      {
      ativaRgb(j,0, 0);
      delay(200);
      }
       if (j>255){
        ativaRgb(510-j,0, 0);
        delay(200);
      }
       j++;
       checkSerial();  <<<<aqui esta el problema

el problema es el checkSerial(); cada vez que el programa llega en ese punto, voy a chequear si he recebido algo en el puerto serial y despues vuelvo a ese punto y sigo en loop sin executar la rutina.

Lo que necesito ahora, es eliminar esa linea, punto, pero para salir de la funcion fade creo que voy a tener que utilizar algun tipo de  interrupción.

Creo que existe una interrupción que se ativa quando el puerto serial recibe algo.  si logro descubrir como hacer eso, mis problemas se han terminado.

Tienes alguna idéa de como puedo "sentir" que algo esta llegando en el puerto serial y interrumpir todo lo que estoy haciendo ?

Logged

0
Offline Offline
Edison Member
*
Karma: 16
Posts: 1579
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Bueno.... Como preguntabas si podias ir por debajo de 48 ó por encima de 57.....Y esto no son números, son ASCII de numero.
Y tienes 4 Bytes de datos, por lo que puedes 65535 leds (si mandas en hexa=FFFF).... son suficientes???   ;D ;D

Hay interrupción de puerto serie. En la libreria Serial, la utilizan para poner el dato recibido en el buffer.

No te sirve Serial.Available()????



« Last Edit: May 22, 2010, 06:27:18 am by igorreal » Logged


Madrid (Spain)
Offline Offline
Full Member
***
Karma: 0
Posts: 140
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Perdonar que me cuele,
Pero pasaba por aqui  .... y he visto el tema.

En mi proyecto, uno de los temas que he incluido, es muy parecido a lo que quieres hacer

Quizas te sirva

https://sites.google.com/site/mikuadricoptero/home/descripciones/1-39-dos-ardus

Saludos
Logged

0
Offline Offline
Full Member
***
Karma: 0
Posts: 131
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hola Tuto

Toda la ayuda es bienvenida (al menos para mi) ;D
Hablo mas con Igor porque el es el único que me contesta.
Muchas gracias por el link.

Igor, me estou quedando sin pelo y no consigo hacer funcionar esto.

Cuando utilizo el Realterm, todo funciona muy bien, quando utilizo el ATMEGA en mi circuito solamente me funciona lo que seria estático, me explico, encender y apagar un led.

Cuando intento hacer algo mas, por ejemplo el fade a un led, el circuito no me funciona.

Si no te importa, cuando tengas un tiempo, prueba hacer el fade en el led del pin 13 del esclavo y salir del fade cuando quieras (Boton ON fade, boton off todo apagado) despues me cuentas, yo sigo arrancando los pelos por aqui!

Saludos,
Logged

0
Offline Offline
Edison Member
*
Karma: 16
Posts: 1579
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

ja,ja,ja

Tranqui, que al final saldrá el gazapo...

¿Qué es exactamente lo que quieres hacer? No entiendo muy bien el problema.....

Logged


Pages: 1 [2] 3   Go Up
Jump to: