Toon posts:

Arduino: Ps2 muis en DmxSimple libraries probleem

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Hallo,

In mijn project, waarin ik een dynamisch lichtsysteem aan wil sturen met een logitech trackball (balmuis), loop ik tegen het volgende probleem aan.
Ik kan de muis op zichzelf uitlezen, het licht kan ik op zichzelf aansturen mbv Dmx, maar wanneer ik ze samen gebruik werkt het niet.
Het programma compiled goed, maar de waarden van de muis worden vervolgens niet gelezen. Ik heb het teruggebracht tot de volgende versie van de code, waar het probleem zich voordoet zodra ik regel 34 uncomment.

code:
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
#include <ps2.h>
#include <DmxSimple.h>
/*
 * an arduino sketch to interface with a ps/2 mouse.
 * Also uses serial protocol to talk back to the host
 * and report what it finds.
 */

PS2 mouse(2, 3);

void dmx_init(){
   DmxSimple.usePin(11);
 DmxSimple.maxChannel(8);
}

/*
 * initialize the mouse. Reset it, and place it into remote
 * mode, so we can get the encoder data on demand.
*/
void mouse_init()
{
  mouse.write(0xff);  // reset
  mouse.read();  // ack byte
  mouse.read();  // blank */
  mouse.read();  // blank */
  mouse.write(0xf0);  // remote mode
  mouse.read();  // ack
  delayMicroseconds(100);
}

void setup()
{
  Serial.begin(9600);
 //dmx_init();
 mouse_init();
}

/*
 * get a reading from the mouse and report it back to the
 * host via the serial line.
 */
void loop()
{
  char mstat;
  char mx;
  char my;

  /* get a reading from the mouse */
  mouse.write(0xeb);  // give me data!
  mouse.read();      // ignore ack
  mstat = mouse.read();
  mx = mouse.read();
  my = mouse.read();

  /* send the data back up */
  Serial.print(mstat, BIN);
  Serial.print("\tX=");
  Serial.print(mx, DEC);
  Serial.print("\tY=");
  Serial.print(my, DEC);
  Serial.println();  
}


Om het licht te controleren include ik DmxSimple: http://code.google.com/p/tinkerit/wiki/DmxSimple
Om de muis uit te lezen include ik Ps2: http://www.arduino.cc/playground/ComponentLib/Ps2mouse

Iemand een idee hoe dit op te lossen is?

Bedankt!

Don

Acties:
  • 0 Henk 'm!

  • steffex
  • Registratie: Augustus 2003
  • Laatst online: 12-08 00:24
ik mis een declaratie van DmxSimple in je code...

je roept direct usePin aan, maar nergens bepaal je wat DmxSimple is!

blijkbaar hoef je DmxSimple niet te declareren... 8)7

Heb je al een andere pin geprobeerd? zit er een shield op je arduino die pin 11 in gebruik heeft?

