Go Down

Topic: Buchstabe auf "doppel-" Rainbowduino schreiben (Read 2112 times) previous topic - next topic

Oct 29, 2012, 02:15 pm Last Edit: Oct 29, 2012, 03:45 pm by Hufy1990 Reason: 1
Hallo Foren-Gemeinde,
nachdem bei uns der Winter mit viel Schnee eingebrochen ist, will ich mich weiter mit Arduino beschäftigen.

Ausgangsstellung:
Ich habe ein Arduino Mega2560 sowie 2 Rainbowduino die "zusammengeschlossen" sind und ein Keypad.

Aufgabe:
Ich möchte einfach einen Buchstabe oder eine Zahl (welche per Taste eines KeyPads ausgewählt werden) auf ein Rainbowduino und eine weitere Zahl oder Buchstabe auf das andere Rainbowduino in einer bestimmten Farbe schreiben.

Frage:
Wie kann ich dies Realisieren?
Ich habe irgend wie gelesen dass da erst eine "Firmware" auf das Rainbowduino muss. Wie geht das? Hat jemand schon einmal etwas ähnliches gemacht?

Vielen Dank schon im Voraus für eure Geduld...

Gruß Basti

//MODIFY
Muss ich Seriell Ansteuern, aber wie?

pylon

Quote
2 Rainbowduino die "zusammengeschlossen"


Welche Version der "Rainbowduino"s und wie zusammengeschlossen?

Quote
Muss ich Seriell Ansteuern, aber wie?


Meist wird dazu von einem Microcontroller aus der I2C Bus genommen. Die serielle Schnittstelle ist zwar in der neusten Version auch vorhanden, aber für die Verbindung mehrerer Module nicht so gut geeignet.

uwefed

Rainbowduino hat eine seriellen Eingang. Du könntest 2 Serielle schnittstellen des Arduino nehmen (der hat ja 4 Stück davon, 3 sind frei).
http://www.seeedstudio.com/wiki/Rainbowduino_v3.0

Grüße Uwe


So, Hallo mal wieder ;)
Heute kamen meine 2 Rainbowduino.

Strom dran -> sieht schon mal gut aus.

Jetzt habe Ich von meinem ATMega2560 den Pin 0(RX) an Rainbowduino RX, 1(TX) an TX, Reset an DTR und den Strom angeschlossen und wollte folgenden Code "auf das Rainbowduino" zeichnen.

und siehe da: Funktioniert nicht.

Was mache ich Falsch?

Mein Code (von SeeedMaster):

Code: [Select]
extern unsigned char dots_color[3][8][4];
extern unsigned char ASCII_Number[10][8];
extern unsigned char ASCII_Char[52][8];

unsigned char State = 2;
unsigned char color=0,row=0,dots=0,position=0;
unsigned char line=0,level=0;
unsigned long timeout;
unsigned char Col_Red,Col_Blue,Col_Green;

/*
This is a hacky implementation of a RainbowDuino serial interface. You need to upload the serial sketch to the RainbowDuino device.
You cannot use multiple devices with this sketch.

If you see garbled characters, reset the RainbowDuino.

This implementation removes the inital handshake required (and advised) for I2C. This varient just sends data down the line hoping the Rainbowduino is in an appropriate state to
output to screen.
*/

void setup()
{
 Serial.begin(115200); //Setup high speed Serial
 
}

