Télécommande voiture RC + caméra

PieM

Senior Member
Ben ça roule !
Pour la tondeuse à gazon tu peux attendre encore un peu ...

Sinon, pour ta commande de moteur, il faut savoir que tu perds beaucoup de la sensibilté de ton joystick:

Avec une période de pwm de 25, le duty de 100% est atteint avec la valeur 100.
donc toutes les valeurs supérieures à 100 de b1 ne servent à rien.

marche avant:
b1 compris entre 127 et 255 au départ mais b1= b1 - 104 donc b1 va varier entre 23 et 151 mais entre 100 et 150 le duty est de 100%
Donc 40% de la course du joystik est perdue !!

marche arrière:
b1 compris entre 0 et 99. mais b1 = 125-b1. Donc b1 varie entre 125 et 26. Tout ce qui est supérieur à 100 ne sert à rien.
Donc 25% de la course du joystik est perdue !!
 

dje8269

Senior Member
Merci PieM,

Je vais donc devoir refaire une mise à l'echelle ! Allez hop a ma calculette !

Comment fais tu pour déterminer cela ?
Avec une période de pwm de 25, le duty de 100% est atteint avec la valeur 100.
 

PieM

Senior Member
Merci PieM,

Je vais donc devoir refaire une mise à l'echelle ! Allez hop a ma calculette !

Comment fais tu pour déterminer cela ?
C'est avec ma boule de cristal ( qui était en panne pour le post d'escarpin! :()
Non, mais c'est directement lié au calcul de PWM duty et de PWM period.

Quelque soit le diviseur de PWM, le 100% du duty est atteint avec une valeur égale à 4 fois la période
si duty = période, sa valeur sera de 25%, si duty = 2 périodes, sa valeur sera de 50% etc.

Il est ainsi très facile de modifier fréquence et duty par des variables liées....

Je suis d'ailleurs très surpris de la valeur choisie pour la période ! 25 pour un picaxe à 8MHz, c'est une fréquence de 77 kHz ! je pense que les pertes dans les Mosfets ne doivent pas être négligeables !
 
Last edited:

dje8269

Senior Member
Voici ma mise a l'echelle . Je testerais dès que la batterie sera chargée .

Marche Avant :
Pour une valeur de joystick ( b1) allant de 129 à 255 . Une variation de duty de 25 à 100

Marche arriére :
Pour une valeur de joystick allant de 100 à 0 . Une variation de duty de 25 à 100 .

ce qui me donne :
Code:
'#####  Commande moteur  #####

Select Case b1			

Case < 101 		'Marche arriere
	high sens
	b1 = 100-b1			' La marche arriere se declenche seulement a partir de 100
	b1 = b1/4*3+25
	
Case > 128		'Marche avant
	low sens
	b1= b1-129			'Le moteur fait rouler la voiture a partir de b1=25
	b1 = b1/168*100+25
else
	b1 = 0			'Si b1 entre 120 et130 signifie au point milieu , donc a l'arret

end select

pwmduty B.0, b1			'envoi du pwm sur le moteur
J'espère avoir bon . Plus simple que le problème d'escarpins, lol
 

PieM

Senior Member
Case > 128 'Marche avant
low sens
b1= b1-129 'Le moteur fait rouler la voiture a partir de b1=25
b1 = b1/168*100+25
else
b1 = 0 'Si b1 entre 120 et130 signifie au point milieu , donc a l'arret
Non ça n'est pas bon ! b1= b1-129
là b1 est au plus égal à 126
ensuite tu calcule b1/168 donc le résultat sera toujours 0 et b1 sera toujours égal à 25 !

ton calcul doit être : b1 = b1*100/168+25

idem pour la marche arrière : mets b1 = b1*3/4+25 c'est mieux .

Pense à mettre une fréquence plus faible ...
Je suis d'ailleurs très surpris de la valeur choisie pour la période ! 25 pour un picaxe à 8MHz, c'est une fréquence de 77 kHz ! je pense que les pertes dans les Mosfets ne doivent pas être négligeables !
 

dje8269

Senior Member
merci PieM pour ces corrections , le fait du multiplié d'abord par 100 avant de diviser est effectivement plus judicieux.

