Télécommande voiture RC + caméra

dje8269

Senior Member
Autre test . j'ai rajouté une pause de 10ms à la fin du programme ........ . Et ben c'est flagrant , j'ai presque un état haut continue, avec quelques petits passage à l'état bas de temps en temps, mais c'est plutôt rare .

Je pense qu'il va falloir jongler et trouvé un compromis non ?
 

dje8269

Senior Member
des tests,......., des tests,.......... encore des tests !!!

En voila un trés flagrant encore . Je me suis dis pourquoi pas comparer le RFin et le flag du hi2c . chose faites , j'ai mis une sonde sur l'entrée RFin du 14M2 , et l'autre sur l'entrée test du 20X2 , ainsi on as les deux signaux . Et hop on voit tout de suite pourquoi des fois y'as des pauses un peu longues .

En haut ( courbe bleu) l'entrée Rfin . En Jaune l'état du flag hi2c quand il est en haut c'est que le programme est en cours .

On voit clairement qu'un Rfin arrive au milieu du programme du 20X2 ( quand il est à l'état haut). et qui se termine au milieu du deuxiéme passage . Il faut donc attendre, le mise a 1 du Hi2cflag . Se phénome se décale avace le temps, c'est pourquoi parfois on as deux etat haut de suite . On peut donc en déduire , qu'au maximum , il y auras un trou de 2 programmes soit 44ms (toujours si la communication est parfaite).

HPIM2255.jpg


Je sais pas si vous arrivez à me suivre ?!? .

En fait je pense qu'il faut trouver un compromis entre beaucoup d'erreur mais rapides, et peu d'erreur mais plus longues !!!! .

Ou alors je viens d'avoir une idée , c'est de faire une "espece" de synchro entre le Rfin et le hi2cflag ....... . Je vais reflechir à ca .
 

dje8269

Senior Member
Hummmmm ...... . je suis content car j'ai vraiment l'impression d'avancer . Le problème ce qu'il faudrait testé tous ca en réel avec la voiture pour avoir un vrai ressentis .

J'ai encore re-pensé concernant la pseuod synchro , et ben ca marche plutôt extrêmement bien ..... mais il me reste a savoir la cadence de mise à jour des infos, car je ne vois qu'une courbe à l'état haut !!! ( ce qui est très bien en soi).

Voila le principe , tant que le hi2cflag n'est pas à 1 je ne fais rien . c'est donc le hi2cflag qui lance le programme de mise à jour , puis une fois mise à jour il attend de nouveau . Comme le programme est plus rapide, je ne devrais pas loupé de Rfin . 1 RFin = 1 MAJ .

Voici le programme :

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

main:
do

B_led = hi2cflag

'-----------------------------------	
'##### perte de communication  #####
do loop while hi2cflag = 0

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			
     |
     |
     |
     |
     |
pause 15
loop
Avec ca , j'ai une courbe "quasiment" permanente à 1 . de temps en temps j'ai un petit état bas il faudrait que j'augmente la pause très légèrement . Maintenant il faut que je regarde le nombre de mise a jour par seconde . Si on concidére un RFin de 36ms , dans un monde idéal, j'ai une actualisation toutes les 36ms . Je pense que si j'obtiens une MàJ des données toutes les 50ms, la réactivité devrait être au TOP .
 

PieM

Senior Member
Non. déjà il faut laisser le 20X2 à sa fréquence de base soit 8 MHz.
Ensuite, le fait que l'actualisation des données se fasse à une fréquence plus faible que le temps de scrutation du programme récepteur est souhaitable. Le fait d'avoir un hi2flag à 0 n'est pas une erreur. C'en est une si il reste dans cet état pendant plusieurs cycles de RFIN.
Concernant ta liaison hi2c mets la en mode slow. le mode fast n'a aucun intérêt ici.
 

dje8269

Senior Member
Non. déjà il faut laisser le 20X2 à sa fréquence de base soit 8 MHz.
Ah bon ?! . Ok c'est pas 4Mhz ça fréquence de base ?
Concernant ta liaison hi2c mets la en mode slow. le mode fast n'a aucun intérêt ici.
Ok , j'avais mis rapide sans trop savoir a quoi cela correspondait en fait .

Ensuite, le fait que l'actualisation des données se fasse à une fréquence plus faible que le temps de scrutation du programme récepteur est souhaitable. Le fait d'avoir un hi2flag à 0 n'est pas une erreur. C'en est une si il reste dans cet état pendant plusieurs cycles de RFIN.
J'ai pas trop compris ou tu voulais en venir ? .

Est u d'accord avec moi , sur le fait que le but de la manip, est d'avoir le plus d'actualisation de données possibles, afin d'avoir la meilleure réactivité .dans l'idéal c'est une actualisation par Rfin . mais ca , c'est dans l'idéal.

En repassant à 8Mhz par exemple , je vais réduire le temps d'exécution de la MàJ , mais j'augmente le risque de louper une instruction en quelques sorte . Je sais pas ce qui vaut le mieux !!
 
Last edited:

PieM

