Arduino Mega 2560 und tpm2.net Bastelei

    Arduino Mega 2560 und tpm2.net Bastelei

    Hi zusammen, ich versuche mich zur zeit an einem eigenen Sketch für eine tpm2.net steuerung meiner 15x11 matrix mit ws2812B Led stripes.

    Da ich bisher aber noch keine Große erfahrung mit arduino und dem ethernet shield habe, so wie mit der Arduino Programmierung, versuche ich aus vorhandenen Sketches etwas zusammen zu basteln.

    über usb kann ich die led´s bereits mit jinx über tpm2 ansteuern. der Code dazu sieht wie folgt aus:

    C-Quellcode

    1. #include "pt.h"
    2. #include "FastLED.h"
    3. /* LED und Arduino Variablen */
    4. #define NUM_LEDS 165 // Number of LEDs
    5. #define MAX_ARGS 500 // Max Number of command arguments
    6. #define BAUDRATE 500000 // Baudrate
    7. #define SERIAL Serial // Serial port for communication
    8. #define SERIAL_DEBUG Serial // Serial port for debugging
    9. #define DATA_PIN 5 // PIN where LEDs are connected/Used for TM1809/WS2811 chipsets, because they dont use SPI
    10. //#define CLOCK_PIN 4 // used for some SPI chipsets, e.g. WS2801
    11. #define BRIGHTNESS 127 // define global brightness 0..255
    12. //#define taster 12
    13. //choose your LED chipset in void setup()
    14. enum Protocol
    15. {
    16. // positions
    17. posStart = 0,
    18. posType = 1,
    19. posFsHigh = 2,
    20. posFsLow = 3,
    21. posData = 4,
    22. // bytes
    23. tpm2Start = 0xc9,
    24. tpm2DataFrame = 0xda,
    25. tpm2Command = 0xc0,
    26. tpm2Answer = 0xaa,
    27. tpm2End = 0x36,
    28. tpm2Ack = 0xAC
    29. };
    30. enum Mode
    31. {
    32. mNone,
    33. mCommunication,
    34. mProgram
    35. };
    36. struct Data
    37. {
    38. int pos;
    39. uint8_t type;
    40. uint16_t fs;
    41. uint8_t command;
    42. CRGB rgb[NUM_LEDS];
    43. } data;
    44. byte args[MAX_ARGS];
    45. unsigned long lastDataAt = 0;
    46. //int program = 0;
    47. //int mode = mNone;
    48. int effectDelay = 100;
    49. static struct pt pt1;
    50. void setup()
    51. {
    52. oneColorAll(0, 0, 20);
    53. Serial.begin(BAUDRATE);
    54. delay(2000);
    55. oneColorAll(0, 0, 0);
    56. //memset(data.rgb, 0, sizeof(struct CRGB) * NUM_LEDS);
    57. FastLED.addLeds<WS2812, DATA_PIN, RGB>(data.rgb, NUM_LEDS);
    58. FastLED.setBrightness(BRIGHTNESS);
    59. }
    60. /* loop
    61. */
    62. void loop()
    63. {
    64. if (Serial.available())
    65. {
    66. doCommunication();
    67. }
    68. }
    69. /* do communication
    70. */
    71. void doCommunication()
    72. {
    73. // read ...
    74. while (SERIAL.available() > 0)
    75. {
    76. byte val = Serial.read();
    77. if (val == tpm2Start || data.pos == posStart ) { //&& val == tpm2Start // Startbyte
    78. resetVars();
    79. }
    80. else if (val == tpm2Start)
    81. resetVars();
    82. else if (data.pos == posType && (val == tpm2DataFrame || val == tpm2Command)) // Block-Art
    83. data.type = val;
    84. else if (data.pos == posFsHigh) // Framesize (High Bit)
    85. {
    86. data.fs = (val << 8) & 0xFF00;
    87. if (data.fs > NUM_LEDS * 3)
    88. {
    89. resetVars();
    90. continue;
    91. }
    92. }
    93. else if (data.pos == posFsLow) // Framesize (Low byte)
    94. {
    95. data.fs += val & 0x00FF;
    96. if (data.fs > NUM_LEDS * 3)
    97. {
    98. resetVars();
    99. continue;
    100. }
    101. }
    102. else if (data.pos == posData + data.fs && val == tpm2End) { // End Byte
    103. parsePacket();
    104. }
    105. else if (data.pos >= posData && data.pos < posData + data.fs){ // Bytes zwischen Header und Ende lesen
    106. evaluateData(val);
    107. }
    108. data.pos++;
    109. }
    110. }
    111. /* evaluate data
    112. */
    113. void evaluateData(byte val)
    114. {
    115. if (data.type == tpm2DataFrame) // frame data
    116. {
    117. uint8_t* rgb = (uint8_t*)data.rgb;
    118. rgb[data.pos - posData] = val;
    119. }
    120. }
    121. /* reset variables
    122. */
    123. void resetVars()
    124. {
    125. memset(&data, 0, sizeof(Data));
    126. //oneColorAll(0, 20, 0);
    127. //data.rgb = (struct CRGB*)FastSPI_LED.getRGBData();
    128. memset(data.rgb, 0, NUM_LEDS * sizeof(struct CRGB));
    129. }
    130. /* parse packet
    131. */
    132. void parsePacket()
    133. {
    134. switch (data.type)
    135. {
    136. case tpm2DataFrame:
    137. {
    138. showLeds();
    139. //break;
    140. }
    141. default:
    142. ; //break;
    143. }
    144. SERIAL.write(tpm2Ack);
    145. resetVars();
    146. data.pos = -1;
    147. }
    148. /* set LED color
    149. */
    150. void setLedColor(int led, uint8_t r, uint8_t g, uint8_t b)
    151. {
    152. data.rgb[led].r = r;
    153. data.rgb[led].g = g;
    154. data.rgb[led].b = b;
    155. }
    156. /* one Color All
    157. */
    158. void oneColorAll(uint8_t r, uint8_t g, uint8_t b)
    159. {
    160. resetVars();
    161. for (int led = 0; led < NUM_LEDS; led++)
    162. setLedColor(led, r, g, b);
    163. showLeds();
    164. //effectDelay = 1000;
    165. }
    166. /* Output Leds
    167. */
    168. void showLeds()
    169. {
    170. FastLED.show();
    171. }


    In diesen code möchte ich aber zum 1. einmal das problem beseitigen, dass man das sketch immer erst neu aufspielen muss, sonnst läuft es nach einem Stromverlust nicht mehr.
    zum anderen sollen die daten die mir dann via netzwerk gesendet werden so wie im usb beispiel verarbeitet werden.

    Toll wäre ein code der so wohl auf USB (TPM2) wie auch auf (TPM2.net) via Lan reagiert. das wäre dann eine schöne geschichte für alle die mit matrixen arbeitet oder versuchen wollen was aufzubauen.

    Würde mich freuen wenn mir jemand der etwas mehr ahnung von der Materie hat etwas unter die Arme greifen könnte.