This shows you the differences between two versions of the page.
|
pm:prj2024:vstoica:cosmin.temciuc [2024/05/26 11:31] cosmin.temciuc |
pm:prj2024:vstoica:cosmin.temciuc [2024/05/26 11:53] (current) cosmin.temciuc |
||
|---|---|---|---|
| Line 21: | Line 21: | ||
| * 10 butoane | * 10 butoane | ||
| - | * 10 1k resistori | + | * 13 1k resistori |
| * Fire | * Fire | ||
| * Buzzer activ 5V Rasberry OKY0151 | * Buzzer activ 5V Rasberry OKY0151 | ||
| Line 27: | Line 27: | ||
| * Led RGB | * Led RGB | ||
| - | {{:pm:prj2024:screenshot_2024-05-04_221258.png?300|}} | + | {{:pm:prj2024:vstoica:pian.png?400|}} |
| ===== Software Design ===== | ===== Software Design ===== | ||
| Line 39: | Line 39: | ||
| </note> | </note> | ||
| + | Mediul de dezvoltare: | ||
| + | |||
| + | * Codul a fost scris in Arduino IDE. | ||
| + | * Schema electrica a fost realizata in Tinkercad | ||
| + | |||
| + | **Functia setup** : Initializeaza pinii digitali si pe cei de intrerupere: | ||
| + | <note> | ||
| + | Serial.begin(9600); | ||
| + | // SETEAZA PINUL 5 CA OUTPUT (BUZZER) | ||
| + | DDRD |= (1 << DDD5); | ||
| + | // SETEAZA PINUL 4 CA OUTPUT (LED) | ||
| + | DDRD |= (1 << DDD4); | ||
| + | // SETEAZA PINUL 6 SI 7 CA INPUS | ||
| + | DDRD &= ~((1 << DDD6) | (1 << DDD7)); | ||
| + | PORTD |= ((1 << PORTD6) | (1 << PORTD7)); | ||
| + | // SETEAZA PINUL 8-13 CA INPUS | ||
| + | DDRB &= ~((1 << DDB0) | (1 << DDB1) | (1 << DDB2) | (1 << DDB3) | (1 << DDB4) | (1 << DDB5)); | ||
| + | PORTB |= ((1 << PORTB0) | (1 << PORTB1) | (1 << PORTB2) | (1 << PORTB3) | (1 << PORTB4) | (1 << PORTB5)); | ||
| + | // SETEAZA PINUL 2 SI 3 CA INPUT PENTRU INTRERUPERI | ||
| + | DDRD &= ~((1 << DDD2) | (1 << DDD3)); | ||
| + | PORTD |= ((1 << PORTD2) | (1 << PORTD3)); | ||
| + | // CONFIGURARE INTRERUPERI | ||
| + | EICRA |= (1 << ISC01); // PD2 | ||
| + | EICRA |= (1 << ISC11); // PD3 | ||
| + | EIMSK |= (1 << INT0) | (1 << INT1); //ACTIVAM INTRERUPERILE | ||
| + | sei(); | ||
| + | </note> | ||
| + | |||
| + | **Functia loop** : Verifica daca s-a apasat vreo clapa, si face reprezentarea unei octave, in cazul schimbarii acesteia | ||
| + | <note> | ||
| + | if (octave >= 0 && octave <= 2) { | ||
| + | if (!(PINB & (1 << PINB5))) { | ||
| + | tone(5, f0[octave * 8], 100); // PINUL 13 | ||
| + | Serial.println("btn1 apasat."); | ||
| + | _delay_ms(100); | ||
| + | } | ||
| + | if (!(PINB & (1 << PINB4))) { | ||
| + | tone(5, f0[octave * 8 + 1], 100); // PINUL 12 | ||
| + | Serial.println("btn2 apasat."); | ||
| + | _delay_ms(100); | ||
| + | } | ||
| + | |||
| + | if (!(PINB & (1 << PINB3))) { | ||
| + | tone(5, f0[octave * 8 + 2], 100); // PINUL 11 | ||
| + | Serial.println("btn3 apasat."); | ||
| + | _delay_ms(100); | ||
| + | } | ||
| + | if (!(PINB & (1 << PINB2))) { | ||
| + | tone(5, f0[octave * 8 + 3], 100); // PINUL 10 | ||
| + | Serial.println("btn4 apasat."); | ||
| + | _delay_ms(100); | ||
| + | } | ||
| + | if (!(PINB & (1 << PINB1))) { | ||
| + | tone(5, f0[octave * 8 + 4], 100); // PINUL 9 | ||
| + | Serial.println("btn5 apasat."); | ||
| + | _delay_ms(100); | ||
| + | } | ||
| + | if (!(PINB & (1 << PINB0))) { | ||
| + | tone(5, f0[octave * 8 + 5], 100); // PINUL 8 | ||
| + | Serial.println("btn6 apasat."); | ||
| + | _delay_ms(100); | ||
| + | } | ||
| + | if (!(PIND & (1 << PIND7))) { | ||
| + | tone(5, f0[octave * 8 + 6], 100); // PINUL 7 | ||
| + | Serial.println("btn7 apasat."); | ||
| + | _delay_ms(100); | ||
| + | } | ||
| + | if (!(PIND & (1 << PIND6))) { | ||
| + | tone(5, f0[octave * 8 + 7], 100); // PINUL 6 | ||
| + | Serial.println("btn8 apasat."); | ||
| + | _delay_ms(100); | ||
| + | } | ||
| + | //REPREZENTARE OCTAVA | ||
| + | if(state == true){ | ||
| + | if(octave == 0){ | ||
| + | PORTD |= (1 << PORTD4); //APRINDEM LEDUL | ||
| + | _delay_ms(100); | ||
| + | PORTD &= ~(1 << PORTD4); //STINGEM LEDUL | ||
| + | } | ||
| + | else if (octave == 1){ | ||
| + | PORTD |= (1 << PORTD4); | ||
| + | _delay_ms(100); | ||
| + | PORTD &= ~(1 << PORTD4); | ||
| + | _delay_ms(100); | ||
| + | PORTD |= (1 << PORTD4); | ||
| + | _delay_ms(100); | ||
| + | PORTD &= ~(1 << PORTD4); | ||
| + | } | ||
| + | else if (octave == 2){ | ||
| + | PORTD |= (1 << PORTD4); | ||
| + | _delay_ms(100); | ||
| + | PORTD &= ~(1 << PORTD4); | ||
| + | _delay_ms(100); | ||
| + | PORTD |= (1 << PORTD4); | ||
| + | _delay_ms(100); | ||
| + | PORTD &= ~(1 << PORTD4); | ||
| + | _delay_ms(100); | ||
| + | PORTD |= (1 << PORTD4); | ||
| + | _delay_ms(100); | ||
| + | PORTD &= ~(1 << PORTD4); | ||
| + | } | ||
| + | Serial.println(octave); | ||
| + | state = false; | ||
| + | } | ||
| + | } | ||
| + | _delay_ms(10); | ||
| + | </note> | ||
| + | |||
| + | **Intreruperile** : Acestea sunt realizate pe butoanele ce schimba octavele, avand rolul de a creste performanta codului. | ||
| + | <note> | ||
| + | ISR(INT0_vect) { | ||
| + | unsigned long currentTime = millis(); | ||
| + | if (currentTime - lastDebounceTimeUp > debounceDelay) { | ||
| + | octaveUp(); | ||
| + | lastDebounceTimeUp = currentTime; | ||
| + | } | ||
| + | } | ||
| + | ISR(INT1_vect) { | ||
| + | unsigned long currentTime = millis(); | ||
| + | if (currentTime - lastDebounceTimeDown > debounceDelay) { | ||
| + | octaveDown(); | ||
| + | lastDebounceTimeDown = currentTime; | ||
| + | } | ||
| + | } | ||
| + | void octaveDown(void) { | ||
| + | Serial.println("Interrupt for Octave Down triggered"); | ||
| + | octave = max(0, octave - 1); | ||
| + | Serial.println("OCT1 apasat."); | ||
| + | state = true; | ||
| + | _delay_ms(200); | ||
| + | } | ||
| + | void octaveUp(void) { | ||
| + | Serial.println("Interrupt for Octave Up triggered"); | ||
| + | octave = min(2, octave + 1); | ||
| + | Serial.println("OCT2 apasat."); | ||
| + | state = true; | ||
| + | _delay_ms(200); | ||
| + | } | ||
| + | </note> | ||
| ===== Rezultate Obţinute ===== | ===== Rezultate Obţinute ===== | ||