Senior Member
l'actualisation des données se fait par le RFIN suivi de l'écriture en sratchpad. ça c'est indépendant du programme 20X2.
Comme la lecture du scratchpad par le 20X2 se fait à une fréquence supérieure à celle d'écriture, il est normal d'avoir de temps en temps un hi2flag à 0. Vouloir le voir toujours à 1 n'a aucun sens, puisqu'on lit plus souvent qu'on écrit.
 

dje8269

Senior Member
l'actualisation des données se fait par le RFIN suivi de l'écriture en sratchpad. ça c'est indépendant du programme 20X2.
Tout à fait d'accord

Comme la lecture du scratchpad par le 20X2 se fait à une fréquence supérieure à celle d'écriture, il est normal d'avoir de temps en temps un hi2flag à 0
d'accord aussi dans le principe . Mais pas dans les faits

Vouloir le voir toujours à 1 n'a aucun sens, puisqu'on lit plus souvent qu'on écrit.
je ne veux pas le voir toujours a 1 je voudrait qu'il se mettent a 1 en même temps .

Deux problèmes dans l'équation . Le premier , n'allant pas à la même vitesse , il y a un décalage dans le temps . qui provoque des passages a vide ( hi2cfalg à 0) . De plus les erreurs de com et le blocage du RFin, se superpose à celui ci .

Dans le pire des cas . j'ai un déphasage dû à la vitesse , et dans la foulée une erreur de com , plus un autres déphasage , résultat, un long état bas sans actualisation . Je comprends ce que tu veux dire .

A ton avis quels sont les inconvénients dans le fait d'actualisé dés que le hic2flag est recu ? comme le programme en #1083 .
 

PieM

Senior Member
Le premier , n'allant pas à la même vitesse , il y a un décalage dans le temps . qui provoque des passages a vide ( hi2cfalg à 0)
On s'en fout !
Si ton facteur passe 1 fois par jour, et que tu relèves ton courrier toutes les heures, il y a de forte chance pour que tu trouves ta boite vide de temps en temps. Par contre peu de risque de rater ton courrier!
Par contre si ta boite reste vide plus d'une journée, c'est que le facteur est malade.

A ton avis quels sont les inconvénients dans le fait d'actualisé dés que le hic2flag est recu
Aucun inconvénient.
 

dje8269

Senior Member
salut Georges ,

bienvenue dans ce débat !!!!
RFIN et RFOUT sont des com's de type ASYNCRONES !
et oui malheureusement ....

En fait , l'important ce n'est pas d'avoir un programme qui attend pour lire , ou qui lis dés que ça arrive . L'important c'est de lire le plus souvent possible .

Je pense que nous sommes pas d'accord sur la facon de faire ca .

Pour résumé nos pensées ( et voir si j'ai tout compris) afin de lire le plus de Màj possible disons sur 400ms ( réglages plus simple a l'oscillo).

Pour moi :
Je pense qu'il faut attendre qu'une donnée arrive, lancé la MAJ une fois qu'elle est reçue et re-attendre qu'une autre arrive . Ainsi on ne loupe aucune actualisation par le RFin . C'est faisable comme le programme va plus vite. Mais si y'as un probléme avec le Rfin l'actualisation sera en conséquence

Pour toi :
On lit en permanence , très vite , quitte à loupé de temps en temps une info, car on est pas synchro.

Je pense que l'oscillo devrait parlé la dessus .

Apres lecture de ton message :
Si ton facteur passe 1 fois par jour, et que tu relèves ton courrier toutes les heures, il y a de forte chance pour que tu trouves ta boite vide de temps en temps. Par contre peu de risque de rater ton courrier!
Par contre si ta boite reste vide plus d'une journée, c'est que le facteur est malade.
Trés jolie image . Exemple parfait .
Donc toi tu préfère regarder le courrier toutes les heures . mais si tu va lever le courrier à 12h00 et que le facteur passe à 12h01 , tu n'auras ton courrier qu'a 13h00 ? ( ça c'est ton inconvénient)
Moi , je relève le courrier dés que le facteur l'a livré ( petit drapeau sur la boite aux lettre à l'américaine) ; je ne peux pas le raté . Par contre si le facteur viens pas , je m'en rendrais compte que le lendemain ( ça c'est mon inconvénient)

Maintenant a savoir qu'elle sont les inconvénients et les avantages de l'une ou l'autre solution . Je veux pas te contredire , je veux comprendre et faire avancé le chmilblick .....
 

dje8269

Senior Member
Le but étant de relevé un max de courier . disosn que le facteur passe toutes les heures.

Ma méthode :
à 12h00, il pose le courrier , je vais le recuperer tout de suite( normal je suis à ma fenêtre et je regarde mon drapeau en permanence) . que je mette une minute pour aller chercher le courrier et revenir à ma fenêtre , ou 59 minutes c'est pareil , je suis prêt à récupérer la deuxième fournée de 13h00 .

Ta méthode :
disons que tu va ouvrir ta boite au lettre toutes les 14 minutes ( grand sprotif va!! ;) ) .
à 12h00 il pose , à 12h14, tu le récupère déjà 14 minute de retard , puis tu y va à 12h28,puis 12h42 , puis 12h56 , il livre a 13h00 et tu recupere a 13h10 encore dix minutes de retard . L'avantage c'est qu'a 13h10 si tu n'as pas de courrier , tu sais qu'il est probablement malade .

