Pages: [1] 2   Go Down
Author Topic: Servo / OneWire et lag  (Read 1788 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Full Member
***
Karma: 1
Posts: 144
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Bonjour à tous.
Je rencontre quelques soucis a faire fonctionner la library Servo et OneWire.
Servo : pour controler un servo moteur fatuba
OneWire : pour lire la température d'un ds18b20

Le problème semble être au niveau des interruptions que le onewire doit "initialiser", ainsi les 20ms pour l'ordre du servo semble tronqué cela a pour conséquence que par moment le servomoteur au lieu de continuer sa course revient un degré avant puis repart au vrai angle (ce qui laisse pense que l'ordre des 20ms n'est pas transmis en entier).

Cela ne se produit que lorsque un périphérique onewire est actif.
Dans la librairie onewire il y a une tonne de delayMicroseconds , interrupts , noInterrupts et cli.
Il y aurait il un petit conflit entre les deux librairies ?


Logged

Offline Offline
Faraday Member
**
Karma: 34
Posts: 5180
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Bonjour à tous.
Je rencontre quelques soucis a faire fonctionner la library Servo et OneWire.
Servo : pour controler un servo moteur fatuba
OneWire : pour lire la température d'un ds18b20

Le problème semble être au niveau des interruptions que le onewire doit "initialiser", ainsi les 20ms pour l'ordre du servo semble tronqué cela a pour conséquence que par moment le servomoteur au lieu de continuer sa course revient un degré avant puis repart au vrai angle (ce qui laisse pense que l'ordre des 20ms n'est pas transmis en entier).

Cela ne se produit que lorsque un périphérique onewire est actif.
Dans la librairie onewire il y a une tonne de delayMicroseconds , interrupts , noInterrupts et cli.
Il y aurait il un petit conflit entre les deux librairies ?

Bonjour
je vais faire une demi réponse de Normand  smiley-mr-green

c'est pas impossible  smiley-cool

Il faut savoir ou se rappeler qu'un DS18B20 pour initier et achever une acquisition à résolution max demande environ 1 seconde (un peu moins mais par confort intellectuel , je table sur la seconde )

il faut voir où serait la criticité du taux d''acquisition de la T° dans ton application.

en thermometrie "domestique" en règle générale il n'y a pas besoin d’acquérir à beaucoup plus que la minute


Logged

Ales
Online Online
Faraday Member
**
Karma: 39
Posts: 3753
Do or DIY
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

S'il y a des noInterrupt() et des cli() c'est pas impossible : la librairie servo se sert justement des interruptions sur le Timer1.
Logged


France
Offline Offline
Faraday Member
**
Karma: 55
Posts: 5347
Arduino Hacker
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Bonjour,

La librairie OneWire fabrique un bus 1Wire software à grand coup de delayMicroseconds() et de noInterrupts().
Du coup il n'est pas possible d'utiliser Servo en même temps, ou sinon le signal des servomoteurs sera altéré par moment.
Logged

Des news, des tuto et plein de bonne chose sur http://skyduino.wordpress.com !

Paris
Offline Offline
Full Member
***
Karma: 1
Posts: 180
Beyond the possible...
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Un petit MCU style ATtiny85 pour commander les servo en i2c est-ce une bonne alternative ?
Logged

The Mind is like a parachute it works best when opened.

France
Offline Offline
Faraday Member
**
Karma: 55
Posts: 5347
Arduino Hacker
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Un petit MCU style ATtiny85 pour commander les servo en i2c est-ce une bonne alternative ?
Pourquoi pas, c'est une solution effectivement.
Logged

Des news, des tuto et plein de bonne chose sur http://skyduino.wordpress.com !

Offline Offline
Full Member
***
Karma: 1
Posts: 144
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

bon ok.
merci des pistes !

je vous tiens au jus du workaround retenu...
Logged

Ales
Online Online
Faraday Member
**
Karma: 39
Posts: 3753
Do or DIY
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ou utiliser un capteur de température qui n'utilise pas le Onewire xD
Logged


France
Offline Offline
Faraday Member
**
Karma: 55
Posts: 5347
Arduino Hacker
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Ou utiliser un capteur de température qui n'utilise pas le Onewire xD
Un bon vieux LM35 et hop probléme réglé smiley-mr-green
Logged

Des news, des tuto et plein de bonne chose sur http://skyduino.wordpress.com !

Offline Offline
Full Member
***
Karma: 1
Posts: 144
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

effectivement.
j'avais prévu le coup, j'ai du lm135 en stock, faudra que j'écrive les classes dérivées pour ce composant d'ailleurs.

pour le moment j'ai juste désactivé la pause et la reprise des interruptions dans le library onewire car je ne m'en sert pas j'en ai profité pour patcher la library pour disposer d'un contructeur par defaut et d'une méthode d'initialisation. Cela permet de déclarer en dynamique un objet via un template et d'activer le onewire quand les init sont finis.

à suivre, une fois que toutes mes library seront terminée. Puis on repassera sur la partie électronique smiley-sad
Logged

France
Offline Offline
Faraday Member
**
Karma: 55
Posts: 5347
Arduino Hacker
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

j'avais prévu le coup, j'ai du lm135 en stock, faudra que j'écrive les classes dérivées pour ce composant d'ailleurs.
Faire une classe dérivée pour un malheureux LM35 ?
J'ose même pas imaginer le reste du code ...
On est sur un µC avec 32Ko 29Ko (effectifs) de flash et 4Ko de RAM ne l'oublie pas smiley-wink

j'en ai profité pour patcher la library pour disposer d'un contructeur par defaut et d'une méthode d'initialisation. Cela permet de déclarer en dynamique un objet via un template et d'activer le onewire quand les init sont finis.
Template + allocations dynamiques ... Tu cherches vraiment la merde smiley-wink
Sur PC pourquoi pas mais sur AVR avec avr-gcc ... bonjour les dégâts collatéraux.

-> Les templates sont supportés depuis la version 4.3, coup de bol (humm smiley-roll) la team arduino fourni la version 4.3.3 avec l'ide.
(La version actuelle de avr-gcc est là 4.7.2, mais avant que la team arduino ce décide on sera à la version 5.x smiley-mr-green)
-> les opérateurs new/del ne sont pas supportés ! En fait il sont émulés en interne à grand coup de malloc/free ...

Fait trés attention aux allocations dynamiques, si tu crées / détruit des objets tu va (immanquablement) fragmenter ta mémoire RAM et avec 4Ko ça peut finir en reset en quelques malloc/free smiley-wink
Tu peut demander aux utilisateurs de la librairie "String" pour arduino : crash assuré à un moment ou à un autre.
Logged

Des news, des tuto et plein de bonne chose sur http://skyduino.wordpress.com !

Offline Offline
Full Member
***
Karma: 1
Posts: 144
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

houlala !  alors t'inquiete pas pour mon code, j'ai fini l'école depuis une bonne vingtaine d'année et c'est un peu ma routine de coder.
Pour info j'ai donc créé un noyau, un shell pour l'arduino. Tout est pilotable en ligne de commande avec une tonne de library que j'ai créé,  permettant ainsi avec une tablette graphique de configurer en wysiwyg ton arduino avec tout ce qui tu y plug et rajouter pour chaque plug des triggers. Mais chutttt c'est pas fini.
Donc pour te faire peur, c'est du polymorphisme, pointeur, du virtual et autre chose que tu vas apprendre a l'école bientôt smiley-wink

Pour info je fais tourner la bête avec moins de 1% du "cpu" et avec un nombre "incalculable" de truc branché ... mais chuuttttt c'est pas fini !  lol
Logged

France
Offline Offline
Faraday Member
**
Karma: 55
Posts: 5347
Arduino Hacker
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Ok ... J'aime les réponses agressives sans raison.

Donc pour te faire peur, c'est du polymorphisme, pointeur, du virtual et autre chose que tu vas apprendre a l'école bientôt smiley-wink
1) Je suis étudiant en 2ème année de DUT informatique, le polymorphisme je connais, les virtual je maitrise.
2) Je ne suis pas un débutant dans le domaine de la programmation comme tu sembles le penser. Si ton but est de m'impressionner avec tout un tas de codes, librairies, ou autre c'est loupé.

