Télécommande voiture RC + caméra

PieM

Senior Member
En principe, le RFOUT est une implémentation du codeur/décodeur NK2401 . Donc il stocke en buffer les 8 bytes, calcule le checksum et envoie tout avec les bits de préambule et de synchro en codage Manchester.
Il ne prends que les 8 bytes de data, même s'il y en a plus.

Essaie d'envoyer 9 bytes de donnée, par ex (b0,b0,b1,b1,b3,b3,b5,b5,b7)

autre test à faire : laisser ton TX sous tension et voir si tu as le même problème.

Ce qu'il faudrait c'est voir si la trame envoyée sur le TX est la même que celle reçue sur le RX ....
Sans mesures on reste dans les suppositions.
 

dje8269

Senior Member
autre test à faire : laisser ton TX sous tension et voir si tu as le même problème.
je l'avais déjà fais , aucun problème quand le Tx est activé . par exemple je bouge mes joysticks en permanence , donc j'emet en permanence, et la les TOR, sont parfaitement reconnus ; c'est seulement quand le Tx est inactif que de temps en temps ca bug . Comme si il n'arrivait pas a faire passer une bonne communication, car il est pourtant bien activé ( la led de visu s'allume) .

Ce qu'il faudrait c'est voir si la trame envoyée sur le TX est la même que celle reçue sur le RX ....
Aîe , la il me faudrait ce maudit analyseur logique pour répondre avec certitude

Essaie d'envoyer 9 bytes de donnée, par ex (b0,b0,b1,b1,b3,b3,b5,b5,b7)
exellente ca ! j'essaye ca tout de suite
 

dje8269

Senior Member
Alors le programme ne prends la commande RFout avec 9 bytes . obligé d'en mettre 8 .

Malheureusement sans oscillo je suis septique sur le sertxd , qui ralentit tout et j'ai l'impression que ca me donne de mauvais résultat ;

Je vais essayé de contourner le problème en lisant le scratchpad du 20X2 , ainsi le 14M2 reception ne sera pas perturbé par le sertxd .
 

dje8269

Senior Member
La lecture du strachpad se passe très bien . mais le problème persiste ;
Je ré-affirme , qu'une fois le Tx activé, aucun bug ne se passe( il lit parfaitement l'etat des TOR) ; Il s'agit vraiment d'un problème de l'activation du Tx par un TOR et l'envoie des données .

Il s'agit exactement du même probléme qu'hier quand j'avais l'oscillo. Le passage de l'interrupteur de l'etat 1 à 0 par exemple, active bien mon Tx , mais le RFin reste bloqué , alors que j'ai bien une emission pendant une seconde .

Je voudrais modifier le programme , pour faire d'autre test de réception sans oscillo , mais ça se complique ; Car il faut que j'utilise le hi2c flag , pour voir si le RFin est bloqué ou non .

Voila le programme du 20X2 celui derriere le 14M2 de reception .
Je vous mets le programme mais , ca fonctionne bien .