Allez Finis de rigolé , laissons parlez l'oscillo , si tu veux bien !!! je vous mets tous ca en photo
 

PieM

Senior Member
si tu va lever le courrier à 12h00 et que le facteur passe à 12h01 , tu n'auras ton courrier qu'a 13h00
qu'est ce que ça peut me faire puisqu'il n'est actualisé qu'une fois par jour.
Tu ne va pas me dire que parce que tu as quelques ms de retard sur ta commande de moteur ça va être une catastrophe ? de toute façon elle n'est actualisée que toutes les 36ms !
et si tu faisais la somme des retards à partir de l'action sur le joystick, tu serais surpris!

Dans le principe le 20X2 va lire en fonction de son propre rythme donc de son besoin.
Si par exemple son temps de cycle venait à s'allonger au delà du temps de rafraichissement du scratchpad, ton principe ne pourrait pas fonctionner.
 

dje8269

Senior Member
Tu ne va pas me dire que parce que tu as quelques ms de retard sur ta commande de moteur ça va être une catastrophe ? de toute façon elle n'est actualisée que toutes les 36ms !
Non non , c'est sur . C'était juste pour le principe , je comprends vachement mieux avec des images ( le facteur était parfait) . Par contre quelques millisecondes ça va . mais ca se corse , quand le RFin fais des siennes couplées a un retard de lecture ; quand on tape dans les 100ms de pause, la oui ça se sent aux commandes .

Si par exemple son temps de cycle venait à s'allonger au delà du temps de rafraichissement du scratchpad, ton principe ne pourrait pas fonctionner.
Oui tout à fais exact .Mais y'a peu de chance quand même .

si tu faisais la somme des retards à partir de l'action sur le joystick, tu serais surpris!
Je veux bien te croire . entre les 36ms de RFout , le traitement de l'info , l'envoie par RF et la réception le traitement de 'linfo ...... je pense qu'on doit être dans les 80ms a 100ms de latence non ?
 

dje8269

Senior Member
Voila les tests ont parlés !!!

Égalité , ça je joue à très peu de choses prêt . j'obtiens environ 20 MàJ ( +/-1) avec les deux méthodes en une seconde ; j'ai tout même eu l'impression d'avoir plus d'erreur avec ta méthode (désolé...) , mais ça reste négligeable . ( j'ai quand même gardé les deux programmes pour testé en vrai)
En tout cas je suis plutôt content ça fais 50ms entre deux infos, c'est très bien je trouve .

Mais alors pourquoi je n'ai pas autant de MàJ que de RFin ? ( bon la c'est chipoter )
 

dje8269

Senior Member
Ben moi je vois qu'entre deux RFIN sur ton oscillo tu as 50 ms !
Oui c'est exact , je m'en suis rendu compte trop tard . Mais j'avais pas osez vous soumettre une idée ; mais au point ou on en est, j'avais pensé a ca .
En fait le Rfin fait 36ms le reste du programme fait 14ms . ces 14ms c'est juste le hi2cout . on peut le réduire si je ne m'abuse . car je n'ai que 4 variables a écrire au lieu de 8 actuellement. Je sais pas si ca me ferait gagner grand chose ; mais bon . si je gagne 5 ms . ca fais tout de même 45ms la période soit sur 1 seconde 22 MàJ au lieu de 20 actuellement .

mais il faudrait aussi que ce soit bien les 14ms du hi2cout, car on dépend aussi du RFout de l'émetteur , qui cadence le RFin qui cadence mon hi2cflag . Oui je sais je chipotte , mais je vous rassure je le ferais pas .

de retour à la maison , test réel !!!

Donc déjà , y'as une nette amélioration par rapport a hier ; la réactivité est top niveau, c'est le jour et la nuit . par contre il faut que je fasse attention car si la voiture s'approche trop de moi , quelques bugs sont apparus .( perte de comme et bloque sur le RFin il faut attendre que l'émetteur s'éteigne.

Autre chose , à un moment j'ai cru à un problème entre la marche avant et la marche arrière , mais en fait non, que nini . Quand on avance , la marche arrière ne peut tout simplement pas passer aussi brutalement . en fait la voiture freine c'est vraiment bien trouvé) . une fois arrêté elle peut passé en marche arrière. je me suis souvenus d'un truc que j'avais lu sur les régulateurs de vitesse . ( je vais certainement m'en servir pour l'arrêt du moteur en cas de perte de com)

La perte de communication fonctionne plus que bien , j'ai mis la variable presque a fond 250( au pire je passerai avec une word) ce qui me laisse 400ms avant d'arrêter la voiture. 400ms de perte de communication c'est plus qu'un accident , donc ca va très bien et c'est très réactif.

A titre d'infos avant de vous faire une vidéo , quand je recule et que je passe en marche avant rapidement ( la on peut le faire) , la voiture leve les roues avant tellement elle est nerveuse, je peux vous dire qu'a fond dans mon jardin , ca dure pas longtemps ...... . une vrai bombe .

Que du positif , vraiment génial, ce soir réglage des servos de la caméra !!!!
 
Last edited:

PieM

