Go Down

Topic: Asservissement position (Read 4487 times) previous topic - next topic

Sonis

J'essaye de faire un capteur d'angle (j'ai un capteur avec un câble qui s'enroule et se déroule) avec une petite formule trigonométrique j'obtient la valeur de mon angle avec la longueur du câble déroulé ou enrouler...
Mais il faut que je face de l'asservissement de position => un moteur se met en route pour enrouler ou dérouler le câble tant que le capteur n'atteint pas la valeur voulu l'"angle_cible" j'ai écris ce doe mais le moteur enroule constamment et ne s'arrête pas à la valeur voulue... en gros il faut que le moteur tourne pour atteindre la valeur cible du capteur

Code: [Select]
//Liste des PIN
#define PIN_SENSOR_ANGLE A0 // capteur du câble
#define PIN_MONT 36 // enroule
#define PIN_DES 37 // deroule

//allume les relais à partir angle=500 avec une hystérésis pour les parasites
#define ANGLE_CHANGE_UP 505
#define ANGLE_CHANGE_DOWN 496

//Com série
#define BAUDRATE 9600

//Mode de fonctionnement
#define MODE_AUTO 1
#define MODE_MANU 2
#define DEFAULT_MODE MODE_AUTO


void setup(){
//défini la fonction des pins
pinMode(PIN_MONT, OUTPUT);
pinMode(PIN_DES, OUTPUT);
//état des relais pas défaut
digitalWrite(PIN_MONT, LOW);
digitalWrite(PIN_DES, LOW);

//initialise le port com
Serial.begin(BAUDRATE);
}

void loop(){
//var et init var
int angle;
bool relayCmd=false; //donne l'ordre activer/désactiver les rélais
bool relayState=false; //indique l'états des rélais
unsigned char mode=DEFAULT_MODE;

//boucle principale
while(true){
//lecture des capteurs
angle=analogRead(PIN_SENSOR_ANGLE);

//communication et traitement
if (Serial.available()) {
char c=Serial.read();
switch(c){
case 'A': //mode auto
mode=MODE_AUTO;
break;
case 'H': //activation des relais + mode manu
relayCmd=true;
mode=MODE_MANU;
break;
case 'L': //activation des relais + mode manu
relayCmd=true;
mode=MODE_MANU;
break;
case 'G': //demande de lecture de l'angle
Serial.println(angle,HEX); //en hexadécimal
break;
}
}

//calcul et traitement
if(mode==MODE_AUTO){
if (angle>ANGLE_CHANGE_UP)
relayCmd=true;
if (angle<ANGLE_CHANGE_DOWN)
relayCmd=false;
}

//exécution des ordres
if (relayCmd==true && relayState==false){ //front montant
digitalWrite(PIN_MONT,HIGH);
digitalWrite(PIN_DES,LOW);
relayState=true;
}
if (relayCmd==false && relayState==true){ //front descendant
digitalWrite(PIN_MONT,LOW);
digitalWrite(PIN_DES,HIGH);
relayState=false;
}
if(angle >= 485 && angle <= 515)
{
digitalWrite(PIN_MONT,LOW);
digitalWrite(PIN_DES,LOW);

}
}
}

Artouste


J'essaye de faire un capteur d'angle (j'ai un capteur avec un câble qui s'enroule et se déroule) avec une petite formule trigonométrique j'obtient la valeur de mon angle avec la longueur du câble déroulé ou enrouler...
Mais il faut que je face de l'asservissement de position => un moteur se met en route pour enrouler ou dérouler le câble tant que le capteur n'atteint pas la valeur voulu l'"angle_cible" j'ai écris ce doe mais le moteur enroule constamment et ne s'arrête pas à la valeur voulue... en gros il faut que le moteur tourne pour atteindre la valeur cible du capteur

...

bonsoir
tu es trop vague dans tes explications
c'est quoi ton capteur ?
quelle longueur de cable veux tu ( pouvoir)  mesurer ?

en supposant un cylindre enrouleur,  la longueur à mesurer pour un angle compris entre 0/360° est un simple calcul de circonference

Sonis

Pour un projet de domotique je dois mesurer l'angle former entre le toit et un panneau solaire, comme sa forme un triangle je peux mesurer l'angle via la longueur du côté opposé (distance entre le haut du panneau et le toit) de l'angle je peux calculer l'angle. J'ai un capteur avec une ficelle de 80 cm qui envoi une résistance de 10k en fonction de la longueur de câble dérouler. J'ais fais une platine d'essai avec des repères er un petit moteur électrique qui enroule et déroule le câble. mon but est que l'arduino pilote seul le moteur de mmanière à atteindre le repère (donc une certaine valeur ADC du capteur)

Artouste


Pour un projet de domotique je dois mesurer l'angle former entre le toit et un panneau solaire, comme sa forme un triangle je peux mesurer l'angle via la longueur du côté opposé (distance entre le haut du panneau et le toit) de l'angle je peux calculer l'angle. J'ai un capteur avec une ficelle de 80 cm qui envoi une résistance de 10k en fonction de la longueur de câble dérouler. J'ais fais une platine d'essai avec des repères er un petit moteur électrique qui enroule et déroule le câble. mon but est que l'arduino pilote seul le moteur de mmanière à atteindre le repère (donc une certaine valeur ADC du capteur)

ok
ton capteur c'est un capteur de type  potentiometrique ou un capteur qui te renvoie une valeur analogique.
un lien vers ce capteur ?

lorsque tu manipule simplement ce capteur , tu lis des infos coherentes avec l'exemple InOutserial ?

Sonis

Mon capteur est le sp1-12 de chez SCAIME

quand j'enroule et déroule ça donne de valeurs cohérente comme dis dans mon avant dernier post j'ai surveiller la valeur renvoyé par le capteur et tracé des repères en fonction des valeurs pour vérifier si mon algo arrêt de bouger le câble quand il atteint la bonne valeur (les valeurs ADC vont de 0 à 024 j'ai gradué de 200 à 800 avec un pas de 100 et j'essaye de faire arrêter le moteur à 500

Artouste


Mon capteur est le sp1-12 de chez SCAIME

quand j'enroule et déroule ça donne de valeurs cohérente comme dis dans mon avant dernier post j'ai surveiller la valeur renvoyé par le capteur et tracé des repères en fonction des valeurs pour vérifier si mon algo arrêt de bouger le câble quand il atteint la bonne valeur (les valeurs ADC vont de 0 à 024 j'ai gradué de 200 à 800 avec un pas de 100 et j'essaye de faire arrêter le moteur à 500

tu veux dire qu'entre min et max la valeur "lue" issue de ton capteur par l'arduino ne varie qu'entre 0 et 24 ?

Sonis

Désolé j'ai fais une faute de frappe c'est de 0 à 1024

Artouste


Désolé j'ai fais une faute de frappe c'est de 0 à 1024

encore perdu , et non
c'est de 0 à 1023  8)

je regarde ton capteur plus tard

Artouste

C'est bien çà comme capteur ?
http://www.i-s.gr/files/Possition.pdf

tu evoque 80cm (800mm) de ficelle, le sp1-12 semble avoir une étendue de mesure de 317mm (31,7cm)

Super_Cinci

Sinon, il y a le servomoteur, il s'asservit tout seul...

Christian_R

Ou l'accéléromètre qui mesure très bien des angles d'inclinaisons, sans ficelles et trucs mécaniques fragiles.
Christian

Go Up