void loop()
{
   SetRGB(0x0F,0x00,0x00); // Set Colour
   SentChar(10,'T'); // Send Char
   delay(200); // Wait a bit (note: Serial is FAR faster than I2C)
   SetRGB(0x0F,0x04,0x00);
   SentChar(9,'e');
   delay(200);
   SetRGB(0x0F,0x0F,0x00);
   SentChar(8,'a');
   delay(200);
   SetRGB(0x00,0x0F,0x00);
   SentChar(7,'m');
   delay(400);
   SetRGB(0x00,0x0F,0x08);
   SentChar(6,'M');
   delay(200);
   SetRGB(0x00,0x00,0x0F);
   SentChar(5,'C');
   delay(200);
   SetRGB(0x0F,0x04,0x0F);
   SentChar(4,'S');
   delay(200);  
   
   SetRGB(0x0F,0x00,0x00);
   SentChar(10,' ');
   delay(200);
   
       SetRGB(0x0F,0x00,0x00);
   SentChar(10,'A');
   delay(200);
   SetRGB(0x0F,0x04,0x00);
   SentChar(9,'t');
   delay(200);
   SetRGB(0x0F,0x0F,0x00);
   SentChar(8,'o');
   delay(200);
   SetRGB(0x00,0x0F,0x00);
   SentChar(7,'m');
   delay(400);
   SetRGB(0x00,0x0F,0x08);
   SentChar(6,'R');
   delay(200);
   SetRGB(0x00,0x00,0x0F);
   SentChar(5,'i');
   delay(200);
   SetRGB(0x0F,0x04,0x0F);
   SentChar(4,'o');
   delay(200);    
   SetRGB(0x0F,0x04,0x0F);
   SentChar(4,'t');
   delay(200);      
 delay(900);


}



//-------------------------------------------------------------
//Name:SendData
//Function: Master sent one buff data to RainbowDuino or sent the color data to RainbowDuino
//Parameter:  ADD: RainbowDuino IIC Address
//            Auto:if Auto = 1 sent the data in buff ; if Auto = 0 then sent the RGB data
//            Red Green Blue: when Auto = 0 ,sent these color data to RainbowDuino
//-------------------------------------------------------------
void SendData(int ADD,int Auto,int Red,int Green,int Blue)
{  
 int OK=0;
 int tempcol;
 while(!OK)
 {
   switch(State)
   {  
   case 2:
     for (color=0;color<3;color++)
     {    
       if (color==0)
       {
         tempcol=Green;
         tempcol|=(Green<<4);
       }
       else if(color==1)
       {
         tempcol=Red;
         tempcol|=(Red<<4);
       }
       else if(color==2)
       {
         tempcol=Blue;
         tempcol|=(Blue<<4);
       }

       //// Serial.beginTransmission(ADD);
       for (row=0;row<8;row++)
       {

         for (dots=0;dots<4;dots++)
         {
           // if (Auto)
           Serial.write(dots_color[color][row][dots]);
           //  else
           //     Serial.write(tempcol);
         }

       }
       // //Serial.endTransmission();    // stop transmitting
       delay(5);  
     }
     OK=1;
     State=2;    
     break;

   default:
     State=2;
     break;
   }
 }

}

Code: [Select]

//-------------------------------------------------------------
//Name:SendShiftData
//Function: Master sent shift the  buff and sent the data to RainbowDuino 
//Parameter:  ADD: RainbowDuino IIC Address
//            shift: set up how much bit  the buff data will shift left           
//-------------------------------------------------------------
void SendShiftData(int ADD,int shift)

  int OK=0;
  int temp,val;
  while(!OK)
  {
    switch(State)
    { 
    case 2:
      for (color=0;color<3;color++)
      {   
        // Serial.beginTransmission(ADD);   
        for (row=0;row<8;row++)
        {

          for (dots=0;dots<4;dots++)
          {                                     
            if (shift&0x01)
            {
              temp = dots + (shift>>1);
              val = ((dots_color[color][row][(temp<4)?(temp):(temp-4)]<<4)|(dots_color[color][row][(temp<3)?(temp):(temp-3)]>>4)); 
              Serial.write(val);
            }       
            else
            {
              temp = dots + (shift>>1);
              val = dots_color[color][row][(temp<4)?(temp):(temp-4)]; 
              Serial.write(val); 
            }                         
          }   
        }
        //Serial.endTransmission();    // stop transmitting
        delay(5);
      }
      OK=1;
      State=2;   
      break;

    default:
      State=2;
      break;
    }
  }

}


