Capacitive Sensor avec arduino mega 2560

Bonjour,
j'ai découvert que l'on pouvait détecter si l'on touchait une surface métallique avec l'arduino. Avec la nano ça marche, mais quand je passe sur la mega, ça ne marche plus.

voici le tuto que j'ai suivi:

merci d'avance!!!!

la fonction readCapacitivePin détermine quels port est utilisé mais c'est basé sur la logique d'une carte UNO ou équivalent. Une carte MEGA n'a pas les mêmes ports

si vous regardez ce schéma

vous verrez quelle pin correspond à quel port. --> il faut modifier la fonction readCapacitivePin pour votre architecture ou si vous n'utilisez qu'une seule pin câbler en dur le port utilisé

Merci de m'avoir répondu. J'ai essayé d'effectuer les changements suivant(le pin utilisé est 10):

uint8_t readCapacitivePin(){


  volatile uint8_t* port;
  volatile uint8_t* ddr;
  volatile uint8_t* pin;


  byte bitmask;
  port = &PORTB;
  ddr = &DDRB;
  bitmask = 1 << 4;
  pin = &PINB;
  
  *port &= ~(bitmask);
  *ddr  |= bitmask;
  delay(1);

  *ddr &= ~(bitmask);

  int cycles = 16000;
  for(int i = 0; i < cycles; i++){
    if (*pin & bitmask){
      cycles = i;
      break;
    }
  }

  *port &= ~(bitmask);
  *ddr  |= bitmask;
  
  return cycles;
}

Mais ça ne marche toujours pas :frowning:

  port = &PORTB;
  ddr = &DDRB;
  bitmask = 1 << 4;
  pin = &PINB;

--> effectivement vous avez bien choisi le bon port et le bon mask (et le code d'origine le faisait correctement aussi)

qu'est-ce qui est connecté d'autre sur votre MEGA et sur quelles pins?

Quelles valeurs sont imprimées quand vous touchez votre surface ?

Finalement, ça marche avec une plus grosse résistance.
Par contre, ma surface est assez grande. Et de temps en temps il y a des parasites. Comment faire pour les enlever?

prendre des valeurs moyennes dans le code, ou filtrer mieux côté hardware

D'un point de vu logiciel, si c0 est la valeur précédente lue et c1 la nouvelle valeur lue, vous pourriez faire un lissage en disant c = 0.9 * c0 + 0.1 * c; --> en jouant sur le 0.9 (et son complément à 1 pour l'autre pondération soit ici 0.1 car 0.9 + 0.1 = 1) vous donnez plus ou moins d'importance au passé. comme cela s'il y a une valeur qui sort de la tendance, elle est "gommée" par le poids de l'historique

bien sûr vous perdez en réactivité avec cette approche, il faudra un petit temps quand vous mettez ou enlevez le doigt pour que la valeur passe le seuil critique --> si vos lectures sont rapides ça ne se voit pas trop en temps humain et vous affinez cela avec les coefficients par exemple

comme on l'a vu c = 0.9 * c0 + 0.1 * c; donne un gros poids au passé
alors que c = 0.2 * c0 + 0.8 * c; va donner une grosse importance à la valeur actuelle, donc plus réactif (moins filtrant)