新手試試 --- Arduino RGB Dot Matrix RGB 27色滾動圖案

搞完個7+1色滾動圖案,順手試下個類似PWM既簡易RGB 27色滾動圖案
都係用番E塊板
http://www.hkepc.com/forum/viewt ... mp%3Bascdesc%3DDESC

RGB Dot Matrix PCB
20090901_8eabe7d51316d1fb1eecblpvELmEcQn5.jpg
2009-9-3 13:59
20090901_90dba0089bb1784ac7aaz1eX5sODfthD.jpg
2009-9-3 13:59

個code改左,分為RGBx2三路控制,利用六組RGB單色圖案重曡出27色的圖案。
用類似PWM方法毎一個色在一循環內出三種組合,結合出27種顏色。
  1. /*
  2.   1 x  8X8 RGB Matrix Common Cathode - Simple Blink W/O PWM

  3.   Layout:
  4.    
  5.    Drive: HD74HC373P x4

  6.     gnd = OC Red, Green, Blue, Common
  7.    pin9 = 1D
  8.    pin8 = 2D
  9.    pin7 = 3D
  10.    pin6 = 4D
  11.    pin5 = 5D
  12.    pin4 = 6D
  13.    pin3 = 7D
  14.    pin2 = 8D
  15.   pin10 = En G Blue
  16.   pin11 = En G Green
  17.   pin12 = En G Red
  18.   pin13 = En G Common
  19.   
  20.    pin1 = Blink Loop Start LED
  21.    
  22.    color combination= 0 R RG RGB RB G GB B  with three level
  23.    
  24.    B2 B1 G2 G1 R2 R1
  25.    0  0  0  0  0  0   0                  
  26.    0  0  0  0  0  1   1     R1              A
  27.    0  0  0  0  1  1     8   R1R2            J
  28.    0  0  0  1  0  0   2     G1              S   
  29.    0  0  0  1  0  1   3     R1G1            B
  30.    0  0  0  1  1  1     9   R1R2G1          K
  31.    0  0  1  1  0  0     12  G1G2            V
  32.    0  0  1  1  0  1     13  R1G1G2          E
  33.    0  0  1  1  1  1     14  R1R2G1G2        N
  34.    0  1  0  0  0  0   4     B1              Y
  35.    0  1  0  0  0  1   5     R1B1            H
  36.    0  1  0  0  1  1     10  R1R2B1          Q
  37.    0  1  0  1  0  0   6     G1B1            T
  38.    0  1  0  1  0  1   7     R1G1B1          C
  39.    0  1  0  1  1  1     11  R1R2G1B1        L
  40.    0  1  1  1  0  0     15  G1G2B1          W
  41.    0  1  1  1  0  1     16  R1G1G2B1        F
  42.    0  1  1  1  1  1     17  R1R2G1G2B1      O
  43.    1  1  0  0  0  0     18  B1B2            Z
  44.    1  1  0  0  0  1     19  R1B1B2          I
  45.    1  1  0  0  1  1     20  R1R2B1B2        R
  46.    1  1  0  1  0  0     21  G1B1B2          U
  47.    1  1  0  1  0  1     22  R1G1B1B2        D
  48.    1  1  0  1  1  1     23  R1R2G1B1B2      M
  49.    1  1  1  1  0  0     24  G1G2B1B2        X
  50.    1  1  1  1  0  1     25  R1G1G2B1B2      G
  51.    1  1  1  1  1  1     26  R1R2G1G2B1B2    P
  52.   
  53. */  
  54.    
  55.     char Pattern01[]={'*'  ,'*'  ,'A'  ,'A'  ,'B'  ,'B'  ,'C'  ,'C'  };
  56.     char Pattern02[]={'D'  ,'D'  ,'E'  ,'E'  ,'F'  ,'F'  ,'G'  ,'G'  };
  57.     char Pattern03[]={'H'  ,'H'  ,'I'  ,'I'  ,'J'  ,'J'  ,'K'  ,'K'  };
  58.     char Pattern04[]={'L'  ,'L'  ,'M'  ,'M'  ,'N'  ,'N'  ,'O'  ,'O'  };
  59.     char Pattern05[]={'P'  ,'P'  ,'Q'  ,'Q'  ,'R'  ,'R'  ,'S'  ,'S'  };
  60.     char Pattern06[]={'T'  ,'T'  ,'U'  ,'U'  ,'V'  ,'V'  ,'W'  ,'W'  };
  61.     char Pattern07[]={'X'  ,'X'  ,'Y'  ,'Y'  ,'Z'  ,'Z'  ,'*'  ,'*'  };
  62.     char Pattern08[]={'A'  ,'J'  ,'S'  ,'V'  ,'Y'  ,'Z'  ,'C'  ,'P'  };
  63.     char Pattern09[]={'A'  ,'G'  ,'M'  ,'S'  ,'Y'  ,'E'  ,'K'  ,'Q'  };
  64.     char Pattern10[]={'B'  ,'H'  ,'N'  ,'T'  ,'Z'  ,'F'  ,'L'  ,'R'  };
  65.     char Pattern11[]={'C'  ,'I'  ,'O'  ,'U'  ,'A'  ,'G'  ,'M'  ,'S'  };
  66.     char Pattern12[]={'D'  ,'J'  ,'P'  ,'V'  ,'B'  ,'H'  ,'N'  ,'T'  };
  67.     char Pattern13[]={'E'  ,'K'  ,'Q'  ,'W'  ,'C'  ,'I'  ,'O'  ,'U'  };
  68.     char Pattern14[]={'F'  ,'L'  ,'R'  ,'X'  ,'D'  ,'J'  ,'P'  ,'V'  };
  69.     char Pattern15[]={'G'  ,'M'  ,'S'  ,'Y'  ,'E'  ,'K'  ,'Q'  ,'W'  };
  70.     char Pattern16[]={'H'  ,'N'  ,'T'  ,'Z'  ,'F'  ,'L'  ,'R'  ,'X'  };

  71.    
  72.     char* Pattern[]={
  73.       

  74. Pattern01,Pattern02,Pattern03,Pattern04,Pattern05,Pattern06,Pattern07,Pattern08,
  75.       

  76. Pattern09,Pattern10,Pattern11,Pattern12,Pattern13,Pattern14,Pattern15,Pattern16,
  77.         };

  78.   int datapin;
  79.   int colorpin;
  80.   int patternww;
  81.   byte PatternR1H[32];
  82.   byte PatternG1H[32];
  83.   byte PatternB1H[32];
  84.   byte PatternR1L[32];
  85.   byte PatternG1L[32];
  86.   byte PatternB1L[32];
  87.   byte PatternR2H[32];
  88.   byte PatternG2H[32];
  89.   byte PatternB2H[32];
  90.   byte PatternR2L[32];
  91.   byte PatternG2L[32];
  92.   byte PatternB2L[32];
  93.   
  94.     int patternlen = 16;

  95.   void setup()   {


  96.   
  97.   for (int i=0; i <=patternlen-1; i++)
  98.     {
  99.       for (int j=0; j <=1; j++)
  100.         {
  101.             bitWrite(PatternR1H[i],(1-j),(
  102.                         (Pattern[i][j] == 'A')|(Pattern[i][j] == 'J')|(Pattern[i][j] == 'B')|(Pattern[i][j] == 'K')|
  103.                         (Pattern[i][j] == 'E')|(Pattern[i][j] == 'N')|(Pattern[i][j] == 'H')|(Pattern[i][j] == 'Q')|
  104.                         (Pattern[i][j] == 'C')|(Pattern[i][j] == 'L')|(Pattern[i][j] == 'F')|(Pattern[i][j] == 'O')|
  105.                         (Pattern[i][j] == 'I')|(Pattern[i][j] == 'R')|(Pattern[i][j] == 'D')|(Pattern[i][j] == 'M')|
  106.                         (Pattern[i][j] == 'G')|(Pattern[i][j] == 'P')
  107.                         ));
  108.             bitWrite(PatternR2H[i],(1-j),(
  109.                         (Pattern[i][j] == 'J')|(Pattern[i][j] == 'K')|(Pattern[i][j] == 'N')|(Pattern[i][j] == 'Q')|
  110.                         (Pattern[i][j] == 'L')|(Pattern[i][j] == 'O')|(Pattern[i][j] == 'R')|(Pattern[i][j] == 'M')|
  111.                         (Pattern[i][j] == 'P')
  112.                         ));
  113.             bitWrite(PatternG1H[i],(1-j),(
  114.                         (Pattern[i][j] == 'S')|(Pattern[i][j] == 'B')|(Pattern[i][j] == 'K')|(Pattern[i][j] == 'V')|
  115.                         (Pattern[i][j] == 'E')|(Pattern[i][j] == 'N')|(Pattern[i][j] == 'T')|(Pattern[i][j] == 'C')|
  116.                         (Pattern[i][j] == 'L')|(Pattern[i][j] == 'W')|(Pattern[i][j] == 'F')|(Pattern[i][j] == 'O')|
  117.                         (Pattern[i][j] == 'U')|(Pattern[i][j] == 'D')|(Pattern[i][j] == 'M')|(Pattern[i][j] == 'X')|
  118.                         (Pattern[i][j] == 'G')|(Pattern[i][j] == 'P')
  119.                         ));
  120.             bitWrite(PatternG2H[i],(1-j),(
  121.                         (Pattern[i][j] == 'V')|(Pattern[i][j] == 'E')|(Pattern[i][j] == 'N')|(Pattern[i][j] == 'W')|
  122.                         (Pattern[i][j] == 'F')|(Pattern[i][j] == 'O')|(Pattern[i][j] == 'X')|(Pattern[i][j] == 'G')|
  123.                         (Pattern[i][j] == 'P')
  124.                         ));
  125.             bitWrite(PatternB1H[i],(1-j),(
  126.                         (Pattern[i][j] == 'Y')|(Pattern[i][j] == 'H')|(Pattern[i][j] == 'Q')|(Pattern[i][j] == 'T')|
  127.                         (Pattern[i][j] == 'C')|(Pattern[i][j] == 'L')|(Pattern[i][j] == 'W')|(Pattern[i][j] == 'F')|
  128.                         (Pattern[i][j] == 'O')|(Pattern[i][j] == 'Z')|(Pattern[i][j] == 'I')|(Pattern[i][j] == 'R')|
  129.                         (Pattern[i][j] == 'U')|(Pattern[i][j] == 'D')|(Pattern[i][j] == 'M')|(Pattern[i][j] == 'X')|
  130.                         (Pattern[i][j] == 'G')|(Pattern[i][j] == 'P')
  131.                         ));
  132.             bitWrite(PatternB2H[i],(1-j),(
  133.                         (Pattern[i][j] == 'Z')|(Pattern[i][j] == 'I')|(Pattern[i][j] == 'R')|(Pattern[i][j] == 'U')|
  134.                         (Pattern[i][j] == 'D')|(Pattern[i][j] == 'M')|(Pattern[i][j] == 'X')|(Pattern[i][j] == 'G')|
  135.                         (Pattern[i][j] == 'P')
  136.                         ));
  137.         }
  138.       for (int j=2; j <=7; j++)
  139.         {
  140.             bitWrite(PatternR1L[i],(9-j),(
  141.                         (Pattern[i][j] == 'A')|(Pattern[i][j] == 'J')|(Pattern[i][j] == 'B')|(Pattern[i][j] == 'K')|
  142.                         (Pattern[i][j] == 'E')|(Pattern[i][j] == 'N')|(Pattern[i][j] == 'H')|(Pattern[i][j] == 'Q')|
  143.                         (Pattern[i][j] == 'C')|(Pattern[i][j] == 'L')|(Pattern[i][j] == 'F')|(Pattern[i][j] == 'O')|
  144.                         (Pattern[i][j] == 'I')|(Pattern[i][j] == 'R')|(Pattern[i][j] == 'D')|(Pattern[i][j] == 'M')|
  145.                         (Pattern[i][j] == 'G')|(Pattern[i][j] == 'P')
  146.                         ));
  147.             bitWrite(PatternR2L[i],(9-j),(
  148.                         (Pattern[i][j] == 'J')|(Pattern[i][j] == 'K')|(Pattern[i][j] == 'N')|(Pattern[i][j] == 'Q')|
  149.                         (Pattern[i][j] == 'L')|(Pattern[i][j] == 'O')|(Pattern[i][j] == 'R')|(Pattern[i][j] == 'M')|
  150.                         (Pattern[i][j] == 'P')
  151.                         ));
  152.             bitWrite(PatternG1L[i],(9-j),(
  153.                         (Pattern[i][j] == 'S')|(Pattern[i][j] == 'B')|(Pattern[i][j] == 'K')|(Pattern[i][j] == 'V')|
  154.                         (Pattern[i][j] == 'E')|(Pattern[i][j] == 'N')|(Pattern[i][j] == 'T')|(Pattern[i][j] == 'C')|
  155.                         (Pattern[i][j] == 'L')|(Pattern[i][j] == 'W')|(Pattern[i][j] == 'F')|(Pattern[i][j] == 'O')|
  156.                         (Pattern[i][j] == 'U')|(Pattern[i][j] == 'D')|(Pattern[i][j] == 'M')|(Pattern[i][j] == 'X')|
  157.                         (Pattern[i][j] == 'G')|(Pattern[i][j] == 'P')
  158.                         ));
  159.             bitWrite(PatternG2L[i],(9-j),(
  160.                         (Pattern[i][j] == 'V')|(Pattern[i][j] == 'E')|(Pattern[i][j] == 'N')|(Pattern[i][j] == 'W')|
  161.                         (Pattern[i][j] == 'F')|(Pattern[i][j] == 'O')|(Pattern[i][j] == 'X')|(Pattern[i][j] == 'G')|
  162.                         (Pattern[i][j] == 'P')
  163.                         ));
  164.             bitWrite(PatternB1L[i],(9-j),(
  165.                         (Pattern[i][j] == 'Y')|(Pattern[i][j] == 'H')|(Pattern[i][j] == 'Q')|(Pattern[i][j] == 'T')|
  166.                         (Pattern[i][j] == 'C')|(Pattern[i][j] == 'L')|(Pattern[i][j] == 'W')|(Pattern[i][j] == 'F')|
  167.                         (Pattern[i][j] == 'O')|(Pattern[i][j] == 'Z')|(Pattern[i][j] == 'I')|(Pattern[i][j] == 'R')|
  168.                         (Pattern[i][j] == 'U')|(Pattern[i][j] == 'D')|(Pattern[i][j] == 'M')|(Pattern[i][j] == 'X')|
  169.                         (Pattern[i][j] == 'G')|(Pattern[i][j] == 'P')
  170.                         ));
  171.             bitWrite(PatternB2L[i],(9-j),(
  172.                         (Pattern[i][j] == 'Z')|(Pattern[i][j] == 'I')|(Pattern[i][j] == 'R')|(Pattern[i][j] == 'U')|
  173.                         (Pattern[i][j] == 'D')|(Pattern[i][j] == 'M')|(Pattern[i][j] == 'X')|(Pattern[i][j] == 'G')|
  174.                         (Pattern[i][j] == 'P')
  175.                         ));
  176.         }
  177.     }      
  178.   // initialize the digital pin as an output:
  179.   pinMode(1, OUTPUT);
  180.   DDRB = DDRB | B00111111;
  181.   DDRD = DDRD | B11111100;

  182.   // initialize the digital pin to switch off the RGB Matrix:

  183.   PORTB &= B11000011;
  184.   delay(1);
  185.   PORTD &= B00000011;
  186.   PORTB &= B11000000;
  187.   delay(1);
  188.   PORTB |= B00111100;  //switch on CRGB input
  189.   delay(1);
  190.   PORTB &= B11000000;  //switch off CRGB input
  191.   delay(10);
  192.   //test RGB
  193.   for (colorpin=12; colorpin >=10; colorpin--)
  194.   {
  195.     PORTD |= B11111100;
  196.     PORTB |= B00000011;
  197.     digitalWrite(colorpin,HIGH);  
  198.     delay(800);
  199.     PORTD &= B00000011;
  200.     PORTB &= B11111100;
  201.    digitalWrite(colorpin, HIGH);
  202.    digitalWrite(colorpin, LOW);
  203.     delay(200);
  204.   }
  205.   // switch off the display
  206.   PORTD |= B11111100;
  207.   PORTB |= B00000011;
  208.   digitalWrite(13,HIGH);
  209.   digitalWrite(13,LOW);   
  210.   
  211.   // blink Loop Start LED
  212.   for (int i=1; i <=5; i++)
  213.   {
  214.     digitalWrite(1, HIGH);
  215.     delay(100);
  216.     digitalWrite(1, LOW);
  217.     delay(100);
  218.   }
  219. }

  220. void loop()                     
  221. {
  222. int running=16; //patternlen-1
  223. int timedelay1=16;
  224. int timedelay2=24;
  225. int datapin[]={9, 8, 7, 6, 5, 4, 3, 2};
  226.   for (int runno=0; runno <=running; runno++)
  227.   {  
  228.   for (int i=1; i <=256; i++)
  229.   {  
  230.   for (int zp=0; zp <=7; zp++)
  231.   {
  232.     PORTD |= B11111100;
  233.     PORTB |= B00000011;
  234.     digitalWrite(datapin[zp], LOW);
  235.     digitalWrite(13, HIGH);
  236.     digitalWrite(13, LOW);
  237.          for (int y=2; y <=9; y++)
  238.         {
  239.         digitalWrite(y, LOW);
  240.         }
  241.         patternww = zp+runno;
  242.         if (patternww > (patternlen-1))
  243.         {
  244.                 patternww=patternww-patternlen;
  245.         }
  246.            
  247.     //row pattern
  248.     PORTD |= (B11111100 & PatternR1L[patternww]);
  249.     PORTB |= (B00000011 & PatternR1H[patternww]);
  250.     //set color
  251.     digitalWrite(12, HIGH);
  252.     delayMicroseconds(timedelay1);
  253.     PORTD &= B00000011;
  254.     PORTB &= B11111100;
  255.     digitalWrite(12, LOW);
  256.     PORTD |= (B11111100 & PatternG1L[patternww]);
  257.     PORTB |= (B00000011 & PatternG1H[patternww]);
  258.     digitalWrite(11, HIGH);
  259.     delayMicroseconds(timedelay1);
  260.     PORTD &= B00000011;
  261.     PORTB &= B11111100;
  262.     digitalWrite(11, LOW);
  263.     PORTD |= (B11111100 & PatternB1L[patternww]);
  264.     PORTB |= (B00000011 & PatternB1H[patternww]);
  265.     digitalWrite(10, HIGH);
  266.     delayMicroseconds(timedelay1);
  267.     PORTD &= B00000011;
  268.     PORTB &= B11111100;
  269.     digitalWrite(10, LOW);
  270.       
  271.         // Another blink      
  272.       
  273.     PORTD |= (B11111100 & PatternR2L[patternww]);
  274.     PORTB |= (B00000011 & PatternR2H[patternww]);
  275.     //set color
  276.     digitalWrite(12, HIGH);
  277.     delayMicroseconds(timedelay2);
  278.     PORTD &= B00000011;
  279.     PORTB &= B11111100;
  280.     digitalWrite(12, LOW);
  281.     PORTD |= (B11111100 & PatternG2L[patternww]);
  282.     PORTB |= (B00000011 & PatternG2H[patternww]);
  283.     digitalWrite(11, HIGH);
  284.     delayMicroseconds(timedelay2);
  285.     PORTD &= B00000011;
  286.     PORTB &= B11111100;
  287.     digitalWrite(11, LOW);
  288.     PORTD |= (B11111100 & PatternB2L[patternww]);
  289.     PORTB |= (B00000011 & PatternB2H[patternww]);
  290.     digitalWrite(10, HIGH);
  291.     delayMicroseconds(timedelay2);
  292.     PORTD &= B00000011;
  293.     PORTB &= B11111100;
  294.     digitalWrite(10, LOW);


  295.   }
  296.   }
  297.   }
  298. }
