Operácie

Miniatúrny analógový joystick

Z SensorWiki

Verzia z 19:35, 6. jún 2023, ktorú vytvoril StudentMIPS (diskusia | príspevky) (Algoritmus a program)

Záverečný projekt predmetu MIPS / LS2023 - Samuel Tomáš


Zadanie

Joystick s dvoma analógovými vstupmi a jedným digitálnym - ovládanie RGB LED-ky. Pomocou joysticku budem ovládať RGB LED-ku, analógové PIN-y teda x-ovú a y-ovú os joysticku využijem na na zmenu farby LED-ky a digitálny PIN aplikujem tak, že farby na LED-ke sa budú dať meniť iba pri stlačenom tlačidlo a po vypnutí tlačidla zostane na LED-ke svietiť posledná vysvietená farba.

Arduino Uno.

Literatúra:


Analýza a opis riešenia

Pri vypracovaní som postupoval nasledovne, ako prvé som zapojil joystick, ktorého schéma zapojenia je zobrazená na obrázku. joystick má 5 PIN-ov (nožičiek), prvý PIN GND (zem) som pripojil na GND (zem) Arduina, druhý PIN je napájacie napätie pre joystick 5V, ktoré som pripojil na PORT 5V v Arduine, ďalšie dva PIN-y sú analógové slúžia na ovládanie x-ovej a y-ovej osi joysticka tieto PIN-y som pripojil na analógové PORT-y Arduina A0 (PC0) a A1 (PC1), posledný PIN je digitálny slúži na ovládanie tlačidla na joysticku, tento som pripojil na digitálny PORT Arduina D2 (PD2).

joystick zapojenie.

Ďalej bolo potrebné zapojiť RGB LED diódu, schéma zapojenia je opäť zobrazená na obrázku nižšie. Dióda má 4 PIN-y (nožičky), prvý PIN je GND (zem), ktorú som pripojil na GND (zem) Arduina, Ďalšie PIN-y slúžia na ovládanie jednotlivých RGB zložiek LED diódy. Červenú zložku som pripojil na digitálny PORT PWM D9 (PB1), zelenú zložku som pripojil na digitálny PORT PWM D10 (PB2) a modrú zložku som pripojil na digitálny PORT PWM D10 (PB3) na Arduine. Všetky výstupy z Arduina pre LED-ku (PB1,PB2,PB3) prechádzajú cez 10K OHM-ové rezistory pred tým ako sú zapojené do diódy

RGB LED zapojenie.

Potom kompletná schéma zapojenia vyzerá nasledovne

RGB LED zapojenie.

Algoritmus a program

Algoritmus programu je....


#include <avr/io.h>

//...Samuel Tomáš.....Projekt....MIPS...//

//...Ovládanie RGB LED pomocou joysticku...//

//...knižnice, ktoré využívam...//
#include <avr/io.h>
#include <util/delay.h>

//...Zadefinovanie PIN-ov...//
#define R_PIN 9  // Pin pre červenú časť LED
#define G_PIN 10 // Pin pre zelenú časť LED
#define B_PIN 11 // Pin pre modrú časť LED
#define JX_PIN 0 // Pin pre smer X joysticku (Analog)
#define JY_PIN 1 // Pin pre smer Y joysticku (Analog)
#define JSW_PIN 2 // Pin pre spínač joysticku (Digital)

//...Nastavenie vstupných a výstupných PIN-ov..//
void setup()
{
    DDRB |= (1 << PB1) | (1 << PB2) | (1 << PB3); // Nastavenie pinov PB1, PB2, PB3 ako výstupné
    DDRD &= ~(1 << PD2); // Nastavenie pinu PD2 ako vstupného
    PORTD |= (1 << PD2); // Zapnutie pull-up rezistora pre pin PD2
}
//...Nastavenie výstupu pre rôzne časti RGB LED. Využívam generovanie PWM signálu na riadenie jasu LED...//
void setRGB(uint8_t rLed, uint8_t gLed, uint8_t bLed)
{
    OCR1A = 255 - rLed;  // Nastavenie hodnoty pre pin R_PIN
    OCR1B = 255 - gLed;  // Nastavenie hodnoty pre pin G_PIN
    OCR2A = 255 - bLed;  // Nastavenie hodnoty pre pin B_PIN
}
//...Čítanie hodnôt z analógového pinu. Využívam AD prevodník, ktorý prevádza analógové hodnoty na digitálne...//
uint16_t analogRead(uint8_t pin)
{
    ADMUX = (1 << REFS0) | (pin & 0x0F);  //...Nastavenie referenčného napätia na AVCC a výber analógového pinu...//
    ADCSRA |= (1 << ADSC) | (1 << ADEN);  //...Spustenie konverzie a povolenie AD prevodníka...//
    while (ADCSRA & (1 << ADSC));  //...Čakanie na dokončenie konverzie...//
    return ADC;  //...Vrátenie výsledku konverzie...//
}

int main()
{
    setup();

    //...Nastavenie časovačov pre PWM generovanie signálu...//
    TCCR1A |= (1 << COM1A1) | (1 << COM1B1) | (1 << WGM10);
    TCCR1B |= (1 << CS10); //...TCCR1A a TCCR1B registre sa používajú na časovač 1 (pre červenú a zelenú časť)...//
    TCCR2A |= (1 << COM2A1) | (1 << WGM20);
    TCCR2B |= (1 << CS20); //...CCR2A a TCCR2B registre sa používajú na časovač 2 (pre modrú časť)...//

    while (1)
    {
        _delay_ms(25); //...Oneskorenie 25 ms...//

        uint8_t joyX = analogRead(JX_PIN) >> 1;  //...Delenie hodnoty X joysticku pre rozsah 0-255...//
        uint8_t joyY = analogRead(JY_PIN) >> 1;  //...Delenie hodnoty Y joysticku pre rozsah 0-255...//

        //...Čítanie stavu (dig) tlačidla...//
        uint8_t buttonState = PIND & (1 << PD2);

        //...Výpočet  pomeru farieb...//
        uint16_t total = joyX + joyY;  //...Celková suma hodnôt z joysticku...//
        uint8_t rLed = (joyX * 255) / total;  //...Výpočet hodnoty pre červenú farbu...//
        uint8_t gLed = (joyY * 255) / total;  //...Výpočet hodnoty pre zelenú farbu...//
        uint8_t bLed = (total * 255) / (joyX + joyY);  //...Výpočet hodnoty pre modrú farbu...//

        if (buttonState == 0)
        {
            //...Tlačidlo je stlačené, LED je zapnutá...//
         setRGB(rLed, gLed, bLed);
        }
        else
        {
            //...Tlačidlo nie je stlačené, LED zostane svietiť takou farbou akou sme tlačidlo vypli...//
            
        }
    }

    return 0;
}
#include <avr/io.h>

void adc_init(void);                                   // A/D converter initialization

unsigned int adc_read(char a_pin);

Pridajte sem aj zbalený kompletný projekt, napríklad takto (použite jednoznačné pomenovanie, nemôžeme mať na serveri 10x zdrojaky.zip:

Zdrojový kód: zdrojaky.zip

Overenie

Na používanie našej aplikácie stačia dve tlačítka a postup používania je opísaný v sekcii popis riešenia. Na konci uvádzame fotku záverečnej obrazovky pred resetom. Vypísaný je tu priemerný čas a najlepší čas.

Aplikácia.

Video:

Kľúčové slová 'Category', ktoré sú na konci stránky nemeňte.