Quand j'emet je vous le sertxd et les données arrivées sur l'ecran du PC . dès que l'emission s'arrete ( au bout d'une seconde) , le sertxd s'arrete et les donnéees se figent à l'ecran . Ca remplace " autant que faire ce peu" l'oscillo .

Code:
'####################################################################################################
'					Programme Principal
'####################################################################################################

main:
do

	get 0,b0,b1,b2,b3,b4,b5,b6,b7			' Lecture du scratchpad
	
	pause 20

if hi2cflag = 1 then
	SERTxd ("b0=",#b0," ","b1=",#b2," ","b3=",#b4," ","b5=",#b6,13,10)
	hi2cflag = 0
	
end if


loop
Mais tous ca ne résoud pas le soucis ; Je vais planché sur un test en affectant une variable plutôt qu'une bit au TOR on ne sait jamais ; Mais il faut que je modifie tout le programme émission qui va certainement se rallonger.
 
Last edited:

dje8269

Senior Member
Alors même en affectant une variable plutôt qu'une bit au Bp et a l'inter , le problème existe toujours . Cela ne viens donc pas de la ! .

Je me suis rendu compte de quelques chose peut être anodin peut être pas ;

Quand un bug se produit , par exemple je bascule l'inter à 1 . il y a bien émission ( led allumé), mais le RFin reste bloqué .
Si je bouge quelque chose(joystick ou TOR) pendant le blocage rien ne se passe, Le RFin est figé . Je suis obligé d'attendre que le Tx se désactive ( au bout d'une seconde sans rien touché) , pour pouvoir reprendre la communication normalement .
 

PieM

Senior Member
Il s'agit vraiment d'un problème de l'activation du Tx par un TOR et l'envoie des données .
l'activation se fait par un test sur b0. b0 est une variable, pas un bit.

si tu veux éviter d'avoir une valeur b0 = 0, mets le bit 7 à 1 par exemple en début de programme
donc tu auras b0 = 128 ou 129 ou 130 ou 131


Je suis obligé d'attendre que le Tx se désactive
Ben ça me semble logique. tout pendant que le Tx émet, le Rx reçoit, mais RFIN reste bloqué sur la trame incomplète.
 
Last edited:

jojojo

Senior Member
Je maintiens: Problème d'alim.
Le fait de passer le TX en emission doit perturber, même un très bref moment, l'alim.
Test simple, tu mets une capa de 10000µ en // sur l'alim, et tu vois, si ça change quelque chose...
 

dje8269

Senior Member
si tu veux éviter d'avoir une valeur b0 = 0, mets le bit 7 à 1 par exemple en début de programme
donc tu auras b0 = 128 ou 129 ou 130 ou 131
Test effectué. pas concluant , au début j'y ai cru , car le bug à mis beaucoup d'essai pour apparaitre ; Donc cela ne viens pas de la non plus .

Le fait de passer le TX en emission doit perturber, même un très bref moment, l'alim.
Pas de souci je pourrais essayé ca au boulot . 10000µF ca commence a faire du gros condo ca lol . je doute d'avoir des aussi gros .

Mais si c'etait un problème d'alim , pourquoi est ce que ca fonctionne à 100% des cas avec les joysticks ?

Peut etre qu'une subtilité m'echappe . tu penserais genre a un courant d'appel ? car les readadc sont tout le temps alimenté eux ( tension d'environ 2.5V les broches). et le fait de passer brutalement de 0 à Vcc avec les TOR provoquerait ce petit bug ? j'ai bon ?

Un petit condo sur les TOR comme pour les readadc de découplage, peut peut-etre résoudre ca ?

Test simple, tu mets une capa de 10000µ en // sur l'alim, et tu vois, si ça change quelque chose...
Au fait sur quelle alim ? celle de l'émetteur ou des µC . ou juste après la batterie ?

Pour info , j'ai une batterie 7.2V 800mAh qui est decouplé , suivis de deux régulateurs low drop de 5V decouplé encore ; un pour les µC et l'autre seulement pour l'émetteur ;
 
Last edited:

PieM

Senior Member
les alim étant séparées, et le courant consommé par les entrées quelles soient ana ou TOR étant insignifiant, je n'y crois guère!
 

dje8269

Senior Member
Autre élément troublant , c'est que ca le faisait sur l'ancienne télécommande . Quand je vous dis que j'ai que des problèmes bizarre .
 

dje8269

Senior Member
Eureka !!!

je pense que cette fois ce doit etre bon . J'ai réduis le temps de stabilisation de l'émetteur de 90 à 30 ms . et pour le moment je n'ai eu aucun loupé a déplorer(environ une cinquaine d'appui sur le BP et l'inter) . Alors me demandez pas pourquoi ca reagis comme ca !.

J'attends de laisser refroidir pour faire encore une bonne centaine d'essai , et la je pourrais me rejouir et enfin , faire rouler cette voiture
 

dje8269

Senior Member
Yes !!! Encore une bonne cinquaine voir plus de test , et toujours aucun bug ...... ca sent bon cette affaire . Du coup c'est à ce demandé si le respect du temps de stabilisation est obligatoire , ou si on peut s'en passé.

Je remets le programme comme au début, car ce devient le fouillis a force de testé......

Je reprends le sourire, c'est génial , on va pouvoir avancé ......

Les ANNNGGGLLLLLAAAAIIIIISSSSSS, Les frenchieeessss arrivenntttttt
 

dje8269

Senior Member
Bon après remise a niveau du prog ..... re-BUGGGG , chemin inverse pour déterminé le problème .

Apparemment , il ne faut pas collé les variables . en mettant b0,b2,b4,b6 ca fonctionne impec . avec b0,b1,b3,b5 sa déconne . mais en remettant à 90 ms aussi . Donc j'avais deux probléme .