Un shell pour arduino ? Super ! J'ai conçu mon propre langage de programmation typé basic/asm, un compilateur 2 passes et une machine virtuelle pour le faire tourner ... (le code du DCPU v1 est sur mon github, les spécifications préliminaire du VCPU v2 aussi)
Mais chuuttttt ... prendre les gens de haut c'est tellement plus pratique.

Bien maintenant que les horloges ont été remise à l'heure revenons à nos moutons, l'allocation dynamique et les templates.
Pour les templates, tout est dit.
Pour l'allocation dynamique voici le lien vers le bug-track sur le tracker du projet arduino et d'avr-gcc :
http://code.google.com/p/arduino/issues/detail?id=857

Pour info je fais tourner la bête avec moins de 1% du "cpu" et avec un nombre "incalculable" de truc branché ... mais chuuttttt c'est pas fini !  lol
De quoi l'arduino ? Si oui je serait curieux de savoir comment tu prétend utiliser 1% d'un CPU ne pouvant pas être mis en pause smiley-wink
(exception faite de l'API <avr/sleep.h> permettant de passer en mode basse consommation)

C'est bien beau de vouloir prendre les gens de haut en se croyant plus fort que n'importe qui.
Pour ma part je n'ai jamais prétendu tout savoir, de toute façon personne sur cette planète ne peut tout savoir quelque soit le domaine.
Le fait est que le peu que je sait en programmation est suffisant pour te dire que faire des classes dérivées pour un capteur aussi simple qu'un LM35 et utiliser des templates / allocations dynamique avec avr-gcc n'est pas une bonne idée.
Aprés je suppose que tu as fait un diagramme UML pour arriver à cette solution technique et c'est ton choix, je le respect.
Logged

Des news, des tuto et plein de bonne chose sur http://skyduino.wordpress.com !

Offline Offline
Jr. Member
**
Karma: 0
Posts: 52
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Salut,

Si je peux me permettre une suggestion avant que la guerre n’éclate :-)

