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!!!!
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
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)