Donc pour le moment c'est espace entre les variables et 30ms de pause de stabilisation . Pour le moment pas de bug .......

Ce soir je m'absente les test finaux demain matin, ou ce soir tard .

Si vous avez une explication possible je serais content de la lire , car moi je sèche complètement .

PS : Aprés reflexion c'est pour ca aussi que j'avais décallé mes variables b1,b3,b5. Car je me souviens au tout début j'avais aussi eu des problèmes avec le readadc , et en decallant ca avait résolus la chose.

@Georges : pour tes TOR peut être pourrait tu essayé sur la voiture du petit-fils

PS : Avez-vous déjà entendu un problème de ce genre sur le forum anglais ?
 
Last edited:

dje8269

Senior Member
Si je la lui reprends maintenant, je vais me faire assassiner
Ca je veux bien le croire !

Mais, oui, je ferais le test.
Je pense que ca vaut le coup d'essayer . En rentrant ce soir d'un repas, j'ai encore fais une bonne cinquantaine d'essai , et zéro bug . Ça fonctionne parfaitement ; Je suis trop content ; demain matin je re-test une dernière fois, et si c'est bon je fais le programme complet ..... maintenant que j'ai la communication sans problème et tout le temps . Ouf je vois enfin la sortie du tunnel .......
 

dje8269

Senior Member
Bon dimanche à tous ,

Et voila encore une bonne cinquantaine de test , toujours pas de bug , même pas un tout petit, rien du tout , que dechi, nada, nothing , ABSOLUMENT aucun raté .......... .

Cette fois c'est enfin la bonne . Je vais encore faire quelques test pour optimiser au max .
 

PieM

Senior Member
et si c'est bon je fais le programme complet
... qui va modifier les timings donc avec risque de perturbation.
Je me répète, mais la méthode est de faire le programme complet hors HF, valider les foncions en en liaison filaire, et seulement après de remplacer le fil par la HF.
Mais tu fais comme tu veux.

Le fait de passer de 90ms à 30ms alors que le mini demandé par le TX est 55ms me laisse très dubitatif sur la suite.
Dynamic timing :
TX enable to full RF - 53 55 ms
 

dje8269

Senior Member
Héhéhéhé .

Donc quand je passe à 32Mhz , quelques bug .
Quand j'enlève la pause de 30 ms quelques bug .

Donc je reste comme ca .

@PieM :

Ben en fait le programme de la télécommande est deja complet, les fonctions demandées :

20M2 gérant les infos qui devront etre envoyées par RF

- 3 lecture analogiques , correspondant au joystick ( 1 joystick haut/bas et droite/gauche , et l'autre joystick droite/gauche seulement
- 1 lecture TOR d'un BP permettant de faire bouger la caméra et seulement la caméra , coupant le moteur de la voiture ( la camera pourra pivoter seulement quand la voiture sera l'arrêt)
- 1 lecture TOR d'un interrupteur a levier , permettant d'activer l'emetteur vidéo se trouvant sur la voiture .

14M2 gérant les infos de bord

- 1 pilote de led pour afficher l'état de la batterie
- 1 lecture analogique pour lire la tension batterie
- 1 sortie Beep, pour signaler des baisses de niveau et/ou la fin de la batterie .


Voila la télécommande est donc bien finie , il me reste donc a implémenter le programme du 14M2 pour les leds ...... voir si ca ne perturbe pas .

Ensuite la voiture .

Le 14M2 de réception , bien lui du coup rien de plus simple , il est déjà finis . je recoit RFin et j'ecrit dans le scratchpad . Rien a rajouter

Je parlais de programme final , le 20X2 qui lui va gérer la voiture . donc aucun problème de timing sur celui ci, car il est indépendant.

Le fait de passer de 90ms à 30ms alors que le mini demandé par le TX est 55ms me laisse très dubitatif sur la suite.
Moi aussi, mais cela peut , peut-être s'expliquer . Je me souviens au début je faisais sans cette pause ; ca fonctionne bien , car comme tu me l'as expliqué le RFin attend, donc peut être que le premier envoie est mangé mais pas le deuxiéme . Quand je met aucune pause, ca fonctionne impeccable , sauf dans un cas précis . quand l'interrupteur est à 1 , j'attends que le Tx se désactive, et quand je passe l'inter à 0 , il ne le prend pas en compte ; c'est le seul bug que j' ai pus constater sans la pause ;
Mais je garde ta remarque sous le coude pour la suite, car moi aussi je comprends pas pourquoi . Mais aussi je comprends pas pourquoi a 90ms ca deconne ; ca devrait etre moins réactif, mais ca devrait fonctionner pourtant non ...... .