Par contre je n'ai pas compris ta remarque
là b1 est au plus égal à 126
J'ai donc effectué des test ainsi , et on note très nettement une amélioration dans la souplesse de l'accélération . la c'est vraiment bien !

Pense à mettre une fréquence plus faible ...
Je suis d'ailleurs très surpris de la valeur choisie pour la période ! 25 pour un picaxe à 8MHz, c'est une fréquence de 77 kHz ! je pense que les pertes dans les Mosfets ne doivent pas être négligeables !
Pour etre franc , j'ai vraiment du mal a determiner la bonne frequence de travail pour ce moteur .

J'ai donc au depart , utilisé les mêmes valeurs que sur la version 1 ( avec un seul picaxe) histoire d'avoir une reference : "pwmout pwmdiv64, B.1, 70, 0 "

Mais avec le div64, ca ne fonctionnait pas . bref j'ai donc cherché et bricoler jusqu'a tomber sur cette valeur de 25 . Disons que je n'ai pas de bruit bizarre meme a vitesse lente , la voiture avance plutot vite .
Apres je suis partant pour essayer d'autres valeurs, mais comme je suis un peu perdus avec le pwmdiv, pwmduty, le rapport cyclique, la periode etc .......
tu verrais quelles frequence , Georges m'avait preconiser 1000Hz je crois de mémoire .
 

jojojo

Senior Member
Et, je confirme, pour ce genre de moteur, 1000 Hz est un bon point de départ.

Mais, j'ai eu quelques surprises, en testant la "fameuse courbe" AV/AR de Piem.

Mathématiquement, c'est plus que très bien (forcément).

Mais, voila, ces saletés de moteurs n'ont pas forcément les mêmes réactions, dans un sens ... Ou dans l'autre ...

J'ai fait exprès une platine dédiée, histoire de tester, ben ... Les moteurs bien référencés, avec un beau point rouge coté plus, "bricolent" pas mal, quant on les alimente dans l'autre sens. Donc ...

Voila la platine de test, et le code "brut" (sans fioritures, mais qui va le mieux, dans les deux sens, avec quatre moteurs testés).