Senior Member
En fait le Rfin fait 36ms le reste du programme fait 14ms .ces 14ms c'est juste le hi2cout
pas du tout. Le RFin se fait à la cadence de la réception donc de l'émetteur et de son RFout.
Le hi2cout ne demande pas 14 ms !
 

dje8269

Senior Member
Le hi2cout ne demande pas 14 ms !
ca me paraissait un peu long aussi lol. Ce doit etre à l'émission alors qu'on peut améliorer un peu . Mais bon ce serait pour plus tard ou jamais lol . La réactivité etait parfaite .

Oui oui "etait " .....

5 minutes d'essai et de roulage sans aucun problèmes. Après mangé , j'invite ma femme a l'essayée et patrata ca déconne , puis plus rien . je n'ai absolument plus de com . Le flag reste à 0 ;

Le Tx s'active bien ( led allumé) mais je peux pas testé s'il envoie quelques chose .

Le Le flag reste a 0 , mais je ne peux pas tester non plus ........

J'espère rien de grave . Au moins c'est une panne franche , ca devrait vite se résoudre ...... .
 

dje8269

Senior Member
Bonjour à tous,

Plus rapide pas possible . La pile alimentant les picaxes sur la voiture etait morte, 2.1V au lieu des 3.6V . ca m'intrigue quand même, j'ai donc farfouillé mes pistes, voir si je n'avait pas un court-circuit ou quelques choses du genre .

J'ai ensuite pris quelques mesures au multimètre .tout est en ordre .

Savez vous pourquoi je perds 100mV quand j'alimente tout le circuit . C'est juste pour mieux comprendre que je pose cette question . Eteind la tension de la pile est 3.65V,par contre quand j'allume j'ai 3.5 V seulement a ces bornes ?
 

PieM

Senior Member
Ce qu'il faut mesurer, c'est le courant consommé par ton montage.
Quel type d'accus as tu et comment le charges tu?
 

dje8269

Senior Member
Alors C'est une vrai usine à gaz mon système .

Pour la télécommande , j'ai une batterie Li-po, 7.4V 800mAh , que je recharge avec le chargeur d'origine
Pour la voiture : deux alims ; une pile lithium de 3.6V,2200mAh pour le montage électronique ( 2µC le 14M2 et le 20X2 , le récepteur radio , une led de test ) aucune charge . je la change .
La deuxième alim il s'agit d'une batterie Ni-mH de 7.2V / 1800mAh , celle ci alimente le moteur et les servo ( direction et camera), je la charge avec le chargeur d'origine fournis avec la voiture . Je compte la changer pour une avec une meilleur capacité ( genre 3000mAh)
Et enfin une troisième li-po de 11.1V 900mAh qui alimente l'émetteur vidéo, que je recharge avec un chargeur de modélisme , conçu pour la charge li-po.

Aujourd'hui je pense pas pouvoir faire des tests, Beaucoup de boulot .
 

dje8269

Senior Member
Rohhh lol c'est pas bien de se moquer ......... .

Blague a part , c'est sur qu'avec 3 alimentation différentes sur la voiture ca fait usine à gaz . Mais bon j'ai bien été obligé ; Le moteur et les servo alim séparés de l"électronique pour les parasites . et l'émetteur vidéo est en 12V et consomme beaucoup deja lui tout seul .

Je suis bien content en tout cas, car la voiture fonctionne à merveille ! . il reste plus qu'a régler les servo de la caméra , et ensuite refaire le programme qui shunt le moteur quand j'appui sur mon BP . bref un peu de programmation quoi .
 

PieM

Senior Member
Si tu veux garder l'alim vidéo à part, je pense qu'à terme il faudra viser une seule batterie en 7.2V de qualité, qui alimente tes moteurs, avec un petit module à découpage qui abaisse la tension pour l'électronique. les parasites doivent se régler autrement que par la multiplication des sources.
En outre electronique et motorisation doivent avoir la même durée de vie en energie.
Tu peux même envisager de réalimenter ton 7.2V à partir de la batterie vidéo si nécessaire, ce qui permet d'optimiser l'autonomie!
Sur ta voiture tu as de l'électronique bien plus pointue, et tout part d'une batterie de 12V, même malgré le démarrage et la HT.
 

dje8269

Senior Member
Toutes ces idées sont bonnes, et ne sont pas tomber dans l'oreille d'un sourd. Mais sur cette voiture j'ai ma dose. Sur un autre projet pourquoi pas! Mais pour être honnête. Je ne pense pas que se sera avec des picaxes. Déjà finir celui la ce serait déjà un bon challenge pour moi.
 

GM39

Senior Member
Savez vous pourquoi je perds 100mV quand j'alimente tout le circuit . C'est juste pour mieux comprendre que je pose cette question . Eteind la tension de la pile est 3.65V,par contre quand j'allume j'ai 3.5 V seulement a ces bornes ?
La résistance interne est élevée, la tension chute vite. Regarde sur ce site, il y a les caractéristiques des piles : http://www.mega-piles.com/pile-lithium-src-11-0-0-0-0-1

Par exemple pour celle là : http://www.mega-piles.com/im/SAFT-LS14500.pdf il suffit de 10mA quand elle n'est plus neuve !

Il y a des modèles LFP rechargeables, c'est à voir : http://www.piles44.com/catalogue.php?de=0&cat=112
il n'y a pas les caractéristiques, dommage
 

