home | area personale         schemi | tutorial | robotica | pic micro | recensioni         forum | chat irc         faq | contatti         store | Ordina PCB
username
password
cerca

 
FORUM: Pic Micro
Tutto quanto riguarda questi microprocessori... progetti, suggerimenti, aiuti, discussioni...ecc


Sfarfallio con Arduino Nano e una matrice di LEDs 4x5
     
Autore Messaggio opzioni
picmicro675




una ogni 10 livelli


postato il:
14.12.2016, alle ore 07:25
Sfarfallio con Arduino Nano e una matrice di LEDs 4x5 

Mi e\' stato chiesto di fare un programma che accenda una ventina di LEDs in sequenza.

Solo che il programma non sembra produrre tanto ritardo da causare questo effetto.
/* Created:   Fri Dec 2 16
 * Processor: ATmega328P
 * Compiler:  Arduino AVR
 */
#define DEBUG                           // Definizione che permette il debug
                                        // Se commentato, nessun debug
#include <TimerOne.h>                   // usato per le temporizzazioni

#define INBTN 2                          // segnale di ingresso
#define TMPRESS 10                      // tempo valido per una pressione di pulsante
#define TIMEOUT 7200000UL               // fine tempo contatore
#define NUMCOLS 4                       // numero di colonne
#define NUMROWS 5                       // numero di righe
#define MAX_LEDS NUMCOLS * NUMROWS      // numero di led
#define BLINKTIME 10                   // in fase normale impostare ad almeno 500

uint8_t data[NUMCOLS];
uint8_t led_count = 0;
uint8_t ticks = 0;
uint32_t period = 0;                        // periodo da contare per 2 ore
uint8_t led_blink = 1;
bool push_btn;

void countdown () {
    period = millis();
            #ifdef DEBUG
            Serial.println(\"Inizio il conteggio\");
            #endif
    while (period < (millis()-TIMEOUT)) {};
    clrmem();
    led_count = 0;
}

void refresh() {
    // rinfresco periodico dei LEDs, alla candenza di 10 mSec
    if (ticks < NUMCOLS-1) ticks++;
    else ticks = 0;
    PORTC = 0;
    PORTB = data[ticks];
    bitWrite(PORTC, ticks, 1);
    delay(23);
}

void clrmem() {
    for (uint8_t x=0; x < NUMCOLS; x++) data[x] = 0;
}

void btn_press() {
    uint8_t col;
    if (pulseIn(INBTN,LOW) > TMPRESS && (led_blink == 1)) {
#ifdef DEBUG
        Serial.print(\"led_count = \");
        Serial.println(led_count, DEC);
#endif
        push_btn = 1;
    }
    // effetto di lampeggio prima di affermare l\' accensione
    if (push_btn) {
      if (led_blink < 5) {
        led_blink++;
        col = led_count / NUMROWS;
        bitWrite(data[col], led_count % NUMROWS, led_blink % 2);
        delay(BLINKTIME);
      }
      else {
        led_count++;
        led_blink = 1;
        push_btn = 0;
      }
    }
}

void setup(){
    #ifdef DEBUG
    Serial.begin(57600);
    #endif
    for (uint8_t x=8; x < 23; x++) {
        pinMode(x, OUTPUT);
    }
    clrmem();
    pinMode(INBTN, INPUT_PULLUP);
    #ifdef DEBUG
    Serial.println(F(\"Monitor pronto\"));
    #endif
    Timer1.initialize(9761);            // set a timer of length 5 milliseconds
    Timer1.attachInterrupt(refresh);    // attach the service routine here
}

void loop() {
    btn_press();
    if (led_count >= MAX_LEDS) countdown();
}
 

Bene, questo è il progetto, non ho interesse diretto ad implementare l\' hardware, ma il mio amico dice che i LEDs non sono accesi ben fissi da vedere.
Avevo anche pensato di saltare i cicli in cui la colonna è vuota, ma questo farebbe variare la frequenza di accensione tra un numero minimo di colonne accese e quando sono tutte accese.
Si pensa anche di aggiungere altre 2 colonne, ma non riesco a scoprire quale possa essere il problema. Forse il limite della corrente dettato dalle resistenze ai catodi ?



Anno nuovo, forum nuovo.
Mi sa che lascio.
picmicro675




una ogni 10 livelli


postato il:
14.12.2016, alle ore 07:30
Il programma senza artefatti di grix, lo si trova anche qui
http://pastebin.com/ADkYUu3i



Anno nuovo, forum nuovo.
Mi sa che lascio.
gironico




una ogni 100 livelli


postato il:
15.12.2016, alle ore 10:14
troppo veloce?

per buttarla là, ho visto che usi un bc547... la sua Ic, non sapendo che led usi non è che è tirata un po' all'osso? prova il fratello più grande in termini di ic tipo il bc337....i pinout inutile dirtelo certo che sai che sono uguali



La vita è troppo breve per bere vini mediocri
picmicro675




una ogni 10 livelli


postato il:
15.12.2016, alle ore 12:11
O sommo
Consigli di aumentare la capacità ? Forse dei darlington o mosfet ?



Anno nuovo, forum nuovo.
Mi sa che lascio.
gironico




una ogni 100 livelli


postato il:
15.12.2016, alle ore 15:55
non esageriamo....non ho capito bene la sequenza e la dinamica di accensione, mi sembra stile multiplaxing.... per un led normale dovrebbe andare bene il tuo transistor, occorre vedere quanti led si accendo contemporaneamente sul quel transistor e che tipo sono i led....

quella res si trova nella condizione in cui simultaneamente possono essere accesi 2 led?

Se si il problema potrebbe essere che una res limita due led e quindi ti passa poca corrente dato che mi sembra che l'hai dimensionata per un led solo....

Se questo è il problema prova con una res per ogni led, però ripensandoci, secondo me c'è un 'errore....

hai messo il transistor, ma comunque passa tutto da una porta....non credo lo supporti il micro...più di quello non da....

Il sorgente non l'ho compreso bene....potresti spiegarmi meglio il tuo obbiettivo e il software, perché da come lo intuisco io, secondo me se devi accendere quella specie di matrice con altro hardware, con un pnp sull'anodi la cui basi sono gestite da d12 a d8....però ricordati dato che usi un pnp di invertire lo stato logico delle porte d per mandare in conduzione i pnp



La vita è troppo breve per bere vini mediocri
picmicro675




una ogni 10 livelli


postato il:
16.12.2016, alle ore 07:26
Sì è multiplexing
Un transistor si prende carico di 5 LEDs che sono accesi sulla PORTB, da 8 a 12 (come nomenclatura di Arduino)
Ogni colonna è pilotata da A0 a A3 in ciclo.
Non ho assemblato l' hardware, aspetto che il mio amico mi "illumini". Al simulatore ho provato con dei mosfer 2N7000C che tirano anche 200 mA e sembra che la luce sia più marcata.

Mi dici che e meglio mettere la matrice ad Anodi comuni, poi usare la corrente di sink (corrente in entrata) per pilotare i LED ?
Ho letto qualcosa che sconsiglia di usare il Nano per pilotare una matrice, tutto conduce ai MAX 72xx. Sebbene ho fatto una prova con 2 display a 7 segmenti e si accendono bene. Ovvero è una matrice anche quella di 8x2

Le mie referenze mi dicono che il Nano non dovrebbe eccedere i 200 mA complessivi. Ma se consideriamo anche di ampliare a 6x6, il consumo dovrebbe al massimo arrivare sui 140 mA, se diamo corrente ai 6 LEDs a 20 mA.

Forse dovrei distaccare l' alimentazione d' uscita (o ingresso) del Nano e alimentare i LEDs con alimentazione separata. Forse frammettere un ULN2804 ai piedini 8~12.

Mhmm, devo metterlo su tagliere e vedere dal vero. (ma non ho tanto tempo)



Anno nuovo, forum nuovo.
Mi sa che lascio.
picmicro675




una ogni 10 livelli


postato il:
16.12.2016, alle ore 07:36
Mi dimenticavo il sorgente.
A parte lo scopo principale, la fase importante del quale potrebbe influire lo sfarfallio, è nella fase di rinfresco.
Io ho usato TimerOne che genera un interrupt ogni centesimo di secondo ed esegue la funzione refresh.. In quel frattempo si esegue:

la porta C spenta, nessuna colonna accesa
Metto il valore del byte di data, riferito alla colonna da accedere PORTB = data[col] (anche se il contenuto è 0)
Imposto il bit della PORTC che deve accendermi la colonna, in ciclo.
lascia la funzione, ripete al prossimo centesimo di secondo.

Così facendo avrei una accensione di 1 centesimo di secondo ogni 4, che sarebbe una frequenza di 25 Hz al 25% di luminosità. La persistenza dell' occhio non dovrebbe percepire lo spegnimento a 25 Hz.



Anno nuovo, forum nuovo.
Mi sa che lascio.
gironico




una ogni 100 livelli


postato il:
16.12.2016, alle ore 10:54
poi di quei 25hz di fatto te ne rimangono un po' meno... non vorrei che superi il limite della persistenza dell'occhio di poco dovuto al fatto che il micro nel frattempo qualche altra cosa la fa...se pur minimo anche il passaggio della corrente elettrica qualcosina ina ina di tempo se ne mangia.... cento niente pesano un quintale

da calcolo non fa una piega, ma a volte mi è capitato che per avere una discreta luminosità di dover scendere un capellino sotto i 4 millisecondi....

Hai scritto un bel software che io da niubbo per fare la solita cosa magari ci metto 100 righe in più e rallento il micro e per questo ti ho detto che devo scendere un po' rispetto al calcolo del limite del tempo di risposta dell'occhio umano

cmq prima proverei ad alimentare i led separatamente con un array di transistor o transistor stessi pilotati dal micro.... almeno scongiuri il problema della corrente ipotetica...

Se continua il problema prova a fare una accensione di 1 centesimo di secondo ogni 3 invece che ogni 4



La vita è troppo breve per bere vini mediocri
picmicro675




una ogni 10 livelli


postato il:
16.12.2016, alle ore 12:33
Ho un delay(23) nel refresh, per dare un poco di accensione in più e un interrupt a 9761 microSec.
Ho letto in giro che i led bianchi prendono anche 30 mA, Con le resistenze da 220 Ohm, sembra che sia un po fioco, ma non dovrebbe al caso influire sulla persistenza visiva.
Avevo immaginato di saltare le righe vuote (ovvero fare il ciclo con solo le righe attive), ma sarebbe un effetto che quando aumentano le righe cala la luminosità.



Anno nuovo, forum nuovo.
Mi sa che lascio.
gironico




una ogni 100 livelli


postato il:
16.12.2016, alle ore 14:09
i led bianchi poccicchiano...chiaramente sarebbe meglio sapere da datasheets... ma la prova con una res all'alim e un'amperometro la puoi fare....se non hai le caratteristiche il suo assorbimento rimane un incognita...magari il problema risiede li....

fai una misura e ti togli il pensiero



La vita è troppo breve per bere vini mediocri
segui questo thread con grixFC, per questa funzione devi aver installato il software grixFC

torna su
     

Come utente anonimo puoi leggere il contenuto di questo forum ma per aprire una discussione
o per partecipare ad una discussione esistente devi essere registrato ed accedere al sito




 







 
 
indietro | homepage | torna su copyright © 2004/2024 GRIX.IT - La community dell'elettronica Amatoriale