prog decodeur ptz pelco d enregistreur vidéo

jominy

New Member
Bonjour à tous
J'essaye d'adapter un montage existant :
http://mikeshawcreates.blogspot.fr/2012/07/making-camera-ptz-decoder.html
Voici mon code (j'ai supprimé les recherche d'adresse, je ne l'utilise pas dans mes instructions conditionnelles) :
Code:
Symbol haut 	= C.6     ' Tilt Up
Symbol bas  	= C.7     ' Tilt Down
Symbol droite     = C.0     ' Pan Right
Symbol gauche     = C.1     ' Pan Left
Symbol stx   =  b0
Symbol adr   =  b1
Symbol cmd1  =  b2
Symbol cmd2  =  b3
Symbol dat1  =  b4
Symbol dat2  =  b5
Symbol chks  =  b6
Symbol tmp   =  b8
Symbol RX_PIN = C.5      'Input from RS485 chip
Symbol RX_BAUD = T4800   'Baud fixed at true 4800

Do 
Gosub GetPacket
Gosub HandlePacket
Loop

GetPacket:
Do
SerIn RX_PIN,RX_BAUD,stx,adr,cmd1,cmd2,dat1,dat2,chks
tmp = adr + cmd1 + cmd2 + dat1 + dat2
Loop Until tmp = chks
Return

HandlePacket:
if cmd2=$02  then high droite     end If
if cmd2=$04  then high gauche     end If
if cmd2=$08  then high haut       end If
if cmd2=$10  then high bas        end If
pause 1000
low droite,gauche,haut,bas
Return
Je teste cela avec mon enregistreur qui a une sortie RS485, les commandes se font depuis une page web.
Ca fonctionne pas mal, mais si je reste cliqué sur une commande la sortie correspondante ''clignote''. Vu le code, cela a l'air normal .
Je voudrais que la sortie reste a l'état haut (sans coupures) tant que la commande est actionnée et tombe a l'état bas ensuite.
Auriez vous une piste a essayer ?
Merci d'avance
 

MGU

Senior Member
Bonjour,

On peut essayer cette modif:
Je pense que la pause de 1 s n'est plus nécessaire.

Code:
#picaxe 18M2
Symbol haut 	= C.6     ' Tilt Up
Symbol bas  	= C.7     ' Tilt Down
Symbol droite     = C.0     ' Pan Right
Symbol gauche     = C.1     ' Pan Left
Symbol stx   =  b0
Symbol adr   =  b1
Symbol cmd1  =  b2
Symbol cmd2  =  b3
Symbol dat1  =  b4
Symbol dat2  =  b5
Symbol chks  =  b6
Symbol tmp   =  b8
Symbol RX_PIN = C.5      'Input from RS485 chip
Symbol RX_BAUD = T4800   'Baud fixed at true 4800

	Do 
		Gosub GetPacket
		Gosub HandlePacket
	Loop

GetPacket:
	Do
		SerIn RX_PIN,RX_BAUD,stx,adr,cmd1,cmd2,dat1,dat2,chks
		tmp = adr + cmd1 + cmd2 + dat1 + dat2
		Loop Until tmp = chks
	Return

HandlePacket:
	if cmd2=$02  then 
		high droite
		do loop while cmd2=$02
    end If
	if cmd2=$04  then
		high gauche
		do loop while cmd2=$04 [COLOR="#FF0000"];boucle jusqu'au relâchement[/COLOR] 
	end If
	if cmd2=$08  then
		 high haut
		 do loop while cmd2=$08
	endif
	if cmd2=$10  then
		high bas
		do loop while cmd2=$10
	end If
	;pause 1000 [COLOR="#FF0000"];supprimé[/COLOR]
	low droite,gauche,haut,bas
	Return
 

PieM

Senior Member
Code:
HandlePacket:
do while cmd2=$02   	: high droite : loop 
do while cmd2=$04  	: high gauche : loop 
do while cmd2=$08  	: high haut   : loop 
do while cmd2=$10  	: high bas    : loop 

low droite,gauche,haut,bas
Return
 

MGU

Senior Member
Code:
HandlePacket:
do while cmd2=$02   	: high droite : loop 
do while cmd2=$04  	: high gauche : loop 
do while cmd2=$08  	: high haut   : loop 
do while cmd2=$10  	: high bas    : loop 

low droite,gauche,haut,bas
Return

Ben oui, c'est beaucoup mieux....
 

jominy

New Member
Merci a tous les deux
Néanmoins ça ne fonctionne pas, la sortie reste a l'état haut tout le temps.
J 'ai peut être une explication :quand on clique par exemple sur l'icone droite, on reçoit une trame du style $FF 01 00 02 32 00 35 au début, puis plus rien.
Quand on relâche, l'enregistreur doit envoyer un ordre de stop (enfin je pense) qui devrait ressembler à $FF 01 00 00 00 00 01.
J'ai essayé de tester cette dernière trame, sans résultat.
Quelqu'un connait il mieux le protocole pelco d?
Merci d'avance
 

PieM

Senior Member
Ouais ! logique.

le plus simple, si c'est un M2 (?) , utilisez une tache parallèle:

mettez tout ce qui est GetPacket en tache 1 (start1 )

Code:
Symbol haut 	= C.6     ' Tilt Up
Symbol bas  	= C.7     ' Tilt Down
Symbol droite     = C.0     ' Pan Right
Symbol gauche     = C.1     ' Pan Left
Symbol stx   =  b0
Symbol adr   =  b1
Symbol cmd1  =  b2
Symbol cmd2  =  b3
Symbol dat1  =  b4
Symbol dat2  =  b5
Symbol chks  =  b6
Symbol tmp   =  b8
Symbol RX_PIN = C.5      'Input from RS485 chip
Symbol RX_BAUD = T4800   'Baud fixed at true 4800

Do 

Gosub HandlePacket
Loop

HandlePacket:
do while cmd2=$02   : high droite : loop 
do while cmd2=$04  	: high gauche : loop 
do while cmd2=$08  	: high haut   : loop 
do while cmd2=$10  	: high bas    : loop 
low droite,gauche,haut,bas
Return

start1:
Do
SerIn RX_PIN,RX_BAUD,stx,adr,cmd1,cmd2,dat1,dat2,chks
tmp = adr + cmd1 + cmd2 + dat1 + dat2
Loop Until tmp = chks
Si vous n'avez pas de M2 essayez ça:

Code:
Symbol haut 	= C.6     ' Tilt Up
Symbol bas  	= C.7     ' Tilt Down
Symbol droite     = C.0     ' Pan Right
Symbol gauche     = C.1     ' Pan Left
Symbol stx   =  b0
Symbol adr   =  b1
Symbol cmd1  =  b2
Symbol cmd2  =  b3
Symbol dat1  =  b4
Symbol dat2  =  b5
Symbol chks  =  b6
Symbol tmp   =  b8
Symbol RX_PIN = C.5      'Input from RS485 chip
Symbol RX_BAUD = T4800   'Baud fixed at true 4800

Do 

Gosub HandlePacket
Loop

HandlePacket:
gosub GetPacket 
select cmd2
 	case =$02   : high droite : goto HandlePacket
	case =$04  	: high gauche : goto HandlePacket 
	case =$08  	: high haut   : goto HandlePacket
	case =$10  	: high bas    : goto HandlePacket 
	else
	low droite,gauche,haut,bas
end select
Return

GetPacket:
Do
SerIn RX_PIN,RX_BAUD,stx,adr,cmd1,cmd2,dat1,dat2,chks
tmp = adr + cmd1 + cmd2 + dat1 + dat2
Loop Until tmp = chks
Return
 
Last edited:

jominy

New Member
Bonsoir a tous
Merci pour votre aide précieuse.
J'ai refait des essais mais en changeant de marque d'enregistreur ... et ca marche bien maintenant.
Je me confronte maintenant à une autre problématique : par sécurité, je voudrais introduire une boucle de temporisation de 45 minutes environ et dont l'action finale serait de mettre en low toutes les sorties. Je voudrais lancer et réinitialiser cette tempo a chaque fois que la commande serin est valide (quand tmp=chks) mais je ne comprend pas la manière de créer une tache parallèle (elle ne doit pas bloquer le déroulement du reste du programme). Enfin, quelle est le code le plus simple pour compter cette tempo de 45 minutes environ ?
Merci d'avance
 

PieM

Senior Member
Je me confronte maintenant à une autre problématique : par sécurité, je voudrais introduire une boucle de temporisation de 45 minutes environ et dont l'action finale serait de mettre en low toutes les sorties. Je voudrais lancer et réinitialiser cette tempo a chaque fois que la commande serin est valide (quand tmp=chks) mais je ne comprend pas la manière de créer une tache parallèle (elle ne doit pas bloquer le déroulement du reste du programme). Enfin, quelle est le code le plus simple pour compter cette tempo de 45 minutes environ ?
Merci d'avance
Il faut utiliser le timer qui travaille en tâche de fond, et sa variable time incrémentée toutes les secondes.

Après validation de votre chks, vous mettez la variable time à 0 (time = 0)
et vous ajoutez une ligne : if time > 2700 then ... go sub RAZsorties dans la boucle do loop du GetPacket, de façon à ce que la lecture du serin continue à se faire.
 

MGU

Senior Member
Bonjour,

Et en plus, ce qui serait sympathique et servirait à tous, c'est d'indiquer le matériel utilisé.

Merci

MM
 

jominy

New Member
Bonjour
J'ai effectivement oublié de préciser que je suis passé au 28X2 car je n'avais pas assez de sorties avec le 18M2.
Le tranceiver est un LINEAR LT485.
Du coup je me pose la question de savoir si le 28X2 possède la fonction timer décrite par PieM, ou si il y a un équivalant ?

Hors sujet : avez vous aussi des problème pour écrire les posts sur ce forum ou bien ai je un virus ? (perso ça ne prend pas toutes les lettres quand j'écris, il faut tout corriger en permanence ... c'est très pénible)
A+
 

PieM

Senior Member
Bonjour
J'ai effectivement oublié de préciser que je suis passé au 28X2 car je n'avais pas assez de sorties avec le 18M2.
Le tranceiver est un LINEAR LT485.
Du coup je me pose la question de savoir si le 28X2 possède la fonction timer décrite par PieM, ou si il y a un équivalant ?

Hors sujet : avez vous aussi des problème pour écrire les posts sur ce forum ou bien ai je un virus ? (perso ça ne prend pas toutes les lettres quand j'écris, il faut tout corriger en permanence ... c'est très pénible)
A+
Sur X2 la variable se nomme timer.
Pas de pb particulier pour écrire sur le forum pour ce qui me concerne.
 

jominy

New Member
Bonjour a tous et bonne année 2015.
Première résolution de l'année : je me replonge dans ce post!
J'éprouve des difficultés à programmer des taches parallèles (ajout d'une tempo de sécurité), et je me demande si le fait d'utiliser la commande serin est compatible (ne bloque t'elle pas le processus)?.
Merci pour vos conseils
 