dje8269

Senior Member
Merci GM39 pour ces infos.
A la louche le Rx 16mA, une led 15mA, et deux picaxes . Je dois être en dessous des 50mA préconisé dans la ds.

Si je dois refaire la solution de PieM paraît adéquate
 

GM39

Senior Member
50 mA, c'est ce modèle (2600mAh) et à cette valeur on ne récupère que 1,2Ah en tolérant une chute à 2V. A 2,1 ça ne fonctionnait plus

Donc ta pile doit durer autour de 15h à 20h
 
Last edited:

dje8269

Senior Member
Donc ta pile doit durer autour de 15h à 20h
15 heures ca me laisse deja pas mal de marge ; surtout que je pense enlever le clignotement de la led une fois bien fignoler . donc 15mA de gagner .


sinon j'avais une suggestion, mais je sais pas si c'est possible et/ou faisable ; alors je vous la soumet .

La caméra tourne bien sur ces deux axes ; mais à l'utilisation ce n'est pas très pratique . je m'explique :

Avec les formules classiques, la sensibilité est au top, mais justement trop sensible . Quand on tourne la caméra pour regarder quelques part , on ne peut pas rester toujours sur exactement la même poistion avec le joystick . donc la camera fais des petits mouvements qui à l'écran doivent être désagréable . Il faudrait un système de palier ou autre ( genre trigger schmidt ) . une fois rentré dans une zone , on en sort que sur un plus gros mouvement , ainsi si on évite les tremblements .

Je n'arrive pas à trouver de solution viable pour faire cela ; j'avais pensé diviser la zone par des paliers par exemple au lieu de bougé de 1° en 1° elle bougerais de 10° en 10° par a coup en quelques sortes !

Auriez vous des idées et/ou suggestions ?
 

jojojo

Senior Member
Sur un de mes anciens robot mobile, le servo de site de la cam était couplé au servo de direction du véhicule. TRES agréable. Et somme toute assez logique.
 

dje8269

Senior Member
Hummm effectivement c'est une idée , et ca parait tout à logique ; faut voir à l'usage . je garde cette idée sous le coude ; Car par la suite , c'est en tournant la tête que la caméra devrait tourné . lol .
 

dje8269

Senior Member
Me revoilà , je m'interroge maintenant sur la bonne façon de faire les choses.

Plusieurs modifications qui je suis sur ne manquerons pas de faire bondir . je suis bien entendu a faire toutes les modification nécessaires si cela s'avére utile.

J'ai créer mes paliers pour le pan de la caméra , ça fonctionne impeccable ( j'evite ainsi une mise à l'echelle :p) , mais c'est surtout plus efficace, peut être qu'une facon plus simple existe pour faire la même chose .

j'ai implémenter la fonction "BP caméra". de quoi s'agit-il ?, il s'agit en faite d'un BP sur la télécommande qui quand il est appuyé, permet de faire bouger la caméra et seulement elle, en inhibant les commandes de la voiture .
Une fois relâché, les commandes de la voiture deviennent à nouveau fonctionnel et c'est les commandes de la caméra qui sont inhibés .

j'aurais désiré arrêter les commandes caméra quand le bouton n'est pas appuyé par un "servo off" après les avoir replacées au milieu .

J'aurais désiré arrêter la voiture par une fonction " escape" , puis arrêter les commandes servo après les avoir replacées au milieu .
est-ce gênant d'utiliser deux fois la même fonction .

J'avais dans l'idée de faire une boucle quand le BP est à 0 et une autre quand le BP est à 1 , avec a l'interieur de chacun la lecture du scratchpad et la commande perte de com ? pensez vous que se serait la meilleure solution ?

Je viens tout juste de rajouter la fonction freinage dans la sub escape .

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_Tilt = b9

Symbol B_moteur = B.4
Symbol B_Direction = B.2
Symbol B_Pan = B.1
Symbol B_Tilt = B.0
Symbol B_Cam = PinC.5
Symbol B_Led = C.7

dirsB = %00010111 'declare Les broches B4,B2,B1 et B0  en sortie
dirsC = %10100000	'declare Les broches C7 et C5  en sortie


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

setfreq m8				' la commande servo ne fonctionne qu'a 8Mhz

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

servo B_moteur , 150		' Initialisation des commandes servo
servo B_Direction,150		
servo B_Pan,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

high B_led


'-----------------------------------	
'##### perte de communication  #####
do while hi2cflag = 0		' On attend l'arrivé d'un flag pour continué, sinon  trop long on arrete la voiture

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
loop

low B_led

get 0,b0,b1,b2,b3,b4,b5,b6,b7			' Lecture du scratchpad
	
hi2cflag = 0					' re-armement du flag
V_compteur_com = 0				' RAZ du compteur			


'------------------------------
'#####  Commande des TOR  #####


B_Cam = V_TXcam		' Declenche la caméra si le bit0 est à 1


