[Résolu] Comment utiliser un "String" comme membre de servo?

Bonjour à tous et à toutes :stuck_out_tongue:

Je viens ici chercher une aide à mon problème... pour lequel je tourne en rond d'erreurs en erreurs !

J'ai créé une fonction qui doit reprendre le nom d'un servo à commander ainsi que la valeur de l'angle.
Le code suivant me renvoi une erreur de type :

'class String' has no member named 'writeMicroseconds'

void loop(){
    .../...
    if (digitalRead(In_BP4)==APPUI) {
        --AngleServoMain_Ref;
        Fct_MajServo ("ServoMain", AngleServoMain_Ref);
    }
    .../...
}
void Fct_MajServo (string NomServo, int ValeurAngle) {  //--- fonction calibrage impulsion servomoteur à partir valeur angle en degrés

	constrain(ValeurAngle,0,180);
	//int impuls=0;
        impuls=map(ValeurAngle,ANGLE_MIN,ANGLE_MAX,POS_MIN, POS_MAX);

	NomServo.writeMicroseconds(impuls); // crée impulsion à partir valeur angle - plus précis que write()
	delay(10);

	//int angle(int valeur_angle) {
		//int impuls=0;
        	//impuls=map(valeur_angle,ANGLE_MIN,ANGLE_MAX,POS_MIN, POS_MAX);
        	//return impuls;  
	//}

} //--- fin fonction calibrage

.

J'ai essayé avec char*[] et autres fonctions, j'ai systématiquement une erreur.
Il y a quelquechose que j'ai loupé, mais quoi?

Merci de votre aide.

Cordialement, B3

Tu as loupé le cours sur les classes dérivées.

NomServo est de type class String

WriteMicroseconds est un membre de la classe Servo

Crée une classe MonServo dérivée de Servo et qui ajoute un membre String NomServo

Merci de ton aide barbudor.

Je vais chercher dans ce sens.

Cordialement,

[Edit]
Je ne trouve rien de bien précis en rapport avec Arduino... Tu as une piste, un lien à me fournir?
Car je débute dans le C++ et cela fait parti des éléments que je n'ai pas encore abordé !
[/Edit]

Ca n'a rien de spécifique Arduino
Concept de base C++
Genre (a affiner, ceci est juste une base) :

class MonServo : public Servo
{ 
  public:
  String Name
}

ok, je vois qu'il va falloir faire un tour complet du C++, afin d'alléger mon programme avec ce genre de "subtilités" !

Merci encore.

[Résolu]
Mon problème est passé en enlevant les guillemets lors de l'appel de ma fonction!!
En effet, ServoMain est déclaré dans la classe servo au début du programme.
Donc, pas besoin de faire une classe dérivée.

A ce sujet, j'ai lu un tuto (notamment sur le site du zéro), mais j'avoue ne pas savoir comment l'appliquer à mon programme.
Heureusement, car je n'ai pas compris grand chose !!!

Merci quand même à Barbudor pour la piste que tu m'as donné. L'héritage des classe permet de faire plein de chose... A voir de près en espérant y comprendre quelquechose lol
[/Résolu]

Yep!

Petit rappel : Les questions et interrogations quelconques n'ont rien à faire dans les catégories, ils sont à positionner à la racine du forum.

Cette règle doit absolument être respectée sous peine de foutoir absolu...

De plus, cela évite du travail inutile à notre modo préferé (Le présent sujet sera déplacé sous peu).

(D'ailleurs, je suis outré que l'on puisse répondre à des problématiques qui ne sont pas dans les bonnes cases, Barbudor : -1 :grin: )

@+

Zoroastre.

Je te remercie de ton intervention désobligeante et non constructive.

C'est ce genre de réactions qui font que je m'adresse à des forums que par nécessités... Choses relativement rares!

Pour ton information, dès mon post, je me suis aperçu de ma boulette, et contacter le modo par MP en m'excusant et lui demandant d'intervenir pour déplacer mon post!

Heureusement que des personnes comme barbudor sont plus indulgents et permettent elles de faire vivre des forums, car les gens sont "bien reçu" et/ou "bien renseigné", sans quoi je me demande à quoi serviraient les forums si ce n'est à discuter entre personnes hautement qualifiées... ce qui est loin d'être mon cas.

barbudor +100, balle au centre!

Yep!

Je ne vois pas en quoi mon intervention fût "désobligeante et non constructive", c'est d'ailleurs l'hôpital qui se fout de la charité car tu es parfaitement conscient que tu donnes du boulot supplémentaire aux modérateurs et aux personnes qui tentent de maintenir un site/forum agréable.

C'est ce genre de réactions qui font que je m'adresse à des forums que par nécessités