Programme 20M2 Emetteur :
Code:
#PICAXE 20M2

'#################################################################################
'########################    Programme Emetteur V4.0   ###########################	
'#################################################################################

'##########################    configuration    ################################	
' 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ée l'Etat de la broche

'b0 à b7 pour les infos envoyés
'b8 flag_EN
'b9 V_TOR


symbol B_BP		= PinB.5
symbol B_EN 	= B.6
symbol B_DONNEE 	= B.7
symbol B_Inter	= PinC.1

symbol flag_EN	= b8
symbol V_TOR	= b9
symbol V_Joystick = W13


dirsB = %11000000	'declare B.7 et B.6 en sortie


'##########################    Initialisation    ################################	

setfreq m4

b0 = V_TOR

'#################################################################################
'##########################    Programme Principal    ############################	
'#################################################################################

do

readadc C.3,b2		' potar Av/ar Vhl/cam	PM : de 166 à 168
readadc B.0,b4		' Potar Dr/Ga Vhl		PM : de 103 à 105
readadc C.7,b6		' Potar Dr/Ga cam		PM : de 103 à 105

bit0 = B_Inter		' Activation de l'emetteur Vidéo
bit1 = B_BP			' Activation du mouvement camera

V_Joystick = b2+b4+b6	' Calcul de la position des joysticks ( PM moyen 375 +/4)



if V_Joystick < 372 or V_Joystick > 378 or  V_TOR <> b0 then	' on verifie qu'une commande est appuyée ou un changement d'etat d'un TOR


 	if flag_EN = 0 then 	' A chaque nouvelle activation on marque une pause de 30ms pour stabilisé le Tx
		high B_EN
		pause 30		' pause de 30ms
		flag_EN = 1		' Met le flag d'activation à 1
	end if
	
	time = 0			' remise à zéro du timer
 	
 else
 
 	if time > 1 then 		' Si les commandes sont au PM, pendant plus de 1s(donc 2s) on eteind
 		low B_EN
 		flag_EN = 0		' Raz du flag
 	end if
 
end if

rfout B_DONNEE,(b0,b1,b2,b3,b4,b5,b6,b7) 		'envoi des données par RF

V_TOR = b0			' Sauvegarde des TOR pour comparaison

loop
14M2 réception:
Code:
#PICAXE 14M2

'#################################################################################
'##########################    Programme Recepteur    ############################	
'#################################################################################

'########################  Configuration  ########################

dirC.0=0				'declare C.0 en entrée DATA

inputtype %0000000100000000 	'met la broche C.0 en  mode TDS


'########################  Initialisation  ########################

setfreq m4

hi2csetup i2cmaster, %10100000, i2cfast_4, i2cbyte 	' met le 14M2 en mode maitre


'####################################################################################################
'					Programme Principal
'####################################################################################################
do

RFin C.0,b0,b1,b2,b3,b4,b5,b6,b7		' Enregistre les données du RX

hi2cout 0,(b0,b1,b2,b3,b4,b5,b6,b7)	

loop
 
Last edited:

dje8269

Senior Member
Apres ajout du programme du 14M2 option sur la télécommande . Aucun bug a déclarer .

les valeurs lus par le readadc sont précises juste le jeu mécanique des potars qui varie de +/- 1 la valeur ( de la chinoiserie) .

Pour le moment tout les voyants sont au vert pour continuer l'aventure . Mais bon il me reste maintenant les conversions et les mises à l'échelle......... Lol
 

dje8269

Senior Member
Lol de mes valeurs , comme d'hab . Mais j'avais marqué une valeur , mais j'ai finis par trouvé . Je vous repose le truc pour correction !!

Je suis en train de planché sur la direction ;

Pour le moteur :

Valeur du joystick en avant : de 167 à 78
Point milieu ( PM) : 167
Valeur du joystick en arrière de 167 à 255


Il faut obtenir une valeur allant de 100 à 200 , en sachant que 150 = moteur a l'arrêt comme pour un servo en fait . je suis pas du tout à cheval sur la précision, car avec les potars chinois , on s'en fou, comme ca on peut arrondir pour faciliter les calculs le plus possible .

