Télécommande voiture RC + caméra

PieM

Senior Member
Pas revu le schéma mais en principe on mets une résistance entre picaxe et gate. c'est pas top au niveau vitesse de commutation mais ça protège les µC selon le Mosfet.
 

PieM

Senior Member
Effectué .

La led s'allume tout de suite , rien ne bouge .

Je met a chaque fois tout le programme pour etre certain de ce que j'injecte.
Je comprends mal ce qui peut se passer car le timing du 14M2 est plus court que celui du 28X2
On va essayer de contourner le problème . Essaie ça et on continuera en fonction du résultat.
(modif en début et en fin de prog.)

Attention que j'utilise b5 comme "flag" - vérifier s'il n'est pas utilisé ailleurs ...

Code:
#PICAXE 28X2

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

Symbol moteur = B.0
Symbol sens = C.6
Symbol Direction = B.1
Symbol Pan = B.2
Symbol Tilt = B.3
Symbol Sirene = B.5
Symbol Secu = PinC.7
Symbol Gyro = pinA.0
Symbol Option = A.2

dirsA = %0101	'declare les broches A.0 et A.2 en sortie
dirsB = %00101111 'declare les broches B.0, B.1, B.2, B.3, et B.5 en sortie
dirsC = %01000000 'declare La broche C.7 en entrée


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

setfreq m8	

hi2csetup i2cslave, %10100000		' Met le 28X2 en Esclave

servo B.1,150				'Servo direction en broche B.1, position neutre a 150, MAJ 20ms

pwmout  B.0, 125, 0 			' rapport cyclique a 0

put 1,125					' Ecrit dans le scratchpad la valeur du point milieu pour le moteur
put 3,125					' Ecrit dans le scratchpad la valeur du point milieu de la direction
Low sens					' met le relais a l'etat bas


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


do
[COLOR="#0000FF"]	get 0,b0,b1,b2,b3,b4,b5			' Lecture du scratchpad
if b5 = 111 then  gosub Escape			
put 5, 111[/COLOR]

endif	  	   				

'#####  Commande TOR  #####

Gyro = bit4	

'#####  Commande moteur  #####

Select Case b1			

Case < 101 		'Marche arriere
	high sens
	b1 = 100-b1					' Mise a l'echelle
	w13 = b1*37/10+130  max 500
	
	
Case > 128		'Marche avant
	low sens
	b1= b1-129					'Mise a l'echelle
	w13 = b1*3+130 max 500			'130 commence à faire avancer la voiture.
	
else
	w13 = 0					'Sinon point milieu , donc a l'arret

end select

pwmduty B.0, w13					'envoi du pwm sur le moteur

'#####  Commande direction  #####

Select case b3

case  < 120
	b3 = b3*3/8
	b3 = 192 - b3
case > 134
	b3 = b3*4/10
	b3 = 200 - b3
else
	b3=150
	
end select

servopos 1,b3

Loop

[COLOR="#0000FF"]Escape:
 Pulsout gyro, 5000
return[/COLOR]
 

dje8269

Senior Member
Il ne veut pas entendre du pulsout gyro, 5000 . Il me met une erreur sur cette ligne pendant la prog .

remplacement par A.0 ai lieu de gyro qui correspond a pinA.0 j'aurais pus le voir avant désolé

Résultat :

La voiture fonctionne correctement , j'arrive à tourner et à avancer . La led clignote super vite en permanence. Si j'eteins la télécommande le moteur reste en route

J'ai tout de même remarqué que la led ne clignote pas de la même facon quand la télécommande est allumée . Télécommande éteinte la led va super vite mais proprement . Télécommande allumée , il clignote moins vite et bizarrement .
Code:
#PICAXE 28X2

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

Symbol moteur = B.0
Symbol sens = C.6
Symbol Direction = B.1
Symbol Pan = B.2
Symbol Tilt = B.3
Symbol Sirene = B.5
Symbol Secu = PinC.7
Symbol Gyro = pinA.0
Symbol Option = A.2

dirsA = %0101	'declare les broches A.0 et A.2 en sortie
dirsB = %00101111 'declare les broches B.0, B.1, B.2, B.3, et B.5 en sortie
dirsC = %01000000 'declare La broche C.7 en entrée


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

setfreq m8	

hi2csetup i2cslave, %10100000		' Met le 28X2 en Esclave

servo B.1,150				'Servo direction en broche B.1, position neutre a 150, MAJ 20ms

pwmout  B.0, 125, 0 			' rapport cyclique a 0

put 1,125					' Ecrit dans le scratchpad la valeur du point milieu pour le moteur
put 3,125					' Ecrit dans le scratchpad la valeur du point milieu de la direction
Low sens					' met le relais a l'etat bas


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


do
	get 0,b0,b1,b2,b3,b4,b5			' Lecture du scratchpad
if b5 = 111 then  gosub Escape			
put 5, 111
	  	   				

'#####  Commande TOR  #####

Gyro = bit4	

'#####  Commande moteur  #####

Select Case b1			

Case < 101 		'Marche arriere
	high sens
	b1 = 100-b1					' Mise a l'echelle
	w13 = b1*37/10+130  max 500
	
	
Case > 128		'Marche avant
	low sens
	b1= b1-129					'Mise a l'echelle
	w13 = b1*3+130 max 500			'130 commence à faire avancer la voiture.
	
else
	w13 = 0					'Sinon point milieu , donc a l'arret

end select

pwmduty B.0, w13					'envoi du pwm sur le moteur

'#####  Commande direction  #####

Select case b3

case  < 120
	b3 = b3*3/8
	b3 = 192 - b3
case > 134
	b3 = b3*4/10
	b3 = 200 - b3
else
	b3=150
	
end select

servopos 1,b3

Loop

Escape:
 Pulsout A.0, 5000
return
 

Jacques ROBERT