If V_BPcam = 0 then		' Si le BP n'est pas appuyé on controle le moteur

	servopos B_Tilt, 150	' on place le tilt au milieu
	servopos B_Pan, 150	' on place le pan au milieu
	
	
	'--------------------------------
	'#####  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		' En Avant
		V_moteur = 165 - V_moteur *50/87
 		V_moteur = 150 + V_moteur
 	
	case > 168		' En arriére
 		V_moteur = V_moteur - 168 *50/87
 		V_moteur = 150 - V_moteur
	
	else			' Point mort
		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

	
else

	servopos B_moteur, 150
	servopos B_direction, 150	
	'----------------------------------------
	'#####  Commande Tilt de la camera  #####
	' Point milieu du joystick 104
	' Vers le haut (V_moteur va de 167 à 78)	/ position du servo de 150 à 70 (max 69)
	' Vers le bas (V_moteur va de 167 à 255)	/ position du servo de 150 à 160 (max 172)			


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

	servopos B_Tilt,V_Tilt			' 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 

	select case V_Pan
	
	case > 170
		servopos B_Pan,80
	case > 160
		servopos B_Pan,90
	case > 150
		servopos B_Pan,100
	case > 140
		servopos B_Pan,110
	case > 130
		servopos B_Pan,120
	case > 120
		servopos B_Pan,130
	case > 110
		servopos B_Pan,140
	case < 40	
		servopos B_Pan,220
	case < 50	
		servopos B_Pan,210
	case < 60	
		servopos B_Pan,200
	case < 70	
		servopos B_Pan,190
	case < 80	
		servopos B_Pan,180
	case < 90	
		servopos B_Pan,170
	case < 100	
		servopos B_Pan,160
		
	else 
	servopos B_Pan,150
	end select

end if

loop

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


'########     Perte de communication     ##########
Escape:
if V_moteur < 130 then 		' Si la voiture était en marche arriére à une certaine vitesse
	servopos B_moteur,200	' On freine la voiture en faisant marche avant
	pause 200
end if

if V_moteur > 170 then 		' Si la voiture était en marche avant à une certaine vitesse
	servopos B_moteur,100	' On freine la voiture en faisant marche arriére
	pause 200
end if

do while hi2cflag = 0		' Tant que le scratchpad n'as rien recu on eteint le moteur
	servopos B_moteur,150
	servopos B_Pan,150
	servopos B_Tilt,150
	servopos B_direction,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
 
Last edited:

PieM

Senior Member
j'aurais désiré arrêter les commandes caméra quand le bouton n'est pas appuyé par un "servo off" après les avoir replacées au milieu .
Non évite servo OFF, car tu est obligé de repartir avec une commande servo pour réinitialiser.
Pourquoi relire le scratchpad puisque tu reboucle systématiquement. Quant au s/p escape, il est géré lui aussi en tête.
le fonctionnement avec ton BP est une variante dans le fonctionnement normal. Il n'a pas à interférer avec la gestion de la sécurité com qui se fait par ailleurs.
 

dje8269

Senior Member
Non évite servo OFF, car tu est obligé de repartir avec une commande servo pour réinitialiser.
Ok c'est noté

Pourquoi relire le scratchpad puisque tu reboucle systématiquement
Justement je comptais creer deux boucles distinctes . BP à 0 et BP à 1 . car dans ce format ce qui me chagrine un peu c'est d'appliquer une valeur au commande servo qui sont inhibé ! je préfere eviter, il me semble que c'est Besqueut qui me l'avais conseillé .

J'ai mis les commandes en question en rouge . car je souhaiterais une fois qu'on appuie sur le BP , faire un arrêt d'urgence avec le s/p escape . Si la personne qui conduis la voiture avance , et appuie sur le bouton camera , il faut que celle ci s'arrête assez vite . D'après mes essais dans le jardin ( ce week end sur un stade), la voiture met bien 4/5 metres pour s'arreter si elle est a fond, le moteur en roue libre .

Code:
If V_BPcam = 0 then		' Si le BP n'est pas appuyé on controle le moteur

[COLOR="#FF0000"]	servopos B_Tilt, 150	' on place le tilt au milieu
	servopos B_Pan, 150	' on place le pan au milieu[/COLOR]
	
	
	'--------------------------------
	'#####  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		' En Avant
		V_moteur = 165 - V_moteur *50/87
 		V_moteur = 150 + V_moteur
 	
	case > 168		' En arriére
 		V_moteur = V_moteur - 168 *50/87
 		V_moteur = 150 - V_moteur
	
	else			' Point mort
		V_moteur = 150
	
	end select

	servopos B_moteur, V_moteur		' envoi du pwm sur le moteur
Quand on appui sur le BP , le moteur passe au PM , et la direction revient au milieu

Quand on relâche le BP la camera se met en position initiale ;

Le plus simple je pense c'est que je fasse ce programme et que je te le montre , car ca va etre dur à expliquer ; la difference ne doit pas etre enorme, c'est juste , que je ne voudrais pas me tromper de logique
 

PieM

Senior Member
ce qui me chagrine un peu c'est d'appliquer une valeur au commande servo qui sont inhibé
comprends pas. Tu lis une valeur ana et tu l'appliques à un servo ou un autre en fonction de l'état de ton BP. Rien d'anormal.

Par contre avoir recours à s/p escape n'est pas génial !
je préfère que tu fasse un un s/p "freinage" que tu appelle quand tu en as besoin. Ne pas tout mélanger.
 