varimotRelais.jpg
(J'ai aussi fait la même platine, avec un L298, même code, juste a demander, si vous voulez voir).

Le code, tout bête :

Code:
'*******************************************************
'*                                                     *
'*              Variateur de vitesse AV/AR  08M2       *
'*              pour télécommande proportionnelle      *
'*              Hardware avec L298 ou relais 2 RT      *
'*              G.TREELS              04/2014          *
'*******************************************************



#picaxe 08M2
Setfreq M32				'Freq µP 32 Mhz
					'Soit 1.25µS par unité Pulsin

Symbol SPWM=C.2			'Sortie PWM
'Symbol ADCSECU=C.1		'Entrée U fst I Mot MAIS symbol va pas avec readadc !
Symbol AVAR=C.0			'Sens rotation
Symbol STOPSECU=C.4		'Led mise en secu, si I mot au dessus consigne
Symbol ENTREE=C.3			'Entrée créneaux RX
Symbol IMAXMOT=1			'En ampère
Symbol RSOURCE=1			'En ohm
b26=RSOURCE*IMAXMOT*51		'Consigne pour ADC	
pwmout pwmdiv64, SPWM, 124, 0	'init PWM à 1000Hz. Moteur, à 0

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

Do
Readadc C.1,b27	'Sécu I moteur
If b27>b26 Then
	Exit		'Dépassement consigne
End If

Pulsin ENTREE,1,w0'Mesure créneau entrée

Select Case w0	'Commande moteur, PWM ET relais av ar
	Case <800	'1ms
	w0=800
	Case >1600	'2ms
	w0=1600
	Case 1175 To 1225
	w0=0		'manche au neutre
	Case >1224
	w0=w0-1225	'mise à l'échelle, pour 0 à 500 (pwm), avec 1225 à 1600
	w0=w0*4/3
	Low AVAR	'avant
	Else
	w0=w0-800
	w1=w0*4/3	'le même à l'envers, pour 500 à 0, avec 800 à 1175
	w0=500-w1
	High AVAR	'arriere
End Select

PWMDUTY SPWM,w0	'V mot


Loop
'Fin des hostilités.
pwmout SPWM, Off	'Secu enclenchée
Low SPWM		'  "Okazou"

Do			
High STOPSECU
Pause 100		'Cligno Sécu Mot.
Low STOPSECU	'attente Reset
Pause 200
Loop
Voilou.

Sinon, pour revenir à ma version générale de la chose, je n'ai toujours que 6 TOR opérationnels. Je n'ai pas résolu ça... (Mais, bon, mon tiot fils s'en accomode très bien, donc ...)

Bonne soirée.
 

dje8269

Senior Member
Bonsoir Georges,

Content de te revoir par ici .

Pourrais tu me guider pour que je fasse des test avec une fréquence a 1000Hz

Quand j'utilise le wizard avec B.0, Horloge je mets 8Mhz, frequence 1000Hz , j'obtiens :

pwmout pwmdiv16, B.0, 124, 500 pour 100%
pwmout pwmdiv16, B.0, 124, 250 pour 50%

Crois tu qu'il faut que je refasse a partir de la ?

Bizarre ton histoire de 7ieme TOR quand même !
 

PieM

Senior Member
Mais, j'ai eu quelques surprises, en testant la "fameuse courbe" AV/AR de Piem.
C'est quoi ma "fameuse courbe" ? si c'est celle en S elle est destinée aux servos...

Concernant les moteurs classiques, c'est un autre problème effectivement.
En général, sur certaines installations, on envoie un pulse plein pot de courte durée pour "décoller" la bête, avant de revenir à une commande normale.

je n'ai toujours que 6 TOR opérationnels. Je n'ai pas résolu ça...
c'était quoi ?

pwmout pwmdiv16, B.0, 124, 500 pour 100%
pwmout pwmdiv16, B.0, 124, 250 pour 50%



Crois tu qu'il faut que je refasse a partir de la ?
Ben oui.
Par contre je n'ai pas compris ta remarque
là b1 est au plus égal à 126
au départ, b1 maxi est de 255 . Et 255 - 129 ça fait 126


Pour ta valeur de fréquence nouvelle, tu laisses les mêmes formules mais à la fin tu écris w1 = b1 * 5

et ton pwm sera pwmout pwmdiv16, B.0, 124, w1
 
Last edited:

dje8269

Senior Member
Comme il se fait tard et que tout le monde dort à la maison, j'ai effectué un petit test dans le garage.

Je pense que la voiture est beaucoup mais alors beaucoup plus nerveuse !!! par contre je n'ai pas pus testé la vitesse de pointe, je ne manquerai pas de le faire demain matin . j'ai aussi constaté le sifflement du moteur a vitesse lente ce que je n'avais pas auparavant. problème de fréquence je pense à ajuster demain matin .

Je ne comprenais pas pkoi mon servo de direction se bloquait d'un coté après les changements . en fait la valeur w1 met les variables b2 et b3 a 0 quand j'écris w1=0 . et mon servo direction utilise b3 donc ca buggais . j'ai corriger en mettant w13 en lieu et place de w1 .

Il devait y avoir de sacré perte , car maintenant la voiture est vraiment très très nerveuse, dur dur de la conduire . je devrais certainement mettre des gardes fou pour le petit ( mode débutant).

Pour ce soir je vais commencer a réfléchir sur la perte de communication, car je ne peux pas faire de bruit . J'ai fais des test en maintenant la direction tournée , et une faible vitesse . Quand je coupe a l'interrupteur la télécommande, la voiture avance toujours et tourne toujours ; Cela montre bien qu'il faut une sécurité de perte de communication ( d'ou les 2 picaxes d'ailleurs).

Je suis vraiment content car on avance !!!
 

dje8269

Senior Member
Bon , rien de bien convaincant . Je n'arrive pas a exécuter correctement une vérification de réception d'infos afin d'arrêter le moteur en cas de perte de la transmissions . Pas si simple de communiquer en i2c . Ma commande writei2c doit être mal configurée .
 

PieM

Senior Member
Bon , rien de bien convaincant . Je n'arrive pas a exécuter correctement une vérification de réception d'infos afin d'arrêter le moteur en cas de perte de la transmissions . Pas si simple de communiquer en i2c . Ma commande writei2c doit être mal configurée .
Non ce n'est pas un pb de config de l'I2C
a priori, tu ne tiens pas compte du fait que le scratchpad n'a pas reçu d'infos après avoir lu son contenu.
Redonne ton programme du 28X2 à jour...

j'ai aussi constaté le sifflement du moteur a vitesse lente ce que je n'avais pas auparavant. problème de fréquence je pense à ajuster demain matin .
Normal puisqu'on est dans les fréquences audibles. Sinon il faut passer au dessus de 18000 Hz, chose que je ne te conseille pas avec ce matériel.
 
Last edited:

dje8269

Senior Member
Bonjour à tous ,

Voila je viens juste de faire un test en réel . La voiture roule vraiment bien avec les nouvelles valeurs . Juste ce satané sifflement à vitesse réduite, que je vais essayé de regler ce matin .

voila les programmes à jour . J'ai virer mes tests d'hier vus qu'ils n'étaient pas concluant .

Pour le 14M2 de réception de donnée :

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

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
Pour le 28X2 :

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 pwmdiv16, B.0, 124, 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,b6,b7,b8	' Lecture du scratchpad

Gyro = bit4						' Commande TOR



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

Select Case b1			

Case < 101 		'Marche arriere
	high sens
	b1 = 100-b1			' Mise a l'echelle
	b1 = b1*3/4+25
	w13 = b1 * 5
 
	
Case > 128		'Marche avant
	low sens
	b1= b1-129			'Mise a l'echelle
	b1 = b1*100/168+25
	w13 = b1 * 5
 
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
Hier soir j'ai essayé sur la direction pour ne pas faire de bruit, si on pouvait faire pareil aujourd'hui ce serais cool .

Le principe , j'allume tout, je tourne a droite ou a gauche peu importe , je laisse le joystick tourné , et j'éteins la télécommande à l'interrupteur pour simuler une perte de donnée . Le servo devrait revenir un position neutre tout seul . Si ça marche avec la direction cela devrait marché avec le moteur . Car c'est plus enquiquinant de tester avec le moteur .

J'ai donc sur le maitre (14M2) voulus écrire dans le scratchpad la valeur de point milieu pour le servo, avant le RFin . et comme le RFin fais une MAJ de la valeur si la commande passe tout va bien ; Si elle est bloquée la lecture du scratchpad se fait quand même mais avec la valeur qui met le servo au milieu . mais ça na pas fonctionné, ou plutôt j'ai dus mal m'y prendre ;

Je me fis a tous vos conseils pour tester cette transmission, car je suis peut etre sur une mauvaise voie sur la méthode employée?
 

dje8269

Senior Member
C'est à dire ?

Sur ta modifications de messages ? effectivement je viens seulement de la lire car je ne regarde pas tous les post du dessus a chaque fois, donc .... .

Je viens de faire moultes tests pour cette fréquence et je me retrouve toujours à enlever le div16 .

a vitesse lente avec pwm div16 et div 4 le bruit persiste ;

Je viens de trouver un bon compromis je pense entre vitesse , nervositié , bruit , couple . Avec ceci :

pwmout B.0, 125, 0
Crois tu que ca abime quelque chose ?
 

PieM

Senior Member
ton programme modifié :

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 pwmdiv16, B.0, 124, 0		' rapport cyclique a 0

[COLOR="#FF0000"]'a supprimer :[/COLOR]
'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"]If hserflag = 1 then	'si le scratchpad a reçu quelque chose
	get 0,b0,b1,b2,b3,b4,b5,b6,b7,b8	' Lecture du scratchpad
	hserflag = 0   'mise du flag à 0 car il a été lu
	else: goto Escape		' sinon appel des pompiers
endif
[/COLOR]
Gyro = bit4						' Commande TOR



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

Select Case b1			

Case < 101 		'Marche arriere
	high sens
	b1 = 100-b1			' Mise a l'echelle
	b1 = b1*3/4+25
	
 
	
Case > 128		'Marche avant
	low sens
	b1= b1-129			'Mise a l'echelle
	b1 = b1*100/168+25
	
 
else
	w13 = 0			'Sinon point milieu , donc a l'arret

end select

[COLOR="#0000FF"]w13 = b1 * 5[/COLOR]
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:

servopos 1,125 'mise au neutre de la direction (ne sert à rien)
pwmout B.0, OFF 'arrêt du moteur.
'+ éventuellement alarme , clignotant, extincteur etc ....[/COLOR]
'--------------------------------------------
pwmout B.0, 125, 0
Crois tu que ca abime quelque chose ?
là tu es à 15800 hz. inutile d'aller plus haut tu es à la limite de ce qu'on peut entendre. Si il n'y a pas trop de pertes coté MOSFET reste en là.
 
Last edited:

dje8269

Senior Member
tu es à 15800 hz. inutile d'aller plus haut tu es à la limite de ce qu'on peut entendre. Si il n'y a pas trop de pertes coté MOSFET reste en là.
Ok ca marche ! . Comment savoir si j'ai de la perte coté MOSFET ?

J'essaie ton programme tout de suite .
 

PieM

Senior Member
Ben le Mosfet va chauffer car il passe beaucoup de temps entre conduction et blocage, cad qu'il fait office de résistance.

J'ai corrigé une petite erreur dans le programme (dans Escape )...
 

dje8269

Senior Member
Ok pour la correction .

J'ai une petite question en passant . peux t-on , sur une même ligne, définir un min et un max pour le résultat d'un calcul ?

Je suis en train de refaire le calcul avec le nouveaux pwm ? et en même temps je cherche a simplifier le calcul
 

dje8269

Senior Member
C'est horrible , dès qu'on touche a réglage , tout le reste bouge aussi, vu que tout est en relation !!!! .

Maintenant je me retrouve avec un minimum de 25 mais la voiture avance vite déjà a 25 . Je dois donc revoir mon calcul !!!!. Mais je désespéré pas d'y arrivé . dés que j'ai finis je test ton code PieM .
 

PieM

Senior Member
Mais il n'y avait rien à changer dans la formule puisque la période reste à 125, la variation de duty est toujours la même !
 

dje8269

Senior Member
Oui la variation reste la même, mais pas le comportement de la voiture . elle est beaucoup plus nerveuse ; donc a 25 elle roule tres vite ! .

Je viens de finir le reglage .Le MOSFET n'est pas chaud ( touché avec le doigt) . je peux ainsi roulé tout doucement sans que le moteur fasse de sifflement, la voiture est trés nerveuse , et à une bonne vitesse de pointe . Je vous post une vidéo tout à l'heure .

Je surveillerais l'etat du MOS, mais je pense en rester la pour les reglages . de plus la formule est simplifier car je peux me permettre d'arrondir certaines valeurs .
Comme d'hab si on peux encore simplifier je suis preneur .

Par contre je n'ai pas supprimer cela car sinon la voiture roule a fond , et la direction se bloque d'un coté si la télécommande est eteinte :

'a supprimer :
'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
Je suis en train d'étudier ton programme, mais le petit fais que me distraire lol

Mes reglages :

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

Gyro = bit4						' Commande TOR



'#####  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
 
Last edited:

dje8269

Senior Member
Désolé PieM ,

Avec ce programme la voiture ne réagit plus !
ce ne serais pas plutôt avec hi2cflag qu'il faudrait travailler ?


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
If hserflag = 1 then				' si le scratchpad a reçu quelque chose
	get 0,b0,b1,b2,b3,b4,b5			' Lecture du scratchpad
	hserflag = 0   				' mise du flag à 0 car il a été lu
	else: goto Escape				' sinon appel des pompiers
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


Escape:

servopos 1,125 'mise au neutre de la direction (ne sert à rien)
pwmout B.0, OFF 'arrêt du moteur.
 

dje8269

Senior Member
BEN SI !!! grosse fatigue !
Au plus loin que ma mémoire s'en souvienne , c'est la première fois que je te vois faire une erreur . Surtout sur un programme d'un autre et pas que tu as fait . C'est déjà remarquable.

de plus en remplaçant "hserflag" par "hi2cflag", n'arrange pas les choses . Le servo direction se met a faire n'importe quoi, il vibrote .

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
If hi2cflag  = 1 then				' si le scratchpad a reçu quelque chose
	get 0,b0,b1,b2,b3,b4,b5			' Lecture du scratchpad
	hi2cflag  = 0   				' mise du flag à 0 car il a été lu
	else: gosub Escape				' sinon appel des pompiers
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

Escape:

servopos 1,125 'mise au neutre de la direction (ne sert à rien)
pwmout B.0, OFF 'arrêt du moteur.
return
 

dje8269

Senior Member
Les explications sur le hi2cflag sont plutot maigres dans la notice .

Un octet a été transmis sur le bus I2C physique (en mode esclave)
Lorsque le maître écrit dans la mémoire d&#8217;un Picaxe esclave, le « hi2cflag » est positionné et la dernière donnée écrite est positionnée
dans la variable « hi2clast ». Il est possible de tester le bit « hi2cflag » ou en positionnant le setintflags, le programme du Picaxe pourra
réagir en conséquence lorsqu&#8217;une opération d&#8217;écriture se produit. Attention, le hi2cflag doit être effacé par programme après utilisation.
A partir de quand a-t-il été transmis avant ou aprés la MAJ ? Il parle aussi d'octet drapeau le hi2cflag se trouve sur le flag6 , ne faudrait il pas pointer sur ce flag ?

Ou peut être utilisé le setintflags ? mais l'histoire des masques me perturbe ! et je ne sais pas comment l'utiliser avec un gosub et une condition .
j'aurais même pensé au "setinflags NOT" plutôt . car c'est si il n'y as pas d'écriture dans le scratchpad qu'il faut interrompre.

J'attends de tes nouvelles car c'est trop pechu pour moi, sans exemple
 
Last edited:

PieM

Senior Member
A partir de quand a-t-il été transmis avant ou aprés la MAJ ? Il parle aussi d'octet drapeau le hi2cflag se trouve sur le flag6 , ne faudrait il pas pointer sur ce flag ?

Ou peut être utilisé le setintflags ? mais l'histoire des masques me perturbe ! et je ne sais pas comment l'utiliser avec un gosub et une condition .
j'aurais même pensé au "setinflags NOT" plutôt . car c'est si il n'y as pas d'écriture dans le scratchpad qu'il faut interrompre.

J'attends de tes nouvelles car c'est trop pechu pour moi, sans exemple
hi2flag ou flag6 , c'est exactement la même chose.
Non il ne faut pas utiliser d'interruption là !

essaie de mettre le flag à 0 avant la lecture:

If hi2cflag = 1 then ' si le scratchpad a reçu quelque chose
hi2cflag = 0
get 0,b0,b1,b2,b3,b4,b5 ' Lecture du scratchpad
else: goto Escape
endif

Si le servo vibre toujours, enlève le servopos 1,125 de la routine Escape.
 

dje8269

Senior Member
J'ai essayé ceci sans succés :

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 le scratchpad n'as rien recu, on appelle les pompiers

	hi2cflag = 0				' rearmement 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:

pwmout B.0, OFF 'arrêt du moteur.
goto main
hi2flag ou flag6 , c'est exactement la même chose.
Non il ne faut pas utiliser d'interruption là !
Ok ! c'etait une petite proposition lol

J'essaie tout de suite ce que tu m'as indiqué.
 

dje8269

Senior Member
Sans succes , le servo vibre encore plus 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
'####################################################################################################
main:
do

if hi2cflag = 1 then 			' si le scratchpad n'as rien recu, on appelle les pompiers

	hi2cflag = 0				' rearmement du flag
	get 0,b0,b1,b2,b3,b4,b5			' Lecture du scratchpad
else: gosub Escape
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

Escape:

pwmout B.0, OFF 'arrêt du moteur.
goto main
Cote maitre il n'y as rien a declarer ? pour mettre le flag un truc du genre , car je comprends pas pkoi ca fonctionne pas, et se comportement plus que bizarre du servo

Le fait que le maitre soit a 32Mhz et l'esclave a 8Mhz ne gene pas ?
 

PieM

Senior Member
Sans succes , le servo vibre encore plus bizarrement .

Cote maitre il n'y as rien a declarer ? pour mettre le flag un truc du genre , car je comprends pas pkoi ca fonctionne pas, et se comportement plus que bizarre du servo
Pourquoi as tu mis un goto main à la fin de la routine Escape !!!

mets dans Escape un truc qui s'allume .
 

dje8269

Senior Member
J'avais pensé, pour qu'il re-test si une valeur est arrivée . Car la communication peut se couper 1/2 seconde et revenir , il faut donc que le programme reparte dans ce cas la non ?

Comme dans l'exemple du manuel en fait (page78) . Tant que rien n'est recu on boucle , si on reçoit on continue.

mets dans Escape un truc qui s'allume .
Ok !
 

PieM

Senior Member
J'avais pensé, pour qu'il re-test si une valeur est arrivée . Car la communication peut se couper 1/2 seconde et revenir , il faut donc que le programme reparte dans ce cas la non ?
Chaque chose en son temps, sinon on ne voit rien !
 

PieM

Senior Member
je viens de revoir tes programmes précédents:

tu as remplacé dans un, un goto Escape par un gosub, un return à la fin d'escape, après un goto main ...
déjà que ce n'est pas simple de mettre au point à distance, si tu bricoles des trucs dans ton coin sans le dire ça ne vas pas aller !
 

dje8269

Senior Member
Chaque chose en son temps, sinon on ne voit rien !
Autant pour moi , tu as raison. je l'enleve

Voila , la led s'allume . donc le programme va directement à Escape , même si la télécommande est allumé avant la voiture . Donc il ne reconnait pas la réception dans le scratchpad .

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

if hi2cflag = 1 then 			

	hi2cflag = 0				' rearmement du flag
	get 0,b0,b1,b2,b3,b4,b5			' Lecture du scratchpad
	
else: gosub Escape

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

Escape:
gyro = 1
pwmout B.0, OFF 'arrêt du moteur.
je viens de revoir tes programmes précédents:

tu as remplacé dans un, un goto Escape par un gosub, un return à la fin d'escape, après un goto main ...
déjà que ce n'est pas simple de mettre au point à distance, si tu bricoles des trucs dans ton coin sans le dire ça ne vas pas aller !
Sorry , mais comme tu n'etait plus présent sur le fofo, j'ai essayé de cherché dans mon coin !. Le programme du dessus est exactement celui que je viens d'injecter . Dis moi si je dois changer quelques choses.
 

dje8269

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.

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

if hi2cflag = 1 then 			

	hi2cflag = 0				' rearmement du flag
	get 0,b0,b1,b2,b3,b4,b5			' Lecture du scratchpad
	
else: goto Escape

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

Escape:
gyro = 1
pwmout B.0, OFF 'arrêt du moteur.
 

jojojo

Senior Member
Ben le Mosfet va chauffer car il passe beaucoup de temps entre conduction et blocage, cad qu'il fait office de résistance.
Heu ... Si il n'y avait que ça.

Compte tenu de la capa gs du mos, le courant de commande (et, oui, il y en a un, quand on monte en fréquence, faut bien les fournir, les coulombs) va grimper.

Et, à jouer à ça, les malheureux 20mA que peut fournir le pic vont vite être dépassés par les événements, et rendre l'âme. Et un pic HS, un ! (je le sais, je l'ai fait :( )

Donc, non, on ne "grimpe" pas à 15Khz, ou alors, on opte pour un circuit de commande de Mos.

A 1Khz, ça siffle. Ben ... Oui, nos oreilles entendent bien cette fréquence. MAIS, ça fonctionne, et bien. Donc ...

Et, pourquoi ne recopie-tu pas simplement le prog de commande moteur, que j'ai donné plus haut ? Tu as juste une variable à transférer depuis ta réception, et hop, un truc de réglé !

Allez, au taf !
 

dje8269

Senior Member
Et, pourquoi ne recopie-tu pas simplement le prog de commande moteur, que j'ai donné plus haut ?
Peut etre plus tard georges , car il faut que je le comprenne dans un premier temps . puis que je l'adapte , rien que les fréquences du µC ne vont pas pour moi. ca feras partie des amelirations a apportés par la suite pourquoi pas .
 
Top