Bouton effet inverse de photo résistance.

Bonjour,

Je suis perplexe.

Ci-joint le schéma du « botton mouse control »

Ci-joint le code

/*
  ButtonMouseControl

  For Leonardo and Due boards only.

  Controls the mouse from five pushbuttons on an Arduino Leonardo, Micro or Due.

  Hardware:
  - five pushbuttons attached to D2, D3, D4, D5, D6

  The mouse movement is always relative. This sketch reads four pushbuttons,
  and uses them to set the movement of the mouse.

  WARNING: When you use the Mouse.move() command, the Arduino takes over your
  mouse! Make sure you have control before you use the mouse commands.

  created 15 Mar 2012
  modified 27 Mar 2012
  by Tom Igoe

  This example code is in the public domain.

  http://www.arduino.cc/en/Tutorial/ButtonMouseControl
*/

#include "Mouse.h"

// set pin numbers for the five buttons:
const int upButton = 2;
const int downButton = 3;
const int leftButton = 4;
const int rightButton = 5;
const int mouseButton = 6;

int range = 5;              // output range of X or Y movement; affects movement speed
int responseDelay = 10;     // response delay of the mouse, in ms


void setup() {
  // initialize the buttons' inputs:
  pinMode(upButton, INPUT);
  pinMode(downButton, INPUT);
  pinMode(leftButton, INPUT);
  pinMode(rightButton, INPUT);
  pinMode(mouseButton, INPUT);
  // initialize mouse control:
  Mouse.begin();
}

void loop() {
  // read the buttons:
  int upState = digitalRead(upButton);
  int downState = digitalRead(downButton);
  int rightState = digitalRead(rightButton);
  int leftState = digitalRead(leftButton);
  int clickState = digitalRead(mouseButton);

  // calculate the movement distance based on the button states:
  int  xDistance = (leftState - rightState) * range;
  int  yDistance = (upState - downState) * range;

  // if X or Y is non-zero, move:
  if ((xDistance != 0) || (yDistance != 0)) {
    Mouse.move(xDistance, yDistance, 0);
  }

  // if the mouse button is pressed:
  if (clickState == HIGH) {
    // if the mouse is not pressed, press it:
    if (!Mouse.isPressed(MOUSE_LEFT)) {
      Mouse.press(MOUSE_LEFT);
    }
  }
  // else the mouse button is not pressed:
  else {
    // if the mouse is pressed, release it:
    if (Mouse.isPressed(MOUSE_LEFT)) {
      Mouse.release(MOUSE_LEFT);
    }
  }

  // a delay so the mouse doesn't move too fast:
  delay(responseDelay);
}

[\code]

On y voit des boutons qui actionnent le curseur de la souris sur l’ecran. 
Haut, bas, droite, gauche.
Et quand je connecte directement D6 avec 5V le curseur va bien en haut.

Mais j’ai remplacé les boutons par des photos résistances avec des photos lasers.
Et le problème, c’est que mes photos résistances, quand je coupe le laser, coupent le courant au lieu de le laisser passer  comme le ferait  un bouton.

Aussi ne serait-il pas possible de faire une moindre modification dans le code pour que quand je coupe le laser l’effet soit le même quand j’appuie sur un bouton ?


Merci pour toute information. 

Intelego.

On y voit des boutons qui actionnent le curseur de la souris sur l'ecran.
Haut, bas, droite, gauche.
Et quand je connecte directement D6 avec 5V le curseur va bien en haut.

Mais j'ai remplacé les boutons par des photos résistances avec des photos lasers.
Et le problème, c'est que mes photos résistances, quand je coupe le laser, coupent le courant au lieu de le laisser passer comme le ferait un bouton.

Aussi ne serait-il pas possible de faire une moindre modification dans le code pour que quand je coupe le laser l'effet soit le même quand j'appuie sur un bouton ?

Merci pour toute information.

Intelego.

C110A1DC-5D35-4924-8AE2-A63D6438D835.png