//-------------------------------------------------------------
//Name:FillBuff
//Function: Fill the master's buff with color data 
//Parameter: Re, Gr, Bl  : RGB color level data       
//-------------------------------------------------------------
void FillBuff(int Re,int Gr,int Bl)
{   
  for(color=0;color<3;color++)
  {
    for (row=0;row<8;row++)
    {
      for (dots=0;dots<4;dots++)
      {
        switch (color)
        {
        case 0://green
          dots_color[color][row][dots]=( Gr|(Gr<<4));
          break;

        case 1://blue
          dots_color[color][row][dots]= (Bl|(Bl<<4));
          break;

        case 2://red
          dots_color[color][row][dots]= (Re|(Re<<4));
          break;

        default:
          break;
        }
      }
    }
  }
}




//-------------------------------------------------------------
//Name:SetLine
//Function:  change one line data of  the master's buff   
//Parameter: Re, Gr, Bl  : RGB line color  data   
//           levl: the RGB level
//           lines: line position
//-------------------------------------------------------------
void SetLine(int levl,int lines,int Red,int Green,int Blue)
{
  int  shift;
  for (color=0;color<3;color++)
  {
    if (color==0)
      shift=Green;
    else if (color==1)
      shift=Blue;
    else if (color==2)
      shift=Red;
    for (dots=0;dots<4;dots++)
    {
      dots_color[color][line][dots]=0;
      if(dots!=0)  shift=shift<<1;
      if (shift&0x80)
        dots_color[color][line][dots]|=(level<<4);
      else
        dots_color[color][line][dots]&=0x0F;


      shift=shift<<1;         
      if (shift&0x80)
        dots_color[color][line][dots]|=level;
      else
        dots_color[color][line][dots]&=0xF0;

    }
  }

}




//-------------------------------------------------------------
//Name:FillLine
//Function:  Fill one line data of  the master's buff   
//Parameter: Re, Gr, Bl  : RGB color level data   
//           Lines : the line position
//-------------------------------------------------------------
void FillLine(int Lines,int Red,int Green,int Blue)
{
  int  shift;
  for (color=0;color<3;color++)
  {
    if (color==0)
      shift=Green;
    else if (color==1)
      shift=Blue;
    else if (color==2)
      shift=Red;
    for (dots=0;dots<4;dots++)
    {
      dots_color[color][Lines][dots]=0;

      shift|=shift<<4;
      dots_color[color][Lines][dots]=shift;
    }
  }

}



//-------------------------------------------------------------
//Name:SetDots
//Function:  change one dot data of  the master's buff   
//Parameter: Row_X, Line_Yint: the dot position
//           Re, Gr, Bl  : RGB color level data   
//-------------------------------------------------------------
void SetDots(int Row_X,int Line_Y,int Red,int Green,int Blue)
{
  dots_color[0][Line_Y][Row_X/2]&=(Row_X&1)?(0xf0):(0x0f);
  dots_color[0][Line_Y][Row_X/2]|=(Row_X&1)?(Green):(Green<<4);
  dots_color[1][Line_Y][Row_X/2]&=(Row_X&1)?(0xf0):(0x0f);
  dots_color[1][Line_Y][Row_X/2]|=(Row_X&1)?(Blue):(Blue<<4);
  dots_color[2][Line_Y][Row_X/2]&=(Row_X&1)?(0xf0):(0x0f);
  dots_color[2][Line_Y][Row_X/2]|=(Row_X&1)?(Red):(Red<<4);     
}






//-------------------------------------------------------------
//Name:SetRGB
//Function:  Set the  Global color Variables 
//Parameter:  Re, Gr, Bl  : RGB color level data           
//-------------------------------------------------------------
void SetRGB(int Red,int Green,int Blue)
{
  Col_Red=Red;
  Col_Blue=Blue;
  Col_Green=Green;   
}