Senior Member
Bonjour dje8269,
En radiocommande il est toujours conseillé de mettre l'émetteur en marche avant le récepteur et à l'inverse couper le récepteur avant l'émetteur,car le récepteur privé de signal peut
créer des signaux parasites qui peuvent entrainer des dysfonctionnements des servos (entre autres).
Cordialement.
 

PieM

Senior Member
Ok, donc ça ça veut dire que ta réception radio est très irrégulière ... ce qui explique le phénomène précédent.

Vais te proposer un truc pour essayer de filtrer ça et d'avoir ta sécurité...
 

Jacques ROBERT

Senior Member
De plus,si le ou les moteurs sont commandés en PWM,le picaxe générateur continue à délivrer un signal qui peut avoir un rapport de l'ordre de 50% ce qui explique que le
moteur continue de tourner.
 

dje8269

Senior Member
Merci Jacques pour ces précisions .

Encore une fois la vérité est ailleurs .

Je vous explicite ce que j'ai essayé .

sur le picaxe maitre ;

J'ecris dans le scratchpad extinction du moteur en mettant la valeur b1 a 125 .
je recois le RFin
je re-ecris dans le scratchpad la commande moteur recu par le RFin .

SI le Rfin n'est pas bloqué donc il qu'il recoit un signal , et donc la valeur du moteur est mise a jour .
Si le RFin est bloqué la valeur du moteur n'est pas mis a jour ,et se trouve donc eteint . a la prochaine lecture du scratchpad pour l'esclave il devrait eteindre le moteur .

voici le programme du maitre modifié .

Code:
#PICAXE 14M2

'########################  Configuration  ########################
Symbol Info = pinC.0 
Symbol Klaxon = C.3
Symbol Phare = pinC.4 

dirC.0=0		'declare C.0 en entrée DATA
dirC.3=1		'Declare C.3 comme une sortie Klaxon
dirC.4=1		'Declare C.4 comme sortie Phare

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


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

setfreq m32								' met le frequence a 32Mhz

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


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

b1 = 125
hi2cout 0,(b0,b1)

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

Phare = bit0

hi2cout 0,(b0,b1,b2,b3,b4,b5,b6,b7)		' Envoi des données au scratchpad du 28X2 esclave

loop
Le résultat de cette expérience me laisse perplexe quand a la réaction de cette fameuse commande bloquante RFin !!!!!

En effet , la voiture fonctionne bien , mais quand j'éteins la télécommande le moteur ne se coupe pas. Pourtant la dernière infos qu'il a dus recevoir c'est de couper le moteur.

Si le moteur ne se coupe c'est que le scratchpad a garder une valeur autre que l'extinction. c'est incompréhensible cette affaire

Peut etre une histoire de tache de fond un truc du genre qu'il faut mettre a jour ?
 

PieM

Senior Member
En radiocommande il est toujours conseillé de mettre l'émetteur en marche avant le récepteur et à l'inverse couper le récepteur avant l'émetteur,car le récepteur privé de signal peut
créer des signaux parasites qui peuvent entrainer des dysfonctionnements des servos (entre autres).
Très bonne remarque effectivement.
De toute façon pour détecter un défaut de réception, il serait difficile de faire la distinction entre le fait qu'il est allumé après la mise sous tension du récepteur, et le fait qu'il est en panne en cours d'utilisation...

Ci joint programme à tester.
dans le principe on compte le nombre de défauts de réception consécutifs
si supérieur à 50, ici, on arrête le moteur, on signale et on reboucle avec la consigne moteur à l'arrêt.
Si le signal revient on redémarre.

Code:
#PICAXE 28X2

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

Symbol moteur = B.0
Symbol sens = C.6
Symbol Direction = B.1
Symbol Pan = B.2
Symbol Tilt = B.3
Symbol Sirene = B.5
Symbol Secu = PinC.7
Symbol Gyro = pinA.0
Symbol Option = A.2

dirsA = %0101	'declare les broches A.0 et A.2 en sortie
dirsB = %00101111 'declare les broches B.0, B.1, B.2, B.3, et B.5 en sortie
dirsC = %01000000 'declare La broche C.7 en entrée


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

setfreq m8	

hi2csetup i2cslave, %10100000		' Met le 28X2 en Esclave

servo B.1,150				'Servo direction en broche B.1, position neutre a 150, MAJ 20ms

pwmout  B.0, 125, 0 			' rapport cyclique a 0

put 1,125					' Ecrit dans le scratchpad la valeur du point milieu pour le moteur
put 3,125					' Ecrit dans le scratchpad la valeur du point milieu de la direction
Low sens					' met le relais a l'etat bas


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

main:
do
	get 0,b0,b1,b2,b3,b4,b5			'Lecture du scratchpad
	if b5 = 111 then  
        gosub Escape	'si pas de mise à jour
	else 
        w12 = 0: gyro = 0		'sinon RAZ compteur défauts
	endif			
	put 5, 111						'pseudo flag de test
	  	   				

'#####  Commande TOR  #####

Gyro = bit4	

'#####  Commande moteur  #####

Select Case b1			

Case < 101 		'Marche arriere
	high sens
	b1 = 100-b1					' Mise a l'echelle
	w13 = b1*37/10+130  max 500
	
	
Case > 128		'Marche avant
	low sens
	b1= b1-129					'Mise a l'echelle
	w13 = b1*3+130 max 500			'130 commence à faire avancer la voiture.
	
else
	w13 = 0					'Sinon point milieu , donc a l'arret

end select

pwmduty B.0, w13					'envoi du pwm sur le moteur

'#####  Commande direction  #####

Select case b3

case  < 120
	b3 = b3*3/8
	b3 = 192 - b3
case > 134
	b3 = b3*4/10
	b3 = 200 - b3
else
	b3=150
	
end select

servopos 1,b3

Loop
'________________________________________
'traitement en cas de défaillances
'si plus de 50 consécutives, arrêt moteur + signal
Escape: 
	inc w12 
	w12 = w12 max 60000
	If w12 > 50 then
	pwmout B.0, OFF 'Moteur à l'arrêt
	put 1, 125 		' lors du return laisse le moteur à 0
	Gyro = 1		'allume le gyro
	endif