Votre image c’est mieux si on peut la voir....

5644621e520c469cbc84197e9b90f8d307e2e5ff.png

Montrez nous comment les photos résistances / laser sont connectées

Ensuite si c’est fonctionnel (bien câblé avec pull up externe??) et que les digitalRead() retournent LOW au lieu de HIGH à l’activation, il suffit d’inverser les state dans ces formules

  int  xDistance = (leftState - rightState) * range;
  int  yDistance = (upState - downState) * range;

pour avoir comme formules

  int  xDistance = (rightState - leftState) * range;
  int  yDistance = (downState - upState) * range;

et idem sur l’appui du bouton souris, tester LOW.

notez que c’est super moche conceptuellement de faire des maths avec LOW et HIGH (même si c’est fonctionnel), idéalement il vaudrait mieux avoir un entier calculé proprement genre int leftValue = (digitalRead(leftPin) == HIGH) ? 1 : 0; auquel cas votre adaptation reviendrait à changer les HIGH en LOW pour inverser la logique;

+1
Si l'électronique réagit en sens inverse il faut inverser la logique.

La sagesse aurait voulu que regardes sur le papier comment cela se passe quand tu as remplacé des boutons par des photorésistances.
Une simple inversion entre la photorésistance et sa résistance en série au moment du câblage aurait résolu l'affaire sans avoir à modifier le code.

C'est en forgeant qu'on devient forgeron ( svp Léonard est en vacances :slight_smile: )

68tjs:
Une simple inversion entre la photorésistance et sa résistance en série au moment du câblage aurait résolu l'affaire sans avoir à modifier le code

On voit l’expert hard versus le softeux :slight_smile:

JML Je vois que tu aimes ce que tu fais. Merci.

68tjs merci aussi. Mais que veux tu dire ? Inverser le schéma c’est à dire faite un pull down au lieu d’un pull up ?

Un dessin pourrait m’aider plus que plusieurs phrases.

Merci donc.

Intelego

Premièrement moi qui viens du matériel je ne me serais jamais servis des "pull-up" internes du micro.
Une simple lecture de la datasheet du micro dit que la valeur est centrée sur 50 k mais que selon le lot de fabrication elles peuvent faire entre 30k et 70k.

Donc l'électronicien n'imagine même pas qu'on câble autre chose qu'une VRAIE résistance dont la valeur est parfaitement connue Comment tu fixe le seuil si tu ne connait pas la valeur de la pull up ? Au pif après tâtonnement ?
Pour moi avec une résistance interne qui varie entre 30k et 70 k ton montage "est tombé en marche".

Donc dans ces conditions rien n'empêche d'inverser la photorésistance et la résistance en série et de conserver le même code.

0V photo résistance | Résistance série +5V
Entrée arduino

Ou

0V Résistance série | photo résistance +5V
Entrée arduino

Le radoteur va encore radoter : un "pull-up" se dit en français : résistance de tirage au Vcc , une "pull-down" se dit résistance de tirage à la masse. Mais ce terme ne s'emploie que pour désigner des résistances qui servent à fixer un potentiel. Absolument pas pour dire qu'une résistance est connectée au Vcc ou à la masse. C'est du jargon des USA.
Si on retire la "poule eupe" c'est sensible au bruit mais cela fonctionne toujours elle n'est pas strictement indispensable.

Or dans ton cas il est OBLIGATOIRE de faire un pont diviseur pour utiliser la photo-résistance sinon cela ne fonctionne pas. Ça s'appelle la résistance du pont.

C'était un extrait de "Papy fait de la résistance" :smiling_imp:

Les gars !

Un grand merci.

Et encore merci.

Cela marche très bien.

Merci donc.

Où est-ce que je marque « RÉSOLU » ?

Intelego.

Ps maintenant il faut que je passe à l’intalation de la Bluetooth sur ce montage.
Il faut que lise tout sur le sujet sujet. Que je comprenne pourquoi cela’ ne fonctionne pas. Et que je pose ma’ question. Bon courage.