//-------------------------------------------------------------
//Name:SentNum
//Function: Sent a Numeber to RainbowDuino to show 
//Parameter:   ADD: RainbowDuino IIC Address
//             Num: the Num want to show
//Other: the Number character color definet by the Global color Variables which set up by SetRGB() function
//-------------------------------------------------------------
void SentNum(int ADD,int Num)

  int OK=0;
  int tempword,tempdata,tempcol;
  while(!OK)
  {
    switch(State)
    { 
    case 2:
      for (color=0;color<3;color++)
      {     
        if(color==0)        tempcol=Col_Green;
        else if(color==1)   tempcol=Col_Red;
        else if(color==2)   tempcol=Col_Blue;

        // Serial.beginTransmission(ADD);
        for (row=0;row<8;row++)
        {

          for (dots=0;dots<4;dots++)
          {

            tempword = ASCII_Number[Num][row];
            if((tempword<<2*dots)&0x80)
            {
              tempdata&=0x0F;
              tempdata|=(tempcol<<4);
            }
            else
            {
              tempdata&=0x0F;
            }

            if((tempword<<(2*dots+1))&0x80)
            {
              tempdata&=0xF0;
              tempdata|=tempcol;
            }
            else
            {
              tempdata&=0xF0;
            }           
            Serial.write(tempdata);

          }

        }
        //Serial.endTransmission();    // stop transmitting
        delay(5); 
      }
      OK=1;
      State=2;   
      break;

    default:
      State=2;
      break;
    }
  }
}



//-------------------------------------------------------------
//Name:SentChar
//Function: Sent a  English Latter character to RainbowDuino to show 
//Parameter:   ADD: RainbowDuino IIC Address
//             Chr: the Latter want to show
//Other: the Latter character color definet by the Global color Variables which set up by SetRGB() function
//-------------------------------------------------------------
void SentChar(int ADD,int Chr)

  int OK=0;
  int tempword,tempdata,tempcol;
  while(!OK)
  {
    switch(State)
    { 
    case 2:
      for (color=0;color<3;color++)
      {     
        if(color==0)        tempcol=Col_Green;
        else if(color==1)   tempcol=Col_Red;
        else if(color==2)   tempcol=Col_Blue;

        // Serial.beginTransmission(ADD);
        for (row=0;row<8;row++)
        {

          for (dots=0;dots<4;dots++)
          {
            if ((Chr>64)&&(Chr<91))
            {
              Chr-=65;
            }
            else if((Chr>96)&&(Chr<123))
            {
              Chr-=71;
            }


            tempword = ASCII_Char[Chr][row];
            if((tempword<<2*dots)&0x80)
            {
              tempdata&=0x0F;
              tempdata|=(tempcol<<4);
            }
            else
            {
              tempdata&=0x0F;
            }

            if((tempword<<(2*dots+1))&0x80)
            {
              tempdata&=0xF0;
              tempdata|=tempcol;
            }
            else
            {
              tempdata&=0xF0;
            }           
            Serial.write(tempdata);

          }

        }
        //Serial.endTransmission();    // stop transmitting
        delay(5); 
      }
      OK=1;
      State=2;   
      break;

    default:
      State=2;
      break;
    }
  }
}

Code: [Select]
//-------------------------------------------------------------
//Name:Shift_Num_Right
//Function: Sent a Numeber with shift to RainbowDuino to show 
//Parameter:   ADD: RainbowDuino IIC Address
//             Num: the Num want to show
//             Shift: Shift right bits(0-8)
//Other: the Number character color definet by the Global color Variables which set up by SetRGB() function
//-------------------------------------------------------------
void Shift_Num_Right(int ADD,int Num,int Shift)

  int OK=0;
  int tempword,tempdata,tempcol;
  while(!OK)
  {
    switch(State)
    { 
    case 2:
      for (color=0;color<3;color++)
      {     
        if(color==0)        tempcol=Col_Green;
        else if(color==1)   tempcol=Col_Red;
        else if(color==2)   tempcol=Col_Blue;

        // Serial.beginTransmission(ADD);
        for (row=0;row<8;row++)
        {

          for (dots=0;dots<4;dots++)
          {

            tempword = ASCII_Number[Num][row];


            if((tempword<<(2*dots+Shift))&0x80)
            {
              tempdata&=0x0F;
              tempdata|=(tempcol<<4);
            }
            else
            {
              tempdata&=0x0F;
            }

            if((tempword<<(2*dots+1+Shift))&0x80)
            {
              tempdata&=0xF0;
              tempdata|=tempcol;
            }
            else
            {
              tempdata&=0xF0;
            }           
            Serial.write(tempdata);

          }

        }
        //Serial.endTransmission();    // stop transmitting
        delay(5); 
      }
      OK=1;
      State=2;   
      break;

    default:
      State=2;
      break;
    }
  }
}