dje8269

Senior Member
Tu lis une valeur ana et tu l'appliques à un servo ou un autre en fonction de l'état de ton BP
Oui , mais a l'appui je dois d'abord affecter une valeur au servo inhibé pour qu'il revient à la position initial . et je fais ca a chaque fois . Mais bon c'est pas forcement gênant, c'est juste que dans le principe je trouve ca bête d'affecté une valeur alors qu'elle ne change pas ;
Par contre avoir recours à s/p escape n'est pas génial !
je préfère que tu fasse un un s/p "freinage" que tu appelle quand tu en as besoin. Ne pas tout mélanger.
Ben je vais cogiter à ça , mais je pense que c'est la même fonction en fait .

Si une perte de com , on freine et on arrête la voiture, on met tout les servo au Point milieu

Si j'appui sur le BP pour commander la camera , il faut aussi freiner , arrêter la voiture , et mettre tout les servo au PM , le seul truc , c'est qu'avec la BP appuyé , On sortira tout de suite du s/p escape, si perte de com il reste dedans . donc je pense que ce s/p peu servir au deux cas
 
Last edited:

PieM

Senior Member
Ton analyse est mauvaise:

Ton escape gère le defaut de com, et en conséquence arrête la voiture avec ou sans freinage.

le freinage est une fonction annexe pouvant être appelée de n'importe quelle partie du programme (dont l'escape).
Pas besoin de teste le hi2flag quand on freine.
Sépare les fonctions , le programme n'en sera que plus clair.
 

dje8269

Senior Member
Je pense que j'ai du mal m'exprimé , comme souvent .

Ton escape gère le defaut de com, et en conséquence arrête la voiture avec ou sans freinage.
Non, Apres plusieurs test dans mon jardin ( et avec ma femme ... lol ), la fonction arrêt et freinage vont de pair ; l'arrêt de la voiture doit obligatoirement passé par un freinage ( suivant la vitesse) . et ce dans les deux cas possible la perte de com et/ou l'appui sur le BP ;

Je n'ai pas d'utilité a seulement freiner ; le freinage implique forcement un arrêt , et un arrêt forcement un freinage ( si la dernière valeur de vitesse enregistrer était élévée).
Je pense que j'ai bon, mais je comprends ce que tu veux dire .

Pas besoin de teste le hi2flag quand on freine.
Ca j'ai pas compris .....

question mécanique j'avais une question : comment je peux savoir que la voiture va au max ? Je n'ai pas de doc sur le régulateur, a ton avis est ce que ca craint si j'essaie une valeur comme 220 au lieu de 200 ? je ne voudrais pas faire de connerie .

PS : la voiture fonctionne du feu de dieu ; la caméra aussi ;

J' ai du repensé la mise a l'échelle du moteur pour créer une zone de "démarrage" . en fait a 150 le moteur est au PM , à 152 le régulateur reçoit l'info ( une led s'allume) et on l'entend forcé , on voit que le moteur essaie de tourner mais en vain . Le bruit est très désagréable, et je pense que la voiture ne doit pas forcement aimé . donc en fait je démarre direct à 160

J'ai toujours dés a coups dans la caméra; des espèces de petits "spasmes" parasites ; il faudra qu'on revienne dessus car c'est pas terrible.

Sinon on touche au but final ; la vidéo !!!!
 
Last edited:

dje8269

Senior Member
Voici le programme quasiment fini . Il est fonctionnel, la voiture réagi vraiment super bien ; Je ne perd pas de vue qu'il me manque la vidéo, ce qui risque de changer la donne sur quelques petits points .
Je m'interroge sur ce point la, j'ai pas trouvé d'autres solutions .

Code:
V_moteur = V_moteur max 160
servopos B_Tilt, V_moteur
point négatif, mais qui m'obligerais a revoir tout le programme et le divisé en deux comme dit un peu plus haut . quand j'appuie sur le BP, je ne peux pas faire un arrêt moteur, car il se se ferait a chaque fois vu qu'il est dans la boucle . Il faudrait que je créer deux boucles avec des instructions avant de rentrer dedans ; Je pense que c'est ce que je vais faire, mais pas ce soir .

autre point négatif, quand j'appuie sur le BP, je bouge camera , si par erreur je relâche un peu le BP , la voiture va réagir instantanément . si j'avais le joystick en haut , la voiture avance a fond par surprise. Il faudrait une tempo , mais ce n'est encore pas possible en l'état.

Sinon, ce weekend j'essayerai de faire une vidéo .

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_Tilt = b9

Symbol B_moteur = B.4
Symbol B_Direction = B.2
Symbol B_Pan = B.1
Symbol B_Tilt = B.0
Symbol B_Cam = PinC.5
Symbol B_Led = C.7

dirsB = %00010111 'declare Les broches B4,B2,B1 et B0  en sortie
dirsC = %10100000	'declare Les broches C7 et C5  en sortie


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

setfreq m8				' la commande servo ne fonctionne qu'a 8Mhz

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

servo B_Pan, 150			' Initialisation des commandes servo
servo B_Tilt, 160
servo B_moteur, 150		
servo B_Direction, 150		