return
'==========================================
 

dje8269

Senior Member
Resultat du test :

Quand le TX est allumé , la direction fonctionne bien , mais le moteur ne fonctionne pas . la led est éteinte en permanence.

Quand j'eteins le TX , le servo se met a "vriboter" , et la led reste très faiblement allumé.

Ce que je trouve positif dans ce test , c'est qu'il se passe quelques chose quand on éteint le TX c'est déjà une victoire en soi . même si ca n'as pas la réaction souhaitée .
 

dje8269

Senior Member
Autre test :

retour a la base .

le principe : si je recois rien je vais vers escpae que allume la led .
sinon je continu mon chemin.

Voila ce qui se passe .

si pas de signal ( TX eteint) , la led est allumé fixe
Quand j'allume le TX, la led se met a clignoter. et la voiture fonctionne bien ( direction et moteur)
Si je re-eteins , la led s'allume fixe .

Je pense qu'il y as un probléme de vitesse, ou de temps quand on regarde se flag un truc du genre .

Car si la led clignote , c'est que un coup il recoit le signal et un coup non . il faut creuser la dessus je pense.

Code:
#PICAXE 28X2

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

Symbol moteur = B.0
Symbol sens = C.6
Symbol Direction = B.1
Symbol Pan = B.2
Symbol Tilt = B.3
Symbol Sirene = B.5
Symbol Secu = PinC.7
Symbol Gyro = pinA.0
Symbol Option = A.2

dirsA = %0101	'declare les broches A.0 et A.2 en sortie
dirsB = %00101111 'declare les broches B.0, B.1, B.2, B.3, et B.5 en sortie
dirsC = %01000000 'declare La broche C.7 en entrée


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

setfreq m8	

hi2csetup i2cslave, %10100000		' Met le 28X2 en Esclave

servo B.1,150				'Servo direction en broche B.1, position neutre a 150, MAJ 20ms

pwmout B.0, 125, 0 			' rapport cyclique a 0

put 1,125					' Ecrit dans le scratchpad la valeur du point milieu pour le moteur
put 3,125					' Ecrit dans le scratchpad la valeur du point milieu de la direction
Low sens					' met le relais a l'etat bas


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

main:
do
if hi2cflag = 0 then Escape		'si pas de signal on appelle les pompiers
	hi2cflag = 0			' re-armement du flag
	
	get 0,b0,b1,b2,b3,b4,b5			' Lecture du scratchpad



'#####  Commande TOR  #####

Gyro = bit4	

'#####  Commande moteur  #####

Select Case b1			

Case < 101 		'Marche arriere
	high sens
	b1 = 100-b1					' Mise a l'echelle
	w13 = b1*37/10+130  max 500
	
	
Case > 128		'Marche avant
	low sens
	b1= b1-129					'Mise a l'echelle
	w13 = b1*3+130 max 500			'130 commence à faire avancer la voiture.
	
else
	w13 = 0					'Sinon point milieu , donc a l'arret

end select

pwmduty B.0, w13					'envoi du pwm sur le moteur

'#####  Commande direction  #####

Select case b3

case  < 120
	b3 = b3*3/8
	b3 = 192 - b3
case > 134
	b3 = b3*4/10
	b3 = 200 - b3
else
	b3=150
	
end select

servopos 1,b3

Loop

Escape:
gyro = 1
goto main
 

PieM

Senior Member
C'est quoi ce programme que tu remets en #370 !? tu te mélanges les pinceaux là !

Dans celui que je t'ai envoyé, dans Escape, tu remplaces la valeur 50 par 200.
 

PieM

Senior Member
Quand le TX est allumé , la direction fonctionne bien , mais le moteur ne fonctionne pas . la led est éteinte en permanence.
Normal ! grosse fatigue 2 !!
Remplace pwmout B.0, OFF par pwmduty B.0 , 0
 

dje8269

Senior Member
Héhéhé ....... ca fonctionne ;

Résultat .

TX allumé , tout fonctionne bien . direction et moteur .
TX éteint , la led s'allume après environ 2,5 secondes et coupe le moteur . La led s'allume faiblement . Mais dans le principe ca fonctionne .
Quand je re-allume le TX, la led s'eteint de suite , et le moteur peu repartir .
 

PieM

Senior Member
Tu vois quand tu veux ...

Tu peux réduire le compteur si tu veux plus de réactivité lors de l'arrêt, mais ne pas trop descendre car ta voiture risque le hoquet.
L'avantage c'est que ça sécurise tout problème lié à la transmission.

