Interférence composants/code

Bonjours,
Je suis grand débutant sous arduino et j'ai écris quelques lignes de code pour m'entrainer à la communication entre mon PC et ma UNO(dans ce sens). Je souhaite ordonner depuis mon PC à un servomoteur de se placer à une position donnée. Je dois donc transmettre une position (un int) de mon PC vers ma carte. Or sachant que Serial.read() ne me permet que d'échanger des caractères ASCII, j'ai donc écrit quelques lignes pour recevoir et traiter l'ordre de position émis depuis mon PC (verrifier que les char envoyés sont compris entre 48 et 57 puis faire la synthèse de ce qui a été reçu pour en dégager une position). Ces lignes semblent tout à fait opérationnelles (je renvoi des message depuis ma UNO pour controler le bon déroulement du programme) TANT QUE je ne branche pas le servomoteur.
Lorsque ce dernier est branché le programme ne répond plus du tout de la même manière.

Exemple:
Sans avoir branché le servo:
depuis le Moniteur je tape "123" puis j'enfonce la touche "enter" -->(le PC envoit donc "49", "50", "51")--> la carte traite ces 3 char entrants (OK si les char correspondent à un chiffre et ERROR sinon) et me renvoit le nombre de char traité, la validité de l'envoi ainsi que la position qui en résulte -->(le moniteur affiche donc "3 OK 123")

Aprés avoir branché le servo:
je tape "123" et le moniteur affiche "2 ERROR 0".

Il semble donc que le branchement du servo agisse sur le traitement et la réception des données:
Cela est-il possible? Est-ce arrivé à l'un d'entre vous? Si oui, pouvez vous donner des détails?
Merci

Bonjour,
comme cela sans voir le code il est difficile de savoir si le problème vient du code ou autre.
Est-ce que le programme "sweep" (dans les exemples) fonctionne?
Comment est alimenté le servomoteur?
C'est peut être l'alimentation qui est un peu juste et qui fait rebooter l'arduino lorsque le servomoteur demande trop de courant... ça c'est déja vu.

Tu le branches sur quels pins le servo ?

Merci de vos réponses

Tout d'abord sweep fonctionne tout a fait, ensuite pour ce qui est des pins j'ai branché le servo sur la sortie 5V et une sortie ground de la carte et la pin indiquant au servo la position à atteindre est la numéro 13.

Je rapelle que le code répond correctement sans le servo puisqu'il me renvoit des messages m'indiquant que la séquence entrée est correcte lorsqu'elle l'est et incorrecte lorsqu'elle est incorrecte. Ci joint le code:

#include <Servo.h>
long detec, nbrByte, actByte, nbr, error;
Servo servo;

void setup()
{
nbr=0;
detec=0;
servo.attach(13);
servo.write(0);
Serial.begin(19200);

}

void loop()
{
detec=Serial.available();
delay(5);
if(detec!=0)
{
detec= Serial.available();
Serial.print(detec);
for(long i=0; i<detec; i++)
{
actByte=Serial.read();
delay(1);
if(actByte>48&&actByte<57)
{
nbr= nbr*10+actByte-48;
}
else
{
error=1;
}
}
if(error==0)
{
servo.write(nbr);
Serial.print(" OK ");
}
else
{
Serial.print(" ERROR ");
}
Serial.println(nbr);
nbr=0;

}
}

Salut,

la pin 13 est un peu particulière car une led y est attachée. De plus, ce n'est pas une sortie PWM. Testes donc avec la pin 9 qui en est une sortie PWM.

Gromain

je ne suis pas très doué en code, mais peut être que servo.write() n'accepte pas les variables de type "long"?

ça ne doit pas être un problème d'alimentation si sweep fonctionne... mais ce serait peut être plus prudent d'alimenter le servomoteur "de l'extérieur" (en reliant les masses évidemment).

Bon, alors déjà, j'ai remarqué une erreur dans mon code: je ne prenait pas en compte l'appuis sur la touche 1 ni 9 des séquences envoyées d'où peut etre et avec malchance les incohérences. Il n'y aurait donc pas d'interferences entre les branchements de la carte et le code.

Mais c'est pas gagné, j'ai encore des problêmes au lancement du moniteur(plantage ou décrochage...). Je vais clore ce sujet et en ouvrir un autre portant sur ces nouvelles erreurs:

En attendant je veux bien alimenter mon servo depuis l'exterieur de mon Pc mais aurais tu une astuce pour le faire? J'ai pas beaucoup de matériel à disposition et j'ai peur que les piles que je possède ne délivrent q'une intensité insuffisante.

Autre question, tu me conseilles de relier les masses et ça me donne une occasion de poser ma question: Pourquoi y -t-il 3 pins notées GND sur la carte? Ces masses sont-elles ttes identiques ou présentent-elles des differences?

Un grand merci à tous pour vos réponses :wink:

Pour alimenter le servomoteur: 4 piles LR06 en série (tu obtiendras entre 4,8 et 6v, suivant l'usure des piles et le fait qu'elles soient rechargeables ou non.) Prendre le + de la pile "du haut" et le relier au + des servos, et relier le - de la pile "du bas" pour le relier à l'une des masses (elles sont reliées).
Aucun problème, les piles débitent énormément de courant (quand elles seront déchargées tes servomoteurs feront n'importe quoi à cause des chutes de tensions)
Il existe des "portes-piles", moi c'est ce que j'utilise:

c'est vrai qu'à la longue c'est contraignant de devoir recharger les piles, mais c'est très fiables car elles peuvent débiter énormément de courant.
bon courage pour la suite!