[ Voor 41% gewijzigd door steffex op 23-05-2011 11:05 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik heb ook een soort van afstandbediening om de lampen mee aan te sturen. Die werkt goed met de dmx (die ook dan op pin 11 zit). Het verschil zit hem denk ik in de communicatie die er met de muis moet zijn, en die er niet hoeft te zijn in het geval van de afstandbediening.

Ik heb ook geprobeerd de muis op pin 2 en 8 te zetten ipv 2 en 3. Dit omdat iemand het idee had dat het misschien kwam omdat Timer2 door dmx gebruikt wordt. Dit had geen effect op het resultaat, het programma komt nog steeds niet aan de loop toe (er wordt niks geprint).

Acties:
  • 0 Henk 'm!

  • Sissors
  • Registratie: Mei 2005
  • Niet online
En als je mouse init uitzet en dmx init wel aanzet (en dan gewoon wat willekeurigs op serial out zet?

Dmx gebruikt inderdaad die timer, maar je ps2 library niet. Dat het geen juiste waarde uitleest kan ik wel geloven als die dmx erg druk zou zijn (want de ps2 library zit vol wait statements), maar dat het helemaal niet aan de loop toekomt zou toch niet moeten gebeuren.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
furby-killer schreef op maandag 23 mei 2011 @ 14:53:
En als je mouse init uitzet en dmx init wel aanzet (en dan gewoon wat willekeurigs op serial out zet?
Ik weet niet zeker of dit is wat je bedoelde:

code:
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
void loop()
{
  char mstat;
  char mx;
  char my;

  /* get a reading from the mouse */
  if (dmxaan == 0)
  {
  mouse.write(0xeb);  // give me data!
  mouse.read();      // ignore ack
  mstat = mouse.read();
  mx = mouse.read();
  my = mouse.read();

  /* send the data back up */
  Serial.print(mstat, BIN);
  Serial.print("\tX=");
  Serial.print(mx, DEC);
  Serial.print("\tY=");
  Serial.print(my, DEC);
  Serial.println();  
  }
  Serial.println("zomaar om te testen");
  if (mx > 20){
    dmx_init();
    Serial.println("DMXAAN!");
    dmxaan = 1;
  }


Bij deze code worden eerst de waarden printen, daarna bij x>20 wordt DMXAAN! geprint en vervolgens constant 'zomaar om te testen'.

Acties:
  • 0 Henk 'm!

  • steffex
  • Registratie: Augustus 2003
  • Laatst online: 12-08 00:24
Verwijderd schreef op maandag 23 mei 2011 @ 11:56:
Ik heb ook een soort van afstandbediening om de lampen mee aan te sturen. Die werkt goed met de dmx (die ook dan op pin 11 zit). Het verschil zit hem denk ik in de communicatie die er met de muis moet zijn, en die er niet hoeft te zijn in het geval van de afstandbediening.

Ik heb ook geprobeerd de muis op pin 2 en 8 te zetten ipv 2 en 3. Dit omdat iemand het idee had dat het misschien kwam omdat Timer2 door dmx gebruikt wordt. Dit had geen effect op het resultaat, het programma komt nog steeds niet aan de loop toe (er wordt niks geprint).
Naar mijn weten, gaat het fout als je 2 devices wilt uitlezen op dezelfde pin. pak voor de dmx gewoon eens een andere pin... 9 of 10...

Acties:
  • 0 Henk 'm!

  • Sissors
  • Registratie: Mei 2005
  • Niet online
Verwijderd schreef op maandag 23 mei 2011 @ 15:11:
[...]


Ik weet niet zeker of dit is wat je bedoelde:

code:
1
void loop()


Bij deze code worden eerst de waarden printen, daarna bij x>20 wordt DMXAAN! geprint en vervolgens constant 'zomaar om te testen'.
Maar in hoeverre werkt dat dan?

Wat ik bedoelde was dat hele mouse.read eruit gooien en daarvoor in de plaats gewoon wat willekeurigs neerzetten, en wel de hele dmx doen. Kijken wat hij dan doet (en je dus de mouse init enzo ook uitzet).

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
steffex schreef op maandag 23 mei 2011 @ 15:29:
[...]


Naar mijn weten, gaat het fout als je 2 devices wilt uitlezen op dezelfde pin. pak voor de dmx gewoon eens een andere pin... 9 of 10...
Dmx zit op 11, muis op 2 en 3.

De dmx op zichzelf werkt goed.

Acties:
  • 0 Henk 'm!

  • steffex
  • Registratie: Augustus 2003
  • Laatst online: 12-08 00:24
Verwijderd schreef op maandag 23 mei 2011 @ 16:18:
[...]


Dmx zit op 11, muis op 2 en 3.

De dmx op zichzelf werkt goed.
Ja, maar dat wil niet zeggen dat als je beide libraries inschakelt het dan nog steeds moet werken!
Je zegt dat als je de dmx_init() doet uncommenten, dat het dan fout gaat. Misschien zit er een bug in de DMXSimple library, waardoor hij de poort niet doet overnemen of dat hij rx/tx wil gebruiken...

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik heb een oplossing gevonden.

Omdat de dmx gebruik maakt van Timer2, en de muis met veel delays werkt, gaat het waarschijnlijk mis wanneer de interrupt van de dmx valt in de delay van de muis (waardoor de communicatie ermee in het water valt).

Om dit te voorkomen zet ik de timer uit wanneer ik met de muis communiceer en weer aan zodra de data binnen is:

cli(); // Timers uit
/* get a reading from the mouse */
mouse.write(0xeb); // give me data!
mouse.read(); // ignore ack
mstat = mouse.read();
mx = mouse.read();
my = mouse.read();
sei(); //Timers aan
Pagina: 1