Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

Uitlezen van scroll wheel van muis

Pagina: 1
Acties:
  • 576 views sinds 30-01-2008
  • Reageer

  • kippy
  • Registratie: September 2004
  • Laatst online: 21-11 13:02
Ik ben bezig met het bouwen van een fan controller, hiervoor gebruik een LCD en een ATMEL Mega 32 micro controller. Nu bevat het LCD menutjes waar ik door heen wil kunnen lopen. Nu had ik het idee om een scroll Wheel van een muis te gebruiken voor de besturing hier van.

Ik heb nu dus een “Microsoft Wheel Mouse Optical 1.1A USB”, ik heb de signalen van de rotary encoder (scroll Wheel) bekeken met een scoop maar ik kan er niets van maken…
Het geen wat ik krijg zijn 2 zaagtand golven die van spanningsniveau veranderen op het moment dat ik aan het scroll Wheel draai. Dit is met een schakelingetje nog wel op te lossen en om te bouwen tot bruikbaar. Maar nu komt het volgende probleem. Ik kan de muis niet gewoon op 5V aansluiten, hiervoor moet ik em op een USB poort hangen. Wanneer ik em gewoon op 5V aan sluit meet ik niets meer alleen op veel vreemde punten 5V. Ik heb al meerdere dingen geprobeerd maar et wil niet lukken.

Ik heb het internet ook al afgezocht maar kan nergens mensen vinden die het scroll Wheel van een muis gebruikt hebben in combinatie met een micro controller. Hebben jullie nog een idee?

  • Fish
  • Registratie: Juli 2002
  • Niet online

Fish

How much is the fish

alleen de lichtsluizen gebruiken en de rest van de elektrica wegsauzen ...

het is dan echt een kwestie van 6 weerstanden en 2 torretjes

[ Voor 31% gewijzigd door Fish op 21-07-2006 21:47 ]

Iperf


  • kippy
  • Registratie: September 2004
  • Laatst online: 21-11 13:02
fish schreef op vrijdag 21 juli 2006 @ 21:46:
alleen de lichtsluizen gebruiken en de rest van de elektrica wegsauzen ...
Dat is een een mogenlijkheid, maar dan weet ik niet hoe ik het aan kan sluiten. Op het scroll wheel zit 1 lichtsluisje. Deze lijkt heel veel op een optocoupler. 1 led en een 3 poots ding. Ik weet niet hoe ik het drie poots ding aan moet sluiten want kan er niets aan zien (type nummer ed). Kan morgen nog wel even foto's maken mocht dat helpen.

  • Fish
  • Registratie: Juli 2002
  • Niet online

Fish

How much is the fish

kippy schreef op vrijdag 21 juli 2006 @ 21:49:
[...]

Dat is een een mogenlijkheid, maar dan weet ik niet hoe ik het aan kan sluiten. Op het scroll wheel zit 1 lichtsluisje. Deze lijkt heel veel op een optocoupler. 1 led en een 3 poots ding. Ik weet niet hoe ik het drie poots ding aan moet sluiten want kan er niets aan zien (type nummer ed). Kan morgen nog wel even foto's maken mocht dat helpen.
ik vermoet dat het driepoots ding een dubbele lichtgevoelige ontvagnstleds zijn is
een paar goede foto's van de print kunnen helpen
maar als ej even even meet. dan zul je vast wel op een pin 5 of 0 volt vinden en op de andere singaal

[ Voor 13% gewijzigd door Fish op 21-07-2006 22:05 ]

Iperf


Verwijderd

fish schreef op vrijdag 21 juli 2006 @ 22:04:
[...]

ik vermoet dat het driepoots ding een dubbele lichtgevoelige ontvagnstleds zijn is
Klopt zo kun je uitrekenen of je naar boven of naar onder gaat was vroeger ook zo met die bal dingen had je nog twee van die lichtsluisjes

  • kippy
  • Registratie: September 2004
  • Laatst online: 21-11 13:02
Ik heb het nog een keer nagemeten (jammer genoeg geen werkende digicam meer :'() maar ik denk dat ik het volgende schema kan toepassen.

Afbeeldingslocatie: http://www.cqham.ru/projects/dds_144mhz/opto_encoder.gif

Dit komt met men metingen ook rdelijk overeen. Want op het middelste pootje meet ik ook 5V. Alleen die 2 andere pootjes vind ik beetje vreemd. Want overal zeggen ze dat een rotary endcoder een fase verschuiving uit stuurd. Maar zo als ik het nu meet verranderd het spanings niveau dus. Ik kan morgen eens alle electronica van de pint af halen zodat ik alleen nog het bruikbare over hou en dan ga ik em volgens het bovenstaande schama aansluiten en hopen dat dat werkt.

  • Fish
  • Registratie: Juli 2002
  • Niet online

Fish

How much is the fish

klopt .. je gebruikt 1 poot als klok
je kijkt op het moment wanneer die of positief of negatief word (1 van de 2)
naar het andere pootje weet je de richting .

Iperf


Verwijderd

(Om fish maar even na te praten in mijn eigen taaltje)

Als je met interrupts wekt: 1 poot aan de INT, en in de interrupt-routine nagaan of de andere poot hoog of laag is; dat bepaalt de richting.
Ga je pollen, check dan 1 poot, en meet --bij een hoog-naar-laag niveau-- onmiddelijk de andere poot.
Afin, denk ik. Heb het zelf nog niet in de praktijk gebracht... ;-)

[ Voor 9% gewijzigd door Verwijderd op 22-07-2006 20:20 ]


  • Fish
  • Registratie: Juli 2002
  • Niet online

Fish

How much is the fish

yup.....

Iperf


  • kippy
  • Registratie: September 2004
  • Laatst online: 21-11 13:02
Ik heb em nu aangesloten volgens het schema wat ik eerder gepost heb, en ik krijg idd een signaal er uit. Het probleem is dat het geen fase verschuiving is maar een spanings verrandering. Ook al zet ik een puls signaal op de led blijft het een spannings verschil opleveren en geen fase verschuiving....

Nu dacht ik om dit spannings niveau in te lezen via een ADC op men microcontroller. Maar dat vind ik eigenlijk niet de meest handige oplossing. Heeft iemand nog andere ideeën om dit makkelijk te doen?

sorry van het lelijke plaatje maar zit meet ik op men scoop.
Afbeeldingslocatie: http://img66.imageshack.us/img66/9627/encoderik0.jpg
Eerst draai ik niet, signaal blijft gelijk. Dan draai ik, dan gaat eerst het ene signaal omlaag (niet tot gnd) en daarna gaat het andere signaal omlaag.

edit.
Na nog wat prutsen en denken. Heb ik het besluit genomen om de analoge comperator te gebruiken, eventuweel in combinatie met 2 adc pinnen. Maar dan kan ik in iedergeval een mooie interupt generenen op het moment dat je scrolt. Als de code werkt ed. zal ik schema's en code posten.

[ Voor 18% gewijzigd door kippy op 23-07-2006 20:01 ]


Verwijderd

Ik neem aan, dat het plaatje dat je toont het resultaat is van pulssturing op de LED? Anders kan ik die blokspanning niet verklaren...
Verder zie ik in je schema een weerstand van 1k om de stroom door de LED te begrenzen. Als het om 1 LED gaat, betekent dat een stoom van ±3.5mA; moesten er 2 LED's in het "blokje" zitten (in serie geschakeld), dan zal het meer iets van 2mA zijn. Het eerste dat ik zou doen, is de klemspanning over de LED('s) meten, en de weerstand zodanig aanpassen dat er 10 ... 20mA doorheen vloeit.
Wat de BSX21 betreft, dat is een goede schakeltransistor. Maar zelf gebruik ik voor dergelijke toepassingen steevast een poort uit een 74HCxx-IC. De 74HC14 bv. beschikt over 6 inverters met Schmitt-trigger ingang, die schakelen rond de halve voedingsspanning. En het ding is goedkoper dan 1 BSX21! Voeg daarbij, dat je voor de pull-up weerstand tot in het mega-Ohm bereik kan gaan. Maar iets tussen 10k en 100k lijkt me beter geschikt voor jouw doel.

  • kippy
  • Registratie: September 2004
  • Laatst online: 21-11 13:02
Ik gebruik de transistoren niet. Ik heb het zoals je al zij geprobeerd met een schmit trigger ic, in mijn geval een 4093 omdat ik er daar nog van heb rondslingeren. Maar het probleem is gewoon dat de uitgangsspaning niet onder de halve voedingsspanning piekt. Dus omzetten naar iets digitaals is niet echt mogenlijk. Ik zal nog wel even die led controleren.

En het plaatje is natuurlijk een pulsende led.

edit.
Bedenk me net dat ik de weestand die op het printje zit gebruik. Dus dat zal wel goed zitten lijkt me.

[ Voor 10% gewijzigd door kippy op 23-07-2006 21:43 ]


  • kippy
  • Registratie: September 2004
  • Laatst online: 21-11 13:02
Het software matig uitlezen gaat best aardig maar niet echt lekker.

Ik heb het nu al volgd aangesloten:
Uitgangen van de rotary encoder aan de analoge comparator. En 1 van de 2 uitgangen aan ADC 0. De comparator geeft een interupt om een neergaande flank, hierna meet de de spanning die op AIN0 staat en probeer daar ui op te maken of ik vooruit of achteruit scrol. Dit gaat een beetje, dat wil zeggen het programma heeft het 5 van de 10 keer goed welke kant je op scrolt. Dat is natuurlijk niet goed genoeg. Hier nog even mijn code, misschien dat jullie nog iets weten om het beter te krijgen.

C:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
//Code gemaakt met IAR studio

COMPARATOR.C

int Jaflag = 0;

void ANALOGINIT(void)
{
    // Analog Comparator initialization
    // Analog Comparator: On
    // Interrupt on Falling Output Edge
    // Analog Comparator Input Capture by Timer/Counter 1: Off
    ACSR=0x0A;
    SFIOR=0x00;
}