Le 1Wire doit pouvoir bloquer les interruptions sinon pas moyen pour lui de respecter
les timmings.

Par contre le Servo moteur n'as besoin de précision que pour la durée de l'impulsion haute.
Entre les impulsions, on peut avoir des écarts de temps tant qu'on lui envoie des pulses assez souvent.

Au lieu d'utiliser la librairie Servo, on pourrait utiliser le timer1 en mode CTC avec
la fonctionnalité qui permet de clearer une pin lorsque le compare se produit. Ainsi la durée
de l'impulsion n'est plus dépendante du blocage ou non des interruptions.

Logged

Offline Offline
Full Member
***
Karma: 1
Posts: 144
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

lol

nan mais aucun problemes, pas de guerre en vue, j'ai bien d'autre chose a faire smiley-wink
Juste que le cote je te pique tout le temps est plus qu'agaçant qu'en voit finalement les projets que certains on réalisé en fin de compte...

Quand on croit tout savoir ou peut etre surpris de découvrir ce que certains ou pu faire qu'on n'aurait jamais pu penser faire ou su faire. Mais chuuuttt ! lol Plus dur sera la chute comme on dit smiley 
Mais elle sera bénéfique à tout le monde car mon système sera gratuit et utilisable tel quel ou comme noyau pour créer sa propre couche graphique ou en y rajoutant ses propres "sensors".

Je vais voir ce que tu dis, meme si pour le moment mon patch convient parfaitement pour ce sensor.

"le challenge" est d'utiliser le minimum de temps "cpu", pour le moment c'est pari gagné, mais cela oblige a re écrire pas mal de librairie pour les rendres non bloquantes bref bref bref ... à suivre smiley-wink  et merci de vos réponses
Logged

Pages: [1] 2   Go Up
Jump to: