Salve,
Mi servirebbe un aiuto per un progetto di arduino che prevede l'acquisizione di un codice ad 8 bit tramite dipswitch. Il codice in binario dovrà poi essere convertito in codice gray e sommato di 1 ( es col dip inserisco il valore binario 0111 (7) e in gray mi dovrà dare 1100 (8)) e il risultato dovrà essere visualizzato su 8 led.
Al massimo posso usare 12 pin di arduino e pensavo di utilizzare un multiplexer 7415 per l'acquisizione dei dati dal dip
Grazie in anticipo
Ti invitiamo a presentarti (dicci quali conoscenze hai di elettronica e di programmazione) qui: Presentazioni
e a leggere il regolamento se non lo hai già fatto: Regolamento
Qui una serie di link utili, non inerenti al tuo problema:
- qui una serie di schede by xxxPighi per i collegamenti elettronici vari: ABC - Arduino Basic Connections
- qui le pinout delle varie schede by xxxPighi: Pinout
- qui una serie di link generali utili: Link Utili
Salve,
Sono Gianmarco e sono di Acquaviva, ho 15 anni e da un po di tempo mi esercito con arduino a scuola.
Il fatto è che io di elettronica ci capisco poco o nulla per questo mi servirebbe il vostro aiuto.
Grazie in anticipo
Ma se vuoi rappresentare un codice gray da un binario, non capisco perche' ti servano 8 Led.
8 Pin di input per i dip switch e 4 Pin di Output per i Led
Eh il progetto prevede la rappresentazione del segnale cosi
e appunto volevo usare il multi per diminuire i pin di ingresso
Brunello:
Ma se vuoi rappresentare un codice gray da un binario, non capisco perche' ti servano 8 Led.
Per il semplice motivo che il codice gray richiede lo stesso numero di bit di un valore binario in quanto è dato dal xor del binario con se stesso shiftato di uno a destra.
Semmai gli bastano 12 pin perché può collegare sia i dip switch che i led sotto forma di matrice 4x2 senza usare nessun hardware aggiuntivo, a parte le resistenze di limitazione corrente per i led.
@VAL8: La presentazione va fatta nell'apposito thread, ovvero QUI e NON in questo thread. Con l'occasione ti prego anche di leggere il REGOLAMENTO ... Grazie.
Guglielmo
Per il semplice motivo che il codice gray richiede lo stesso numero di bit di un valore binario
a volte mi sento un Cog....e.
... un codice ad 8 bit va da 00 (0) a FF (255) ... oppure intendi leggere quale degli 8 dip-switch e' acceso in base alla posizione, indifferentemente dalla codifica hex ?
EDIT: Brunello, probabilmente stavi pensando al codice BCD
Il dip switch lo devo utilizzare per creare il codice binario ad 8 bit
se il dip è spostato in una determinata posizione mi da valore 1 sennò 0 e così dovrei creare il segnale ad 8 bit, una volta ricevuto il segnale su arduino devo trasformare da binario a Gray sommato di 1 e i led si devono accendere in base al valore, se il primo bit è 0 il primo led è spento senno si accende e così anche per gli altri 7 led.
Ma il mio problema è che non so scrivere il programma su arduino perchè la parte fisica l'ho già montata sulla breadbord.
Semmai gli bastano 12 pin perché può collegare sia i dip switch che i led sotto forma di matrice 4x2 senza usare nessun hardware aggiuntivo, a parte le resistenze di limitazione corrente per i led.
EDIT: Brunello, probabilmente stavi pensando al codice BCD
Poi non ho risposto perchè sono dovuto scappare, ma stavo proprio pensando a 8pin per il dipswitch e a 4 pin per i led, messi in matrice.
Anzi, visto che sono in pausa pranzo, mi sono voluto divertire un pò
Dovrebbe funzionare. Per i Led li ho collegati in charlieplexing
Poi metto anche un disegnino dei collegamenti
/*
Converte un numero letto da dipswitch e lo converte in codice gray
e lo visualizza su led in charlieplexing
*/
// definisce i pin dei led per il charlieplexing
#define led_A A0
#define led_B A1
#define led_C A2
#define led_D A3
// definisce i pin (MSB)7,6,5,4,11,10,9,8 come ingressi
byte ddrb_mask = ~((1 << DDB0) | (1 << DDB1) | (1 << DDB2) | (1 << DDB3) );
byte ddrd_mask = ~((1 << DDD4) | (1 << DDD5) | (1 << DDD6) | (1 << DDD7) );
byte portb_mask = ((1 << PORTB0) | (1 << PORTB1) | (1 << PORTB2) | (1 << PORTB3) ); // Pullup
byte portd_mask = ((1 << PORTD4) | (1 << PORTD5) | (1 << PORTD6) | (1 << PORTD7) ); // Pullup
byte pinb_mask = ((1 << PINB0) | (1 << PINB1) | (1 << PINB2) | (1 << PINB3) );
byte pind_mask = ((1 << PIND4) | (1 << PIND5) | (1 << PIND6) | (1 << PIND7) );
int dec;
int binario[10];
int i;
unsigned int gray ;
unsigned int num ;
void setup()
{
// imposta i pin A0---A4 come input
DDRC = DDRC & ~ ((1 << DDC0) | (1 << DDC1) | (1 << DDC2) | (1 << DDC3));
// imposta i pin come input
DDRD = DDRD & ddrd_mask; // PortaD 4,5,6,7
DDRB = DDRB & ddrb_mask; // PortaB 8,9,10,11
// abilita il pullup, perche' i dipswich vanno verso il Ground
PORTD = PORTD | portd_mask;
PORTB = PORTB | portb_mask;
Serial.begin (115200);
}
void ritardo() {
delay(2); // ritardo per il refresh dei led
}
void loop()
{
num = (PINB & pinb_mask) + ( PIND & pind_mask); // legge i dip switch
//num++ ; // aumenta di uno
gray = (num >> 1) ^ num ; // converte in codice gray
Serial.print (num);
Serial.print(" = ");
Serial.println ( gray );
conversione(gray) ;
visua_numero();
if (binario[8] == 1 )
imposta_pins(led_B, led_A); // 1 led
ritardo();
if (binario[7] == 1 )
imposta_pins(led_A, led_B); // 2 led
ritardo();
if (binario[6] == 1 )
imposta_pins(led_C, led_B); // 3 led
ritardo();
if (binario[5] == 1 )
imposta_pins(led_B, led_C); // 4 led
ritardo();
if (binario[4] == 1 )
imposta_pins(led_C, led_A); // 5 led
ritardo();
if (binario[3] == 1 )
imposta_pins(led_A, led_C); // 6 led
ritardo() ;
if (binario[2] == 1 )
imposta_pins(led_D, led_B); // 7 led
ritardo();
if (binario[1] == 1 )
imposta_pins(led_B, led_D); // 8 led
ritardo() ;
if (binario[0] == 1 )
imposta_pins(led_D, led_A); // 9 led
ritardo() ;
}
void imposta_pins(int high_pin, int low_pin)
{
reset_pins();
pinMode(high_pin, OUTPUT);
pinMode(low_pin, OUTPUT);
digitalWrite(high_pin, HIGH);
digitalWrite(low_pin, LOW);
}
void reset_pins()
{
DDRC = DDRC & ~ ((1 << DDC0) | (1 << DDC1) | (1 << DDC2) | (1 << DDC3)); // pinMode INPUT
PORTC = PORTC | ((0 << PORTC0) | (0 << PORTC1) | (0 << PORTC2) | (0 << PORTC3)); // digitalWrite LOW);
}
void conversione( int dec) { // riempe il vettore
for (i = 0; i < 9; i++) {
if (dec % 2 == 0) {
binario[i] = 0;
} else {
binario[i] = 1;
}
dec = dec / 2;
}
}
void visua_numero() { // visualizza su seriale
for (i = 8; i >= 0; i--) {
Serial.print(" ");
Serial.print( binario[i]);
}
Serial.println();
}
Gentilissimo!
Le spiacerebbe però spiegarmi come montare i led sulla breadboard perchè non sono molto pratico nell'interpretazione dei disegni ahahah
e anche le resistenze per i basta che ne metto 1 per uscita o una prima di ogni led?
Scusa un attimo
ma perche nel disegno ci sono 9 led? serve per l'overflow?
avevo letto che leggevi gli 8 bit e poi sommavi di uno
quindi se ad "1111 1111" (255) (0xFF) sommo UNO, passo da 8 a 9 Bit
ahhhh ok perfetto
caspita ha pensato a tutto ahahah gentilissimo veramente
grazie mille