Domanda:
Come affrontare un'insolita griglia neopixel
GhostToast
2018-04-21 21:04:37 UTC
view on stackexchange narkive permalink

Ho realizzato un'installazione personalizzata nella mia casa con 896 WS2812 LED pilotato da un ArduinoMega 2560 e alimentato da diversi binari benissimo. Tuttavia, l'installazione è organizzata secondo uno schema a scacchiera. Ci sono 14 pannelli con 8 strisce di 8 LED ciascuna (64 LED per pannello), le strisce sono saldate a zigzag all'interno di un pannello e le piastrelle sono collegate tramite cavi in ​​modo "progressivo a colonna".

Collegarlo e farlo funzionare funziona bene, ma sto cercando di affrontare il modello insolito che ho creato e ho difficoltà a ridimensionare con la mia soluzione attuale. Sono preoccupato che la mia soluzione non sia molto graziosa e utilizzi molta RAM non necessaria. Attualmente sto utilizzando la libreria NeoMatrix di Adafruit.

La mia soluzione è "fingere" come se avessi molti più pixel e utilizzare setRemapFunction () per eliminare questi falsi punti della griglia. Ma mentre continuo ad aggiungere pixel falsi, presumo che la RAM in testa sia messa da parte per loro e lo spingerò al massimo prima di finire. Ho 896 pixel reali in totale, ma a questo ritmo dichiaro di averne 1.792. Questo è il mio tentativo di affrontare l'offset ed è un work in progress. Questo utilizza finora circa la metà della mia griglia totale:

  const int16_t grid [] = {0, 15, 16, 31, 32, 47, 48, 63, -1, -1 , -1, -1, -1, -1, -1, -1, 256, 271, 272, 287, 288, 303, 304, 319, -1, -1, -1, -1, -1, -1, -1, -1,1, 14, 17, 30, 33, 46, 49, 62, -1, -1, -1, -1, -1, -1, -1, -1, 257 , 270, 273, 286, 289, 302, 305, 318, -1, -1, -1, -1, -1, -1, -1, -1,2, 13, 18, 29, 34, 45 , 50, 61, -1, -1, -1, -1, -1, -1, -1, -1, 258, 269, 274, 285, 290, 301, 306, 317, -1, -1 , -1, -1, -1, -1, -1, -1,3, 12, 19, 28, 35, 44, 51, 60, -1, -1, -1, -1, -1, -1, -1, -1, 259, 268, 275, 284, 291, 300, 307, 316, -1, -1, -1, -1, -1, -1, -1, -1,
4,  11,  20,  27,  36,  43,  52,  59,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1, 260, 267, 276, 283, 292, 299, 308, 315,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,5,  10,  21,  26,  37,  42,  53,  58,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1, 261, 266, 277, 282, 293, 298, 309, 314,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,6,   9,  22,  25,  38,  41,  54,  57,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1, 262, 265, 278, 281, 294, 297, 310, 313,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,7,   8,  23,  24,  39,  40,  55,  56,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1, 263, 264, 279, 280, 295, 296, 311, 312,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,-1,  -1,  -1,  -1,  -1,  -1,  -1,  -1, 128, 143, 144, 159, 160, 175, 176, 191,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1, 384, 399, 400, 415, 416, 431, 432, 447,-1,  -1,  -1,  -1,  -1,  -1,  -1,  -1, 129, 142, 145, 158, 161, 174, 177, 190,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1, 385, 398, 401, 414, 417, 430, 433, 446,-1,  -1,  -1,  -1,  -1,  -1,  -1,  -1, 130, 141, 146, 157, 162, 173, 178, 189,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1, 386, 397, 402, 413, 418, 429, 434, 445,-1,  -1,  -1,  -1,  -1,  -1,  -1,  -1, 131, 140, 147, 156, 163, 172, 179, 188,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1, 387, 396, 403, 412, 419, 428, 435, 444,-1,  -1,  -1,  -1,  -1,  -1,  -1,  -1, 132, 139, 148, 155, 164, 171, 180, 187,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1, 388, 395, 404, 411, 420, 427, 436, 443,-1,  -1,  -1,  -1,  -1,  -1,  -1,  -1, 133, 138, 149, 154, 165, 170, 181, 186,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1, 389, 394, 405, 410, 421, 426, 437, 442,-1,  -1,  -1,  -1,  -1,  -1,  -1,  -1, 134, 137, 150, 153, 166, 169, 182, 185,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1, 390, 393, 406, 409, 422, 425, 438, 441,-1,  -1,  -1,  -1,  -1,  -1,  -1,  -1, 135, 136, 151, 152, 167, 168, 183, 184,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1, 391, 392, 407, 408, 423, 424, 439, 440,
64,  79,  80,  95,  96, 111, 112, 127,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1, 320, 335, 336, 351, 352, 367, 368, 383,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,65,  78,  81,  94,  97, 110, 113, 126,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1, 321, 334, 337, 350, 353, 366, 369, 382,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,66,  77,  82,  93,  98, 109, 114, 125,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1, 322, 333, 338, 349, 354, 365, 370, 381,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,67,  76,  83,  92,  99, 108, 115, 124,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1, 323, 332, 339, 348, 355, 364, 371, 380,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,68,  75,  84,  91, 100, 107, 116, 123,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1, 324, 331, 340, 347, 356, 363, 372, 379,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,69,  74,  85,  90, 101, 106, 117, 122,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1, 325, 330, 341, 346, 357, 362, 373, 378,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,70,  73,  86,  89, 102, 105, 118, 121,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1, 326, 329, 342, 345, 358, 361, 374, 377,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,71,  72,  87,  88, 103, 104, 119, 120,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1, 327, 328, 343, 344, 359, 360, 375, 376,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,-1,  -1,  -1,  -1,  -1,  -1,  -1,  -1, 192, 207, 208, 223, 224, 239, 240, 255,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1, 448, 463, 464, 479, 480, 495, 496, 511,-1,  -1,  -1,  -1,  -1,  -1,  -1,  -1, 193, 206, 209, 222, 225, 238, 241, 254,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1, 449, 462, 465, 478, 481, 494, 497, 510,-1,  -1,  -1,  -1,  -1,  -1,  -1,  -1, 194, 205, 210, 221, 226, 237, 242, 253,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1, 450, 461, 466, 477, 482, 493, 498, 509,-1,  -1,  -1,  -1,  -1,  -1,  -1,  -1, 195, 204, 211, 220, 227, 236, 243, 252,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1, 451, 460, 467, 476, 483, 492, 499, 508,
-1, -1, -1, -1, -1, -1, -1, -1, 196, 203, 212, 219, 228, 235, 244, 251, -1, -1, -1, - 1, -1, -1, -1, -1, 452, 459, 468, 475, 484, 491, 500, 507, -1, -1, -1, -1, -1, -1, -1 , -1, 197, 202, 213, 218, 229, 234, 245, 250, -1, -1, -1, -1, -1, -1, -1, -1, 453, 458, 469, 474, 485, 490, 501, 506, -1, -1, -1, -1, -1, -1, -1, -1, 198, 201, 214, 217, 230, 233, 246, 249, -1, -1, -1, -1, -1, -1, -1, -1, 454, 457, 470, 473, 486, 489, 502, 505, -1, -1, -1, - 1, -1, -1, -1, -1, 199, 200, 215, 216, 231, 232, 247, 248, -1, -1, -1, -1, -1, -1, -1 , -1, 455, 456, 471, 472, 487, 488, 503, 504,};  

Lo sto usando in questo modo:

  #define PIN 6 # define WIDTH 32 // Finora. Sarà 56 quando finisco di creare l'array. # Define HEIGHT 32 / ** * Imposta la matrice lightwall. * * Ogni pannello è 8x8 pixel. Ci sono 7 colonne e 2 righe, * ma sono disposte secondo uno schema a scacchiera. * / Adafruit_NeoMatrix matrix = Adafruit_NeoMatrix (WIDTH, HEIGHT, PIN, NEO_MATRIX_TOP + NEO_MATRIX_LEFT + NEO_MATRIX_COLUMNS + NEO_MATRIX_ZIGZAG, NEO_GRBW + NEO_KHZ800); x16_Yt_t return grid [y];} void setup () {matrix.setRemapFunction (remapXY); matrix.begin ();}  

Quindi remapXY () restituisce la chiave corretta dell'array, quindi il motivo del folle array incollato sopra. E quell'array è completo solo a metà (scriverlo noiosamente!)

Ma finora funziona. Ho un'animazione di Pacman (non raffigurata) che scorre sullo schermo ed è "fuori dallo schermo" per un periodo di tempo credibile. Questo è il punto centrale di questa follia. Ma sto andando tutto male? In allegato è anche un'immagine della matrice visibile completa per un aiuto visivo.

lightwall

A partire dall'angolo in alto a sinistra c'è il pannello 1, quindi in basso pannello sinistro 2. La colonna successiva in alto è il pannello 3, il pannello inferiore 4. E così via.

Quindi avrò bisogno di più RAM affinché funzioni? O c'è un modo migliore per codificare la mia via d'uscita da questo problema? Ho in programma molte animazioni ed effetti ambientali, non tutti richiederanno rigorosamente questo offset.

C'è un altro modo per "mascherare" o ritardare temporaneamente alcuni pixel fuori dallo schermo in base a dove dovrebbero essere? Solo per rimetterli al loro posto in seguito?

questo è un progetto assolutamente fantastico
puoi usare un programma di fogli di calcolo, come Excel, per generare array come quello che hai. ... quindi taglia e incolla dall'intervallo di celle all'editor del programma
La tua stanza sembra più high-tech della mia, e questo sta dicendo qualcosa!
Due risposte:
jsotola
2018-04-21 23:37:57 UTC
view on stackexchange narkive permalink

suddividilo in blocchi per determinare l'angolo superiore sinistro di qualsiasi griglia 8x8

  const int16_t grid [8] [8] = {{0, 15, 16, 31, 32, 47, 48, 63}, {1, 14, 17, 30, 33, 46, 49, 62}, {2, 13, 18, 29, 34, 45, 50, 61}, {3, 12, 19, 28, 35, 44, 51, 60}, {4, 11, 20, 27, 36, 43, 52, 59}, {5, 10, 21, 26, 37, 42, 53, 58}, {6, 9, 22, 25, 38, 41, 54, 57}, {7, 8, 23, 24, 39, 40, 55, 56}}; const int16_t blocco [7] [4] = {{0, -1 , 4, -1, 8, -1, 12}, {-1, 2, -1, 6, -1, 10, -1}, {1, -1, 5, -1, 9, -1, 13}, {-1, 3, -1, 7, -1, 11, -1}}; blockNumber = block [x / 8] [y / 8]; // alcuni controlli per il valore -1pixelNumber = blockNumber * 64 + griglia [x% 8] [y% 8] //  
Sembra davvero promettente, credo di aver capito. Lo proverò e ti risponderò su come va. Grazie!
grazie ancora! questo sta funzionando. ho dovuto correggere un paio di sfumature minori ma questo è stato immensamente utile!
Se aggiungo altro, esaurisco la RAM. Ogni pixel necessita di 3 byte di RAM. Se lo faccio largo 10 "scatole", diventa una griglia di 80x32 o 2560 pixel. Sono 7680 byte di RAM, che è semplicemente troppo per questa piccola scheda debole.
Vorrei dare un'occhiata seria alla risposta di @edgarbonet's e accettare quella invece di questa se consente pannelli più grandi
crea gli array `grid` e` block` di tipo uint8_t invece di int16_t per i principianti .... potresti suddividere l'array `grid` in 4 sezioni orizzontalmente per salvare qualche altro byte ..... potresti aggiungere più` blocchi non utilizzati per seguire più da vicino il layout effettivo ..... la riga superiore dell'array `block` sarebbe` {0, -1, -1, -1, 4, -1, -1, -1, 8, -1, -1, -1, 12}, `
Edgar Bonet
2018-04-22 01:44:25 UTC
view on stackexchange narkive permalink

Questo sembra davvero fantastico!

Suggerisco di sbarazzarsi del grande array grid e invece di generare la mappatura in modo programmatico. Dato che è molto regolare, la mappatura può essere calcolata invece che memorizzata:

  uint16_t remapXY (uint16_t x, uint16_t y) {// Posizione del pannello di calcolo e offset di pixel all'interno di quel pannello. uint8_t pannel_x = x / 8; uint8_t offset_x = x% 8; uint8_t pannel_y = y / 8; uint8_t offset_y = y% 8; // È un pannello mancante? if ((pannel_x + pannel_y) & 1) return -1; // Calcola il numero del pannello. uint8_t pannel = pannel_y / 2 + pannel_x * 2; // Indice LED all'interno del pannello. uint8_t led = 8 * offset_x; if (offset_x & 1) // led dal basso verso l'alto numerato + = 7 - offset_y; altro // led numerato dall'alto verso il basso + = offset_y; return pannel * 64 + led;}  

Spero che questo salverà abbastanza memoria per far funzionare il tutto.

Anche questa è una soluzione molto elegante e funziona anche! Non mi consente di aggiungere ancora più pannelli falsi come sperava @jsotola, ma sicuramente sembra meno sovraccarico (anche se mi chiedo se fare i calcoli ripetutamente sia un risparmio rispetto alla definizione delle costanti? Supponiamo che sia CPU vs RAM domanda). Il Mega semplicemente non ha abbastanza RAM per fingere oltre quello che ho fatto.
Mi viene in mente di poter memorizzare anche le tabelle di ricerca in `PROGMEM` e salvare un po 'di` SRAM` in questo modo. Leggendo questo: https://www.arduino.cc/en/Tutorial/Memory


Questa domanda e risposta è stata tradotta automaticamente dalla lingua inglese. Il contenuto originale è disponibile su stackexchange, che ringraziamo per la licenza cc by-sa 3.0 con cui è distribuito.
Loading...