Aller au contenu


Photo
- - - - -

Besoin d'aide pour comprendre un programme..


  • Veuillez vous connecter pour répondre
4 réponses à ce sujet

#1 Astro

Astro

    Nouveau membre

  • Membres
  • 4 messages

Posté 27 avril 2011 - 08:12

Bonsoir, à la suite de ce sujet, je viens à nouveau vous demander aide et conseils, afin de m'aider à comprendre le programme qui fait marcher tout le système ( un accéléromètre commande deux servomoteurs afin que la plateforme soit toujours à l'horizontale ). Les 3/4 du programme ayant été fait par mon professeur, je dois dire que je suis un peu perdu, et j'aimerai donc que l'on m'aide pas à pas à en comprendre son intégralité.

Le programme a été écrit grace au logiciel CUBLOC en BASIC ( du moins je crois. )

Voilà, ça serait super sympa à vous si vous pouviez, encore une fois, me filer un coup de main :)

Dans l'attente d'une réponse, je vous laisse ci après le programme en question :

Const Device = CB220
	Dim pas As Single 
	Const minY As Single=2000
	Const maxY As Single=4000			'Constantes des positions extremes et du pas
	Const minX As Single=3700				'-30degres
	Const maxX As Single=5000				'+30degres
Dim mes_x As Integer
Dim mes_y As Integer
Dim mes_z As Integer


Dim acc_x As Single
Dim acc_y As Single
Dim acc_z As Single
	                                                               																						
	Dim dx As Integer
	Dim dy As Integer
	Dim dz As Integer
	

	Dim angle_x As Single
	Dim angle_y As Single
	Dim angle_z As Single
	Low 5								'Configure les port P5 et P6 en sortie
	Low 6
	Dim angle1 As Single
	Dim angle2 As Single
	Dim commande As Single
	Dim Npas As Single

	
Do
	mes_x=Adin(0)
	acc_x=(mes_x-337.0)/167.0
	mes_y=Adin(1)
	acc_y=(mes_y-345.0)/160.0
	mes_z=Adin(2)
	acc_z=(mes_z-337.0)/167.0
	angle1=Atan acc_x/(Sqr(acc_y*acc_y+acc_z*acc_z))
	angle1=angle1/3.14257*180
	angle2=Atan acc_y/(Sqr(acc_x*acc_x+acc_z*acc_z))
	angle2=angle2/3.14257*180
	Debug "angle1 = ", Float angle1,Cr
	Debug "angle2 = ", Float angle2,Cr
	
If (angle1>2) Or (angle1<-2) Then


pas=-20.0
	commande=angle1*pas+4350

	dx=commande

	

	Pwm 0, dx, 32768
	
	Else
	
	dx=4350
	Pwm 0, dx, 32768
Endif
If (angle2>2) Or (angle2<-2) Then

pas=20.0
commande=angle2*pas+3000
	dy=commande
	
	Pwm 1, dy, 32768
	
	
	Else
	dy=3000
	Pwm 1, dy, 32768
	
Endif



Debug  Cr
Delay 200
'Debug Float angle1,Cr

	
'Pwm 0,4900,32768			                      	'Servo 2 en position -90°
'Delay 1000
	'Pwm 0, 3700,32768				'Servo 2 en position -90°
	'Delay 1000
	'Pwm 1, 2100,32768				'Servo 2 en position -90°
	 'Delay 2000
	'Pwm 1, 3700,32768				'Servo 2 en position -90°
	 'Delay 2000
	  
	Loop


#2 Guillaume TDRIS

Guillaume TDRIS

    Membre

  • Membres
  • 49 messages
  • Gender:Male
  • Location:Saint Soupplet

Posté 28 avril 2011 - 06:24

Bonjour,

Ce programme est plutôt simple, la première partie est une définition du module cubloc

Const Device = CB220


La tu as la déclaration des butées logiciels des servomoteurs (const signifie fixe)

Const minY As Single=2000
Const maxY As Single=4000 'Constantes des positions extremes et du pas
Const minX As Single=3700 '-30degres
Const maxX As Single=5000 '+30degres


Ensuite les déclarations de variables du programme et les déclarations des E/S

Dim pas As Single
Dim mes_x As Integer
Dim mes_y As Integer
Dim mes_z As Integer

Dim acc_x As Single
Dim acc_y As Single
Dim acc_z As Single
Dim dx As Integer
Dim dy As Integer
Dim dz As Integer

Dim angle_x As Single
Dim angle_y As Single
Dim angle_z As Single
Low 5 'Configure les port P5 et P6 en sortie
Low 6
Dim angle1 As Single
Dim angle2 As Single
Dim commande As Single
Dim Npas As Single


Ici tu as le calcul de l'inclinaison de la plateforme en degré à partir des données accéléromètres

Do
mes_x=Adin(0)
acc_x=(mes_x-337.0)/167.0
mes_y=Adin(1)
acc_y=(mes_y-345.0)/160.0
mes_z=Adin(2)
acc_z=(mes_z-337.0)/167.0
angle1=Atan acc_x/(Sqr(acc_y*acc_y+acc_z*acc_z))
angle1=angle1/3.14257*180
angle2=Atan acc_y/(Sqr(acc_x*acc_x+acc_z*acc_z))
angle2=angle2/3.14257*180
Debug "angle1 = ", Float angle1,Cr
Debug "angle2 = ", Float angle2,Cr


Ensuite il y a trois possibilitées

- soit les inclinaisons sont inférieurs à 2°, rien ne se passe
- si l'inclinaison de l'angle 1 est > 2° ou < 2°, on agit sur la valeur de la pwm 0 qui commande le servo
- si l'inclinaison de l'angle 2 est > 2° ou < 2°, on agit sur la valeur de la pwm 1 qui commande le servo

If (angle1>2) Or (angle1<-2) Then


pas=-20.0
commande=angle1*pas+4350

dx=commande



Pwm 0, dx, 32768

Else

dx=4350
Pwm 0, dx, 32768
Endif
If (angle2>2) Or (angle2<-2) Then

pas=20.0
commande=angle2*pas+3000
dy=commande

Pwm 1, dy, 32768


Else
dy=3000
Pwm 1, dy, 32768

Endif


Le reste c'est du debug à comprendre dans le contexte...

Debug Cr
Delay 200
'Debug Float angle1,Cr


'Pwm 0,4900,32768 'Servo 2 en position -90°
'Delay 1000
'Pwm 0, 3700,32768 'Servo 2 en position -90°
'Delay 1000
'Pwm 1, 2100,32768 'Servo 2 en position -90°
'Delay 2000
'Pwm 1, 3700,32768 'Servo 2 en position -90°
'Delay 2000


Et cela doit être l'indication de bouclage.

Loop


En espérant t'avoir aidé, demande moi si tu veux des précisions sur une partie.

#3 Astro

Astro

    Nouveau membre

  • Membres
  • 4 messages

Posté 28 avril 2011 - 07:25

Merci énormément pour la réponse rapide et concise, toutefois j'aimerais avoir plus de précisions dans cette partie :

Dim pas As Single
Dim mes_x As Integer
Dim mes_y As Integer
Dim mes_z As Integer

Dim acc_x As Single
Dim acc_y As Single
Dim acc_z As Single
Dim dx As Integer
Dim dy As Integer
Dim dz As Integer

Dim angle_x As Single
Dim angle_y As Single
Dim angle_z As Single
Low 5 'Configure les port P5 et P6 en sortie
Low 6
Dim angle1 As Single
Dim angle2 As Single
Dim commande As Single
Dim Npas As Single


Pourquoi certaine variables sont définies en tant que "Single" et d'autres en tant que "Integer", je suppose que cela a un rapport avec les valeurs entières ou à virgules, mais pourquoi certaines et d'autres non ?

Merci encore ;)

#4 Guillaume TDRIS

Guillaume TDRIS

    Membre

  • Membres
  • 49 messages
  • Gender:Male
  • Location:Saint Soupplet

Posté 29 avril 2011 - 09:58

Alors je ne suis pas sur...

Mais la logique voudrait que "single" soit pour des valeur à virgule et que "integer" soit des entiers.

C'est à vérifier je ne connais plus très bien le basic (cela date un peu pour moi)

#5 Zan

Zan

    Nouveau membre

  • Membres
  • 2 messages

Posté 18 juin 2011 - 06:56

salut
une piste...

les données en integer mes_x,mes_y, mes_z sont des mesures provenant du capteur. Se sont dont des valeurs entieres. c'est comme sa, c'est lié au fabricant et au capteur.

le pas est en single car il représente une valeur en radiant

dx,dy,dz sont des écarts entre deux temps pour les données entieres provenant du capteur. Donc elles sont également en integer

en fait tout est en décimale saut les mesures provenant du capteur

j'espère que sa peut t'aider




0 utilisateur(s) li(sen)t ce sujet

0 members, 0 guests, 0 anonymous users