#pragma vector = ANA_COMP_vect
    __interrupt void AnaCompare(void)
    {


    if (Jaflag == 0)
    {
        char ADCTemp;
        __delay_cycles(3000);
        ADCTemp = ADCSTART(0x00);
        LCDXY(19,1);
        LCDLETTER(ADCTemp);
        if (ADCTemp < 0xD5)
        {
            LCDXY(0,1);
            LCDSTRING("ja ");
            Jaflag = 1;
        }
        else
        {
            LCDXY(0,1);
            LCDSTRING("nee");
            Jaflag = 0;
        }
        __delay_cycles(300000);
    }
    else
    {
        Jaflag = 0;
    }
    }

//---------------------------------------------------------------------------------------------
ADC.C

#define ADC_VREF_TYPE 0x20

void ADCINIT (void)
{
    // ADC initialization
    // ADC Clock frequency: 62,500 kHz
    // ADC Voltage Reference: AREF pin
    // Only the 8 most significant bits of
    // the AD conversion result are used
    ADMUX=ADC_VREF_TYPE;
    ADCSRA=0x87;
}

char ADCSTART(unsigned char adc_input)
{
    ADMUX=adc_input|ADC_VREF_TYPE;
    // Start the AD conversion
    ADCSRA|=0x40;
    // Wait for the AD conversion to complete
    while ((ADCSRA & 0x10)==0);
    ADCSRA|=0x10;
    return ADCH;
}

unsigned char ADCREAD(void)
{
    return ADCH;
}


Als er meer info nodig is moet je even roepen.

  • kippy
  • Registratie: September 2004
  • Laatst online: 21-11 13:02
Het duurt even maar dan heb je ook niets. Of terweil het werkt _/-\o_

Ik zal even uitleggen wat ik nu gedaan heb. Ik maak gebruik van de analoge comparator die in de mega 32 zit. Deze staat op toggel interupt.
De 2 uitgangen van het scroll wiel gaan allebij naar een ADC pin. Ik lees de waardes in op het moment dat er een interupt op treed, ik blijf lezen tot een van de 2 pinnen onder de 3V komt (ADC waarde 160). Als dat gebeurd weet ik of ik het wieltje voor of wachter uit beweeg. Nu moet ik alleen nog wachten of het wieltje weet in de wait pozitie komt te staan en daarna kan ik de volgende sessie weer lezen.

C:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
// *************** ADC.C ************************
#define ADC_VREF_TYPE 0x20

void ADCINIT (void)
{
    // ADC initialization
    // ADC Clock frequency: 1000,000 kHz
    // ADC Voltage Reference: AREF pin
    // Only the 8 most significant bits of
    // the AD conversion result are used
    ADMUX=ADC_VREF_TYPE;
    ADCSRA=0x83;
}

char ADCSTART(unsigned char adc_input)
{
    ADMUX=adc_input|ADC_VREF_TYPE;
    // Start the AD conversion
    ADCSRA|=0x40;
    // Wait for the AD conversion to complete
    while ((ADCSRA & 0x10)==0);
    ADCSRA|=0x10;
    return ADCH;
}

unsigned char ADCREAD(void)
{
    return ADCH;
}

// ********************** COMPARATOR.C **********************

void ANALOGINIT(void)
{
    // Analog Comparator initialization
    // Analog Comparator: On
    // Interrupt on Output Toggle
    // Analog Comparator Input Capture by Timer/Counter 1: Off
    ACSR=0x08;
    SFIOR=0x00;
}

#pragma vector = ANA_COMP_vect
    __interrupt void AnaCompare(void)
    {
        char ADCTemp1, ADCTemp2;
        __disable_interrupt ();
        __delay_cycles(10000);
        do
        {
            ADCTemp1 = ADCSTART(0x00);
            ADCTemp2 = ADCSTART(0x01);
            if ((ADCTemp1 > 240) && (ADCTemp2 > 240))
            {
                return;
            }
        }
        while ((ADCTemp1 > 160) && (ADCTemp2 > 160));
        if (ADCTemp1 < 160)
        {
            LCDXY(0,1);
            LCDSTRING("Achteruit");
        }
        if (ADCTemp2 < 160)
        {
            LCDXY(0,1);
            LCDSTRING("Vooruit  ");
        }
        do
        {
            ADCTemp1 = ADCSTART(0x00);
            ADCTemp2 = ADCSTART(0x01);
        }
        while ((ADCTemp1 < 240) && (ADCTemp2 < 240));
        __enable_interrupt ();
    }


Ik maak nog steeds gebruik van het schema wat ik eerder al gepost heb, alleen dan zonder de 2 transistoren. Nu dat dit allemaal klaar ik ga ik dit gebruiken voor mijn 6 kanaals fan controller. Voor deze controller zal ik binnen kort een nieuw draadja maken. (de controller zal bestaan uit een 2 x 20 char LCD, een scroll wiel voor de menu structuren op het lcd, en wat electronica. En dit alles geheel PWM gestuurd)
Pagina: 1