put 2,167				' Ecrit dans le scratchpad la valeur du point milieu pour le moteur
put 4,104				' Ecrit dans le scratchpad la valeur du point milieu de la direction
put 6,104				' Ecrit dans le scratchpad la valeur du point milieu du Pan de la caméra

					
V_compteur_com = 0		' RAZ du compteur d'erreur communication	
		


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

main:
do

high B_led			' Allume la led test, pour verifie la communication et indique que la voiture est allumée / / peut etre supprimé.


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

do while hi2cflag = 0			' On attend l'arrivé d'un flag pour continuer, si c'est trop long, on arrete la voiture

V_compteur_com = V_compteur_com + 1 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
loop

low B_led					' On eteind la led test

get 0,b0,b1,b2,b3,b4,b5,b6,b7		' Lecture du scratchpad
	
hi2cflag = 0				' re-armement du flag
V_compteur_com = 0			' RAZ du compteur			


'------------------------------
'#####  Commande des TOR  #####


B_Cam = V_TXcam			' Declenche la caméra si le bit0 est à 1


If V_BPcam = 0 then		' Si le BP n'est pas appuyé on controle le moteur

	servopos B_Tilt, 160	' on place le tilt au milieu
	servopos B_Pan, 150	' on place le pan au milieu
	
	
	'--------------------------------
	'#####  Commande du moteur  #####
	' Point milieu 167 +/- 1
	' En Avant (V_moteur va 167 à 78)		/ Valeur du servo de 150 à 200
	' En arriére ( V_moteur va de 167 à 255 )	/ Valeur du servo de 150 à 100


	Select case V_moteur
		
	case < 163					' Marche avant
		V_moteur = V_moteur / 2
		V_moteur = 245 - V_moteur
	case > 171					' Marche arrriére
		V_moteur = V_moteur / 2
		V_moteur = 225 - V_moteur
	else			
		V_moteur = 150			' Point mort
	
	end select

	servopos B_moteur, V_moteur		' envoi du pwm sur le moteur
	
	
	'--------------------------------------
	'#####  Commande de la direction  #####
	' Point milieu du joystick 104
	' Tourne à droite (V_direction va de 104 à 185) / position du servo de 150 à 120 
	' Tourne à gauche (V_direction va de 104 à 29) 	/ position du servo de 150 à 180


	Select case V_direction

	case < 101					' Tourne à gauche	
		V_direction = 101 - V_direction * 5/12
 		V_direction = 150 + V_direction
 	
	case > 104					' Tourne à droite
	 	V_direction = V_direction - 104 * 5/12
	 	V_direction = 150 - V_direction min 120
	else
		V_direction = 150			' Point mort
	
	end select

	servopos B_Direction,V_direction	' Positionnement du servo

	
else

	servopos B_moteur, 150		'Appui sur le BP on met le moteur au PM
	servopos B_direction, 150	'Appui sur le BP on met la direction au PM
		
	'----------------------------------------
	'#####  Commande Tilt de la camera  #####
	' Point milieu du joystick 104
	' Vers le haut (V_moteur va de 167 à 78)	/ position du servo de 150 à 70 (max 69)
	' Vers le bas (V_moteur va de 167 à 255)	/ position du servo de 150 à 160 (max 172)			

	V_moteur = V_moteur max 160

	servopos B_Tilt, V_moteur 
	
	'---------------------------------------
	'#####  Commande Pan de la camera  #####
	' Point milieu du joystick 104 +/-1
	' Tourne à droite (V_Pan va de 104 à 181)	/ position du servo de 150 à 65
	' Tourne à gauche (V_Pan va de 104 à 32)	/ position du servo de 150 à 235 

	select case V_Pan
	
	case > 170
		servopos B_Pan,80		' Fonctionnement en creneau pour eviter les mouvements parasites
	case > 160
		servopos B_Pan,90
	case > 150
		servopos B_Pan,100
	case > 140
		servopos B_Pan,110
	case > 130
		servopos B_Pan,120
	case > 120
		servopos B_Pan,130
	case > 110
		servopos B_Pan,140
	case < 40	
		servopos B_Pan,220
	case < 50	
		servopos B_Pan,210
	case < 60	
		servopos B_Pan,200
	case < 70	
		servopos B_Pan,190
	case < 80	
		servopos B_Pan,180
	case < 90	
		servopos B_Pan,170
	case < 100	
		servopos B_Pan,160
		
	else 
	
		servopos B_Pan,150	' Point mort
	
	end select

end if

loop

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


'########     Arret de la voiture     ##########
Escape:

if V_moteur < 130 then 		' Si la voiture était en marche arriére à une certaine vitesse
	servopos B_moteur,200	' On freine la voiture en faisant marche avant
	pause 200
end if

if V_moteur > 170 then 		' Si la voiture était en marche avant à une certaine vitesse
	servopos B_moteur,100	' On freine la voiture en faisant marche arriére
	pause 200
end if

do while hi2cflag = 0		' Tant que le scratchpad n'as rien recu on eteint le moteur
	servopos B_moteur,150	' Si c'est une perte de com, on restera dans cette boucle
	servopos B_Pan,150	' Si c'est un appui BP on en sortira tout de suite
	servopos B_Tilt,160
	servopos B_direction,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
 
Top