Si tu ne veux pas succiter ce "genre de réactions", apprend à lire les règlements et à utiliser correctement un forum, chose que tu ne sais pas faire ou que tu ne veux pas faire apparement.
Lorsque que l'on pénètre un espace dont on ne connait pas les us et coutumes, il est courant d'en apprendre un peu avant d'échanger, cela s'appelle de la courtoisie d'ailleurs, et les individus qui jètent leur sujet un peu n'importe comment, n'importe où, sont des pollueurs, point final.

Le présent sujet a débuté poliement et fût bien décrit et résolu in fine, je n'ai donc rien à dire de ce côté là, Je reconnais bien aussi l'altruisme altier de notre ami Barbudor et suis simplement au regret qu'il ajoute de l'eau à un moulin qui n'est pas dans la bonne rivière.

L'envie d'aider, ne doit pas céder à la sensiblerie. Il y a un règlement, respectons le :
http://arduino.cc/forum/index.php/topic,102175.0.html

@+

Zoroastre.

zoroastre:
(D'ailleurs, je suis outré que l'on puisse répondre à des problématiques qui ne sont pas dans les bonnes cases, Barbudor : -1 :grin: )

Mais qu'est-ce que j'ai fait moi =(
La plupart du temps je répond aux topics qui apparaissent via un mail de notification, sans faire gaffe où ils se trouvent.
Puisque c'est ca, je retourne à la piscine et je vous laisse tous à vos problème de classes dérivée, fonctions membres et surcharges et patati patata. En cas de problème avec le C++, merci de vous adresser directement à Bjarne Stroustrup, ca fera gagner du temps à tout le monde. :smiley:

Je ne peux qu'être du même avis que zoro qui a juste fais un rappel et qui je pense s'en serait passer volontiers, il ne faut pas y voir d'action malveillante ce n'est pas son but et il ne pouvait deviner que la modération avait déjà été prévenue de l'erreur.
Maintenant s'il y a un règlement ce n'est pas par plaisir de sanctionner, sermonner ou autre mais plutôt une nécessité afin d'avoir un forum claire et agréable à parcourir pour tous.
Ici je crois bien que c'est l'un des forum les plus tolérant et respectueux que j'ai vu et rencontrer (même trop à mon gout :grin:), il y a juste des limites, les règles il y a partout (conduire, travailler, etc) il suffit de les connaître et respecter et tout ira pour le meilleur des mondes (l'erreur est permise également).

barbudor:

zoroastre:
(D'ailleurs, je suis outré que l'on puisse répondre à des problématiques qui ne sont pas dans les bonnes cases, Barbudor : -1 :grin: )

Mais qu'est-ce que j'ai fait moi =(
La plupart du temps je répond aux topics qui apparaissent via un mail de notification, sans faire gaffe où ils se trouvent.

Barbu c'est non volontaire évidement mais en répondant trop précipitamment tu valides en quelque sorte le non respect de la charte et règlement.

On reste calme svp, J-F est en vacance laissons le en profiter.
Il a bien le droit de prendre une petite pause vu le temps qu'il passe à gérer nos conneries :wink:

babyboombros:
Pour ton information, dès mon post, je me suis aperçu de ma boulette, et contacter le modo par MP en m'excusant et lui demandant d'intervenir pour déplacer mon post!

Dans ce genre de cas (ça arrive à tout le monde de faire des erreurs) il suffit :

  • d'éditer ton message pour récupérer le texte,
  • supprimer ton topic mal placé en supprimant ton 1er message,
  • ouvrir un nouveau topic avec ton texte en copier/coller au bon endroit
    Cela évite du travail inutile aux modérateurs :wink:

babyboombros:
Heureusement que des personnes comme barbudor sont plus indulgents et permettent elles de faire vivre des forums, car les gens sont "bien reçu" et/ou "bien renseigné", sans quoi je me demande à quoi serviraient les forums si ce n'est à discuter entre personnes hautement qualifiées... ce qui est loin d'être mon cas.

Ce n'est pas pour autant qu'il faut laisser de côté les règles établit :wink:
Elles ont été discuté longuement (trés longuement même) avec les membres du forum, afin justement d'éviter d'avoir à faire ce genre de rappel.
On passe ainsi moins de temps à faire la police et plus de temps à répondre aux questions / problémes.
Chaque membre du forum ce doit de veiller au bon fonctionnement du forum, sinon ça s'appelle un SAV :wink:

osaka:
Ici je crois bien que c'est l'un des forum les plus tolérant et respectueux que j'ai vu et rencontrer (même trop à mon gout :grin:), il y a juste des limites, les règles il y a partout (conduire, travailler, etc) il suffit de les connaître et respecter et tout ira pour le meilleur des mondes (l'erreur est permise également).

Les modo/admin d'arduino.cc sont trés (trop ?) tolérant :grin:
Il me semble (de mémoire) qu'il est impossible de ce faire bannir sauf en cas de comportement vraiment trés grave.
C'est un des rares forums ou tu ne verra jamais quelqu'un répondre "tient le noob, va donc voir sur google".
Ici que tu soit débutant, grand débutant ou utilisateur confirmé / expert tu est traité de la même façon :wink:

