#PICAXE 20X2
'#################################################################################
'########################## Programme 28X2 Slave #############################
'#################################################################################
' B_ pour Broche, c'est le nom ou est branché le composant
' E_ pour Etat, c'est la valeur de la broche
' V_ pour Variable, ou est enregistré l'Etat de la broche
'
'######################## Configuration ########################
'b0 à b7 pour les communications
Symbol V_TXcam = bit0
Symbol V_BPcam = bit1
Symbol V_moteur = b2
Symbol V_direction = b4
Symbol V_Pan = b6
symbol V_compteur_com = b8
symbol V_Tilt = b9
Symbol B_moteur = B.4
Symbol B_Direction = B.2
Symbol B_Pan = B.1
Symbol B_Tilt = B.0
Symbol B_Cam = PinC.5
Symbol B_Led = C.7
dirsB = %00010111 'declare Les broches B4,B2,B1 et B0 en sortie
dirsC = %10100000 'declare Les broches C7 et C5 en sortie
'######################## Initialisation ########################
setfreq m8 ' la commande servo ne fonctionne qu'a 8Mhz
hi2csetup i2cslave, %10100000 ' Met le 20X2 en Esclave
servo B_Pan, 150 ' Initialisation des commandes servo
servo B_Tilt, 160
servo B_moteur, 150
servo B_Direction, 150
put 2,167 ' Ecrit dans le scratchpad la valeur du point milieu pour le moteur
put 4,104 ' Ecrit dans le scratchpad la valeur du point milieu de la direction
put 6,104 ' Ecrit dans le scratchpad la valeur du point milieu du Pan de la caméra
V_compteur_com = 0 ' RAZ du compteur d'erreur communication
'####################################################################################################
' Programme Principal
'####################################################################################################
main:
do
high B_led ' Allume la led test, pour verifie la communication et indique que la voiture est allumée / / peut etre supprimé.
If V_BPcam = 1 then gosub mouv_cam ' Si le BP est appuyé, on va piloter la camera
'-----------------------------------
'##### perte de communication #####
do while hi2cflag = 0 ' On attend l'arrivé d'un flag pour continuer, si c'est trop long, on arrete la voiture
V_compteur_com = V_compteur_com + 1 'Compteur d'erreurs de flag
if V_compteur_com > 50 then ' en augmentant le chiffre , on augmente le delai de reaction
gosub Escape ' Si plus de 50 erreurs à la suite, on arrete la machine
end if
loop
low B_led ' On eteind la led test
get 0,b0,b1,b2,b3,b4,b5,b6,b7 ' Lecture du scratchpad
hi2cflag = 0 ' re-armement du flag
V_compteur_com = 0 ' RAZ du compteur
'------------------------------
'##### Commande des TOR #####
B_Cam = V_TXcam ' Declenche la caméra si le bit0 est à 1
'--------------------------------
'##### Commande du moteur #####
' Point milieu 167 +/- 1
' En Avant (V_moteur va 167 à 78) / Valeur du servo de 150 à 200
' En arriére ( V_moteur va de 167 à 255 ) / Valeur du servo de 150 à 100
Select case V_moteur
case < 163 ' Marche avant
V_moteur = V_moteur / 2
V_moteur = 242 - V_moteur
case > 171 ' Marche arrriére
V_moteur = V_moteur / 2
V_moteur = 225 - V_moteur
else
V_moteur = 150 ' Point mort
end select
servopos B_moteur, V_moteur ' envoi du pwm sur le moteur
'--------------------------------------
'##### Commande de la direction #####
' Point milieu du joystick 104
' Tourne à droite (V_direction va de 104 à 185) / position du servo de 150 à 120
' Tourne à gauche (V_direction va de 104 à 29) / position du servo de 150 à 180
Select case V_direction
case < 101 ' Tourne à gauche
V_direction = 101 - V_direction * 5/12
V_direction = 150 + V_direction
case > 104 ' Tourne à droite
V_direction = V_direction - 104 * 5/12
V_direction = 150 - V_direction min 120
else
V_direction = 150 ' Point mort
end select
servopos B_Direction,V_direction ' Positionnement du servo
loop
'####################################################################################################
' Programme secondaire
'####################################################################################################
mouv_cam:
gosub freinage
do
high B_led ' Allume la led test, pour verifie la communication et indique que la voiture est allumée / / peut etre supprimé.
'-----------------------------------
'##### perte de communication #####
do while hi2cflag = 0 ' On attend l'arrivé d'un flag pour continuer, si c'est trop long, on arrete la voiture
V_compteur_com = V_compteur_com + 1 'Compteur d'erreurs de flag
if V_compteur_com > 50 then ' en augmentant le chiffre , on augmente le delai de reaction
gosub Escape ' Si plus de 50 erreurs à la suite, on arrete la machine
end if
loop
low B_led ' On eteind la led test
get 0,b0,b1,b2,b3,b4,b5,b6,b7 ' Lecture du scratchpad
hi2cflag = 0 ' re-armement du flag
V_compteur_com = 0 ' RAZ du compteur
'------------------------------
'##### Commande des TOR #####
B_Cam = V_TXcam ' Declenche la caméra si le bit0 est à 1
'----------------------------------------
'##### Commande Tilt de la camera #####
' Point milieu du joystick 104
' Vers le haut (V_moteur va de 167 à 78) / position du servo de 150 à 70 (max 69)
' Vers le bas (V_moteur va de 167 à 255) / position du servo de 150 à 160 (max 172)
V_Tilt = V_moteur
V_Tilt = V_Tilt max 160
servopos B_Tilt, V_Tilt
'---------------------------------------
'##### Commande Pan de la camera #####
' Point milieu du joystick 104 +/-1
' Tourne à droite (V_Pan va de 104 à 181) / position du servo de 150 à 65
' Tourne à gauche (V_Pan va de 104 à 32) / position du servo de 150 à 235
select case V_Pan
case > 170
servopos B_Pan,80 ' Fonctionnement en creneau pour eviter les mouvements parasites
case > 160
servopos B_Pan,90
case > 150
servopos B_Pan,100
case > 140
servopos B_Pan,110
case > 130
servopos B_Pan,120
case > 120
servopos B_Pan,130
case > 110
servopos B_Pan,140
case < 40
servopos B_Pan,220
case < 50
servopos B_Pan,210
case < 60
servopos B_Pan,200
case < 70
servopos B_Pan,190
case < 80
servopos B_Pan,180
case < 90
servopos B_Pan,170
case < 100
servopos B_Pan,160
else
servopos B_Pan,150 ' Point mort
end select
loop while V_BPcam = 1 ' On reboucle pendant tant que le BP est à 1
servopos B_Tilt, 160 ' on place le tilt au milieu
servopos B_Pan, 150 ' on place le pan au milieu
do
get 2,b2 ' On lit la valeur du joystick moteur
hi2cflag = 0 ' On ré-arme le flag
loop while V_moteur>169 or V_moteur<160 ' On boucle tant que le joystick n'est pas au PM
return
'####################################################################################################
' Programme secondaire
'####################################################################################################
'######## Arret de la voiture ##########
Escape:
Gosub freinage
servopos B_Tilt,160
servopos B_Pan,150
do loop while hi2cflag = 0 ' Tant que le scratchpad n'as rien recu on laisse le moteur eteint
V_compteur_com = 0 ' En sortant de la boucle, c'est que la communication est revenue
hi2cflag = 0 ' On remet le compteur a 0 et on ré-arme le flag
return
'######## freinage + arret de la voiture ##########
freinage:
if V_moteur < 130 then ' Si la voiture était en marche arriére à une certaine vitesse
servopos B_moteur,200 ' On freine la voiture en faisant marche avant
pause 200
end if
if V_moteur > 170 then ' Si la voiture était en marche avant à une certaine vitesse
servopos B_moteur,100 ' On freine la voiture en faisant marche arriére
pause 200
end if
servopos B_moteur,150 ' On eteint le moteur
servopos B_direction,150 ' On met la direction au milieu
return