//-------------------------------------------------------------
//Name:Shift_Num_Left
//Function: Sent a Numeber with shift to RainbowDuino to show 
//Parameter:   ADD: RainbowDuino IIC Address
//             Num: the Num want to show
//             Shift: Shift left bits (0-8)
//Other: the Number character color definet by the Global color Variables which set up by SetRGB() function
//-------------------------------------------------------------
void Shift_Num_Left(int ADD,int Num,int Shift)

  int OK=0;
  int tempword,tempdata,tempcol;
  while(!OK)
  {
    switch(State)
    {     
    case 2:
      for (color=0;color<3;color++)
      {     
        if(color==0)        tempcol=Col_Green;
        else if(color==1)   tempcol=Col_Red;
        else if(color==2)   tempcol=Col_Blue;

        // Serial.beginTransmission(ADD);
        for (row=0;row<8;row++)
        {

          for (dots=0;dots<4;dots++)
          {

            tempword = ASCII_Number[Num][row];

            tempword=tempword>>Shift;
            if((tempword<<(2*dots))&0x80)
            {
              tempdata&=0x0F;
              tempdata|=(tempcol<<4);
            }
            else
            {
              tempdata&=0x0F;
            }

            if((tempword<<(2*dots+1))&0x80)
            {
              tempdata&=0xF0;
              tempdata|=tempcol;
            }
            else
            {
              tempdata&=0xF0;
            }           
            Serial.write(tempdata);

          }

        }
        //Serial.endTransmission();    // stop transmitting
        delay(5); 
      }
      OK=1;
      State=2;   
      break;

    default:
      State=2;
      break;
    }
  }
}


//-------------------------------------------------------------
//Name: Shift_Char_Right
//Function: Sent a Latter character with shift to RainbowDuino to show 
//Parameter:   ADD: RainbowDuino IIC Address
//             Chr: the Latter want to show
//             Shift: Shift right bits (0-8)
//Other: the Latter character color definet by the Global color Variables which set up by SetRGB() function
//-------------------------------------------------------------
void Shift_Char_Right(int ADD,int Chr,int Shift,int BG)

  int OK=0;
  int tempword,tempdata,tempcol;
  while(!OK)
  {
    switch(State)
    { 
    case 2:
      for (color=0;color<3;color++)
      {     
        if(color==0)        tempcol=Col_Green;
        else if(color==1)   tempcol=Col_Red;
        else if(color==2)   tempcol=Col_Blue;

        // Serial.beginTransmission(ADD);
        for (row=0;row<8;row++)
        {

          for (dots=0;dots<4;dots++)
          {
            if ((Chr>64)&&(Chr<91))
            {
              Chr-=65;
            }
            else if((Chr>96)&&(Chr<123))
            {
              Chr-=71;
            }
            tempword = ASCII_Char[Chr][row];


            if((tempword<<(2*dots+Shift))&0x80)
            {
              tempdata&=0x0F;
              tempdata|=(tempcol<<4);
            }
            else
            {
              tempdata&=0x0F;
              if(BG)  tempdata|=(dots_color[color][row][dots]&0xf0);

            }

            if((tempword<<(2*dots+1+Shift))&0x80)
            {
              tempdata&=0xF0;
              tempdata|=tempcol;
            }
            else
            {
              tempdata&=0xF0;
              if(BG)  tempdata|=(dots_color[color][row][dots]&0x0f);

            }           
            Serial.write(tempdata);

          }

        }
        //Serial.endTransmission();    // stop transmitting
        delay(5); 
      }
      OK=1;
      State=2;   
      break;

    default:
      State=2;
      break;
    }
  }
}


//-------------------------------------------------------------
//Name: Shift_Char_Left
//Function: Sent a Latter character with shift to RainbowDuino to show 
//Parameter:   ADD: RainbowDuino IIC Address
//             Chr: the Latter want to show
//             Shift: Shift left bits (0-8)
//Other: the Latter character color definet by the Global color Variables which set up by SetRGB() function
//-------------------------------------------------------------
void Shift_Char_Left(int ADD,int Chr,int Shift,int BG)

  int OK=0;
  int tempword,tempdata,tempcol;
  while(!OK)
  {
    switch(State)
    { 
    case 2:
      for (color=0;color<3;color++)
      {     
        if(color==0)        tempcol=Col_Green;
        else if(color==1)   tempcol=Col_Red;
        else if(color==2)   tempcol=Col_Blue;

        //Serial.beginTransmission(ADD);
        for (row=0;row<8;row++)
        {

          for (dots=0;dots<4;dots++)
          {
            if ((Chr>64)&&(Chr<91))
            {
              Chr-=65;
            }
            else if((Chr>96)&&(Chr<123))
            {
              Chr-=71;
            }
            tempword = ASCII_Char[Chr][row];               
            tempword=tempword>>Shift;

            if((tempword<<(2*dots))&0x80)
            {
              tempdata&=0x0F;
              tempdata|=(tempcol<<4);
            }
            else
            {
              tempdata&=0x0F;
              if(BG)  tempdata|=(dots_color[color][row][dots]&0xF0);

            }

            if((tempword<<(2*dots+1))&0x80)
            {
              tempdata&=0xF0;
              tempdata|=tempcol;
            }
            else
            {
              tempdata&=0xF0;
              if(BG)  tempdata|=(dots_color[color][row][dots]&0x0f);

            }           
            Serial.write(tempdata);

          }

        }
        ////Serial.endTransmission();    // stop transmitting
        delay(5); 
      }
      OK=1;
      State=2;   
      break;

    default:
      State=2;
      break;
    }
  }
}

uwefed

Versuchs mal mitt einer anderen seriellen Schnittstelle. die erste ist an dem USB-Seriel Adapter angeschlossen.
grüße Uwe

#9
Nov 29, 2012, 02:25 pm Last Edit: Nov 29, 2012, 03:29 pm by Hufy1990 Reason: 1
Hab ich probiert, geht nicht.

Muss ich (außer die 2 zusammenschließen) noch irgend etwas tun?

Brauche ich die Pins SDA und SCL (I2C)?

Habe das Rainbowduino an einen USB TTL Adapter TX->TX RX->RX ... angeschlosse,
wollte eine Firmware aufspielen aber es geht nix.

Bekomme immer die Fehlermeldung: avrdude: stk500_getsync(): not in sync: resp=0x00

Was mache ich nur falsch?


uwefed


Hab ich probiert, geht nicht.

Muss ich (außer die 2 zusammenschließen) noch irgend etwas tun?

Brauche ich die Pins SDA und SCL (I2C)?


Die beiden Pins brauchst Du wenn Du die Daten über die I2C Schnittstelle übertragen willst. Der Rainbowduino kann aber auch über die seriele Schnittstelle gesteuert werden.


Habe das Rainbowduino an einen USB TTL Adapter TX->TX RX->RX ... angeschlosse,
wollte eine Firmware aufspielen aber es geht nix.

Bekomme immer die Fehlermeldung: avrdude: stk500_getsync(): not in sync: resp=0x00

Was mache ich nur falsch?

Es fehlt die Resetleitung und die Masse (eventuell auch 5V). Um einen ATmega zu programieren muß der Bootloader gestartet werden und das geschiet nur nach dem Einschalten oder einem Reset.

http://www.susay.de/rainbowino-mit-arduino-verbinden-und-programmieren/
http://www.seeedstudio.com/blog/2009/10/21/rainbowduino-carnival-winners/
http://www.seeedstudio.com/wiki/Rainbowduino

Grüße Uwe

Habe alles angeschlossen, meine pde geöffnet, ATMega328 eingestellt, Reset gedrückt und dann Upload, aber passiert nichts *heul*

uwefed

Wieso drückst Du reset?

Welche Fehlermeldungen bekommst Du? Bitte alle Zeilen.
Welches Betriebsystem und welche IDE-Version verwendest Du?
Welchen Sketch lädst Du hoch? Hast Dus mal mit dem einfachen Blink versucht?
Grüße Uwe


Go Up