dje8269

Senior Member
Il me semble que le fait d'utiliser des taches // divise la fréquence de travail de chaque tache . Mais le multi-tache n'est pas possible sur un X .
Attends l'avis d'un expert , car je ne suis pas sur de moi;
 

MGU

Senior Member
Bonjour a tous et bonne année 2015.
Première résolution de l'année : je me replonge dans ce post!
J'éprouve des difficultés à programmer des taches parallèles (ajout d'une tempo de sécurité), et je me demande si le fait d'utiliser la commande serin est compatible (ne bloque t'elle pas le processus)?.
Merci pour vos conseils
Bonjour,

La commande serin est bloquante tant qu'il n'y a rien à lire, ça perturbe le multitâche.
Mais il y a la possibilité de fixer un timeout et une adresse de déroutement en cas de dépassement du temps.

Le multitâche, c'est uniquement sur les M2

Et bonne année

MM
 

jominy

New Member
Merci pour vos réponses.
Quelle déception : moi qui pensais être tranquille en prenant la version X2 ("Advanced") au lieu de modèles M2 ("standard") je pensais "qui peut le plus peut le moins" alors que c'est "qui coûte le plus cher peut le moins" ... tant pis :(
A+
 

dje8269

Senior Member
Je me suis fait avoir il n'y as pas si longtemps aussi . j'avais prévus un 20X2 à la place d'un 20M2, mais le 20X2 n'as pas la commande RFout/in . par contre il peut passer un esclave !