En fait le hi2cflag doit marcher (je m'en sers mais pas avec une trans radio) .
La difficulté tient au fait de l'irrégularité du rfin. Donc il faudrait faire avec lui ce que j'ai fait avec b5 et le compteur.

Redonne ton programme de l'émetteur pour voir ?

Tu pourrais même avoir une coupure complète de l'alim de la voiture au bout d'un temps de plusieurs minutes par exemple, après extinction de ton émetteur. (un petit relai à ajouter)
 

jojojo

Senior Member
Sans vouloir "radoter", je rapelle, ici, que le seul moyen de gérer une perte de niveau du signal reçu, c'est un RX avec une sortie RSSI.
Ceci mis à part, la remarque de Jacques est évidemment très futée : On ne démarre JAMAIS un RX, sans avoir auparavant mis en route le TX.
Quoique, en proportionnel analogique simple, on peut aussi se prémunir.
Comme ça :

Code:
Do
Pulsin ENTREE,1,w0		'Mesure créneau entrée
Loop while w0<800 or w0>1600	'Sécu demarrage, si TX éteint
 

PieM

Senior Member
Sans vouloir "radoter", je rapelle, ici, que le seul moyen de gérer une perte de niveau du signal reçu, c'est un RX avec une sortie RSSI.
On ne gère pas la perte de signal, mais la non réception d'un code numérique. Ce qui englobe aussi la perte de signal.

Sinon, c'est évident qu'on peut faire mieux qu'avec des TX RX à 3&#8364;.
Faute de RSSI , là , si le signal est trop faible pour porter l'info, RFIN se met en stand by, et on peut agir.
Certes, ça peut choquer des puristes... L'essentiel est qu'il y ait au moins une personne de satisfaite en la personne de dje

Je fais remarquer aussi que si on démarre le RX avant, le moteur ne se met pas en marche...
 
Last edited:

dje8269

Senior Member
Tu vois quand tu veux ...
Sur le coup, c'est toi qui as fait le boulot .

Moi j'ai juste essayé de comprendre et de reflechir a mon niveau .
Par contre pour etre franc , je m'attendais a plus de réactivité .
Avec 50 ca fonctionnait pas , avec 200 nickel . J'imagine un juste milieu a 100/150 . donc une grosse seconde de réactivité. C'est toujours mieux que rien du tout, mais à 30 Km/h, la voiture en 1 seconde en fait du chemin.

La difficulté tient au fait de l'irrégularité du rfin
C'est ici que je bloque . car que viens faire le RFin dans la mise a 1 du flag hi2c. comme les frequences de travail sont pas les memes , il s'ecoule 4 fois plus de temps entre les deux , a savoir que le flag est mise a 1 que l"esclave n'en lira qu'1 seul . je pense que je vais regarder cela de plus pret ;

Mon niveau d'anglais ne me permet pas d'allé glanner des infos sur le fofo anglais sur le hi2cflag , mais pour moi la solution devrait se trouver ici, plutot que de la contourner .

Programme de l'emetteur :

Code:
#PICAXE 20M2

'##########################    configuration    ################################	

symbol BUZ=C.0
symbol TX = B.4
symbol DONNEE = B.7
symbol Klax	= pinC.6
symbol Phare= pinB.5
symbol Gyro= pinB.6
symbol sirene= pinB.1
symbol chgt= pinB.3

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

setfreq m32		'Mets la freq à 32Mhz pour tout le programme, RFout se met a 4 mzh puis repasse à 32Mhz

dirsC = %00000001	'declare C.0 comme sortie
dirsB = %10010000 'declare B.4 et B.7 en sortie

high TX

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

do

readadc C.3,b1		'Av/ar voiture
readadc C.2,b3		'Dr/ga voiture

bit0 = Klax
bit1 = Phare
bit2 = sirene
bit3 = gyro
bit4 = chgt



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







#rem
low BUZ
				'apres un tour eteint le BUZZER
	if b8<>b0 then	'si changement d'un etat allume le BUZ
		high BUZ	'fais un BIP
	end if
b8=b0				' recopie la valeur b0 dans b8				
#endrem
 

PieM

Senior Member
il s'ecoule 4 fois plus de temps entre les deux , a savoir que le flag est mise a 1 que l"esclave n'en lira qu'1 seul . je pense que je vais regarder cela de plus pret ;
Non ça ne marche pas comme ça.
le flag est mis à 1 si le 14M2 envoie ses données, donc si il n'est pas bloqué par RFin. Tout cela est lié.
que l'on traite les retards liés à la mise à 1 du flag, ou ce que j'ai fait revient exactement au même. Avec le flag, on serait obligé de s'assurer qu'il il en a plusieurs de suite qui ne sont pas remis à 1. d'où un compteur et de prendre la décision d'un arrêt au bout d'un cetain temps.
 

dje8269

Senior Member
Avec le flag, on serait obligé de s'assurer qu'il il en a plusieurs de suite qui ne sont pas remis à 1. d'où un compteur et de prendre la décision d'un arrêt au bout d'un cetain temps.
la je suis d'accord Une fois la perte de liaison prouvée , il devrait y avoir une réaction .

Donc le problème se trouve dans la preuve de perte de liaison.

le flag est mis à 1 si le 14M2 envoie ses données, donc si il n'est pas bloqué par RFin. Tout cela est lié.
Cela mérite explications, car je suis pas d'accord d'après mes test .

Que fais reelement un RFin bloqué ? je veut dire "softement" parlant?

le flag est mis à 1 si le 14M2 envoie ses données
Oui mais, il peut etre mis a 1 sans avoir etre recu . c'est ce qui se passe 1 fois sur 4 . L'esclave tourne 4 fois moins vite . donc loupe 3 infos sur 4 .

Cela ne colle pas ,on respire , ca colle pas avec MA logique . une info envoyée n'est pas égale à une infos recue , avec les pertes . Le flag n'est pas mis à 1 si les infos sont envoyées. le flag est mis a 1 si les infos sont recues. la différence se situe la ; et notre probleme aussi !!!

Avec le flag, on serait obligé de s'assurer qu'il il en a plusieurs de suite
Ca c'est sur , il vaut mieux s'assurer de l'erreur, avec de donner un vaccin . MAIS il est préférable de donner un anti-dote avant d'etre mordu . Avec le hi2cflag, l'erreur devrait être déterminée plus vite que 200 fois pour être fiable ? non ?

et même si l'erreur est déterminée prématurément, la reaction devrait etre immediate suivant le timing choisis . a savoir par exemple une erreur de communication de l'ordre de la 1/2 seconde, l'erreur devrait ou devras etre ignorée ? non ?
 
Last edited:

dje8269

Senior Member
Je préfère rajouté ,comme d'hab un gros merci a PieM (qui devrais ouvrir un site)
et Jojojo dit Georges ( pareil ouvrir un site)
un peu a l'image de MGU dit Michel celui la
Et la je pourrais en aider certains ...
Je dois être un mec super égoïste, car je conçois mal qu'une personne vienne me voir en me disant , S'il vous plait aidez moi .
sans que cette personne , me dise s'il vous plait aidez moi avant ????? genre ca
@MGU : ton site pourrait te ramené des sousous : @Me MP si interrssé
 
Last edited:

PieM

Senior Member
Cela mérite explications, car je suis pas d'accord d'après mes test .

Que fais reelement un RFin bloqué ? je veut dire "softement" parlant?
Ben le 14M2 attend ! et rien ne se passe, donc il n'y a plus de liaison i2c.

Oui mais, il peut etre mis a 1 sans avoir etre recu . c'est ce qui se passe 1 fois sur 4 . L'esclave tourne 4 fois moins vite . donc loupe 3 infos sur 4 .
Totalement faux. Ce n'est pas un problème de fréquence d'horloge, mais de durée du cycle du programme ce qui n'a rien à voir. Ici, c'est l'esclave qui attend la mise à jour en provenace du 14M2, car RFIN est une instruction qui demande du temps !

Cela ne colle pas ,on respire , ca colle pas avec MA logique . une info envoyée n'est pas égale à une infos recue , avec les pertes . Le flag n'est pas mis à 1 si les infos sont envoyées. le flag est mis a 1 si les infos sont recues. la différence se situe la ; et notre probleme aussi !!!
Si la connexion i2c est coupée, c'est certain que ce qui part n'arrive pas ! On se moque de l'info envoyée. On surveille le flag qui se met à 1 quand il y a écriture dans le scratchpad

Pour t'amuser, tu neutralises la commande RFIN du 14M2, tu envoies par I2C des valeurs quelconques pour tes consignes vitesse et servo, et tu verras que tu n'as aucun problème de liaison et de lecture du flag.

Je vais te faire un programme avec le hi2flag en cadeau de Pâques, avec un ruban.
 

MGU

Senior Member
Je préfère rajouté ,comme d'hab un gros merci a PieM (qui devrais ouvrir un site)
et Jojojo dit Georges ( pareil ouvrir un site)
un peu a l'image de MGU dit Michel celui la
Et la je pourrais en aider certains ...
Je dois être un mec super égoïste, car je conçois mal qu'une personne vienne me voir en me disant , S'il vous plait aidez moi .
sans que cette personne , me dise s'il vous plait aidez moi avant ????? genre ca

@MGU : ton site pourrait te ramené des sousous : @Me MP si interrssé
Bonjour,

C'est vrai que PieM devrait ouvrir un site, nous en apprenons tous les jours grâce à lui.
Quant au mien, le but n'est pas qu'il me rapporte des sous, je suis déjà content qu'il ne me coute rien.

MM
 

PieM

Senior Member
C'est vrai que PieM devrait ouvrir un site, nous en apprenons tous les jours grâce à lui.

C'est très sympa, merci. Cela me touche beaucoup.
Mais hélas je m'occupe déja d'un site, d'un blog et président d'une assos (qui n'ont rien à voir avec l'électronique ni les µC!), je suis obligé de garder quelques heure ... pour dormir !
 

dje8269

Senior Member
Bonsoir à tous,

Moi je sens la crise de foie arrivée. Vive Pâques !!!! :rolleyes:

je viens de réduire la valeur du compteur afin de regarder la réaction de la voiture . et ben c'est nickel, un bon compromis a 40 est vraiment bien . Pas de coupure intempestive . et une bonne réactivité .

Je pensais du coup changé le w12 par un byte plutôt , ou cela poserai-t-il probléme ?
je ne comprends pas cette ligne PieM ou plutot son utilité :
w12 = w12 max 60000
"B5 = 111" y-a-t-il une raison pour avoir choisis 111 ?

Sinon je n'arrive toujours pas a comprendre une chose .

je sais quand pratique ça ne fonctionnerais pas car le moteur s'allumerait et s'éteindrait en boucle ; Mais dans le principe je ne sais pas pour quoi ça ne fonctionne pas .

avant chaque RFin j'éteins le moteur en écrivant dans le scratchpad
Si le RFin passe , en re-envoie la valeur du moteur et donc le fait tourné .
Si le Rfin se bloque le moteur devrait resté eteint car il n'y as plus de MAJ

ma question pkoi le moteur continue de tourné ?

Code:
#PICAXE 14M2

'########################  Configuration  ########################
Symbol Info = pinC.0 
Symbol Klaxon = C.3
Symbol Phare = pinC.4 

dirC.0=0		'declare C.0 en entrée DATA
dirC.3=1		'Declare C.3 comme une sortie Klaxon
dirC.4=1		'Declare C.4 comme sortie Phare

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


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

setfreq m32								' met le frequence a 32Mhz

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


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

b1 = 150
hi2cout 1,(b1)                                                  'extinction du moteur

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

Phare = bit0

hi2cout 0,(b0,b1,b2,b3,b4,b5,b6,b7)		' Envoi des données au scratchpad du 28X2 esclave

loop
 

PieM

Senior Member
Je pensais du coup changé le w12 par un byte plutôt , ou cela poserai-t-il probléme ?
aucun problème...

je ne comprends pas cette ligne PieM ou plutot son utilité :
w12 = w12 max 60000
"B5 = 111" y-a-t-il une raison pour avoir choisis 111 ?
faudra mettre max 255 si tu utilise un byte. C'est pour bloquer le comptage et eviter qu'il passe à 0 tout seul.
111 ? parceque c'est plus facile à taper que 169 !

Pour le reste, je ne sais pas. Tu as expérimenté en arrêtant le TX ?

Te passerai un nouveau programme demain avec le hi2cflag .....
 

dje8269

Senior Member
Bonjour,

Pour le reste, je ne sais pas. Tu as expérimenté en arrêtant le TX ?
Oui, oui , tout mes tests sont fait, en arrêtant directement le TX afin de simuler la perte de com.

Te passerai un nouveau programme demain avec le hi2cflag .....
Je cherche toujours à trouver une solution . Alors je veux bien un petit coup de main . Ca me chiffonne de de voir contourné le problème alors qu'il existe une fonction parfaite pour faire ca mais que ca ne fonctionne pas.

Je vais tester comme tu me l'as préconisé, d'enlever le RFin et de bien comprendre la réaction du hi2cflag.

tu m'avais dis PieM, de ne pas utilisé l'interruption flag ( "setintflags" ), pourquoi , je trouve que l'interruption trouve tout son sens de ce cas d'urgence ? non ?

Désolé si je fais fausse route , j'essaie juste de comprendre
 

PieM

Senior Member
tu m'avais dis PieM, de ne pas utilisé l'interruption flag ( "setintflags" ), pourquoi , je trouve que l'interruption trouve tout son sens de ce cas d'urgence ? non ?

Désolé si je fais fausse route , j'essaie juste de comprendre
Non nous ne sommes pas dans le cas d'une interruption. De toute façon l'interruption liée au hi2cflag se déclenche... quand le hi2cflag est mis à 1 !

Ci joint le programme avec gestion du flag.
La réactivité devrait être maxi après avoir ajusté la valeur du compteur dans la boucle.
Si le TX est éteint au démarrage du RX, la voiture reste à l'arrêt et le gyro reste allumé.


Recopie bien la totalité du programme car j'ai ajouté une variable et quelques bricoles.

Code:
#PICAXE 28X2
#no_table

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

Symbol moteur = B.0
Symbol sens = C.6
Symbol Direction = B.1
Symbol Pan = B.2
Symbol Tilt = B.3
Symbol Sirene = B.5
Symbol Secu = PinC.7
Symbol Gyro = pinA.0
Symbol Option = A.2

dirsA = %0101	'declare les broches A.0 et A.2 en sortie
dirsB = %00101111 'declare les broches B.0, B.1, B.2, B.3, et B.5 en sortie
dirsC = %01000000 'declare La broche C.7 en entrée
symbol compteur = w12


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

setfreq m8	

hi2csetup i2cslave, %10100000		' Met le 28X2 en Esclave

servo B.1,150				'Servo direction en broche B.1, position neutre a 150, MAJ 20ms

pwmout  B.0, 125, 0 			' rapport cyclique a 0

put 1,125					' Ecrit dans le scratchpad la valeur du point milieu pour le moteur
put 3,125					' Ecrit dans le scratchpad la valeur du point milieu de la direction
Low sens
hi2cflag =0 					' met le relais a l'etat bas


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

main:
do
	'boucle de contrôle --------
	do while hi2cflag = 0
	inc compteur
	if compteur > 100 then Escape  ' à ajuster à la plus petite valeur.	
	loop 
	' si écriture dans scrath
	hi2cflag = 0
	get 0,b0,b1,b2,b3,b4,b5			'Lecture du scratchpad
	gyro = 0		
	  	   				

'#####  Commande TOR  #####

Gyro = bit4	

'#####  Commande moteur  #####

Select Case b1			

Case < 101 		'Marche arriere
	high sens
	b1 = 100-b1					' Mise a l'echelle
	w13 = b1*37/10+130  max 500
	
	
Case > 128		'Marche avant
	low sens
	b1= b1-129					'Mise a l'echelle
	w13 = b1*3+130 max 500			'130 commence à faire avancer la voiture.
	
else
	w13 = 0					'Sinon point milieu , donc a l'arret

end select

pwmduty B.0, w13					'envoi du pwm sur le moteur

'#####  Commande direction  #####

Select case b3

case  < 120
	b3 = b3*3/8
	b3 = 192 - b3
case > 134
	b3 = b3*4/10
	b3 = 200 - b3
else
	b3=150
	
end select

servopos 1,b3

Loop
'________________________________________
'traitement en cas de défaillances
' arrêt moteur + signal
Escape: 
	compteur = 0 		'RAZ compteur
	pwmduty B.0, 125 	'Moteur à l'arrêt
	Gyro = 1			'allume le gyro
	pause 1000
goto main
'=========================================
 

dje8269

Senior Member
De toute façon l'interruption liée au hi2cflag se déclenche... quand le hi2cflag est mis à 1 !
Même avec "setintflags NOT " ? Allez j'arrete de t'embeter avec mes interruptions.

Je viens d'effectuer des tests sans le RFin . On se rend bien compte que le hic2flag fonctionne. Dnas tous les cas , il faudrat un compteur car des loupés au niveu des flag d'ecriture y'en as pas mal, et encore sans commande RFin .

J'essaie ton programme tout de suite
 

dje8269

Senior Member
Alors voici le résultat : une vidéo vaut peut etre mieux que tout les discours ;

Vidéo par Ici
[video=dailymotion;x1q723w]http://www.dailymotion.com/video/x1q723w_voiture-rc-avec-picaxe-6_tech[/video]

Le truc que je trouve intéressant c'est que la led s'éclaire très fort , donc elle ne clignote pas . Sinon le fonctionnement est plutôt étrange .
 

PieM

Senior Member
Alors voici le résultat : une vidéo vaut peut etre mieux que tout les discours ;


Le truc que je trouve intéressant c'est que la led s'éclaire très fort , donc elle ne clignote pas . Sinon le fonctionnement est plutôt étrange .
Oui mais un peu d'explication serait mieux car on ne voit pas ce que tu commandes !
De toute façon si la led Gyro reste allumée , il y a un problème. Car on l'allume avec Escape . Et si on passe par Escape, il y a une pause de 1 seconde.
enlève ta ligne Gyro = bit4 car je ne sais pas ce que tu envoies dans b0.
 

dje8269

Senior Member
Bizarrement ce matin ca fonctionne, alors qu'hier non !! j'ai dus changé un petit truc, mais je sais pas quoi !

Je pense qu'avec cela, je touche au but, mais il reste un truc que je ne comprends pas .


J'ai écris "b6 = b6+1 max 255" pour pouvoir incrémenter et mettre un max sur la même ligne . je sais pas si ca me fais gagner du temps.
Je comprends pas , pourquoi le led s'éclaire que tres peu . Ca signifie qu'elle clignote mais pkoi ? car quand je coupe la com, il n'y aucun ordre d'éteindre la led ? sauf quand le flag est remis a 1 mais pas de com pas de remise a 1 du flag . a moins qu'il soit temporaire ce flag ?

Code:
#PICAXE 28X2

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

Symbol moteur = B.0
Symbol sens = C.6
Symbol Direction = B.1
Symbol Pan = B.2
Symbol Tilt = B.3
Symbol Sirene = B.5
Symbol Secu = PinC.7
Symbol Gyro = pinA.0
Symbol Option = A.2

dirsA = %0101	'declare les broches A.0 et A.2 en sortie
dirsB = %00101111 'declare les broches B.0, B.1, B.2, B.3, et B.5 en sortie
dirsC = %01000000 'declare La broche C.7 en entrée


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

setfreq m8	

hi2csetup i2cslave, %10100000		' Met le 28X2 en Esclave

servo B.1,150				'Servo direction en broche B.1, position neutre a 150, MAJ 20ms

pwmout B.0, 125, 0 			' rapport cyclique a 0

put 1,125					' Ecrit dans le scratchpad la valeur du point milieu pour le moteur
put 3,125					' Ecrit dans le scratchpad la valeur du point milieu de la direction
Low sens					' met le relais a l'etat bas


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

main:
do
	get 0,b0,b1,b2,b3,b4,b5			' Lecture du scratchpad

if hi2cflag = 0 then 		'Si flag=0, donc perte de com
	b6 = b6+1 max 255
		if b6>20 then	
		gyro = 1		' On allume la led
		end if 
else
	hi2cflag = 0		're-armement du flag
	gyro = 0
	b6 = 0			'extinction de la led temoin
end if

'#####  Commande TOR  #####

Gyro = bit4	

'#####  Commande moteur  #####

Select Case b1			

Case < 101 		'Marche arriere
	high sens
	b1 = 100-b1					' Mise a l'echelle
	w13 = b1*37/10+130  max 500
	
	
Case > 128		'Marche avant
	low sens
	b1= b1-129					'Mise a l'echelle
	w13 = b1*3+130 max 500			'130 commence à faire avancer la voiture.
	
else
	w13 = 0					'Sinon point milieu , donc a l'arret

end select

pwmduty B.0, w13					'envoi du pwm sur le moteur

'#####  Commande direction  #####

Select case b3

case  < 120
	b3 = b3*3/8
	b3 = 192 - b3
case > 134
	b3 = b3*4/10
	b3 = 200 - b3
else
	b3=150
	
end select

servopos 1,b3

Loop
Je remet ton programme PieM avec les modifs et je fais les commentaires .
 

dje8269

Senior Member
Test programme PieM ,

Donc :

J'allume la voiture , le TX est eteint :
Led allumée forte en permanence : tout va bien .

Voiture toujours allumé , j'allume le TX :
La voiture a un comportement tordue , elle avance doucement , et la led clignote périodiquement, je dirais toutes les secondes .Les commandes fonctionnent 1 secondes sur 2 .

Je re-eteins le TX , la led devient fixe , mais la voiture continue de rouler doucement
 

PieM

Senior Member
Test programme PieM ,

Donc :

J'allume la voiture , le TX est eteint :
Led allumée forte en permanence : tout va bien .

Voiture toujours allumé , j'allume le TX :
La voiture a un comportement tordue , elle avance doucement , et la led clignote périodiquement, je dirais toutes les secondes .Les commandes fonctionnent 1 secondes sur 2 .

Je re-eteins le TX , la led devient fixe , mais la voiture continue de rouler doucement
augmente la valeur du compteur qui est à 100 . Je n'avais pas calculé mais on est en 8 MHz ... mets le à 500 et tu diminues progressivement. Tu ne dois pas avoir d'allumage de la led, TX allumé.

et j'ai oublié: remets put 1, 125 après le pwduty dans Escape
 

dje8269

Senior Member
Si tu veux bien on ne vas pas travailler sur plusieurs programmes à la fois !
Oui car je jongle entre les deux , entre ta facon et la mienne lol .

Je viens de passer la valeur du compteur a 500 , le résultat est quasiment le même qu'a 100 sauf que le clignotement est plus lent . genre toutes les 3 secondes .

Je comprend pas trop pkoi ? il doit manquer une remise a zero du compteur quelques part

Même résultat avec le rajout de put 1,125

Code:
#PICAXE 28X2
#no_table

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

Symbol moteur = B.0
Symbol sens = C.6
Symbol Direction = B.1
Symbol Pan = B.2
Symbol Tilt = B.3
Symbol Sirene = B.5
Symbol Secu = PinC.7
Symbol Gyro = pinA.0
Symbol Option = A.2

dirsA = %0101	'declare les broches A.0 et A.2 en sortie
dirsB = %00101111 'declare les broches B.0, B.1, B.2, B.3, et B.5 en sortie
dirsC = %01000000 'declare La broche C.7 en entrée
symbol compteur = w12


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

setfreq m8	

hi2csetup i2cslave, %10100000		' Met le 28X2 en Esclave

servo B.1,150				'Servo direction en broche B.1, position neutre a 150, MAJ 20ms

pwmout  B.0, 125, 0 			' rapport cyclique a 0

put 1,125					' Ecrit dans le scratchpad la valeur du point milieu pour le moteur
put 3,125					' Ecrit dans le scratchpad la valeur du point milieu de la direction
Low sens
hi2cflag =0 					' met le relais a l'etat bas


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

main:
do
	'boucle de contrôle --------
	do while hi2cflag = 0
	inc compteur
	if compteur > 500 then Escape  ' à ajuster à la plus petite valeur.	
	loop 
	' si écriture dans scrath
	hi2cflag = 0
	get 0,b0,b1,b2,b3,b4,b5			'Lecture du scratchpad
	gyro = 0		
	  	   				

'#####  Commande moteur  #####

Select Case b1			

Case < 101 		'Marche arriere
	high sens
	b1 = 100-b1					' Mise a l'echelle
	w13 = b1*37/10+130  max 500
	
	
Case > 128		'Marche avant
	low sens
	b1= b1-129					'Mise a l'echelle
	w13 = b1*3+130 max 500			'130 commence à faire avancer la voiture.
	
else
	w13 = 0					'Sinon point milieu , donc a l'arret

end select

pwmduty B.0, w13					'envoi du pwm sur le moteur

'#####  Commande direction  #####

Select case b3

case  < 120
	b3 = b3*3/8
	b3 = 192 - b3
case > 134
	b3 = b3*4/10
	b3 = 200 - b3
else
	b3=150
	
end select

servopos 1,b3

Loop
'________________________________________
'traitement en cas de défaillances
' arrêt moteur + signal
Escape: 
	compteur = 0 		'RAZ compteur
	pwmduty B.0, 125 	'Moteur à l'arrêt
	put 1, 125
	Gyro = 1			'allume le gyro
	pause 1000
goto main
'=========================================
 

PieM

Senior Member
C'est tout à fait anormal que le flag reste à 0 aussi longtemps. Difficile à distance si tu n'as pas de moyen d'investigation pour visualiser le flag...

Moi je te propose pour l'instant de revenir à ce qu'il y avait hier soir avec un flag géré par b5. On pourra choisir après une autre variable si tu te sers de celle là.
Je te répète que cela revient exactement au même qu'utiliser le hi2flag mais c'est une façon manuelle.
si il y a liaison, I2C mets 0 dans une variable du sratchpad. si il y a 0 on lit les autres valeurs et on met 111 dans cette variable.
si il y a 111 pendant un certain temps on passe en sécurité.
C'est exactement ce qu'on ferait avec le hi2cflag.
 

dje8269

Senior Member
si tu n'as pas de moyen d'investigation pour visualiser le flag...
Que faudrait - il ?

En tout cas merci d'avoir essayé . C'est déjà énorme, le temps que tu passe avec moi et avec mes problémes.
 

dje8269

Senior Member
Bon les efforts on payés ......

Je suis enfin arrivé au but . mais pas encore la perfection . Tout fonctionne a merveille, mais je me souviens du conseil de BEUSQUET et du lapin blanc . Dans ma configuration, a chaque tour il y as RAZ du compteur ce qui ne sert a rien si le compteur n'as pas décollé .

Je suis en train de chercher une fonction qui quand on perd les données, on entre dans une autre boucle qui surveille si on as repris ou non la reception de données et la, qui efface le compteur . Un truc du genre . Sinon , à part ça c'est parfait , la réactivité est quasiment instantanée , sans pour autant avoir des erreurs . Je n'ai même eu aucune erreurs depuis que je fais des tests .

Voyez-vous des simplifications à apportés ?
Sinon vous remarquerez que pour eteindre le moteur , il suffit d'ecrire dans le scratchpad, comme il n'y as pas de mise à jour par le RFin.

Je cherche encore un peu la petite bête , mais sinon je passe à un autre probléme , a savoir la siréne !!!!
Que me conseilleriez-vous pour jouer de la musique ? tune ? Pwmout ?

Code:
#PICAXE 28X2

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

Symbol moteur = B.0
Symbol sens = C.6
Symbol Direction = B.1
Symbol Pan = B.2
Symbol Tilt = B.3
Symbol Sirene = B.5
Symbol Secu = PinC.7
Symbol Gyro = pinA.0
Symbol Option = A.2

dirsA = %0101	'declare les broches A.0 et A.2 en sortie
dirsB = %00101111 'declare les broches B.0, B.1, B.2, B.3, et B.5 en sortie
dirsC = %01000000 'declare La broche C.7 en entrée


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

setfreq m8	

hi2csetup i2cslave, %10100000		' Met le 28X2 en Esclave

servo B.1,150				'Servo direction en broche B.1, position neutre a 150, MAJ 20ms

pwmout B.0, 125, 0 			' rapport cyclique a 0

put 1,125					' Ecrit dans le scratchpad la valeur du point milieu pour le moteur
put 3,125					' Ecrit dans le scratchpad la valeur du point milieu de la direction
Low sens					' met le relais a l'etat bas


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

main:
do
	get 0,b0,b1,b2,b3,b4,b5			' Lecture du scratchpad

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

	b6 = b6+1 max 25			'Compteur d'erreurs de flag
		if b6>20 then		'quand 21 erreurs
			put 1,125		'On eteint le moteur
		end if
else
hi2cflag = 0		're-armement du flag
b6 = 0			'RAZ du compteur			
end if

		

'#####  Commande TOR  #####

Gyro = bit4	

'#####  Commande moteur  #####

Select Case b1			

Case < 101 		'Marche arriere
	high sens
	b1 = 100-b1					' Mise a l'echelle
	w13 = b1*37/10+130  max 500
	
	
Case > 128		'Marche avant
	low sens
	b1= b1-129					'Mise a l'echelle
	w13 = b1*3+130 max 500			'130 commence à faire avancer la voiture.
	
else
	w13 = 0					'Sinon point milieu , donc a l'arret

end select

pwmduty B.0, w13					'envoi du pwm sur le moteur

'#####  Commande direction  #####

Select case b3

case  < 120
	b3 = b3*3/8
	b3 = 192 - b3
case > 134
	b3 = b3*4/10
	b3 = 200 - b3
else
	b3=150
	
end select

servopos 1,b3

Loop
 

PieM

Senior Member
Ce que tu as fait est exactement la même chose que ce que je t'ai donné dans le dernier programme, sauf que tu ne renvoies pas sur un sous programme qui gère le défaut, avec une pause.
Donc en fait tu escamotes le problème car tu arrêtes le moteur de temps en temps, sans que tu le vois à cause de l'inertie.

mais je me souviens du conseil de BEUSQUET et du lapin blanc . Dans ma configuration, a chaque tour il y as RAZ du compteur ce qui ne sert a rien si le compteur n'as pas décollé .
ça n'a rien à voir ! Tu vas faire un test pour mettre le compteur à 0 si il est différent de 0 ? c'est à dire que tu remplaces une instruction qui prend 200 µs par plusieurs qui prennent 4 fois plus de temps !!
 
Top