複製代碼
ps: 1. PatternB2H 同 PatternB2L 打錯顏色code,作出修正。[  於 2009-9-4 10:51 編輯 ]
2. 取消個ForLoop,加番個delay。

[ 本帖最後由 zonebaby 於 2009-9-5 13:49 編輯 ]

TOP

E個Code都係放在examples入面....

RGB Dot Matrix RGB 27color Location

當Compile同upload成功後,再等一陣,個RGB Dot Matrix就會先開始測試RGB,然後熄哂佢。
跟住就顯示個圖案,並開始一行一行向上移,然後不斷重覆,....。

不過個效果一般,D顏色淡左,之前因個code打錯顏色code搞到D顏色分別唔明顯,。
E+修正左D顏色就正常番,順手換番張圖。(ps1)

改埋過ForLoop,就可以用番個delay調較D顏色,效果好左,又上多張rolling pattern圖。(ps2)

RGB Dot Matrix RGB 27 color Success
RGBMatrix 27 color Success_V2.jpg
2009-9-4 11:05
RollingPattern_1.gif
2009-9-5 13:50



RGB Dot Matrix RGB 27 color 試機成功...


ps:1. 修正左個code,上返張啱既圖,並改埋句comment。[於 2009-9-4 11:05 編輯]
2. 取消個ForLoop,加番個delay。

[ 本帖最後由 zonebaby 於 2009-9-5 13:50 編輯 ]

TOP

後記1:

原來主要因為個code打錯顏色code,所以搞到D顏色分別唔明顯,。
基本上個方法可以用作加多幾隻色,.............................但都係唔係咁理想..............

[ 本帖最後由 zonebaby 於 2009-9-4 11:17 編輯 ]

TOP

原帖由 zonebaby 於 2009-9-3 14:02 發表
E個Code都係放在examples入面....

RGB Dot Matrix RGB 27color Location

當Compile同upload成功後,再等一陣,個RGB Dot Matrix就會先開始測試RGB,然後熄哂佢。
跟住就顯示個圖案,並開始一行一行向上移,然後不斷重覆 ...

gamma     問題

TOP

原來如此,唔該哂,遲D睇下D點搞。

TOP

最後再試出顏色時,發現原來個code打錯顏色code,所以岀錯D顏色,修正後就正常番。

又試下加長第二節顯示時間:

雖然有改善,但效果唔明顯..,而且delay太長唔係咁好.。

[ 本帖最後由 zonebaby 於 2009-9-4 15:41 編輯 ]

TOP

修正左取消個ForLoop,用番PORTD同PORTB時會,就可以用番個delay去調較D顏色,效果好左。
大约公別設定兩組delay旣差別就可以加強顏色既效果。

TOP