--

Revenons à ton probléme.

A tu trouvais une solution ?
Si oui laquelle (que cela profite aux prochaines personnes qui passeront sur ce topic) ?

Tu dis :

Mon problème est passé en enlevant les guillemets lors de l'appel de ma fonction!!

Je suppose donc que ta fonction prend désormais en argument un objet de type Servo ?
Si oui est ce que tu passe cette objet par copie, par pointeur ou par référence ?
Selon le type de passage d'argument de ta fonction tu peut avoir des problémes par la suite.

Yep!

J'ai peut être été un peu virulent dans ma remarque précedente.

J'ai eu quelques mots avec babyboombros en private et la polémique est aujourd'hui éteinte.

Osaka a parfaitement résumé la situation. Le fond doit être cohérent avec la forme sinon nous dérivons vers le non-sens et le foutoir absolu.

babyboombros a peut être lancé son sujet un peu précipitement, mais je le crois lorsqu'il s'en excuse et affirme qu'il a prévenu le modo de sa bévue.

J'ai d'ailleurs loué l'altruisme altier de barbudor et l'en félicite en quelque sorte. Mais il faut également être conscient que la vie du forum, ce sont ces membres les plus assidus, le noyau dur, dont barbudor fait aujourd'hui fièrement partie, qui la font grandir et évoluer dans le bon sens. Et c'est de notre responsabilité à chacun d'écouter et de faire respecter les règles de notre belle communauté.
D'ailleurs, ces règles ne sont pas figées, elles sont le consensus de nos idéaux...

@+

Zoroastre.

Bonsoir à tous,

Dans ce genre de cas (ça arrive à tout le monde de faire des erreurs) il suffit :

  • d'éditer ton message pour récupérer le texte,
  • supprimer ton topic mal placé en supprimant ton 1er message,
  • ouvrir un nouveau topic avec ton texte en copier/coller au bon endroit
    Cela évite du travail inutile aux modérateurs

Merci pour l'info, je ne savais pas qu'il était possible de faire ce genre de manip, d'où mon MP au modo.

Je suppose donc que ta fonction prend désormais en argument un objet de type Servo ?

En fait oui, mon objet est de type servo et déclaré comme tel au début du programme, avant le setup()

Selon le type de passage d'argument de ta fonction tu peut avoir des problémes par la suite.

Pour moi , cela reste encore du domaine du charabia, je sais juste que j'ai enlevé les guillemets qui encadrent ServoMain.
Mon appel de la fonction initiale

Fct_MajServo ("ServoMain", AngleServoMain_Ref);

Mon appel de la fonction finale

Fct_MajServo (ServoMain, AngleServoMain_Ref);

Selon le type de passage d'argument de ta fonction tu peut avoir des problémes par la suite.

Quels types de problèmes? il me faut alors dores et déjà y rechercher des solutions lol

En fait si tu passe ton objet Servo par copie (ce qui semble être le cas) tu as une copie de l'objet qui est faite (logique ...).
Ça demande beaucoup de travail pour faire la copie.

Le mieux est de passer ton objet Servo par pointeur :
Prototype de la fonction (par exemple) :

void Fct_MajServo(Servo *myServo, int angle);

(bien remarquer le * devant le nom de l'objet myServo)

Appel la fonction via :

Fct_MajServo(&ServoMain, AngleServoMain_Ref);

(bien remarquer le & devant le nom de l'objet Servo)

Par contre dans le code de ta fonction il te faudra utiliser -> et non . pour accéder aux membres de ton objet Servo.
Exemple :

myServo->writeMicroseconds(impuls);

Une autre solution valable uniquement en C++ est le passage par référence.
C'est le même principe que le passage par pointeur mais sans pointeur et sans copie :grin:

Prototype de la fonction (par exemple) :

void Fct_MajServo(Servo &myServo, int angle);

(bien remarquer le & devant le nom de l'objet myServo)

Pour ce qui est de l'appel de la fonction, ou l'utilisation de l'objet Servo dans le corps de ta fonction, c'est exactement comme un passage par copie.
-> Simplicité du passage par copie + rapidité du passage par pointeur
Attention : comme avec le passage par pointeur toute modification sur l'objet Servo à l'intérieur de ta fonction se répercutera sur l'objet Servo d'origine.

Ça demande beaucoup de travail pour faire la copie.

Qu'entends-tu par travail? Le temps de réaction?

Pour un projet relativement basique comme le mien, la réaction n'est pas une priorité.

Merci pour ta réponse, je vais modifié mon programme en faisant appel aux pointeurs.

babyboombros:
Qu'entends-tu par travail? Le temps de réaction?

Non j'entends "instructions en plus" à exécuter et mémoire RAM nécéssaire pour copier l'objet.
Ce n'est pas vraiment un question de vitesse, mais plus une question de mémoire RAM (très limité sur un arduino) :wink: