Bonjour tout le monde !
Je suis un ptit nouveau sur le forum arduino, mais cela fait plus d'un an que j'utilise une arduino.
J'ai récemment acheté une carte arduino-like : La Romeo de DFRobot pour me monter un robot-monster-truck pilotable via une liaison série sans fil.
Le problème, c'est que j'obtient des résultats absolument délirants pour une calcul tout bête, et je ne sais pas d'ou celà peut provenir. Je vous explique un peu :
Du côté ordinateur, processing envoie des trames du style "20m" et la carte l'interprete comme envoyer 20 / 255 au moteur (en PWM).
Sauf que pour limiter la vitesse (car le joystick que j'utlise est très sensible), j'ai mis un diviseur. Par exemple si l'arduino reçoit "20m" avec un diviseur de 4 réglé au préalable, je suis censé envoyer 5 au moteur sur le PWM.
Sauf que la carte me calcule des trucs totalement délirants, genre -3667 ou autre...
Pourtant la section ne m'apparait pas fausse, qu'en dites-vous :
imval:
Le problème, c'est que j'obtient des résultats absolument délirants pour une calcul tout bête, et je ne sais pas d'ou celà peut provenir. Je vous explique un peu :
Du côté ordinateur, processing envoie des trames du style "20m" et la carte l'interprete comme envoyer 20 / 255 au moteur (en PWM).
Sauf que pour limiter la vitesse (car le joystick que j'utlise est très sensible), j'ai mis un diviseur. Par exemple si l'arduino reçoit "20m" avec un diviseur de 4 réglé au préalable, je suis censé envoyer 5 au moteur sur le PWM.
Sauf que la carte me calcule des trucs totalement délirants, genre -3667 ou autre...
Pourtant la section ne m'apparait pas fausse, qu'en dites-vous :
Sans le code complet c'est impossible de voir ou ce situe le probléme, si tu obtient des nombres négatif c'est surement que tu a dépasser la limite du type de la variable en question.
case 'm':
{
motorvalue = (int)v / motordivider; // attention au possible erreur de virgules lors de la conversion en int
analogWrite(motorpin, motorvalue); // motorvalue doit être de type byte ou de type int
Serial.println(motorvalue, DEC);
}
break;
En effet, que cherches-tu à faire ? à t'assurer que le résultat soit bien un entier ?
Si c'est le cas, la "bonne" écriture serait ceci :
motorvalue = (int)(v / motordivider);
Cependant, pourquoi effectues-tu un cast en INT sur une division d'un INT par un INT ? Car le résultat sera toujours un INT, donc ton cast est inutile.
Et, je dirais même plus, étrange car ensuite, tu effectues une comparaison étrange :
if(motorvalue <= 254 && motorvalue >= 0)
Que cherches-tu à faire avec cette comparaison ?
motorvalue étant déclaré comme un int (entier positif et négatif), pourquoi comparer cette plage qui correspondrai au domaine d'un CHAR ?