Il s'agit je crois de l'architecture interne et de la façon dont rev-ed fait son mini programme !
 

jominy

New Member
J'ai un 20M2 qui traine, mais il faut que je vérifie qu'il est compatible avec la commande serin avant de modifier mon programme ... GRRRRRR
 

jominy

New Member
Bonjour à tous
Je continue tout doucement avec ce montage qui fonctionne mais avec quelques ratées de temps en temps ...
Les commandes Pelco (directions, zooms, focus ...) se terminent par une trame d'arrêt commune à toutes ces commandes.
De temps en temps, des sorties restent à l'état haut (le serin de stop a t'il été raté?)
Je voulais donc faire des essais en ajoutant un quartz externe pour (peut-être) plus de rapidité et de précision.

J'ai donc ajouté la ligne setfreq em16 pour un quartz externe de 16 MHZ (merci Farnell)
Je voulais passer à un débit serin en 9600 bauds (ex : T9600_8) mais j'ai du mal a comprendre le fonctionnement de serin :
quelle est la relation entre la fréquence externe et la vitesse en bauds finale ?
J'ai remarqué qu'en fonction de la fréquence externe et de ce qui suit la vitesse _X et bien la carte réagit au final tantôt au double (19200 ou bien la moitié, ou bien le quart de la vitesse choisie dans le programme.
Je sais que ce n'est pas tres clair ... mille excuses d'avance.

Autre question concernant la fonction serin : a quoi sert le [timeout] ? et peut il servir a la fonction serout ?
Merci d'avance
 

PieM

Senior Member
Avec un quartz de 16MHz la fréquence de fonctionnement du Picaxe 28X2 sera de 64 MHz, à cause de la présence d'un PLL x4.
donc SERIN T9600_64
Serin est une commande bloquante; le picaxe attend avant de continuer.
le timeout permet de passer à la suite du programme si rien n'a été reçu au bout du temps indiqué dans timeout.

Attention avec serout T: mettre la broche serin à l'état haut avant la première transmission.
 
Last edited:

jominy

New Member
Merci PieM
Effectivement ça marche bien mieux, je n'ai pas encore réussi à mettre en défault le montage pour l'instant, et ça réagit très vite au commandes.

Attention avec serout T: mettre la broche serin à l'état haut avant la première transmission.
Concrètement ça donnerait quoi ? Un high A.3 en début de code (A.3 est ma broche serout) suffirait ou alors il faut passer par dir ... ?
A+
 
Top