J'en suis rendu la , pour le moteur .

Code:
'--------------------------------
'#####  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

V_moteur = V_moteur*10/16
V_moteur = 254 - V_moteur

servopos B_moteur, V_moteur		' envoi du pwm sur le moteur
Pour la direction les valeurs sont :
Attention c'est différent car le servo ne doit pas allez a fond le débattement est réduit de 180 à 120
Joystick a droite va de 104 à 185
PM : 104
Joystick à gauche de 104 à 29 .
Par contre les valeurs du servo doivent aller de à droite 150 à 120max et a gauche de 150 à 180 max

Pour la direction j'en suis rendu la :

Code:
'--------------------------------------
'#####  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


V_direction = V_direction / 7 * 3		' Mise à l'echelle
V_direction = 192 - V_direction

servopos B_Direction,V_direction		' Positionnement du servo
 

dje8269

Senior Member
Si si . c'est ce qui permet de simplifier les calculs . Mais effectivement je l'ai pas marqué ; J'ai fais des petites zone morte ;
Pour le moteur PM a 167 . j'ai pris 170 et 160 . et les min max j'ai arrondi un peu avant le chiffre 80 au lieu de 78 et 250 au lieu de 255
Pour la direction PM à 104 ; j'ai pris 100 et 110 . et les min max j'ai arrondi un peu avant le chiffre 30 au lieu de 29 et 180 au lieu de 185

Les valeurs min max pourront etre ajusté en limitant min et max les valeurs par soft pour encore simplifié ;
 

PieM

Senior Member
si ça marche tant mieux, mais en neutralisant les valeurs de zone morte, comme ça, ton servo ne sort pas progressivement du neutre, puisque le calcul saute de 170 à 160 et de 100 à 110
et remplace ton /7*3 par *3/7.
 

dje8269

Senior Member
si ça marche tant mieux, mais en neutralisant les valeurs de zone morte, comme ça, ton servo ne sort pas progressivement du neutre, puisque le calcul saute de 170 à 160 et de 100 à 110
j'ai pas encore testé en vrai , j'ai seulement vérifié par des sertxd les valeurs min et max . Je comprends pas trop ce truc de zone morte , et/ou je sais pas comment m'y prendre .

Pour faire de vrai zone morte , il faudrait que je divise en deux mes calculs non ? pour activer tel ou tel partie?

et remplace ton /7*3 par *3/7.
Oups , merci .

Le pire c'est que ca ce complique avec la camera .
 

PieM

Senior Member
il faudrait que je divise en deux mes calculs non ? pour activer tel ou tel partie?
ben oui! c'est ce que tu avais fait pour l'autre ... déjà oublié ?

Tu donneras exactement les valeurs que tu veux. Te le calculerai...
 

dje8269

Senior Member
Tu donneras exactement les valeurs que tu veux. Te le calculerai...
Je serais pas contre un petit coup de main la dessus ; Mais les valeurs je te les ai donnés pour le moteur et la direction du moins ; Apres il faut adapter a ta guise pour simplifié au max , sans pour autant perdre la moitié de la course des potars ; mais si le moteur est a fond avant que le joystick soit physiquement a fond , c'est pas grave du tout ;

Dans le code en #1064 , les valeurs sont les vrais valeurs des potars, et apres ce sont les valeurs à atteindre pour les commandes servo .

Si jamais tu trouve ca simple attend de voir les mises a l'échelle de la camera ....

déjà oublié ?
J'ai un peu la tête comme une passoire, voila depuis 12h00 que je suis dans ces mises à l'échelle ........ ; Après ca c'est presque finis . Il faudras ajuster certainement quelques petites choses . Surtout le fait d'appuyer sur le BP qui change pas mal de chose .
 

PieM

Senior Member
pour ton moteur:

potard : 78 - 255
servo : 200 - 100
seuil mini 165 seuil maxi 168 zone morte de 3

en dessous de 165 :

V_moteur = 165 - V_moteur *50/87
V_moteur = 150 + V_moteur

au dessus de 168 :

V_moteur = V_moteur - 168 *50/87
V_moteur = 150 - V_moteur

pour ta direction:


potard : 29 - 176 (185 pas possible si 104 est le milieu du potard)
servo : 180 - 120
seuil mini 101 seuil maxi 104 zone morte de 3

en dessous de 101
V_direction = 101 - V_direction * 5/12
V_direction = 150 + V_direction

au dessus de 104
V_direction = V_direction - 104 * 5/12
V_direction = 150 - V_direction
 

dje8269

Senior Member
Merci PieM , ca fonctionne bien .

J'ai enfin fait roulé la voiture pour tester en condition réel , et aussi testé mon typon que j'avais refait . Ca roule c'est déjà pas mal .

Par contre , je ne suis pas super satisfait de la réactivité . Il y a un temps de latence un peu gênant je trouve, par rapport a l'ancienne .

Je miserais un sou , sur la liaison radio et le hi2cflag . vous savez ma sécurité de perte de communication . je verrais tout ca peut être à l'oscillo .
 

dje8269

Senior Member
J'ai oublié de vous fournir mon programme de test réel , des fois que j'ai fais une boulette qui degraderais ma communication .

Code:
#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_moteur2 = 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 = pinC.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_moteur , 150		' Servo moteur en broche C.0, position neutre a 150
servo B_Direction,150		' Servo direction en broche B.1, position neutre a 150
servo B_Pan,150			' Servo Pan en broche B.2, position neutre a 150
servo B_Tilt,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

	get 0,b0,b1,b2,b3,b4,b5,b6,b7			' Lecture du scratchpad

'-----------------------------------	
'##### perte de communication  #####

if hi2cflag = 0 then 					'Si flag=0, donc perte de com

	V_compteur_com = V_compteur_com + 1 max 60'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 40 erreurs à la suite, on arrete la machine
		end if					
else
	hi2cflag = 0					're-armement du flag
	V_compteur_com = 0				'RAZ du compteur			
end if


'------------------------------
'#####  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 < 165	
	V_moteur = 165 - V_moteur *50/87
 	V_moteur = 150 + V_moteur
 	
case > 168
 	V_moteur = V_moteur - 168 *50/87
 	V_moteur = 150 - V_moteur
else
	V_moteur = 150
	
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	
	V_direction = 101 - V_direction * 5/12
 	V_direction = 150 + V_direction
 	
case > 104
 	V_direction = V_direction - 104 * 5/12
 	V_direction = 150 - V_direction min 120
else
	V_direction = 150
	
end select

servopos B_Direction,V_direction		' Positionnement du servo


loop



'####################################################################################################
'					Programme secondaire
'####################################################################################################


'########     Perte de communication     ##########
Escape:

do while hi2cflag = 0		' Tant que le scratchpad n'as rien recu on eteint le moteur
	servopos B_moteur,150
		
loop

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
 

PieM

Senior Member
sur le plan de la logique je préfèrerais :

Code:
main:

do

if hi2cflag = 1 then 					'Si flag=1, donc com OK
	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			
else	'##### perte de communication  #####
	V_compteur_com = inc V_compteur_com max 60   '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					
end if
 

dje8269

Senior Member
Ok Je pense que c'est mieux aussi ;

En gros je lis mon sctrachpad , seulement quand une donnée est écrit dessus c'est bein ca ?

Est ce que tu verrais un test efficace, pour visualiser cela ? Je m'explique j'avais l'impression et je l'ai encore, au vu des symptômes que mon compteur d'erreur ( perte de com) compte beaucoup trop .
Ceci peut etre du a plusieurs raison . une mauvaise com donc mon RFin se bloque .
Mais aussi au fait que mon programme 20X2 tourne plus vite que le RFin, et ainsi il attend l'info et donc compte en attendant .

Je voudrais visualisé ceci . crois tu qu'en mettant une sortie a 1 quand y'as lecture et à 0 sinon , je pourrais le voir a l'oscillo ?
 

PieM

Senior Member
Je voudrais visualisé ceci . crois tu qu'en mettant une sortie a 1 quand y'as lecture et à 0 sinon , je pourrais le voir a l'oscillo ?
oui bien sûr : tu fais un pinC.x = hi2flag

Tu pourrais passer en sécurité en fonction du timer plutôt que d'un compteur.
 

dje8269

Senior Member
Tu pourrais passer en sécurité en fonction du timer plutôt que d'un compteur
Hum.... je sais plus pourquoi j'avais fais le compteur ... mais y'avait une raison . Soit que le timer peut prendre en compte seulement 1 secondes minimum , ce qui est énorme . soit que je pouvais pas fixé de max un truc du genre ..... et le timer ou le timer est pris par la commande servo, même si je il reste le timer3 .

Ok je vais faire des test vite fait . a tout de suite
 

dje8269

Senior Member
Test effectué .

Je pense que c'est normal , mais alors c'est pas cool ; Explications :

Voici le programme je vous passe l'initialisation :
Code:
'####################################################################################################
'					Programme Principal
'####################################################################################################

main:
do

B_led = hi2cflag

'-----------------------------------	
'##### perte de communication  #####

If hi2cflag = 1 then

	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			

	
else		'Si flag=0, donc perte de com
	
V_compteur_com = V_compteur_com + 1 max 60'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 40 erreurs à la suite, on arrete la machine
	end if					

end if


'------------------------------
'#####  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 < 165	
	V_moteur_modif = 165 - V_moteur *50/87
 	V_moteur_modif = 150 + V_moteur_modif
 	
case > 168
 	V_moteur_modif = V_moteur - 168 *50/87
 	V_moteur_modif = 150 - V_moteur_modif
else
	V_moteur_modif = 150
	
end select

servopos B_moteur, V_moteur_modif		' 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	
	V_direction = 101 - V_direction * 5/12
 	V_direction = 150 + V_direction
 	
case > 104
 	V_direction = V_direction - 104 * 5/12
 	V_direction = 150 - V_direction min 120
else
	V_direction = 150
	
end select

servopos B_Direction,V_direction		' Positionnement du servo

'---------------------------------------
'#####  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 

V_Pan = V_Pan * 6 / 5		' Mise a l'echelle
V_Pan = 275- V_Pan 

servopos B_Pan,V_Pan		' Positionnement du servo


'----------------------------------------
'#####  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 à 170 (max 172)			


V_Tilt = V_moteur * 10 / 16		' Mise a l'echelle
V_Tilt = V_Tilt + 45  max 170

servopos B_Tilt,V_Tilt			' Positionnement du servo

loop



'####################################################################################################
'					Programme secondaire
'####################################################################################################


'########     Perte de communication     ##########
Escape:

do while hi2cflag = 0		' Tant que le scratchpad n'as rien recu on eteint le moteur
	servopos B_moteur,150
		
loop

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
Donc je met une sortie à 1 quand quelque chose est écrit dans le scratchpad . Ceci fais la réactivité de la voiture . Plus vite on re-ecrit dans le scratchpad , plus vite les données sont mises à jour et donc interprétés . L'écriture du scratchpad , se fait juste après le RFin du récepteur . Donc on en déduit qu'il se met a jour toutes les 37 ms ( durée du RFin) , dans des conditions parfaites de communication (sans que le RFin se bloque) .

Maintenant a l'oscillo ; j'ai donc mis ma sonde sur la broche de la led test que j'avais mis pour faire des test justement .

On voit qu'une fois l'état à 1 , qui signifie une MAJ et une écriture dans le scratchpad, on remet le flag à zéro, donc le temps de l'état haut = le temps du programme. le programme met 13ms pour faire une boucle ! . ok
Comme le RFin met a jour toutes les 40ms( pour arrondir ) . celui signifie que le programme feras trois tour avant d'etre remis a jour , donc mon compteur devrait au minimum compter jusqu'a 3 a chaque coup . On voit sur la photo que des fois ca dur beaucoup plus longtemps . et c'est la je pense que se situe la mauvaise reactivité .

Qu'en pensez vous ?

Sans titre.JPG
 

dje8269

Senior Member
Autre test . J'ai ralentis la cadence du µC passé de 8Mhz à 4Mhz (attention l'échelle de temps de l'oscillo à changé aussi) . Je pense que c'est mieux . certes le programme met maintenant 22ms pour faire une boucle . Mais on remarque sur la photo , que souvent il enchaine plusieurs MAJ ( quand l'etat haut dur plus longtemps que 22ms) . Et le temps de l'état bas le plus long , ne dépasse pas les 40ms . On remarque qu'il y as nettement plus d'état haut que d'etat bas .

toujours pareil , pensez vous que mes déductions soient bonnes ? Je dirais même qu'il faudrait que la boucle du programme dur aussi longtemps ou plus longtemps , que le Rfin, ainsi j'aurais tout le temps l'etat haut ? , dans ce cas de figure le revers de la médaille serait que si je loupe un RFin ( la durée de MAJ seras aussi rallongée) .

j'attends vos commentaires avec impatience . ( je vais vite mangé)

HPIM2249.jpg
 
Top