Connexions (pins) PWM et RX, TX

Bonjour.

En regardant les pins de l'Arduino, je me rends compte qu'il y a 3 choses que je connais pas.
Premièrement les sorties digitales marquées PWM ont quel différence avec les autres ?
Je sais ce qu'est le PWN (signal carré avec longueur variable), mais pourquoi seulement certaines broches l'accepte ?

Ensuite je ne vois pas comment utiliser/l'utilité des Pins RX et TX, c'est quoi ?

Merci d'avance.

Pour les PWM je vais peut-être dire une connerie, le PWM utilise les timer du µC, donc il faut que le dit timer soit relié au timer et tu auras aussi des contraintes vis à vis de la gestion séparée des pins (sur chacun des pins tu peux définir un PWM indépendant).

Pour les RX et TX ce sont les connexions série du µC. En gros tu as :

USB <==> FTDI <==> Atmega

Le FTDI (ou at-bidule sur la UNO) va émuler un port RS-232 (qui utilise du +/-12V) sur ton PC. L'Atmega lui utilise du série TTL (qui utilise du 0-5V et polarité inversée au RS-232). Le FTDI fait donc l'interface PC/Atmega, et les pin RX-TX sont deux piquages entre le FTDI et l'ATMEGA.

Si tu ne te sers pas de la liaison série avec le PC sur une UNO, tu peux par exemple communiquer avec une autre UNO.

Bonjour,

Phoenix65:
En regardant les pins de l'Arduino, je me rends compte qu'il y a 3 choses que je connais pas.
Premièrement les sorties digitales marquées PWM ont quel différence avec les autres ?
Je sais ce qu'est le PWN (signal carré avec longueur variable), mais pourquoi seulement certaines broches l'accepte ?

C'est lié au hardware, comme le précise B@tto il ya un timer derrière chaque broche PWM (enfin 1 timer pour deux broches PWM pour être précis).
-> 3 timers = 6 broches PWM, le fabricant (ATMEL) à choisi les broches en question de manière arbitraire.

Phoenix65:
Ensuite je ne vois pas comment utiliser/l'utilité des Pins RX et TX, c'est quoi ?

  • upload du code (le port série usb et Rx/Tx sont relié en interne)
  • communication avec l'ordinateur
  • communication en série avec divers modules si besoin (gps, lcd, ...)

Ok pour le RX TX, je vais pas y toucher pour le moment alors. XD

Pour les PWM je vais peut-être dire une connerie, le PWM utilise les timer du µC

Donc il utilise pas le quartz présent sur la carte ?

il faut que le dit timer soit relié au timer

Pas bien compris la...
Pourquoi avoir plusieurs timers séparés ? Un seul (quartz) ne suffirait pas ? Après c'est généré par la puce, non ?

Phoenix65:
Donc il utilise pas le quartz présent sur la carte ?

Si, tout utilise la source d'horloge (le quartz) dans un microcontrôleur.

Phoenix65:
Pourquoi avoir plusieurs timers séparés ? Un seul (quartz) ne suffirait pas ? Après c'est généré par la puce, non ?

Timer = interruption(s) à un intervalle de temps précis -> applications gérant le temps de manière précise

Quartz = source du signal d'horloge, il ne faut pas tout mélanger.
Le quartz génère un signal qui cadence :

  • le cpu, à chaque "tick" une action est effectué,
  • les périphériques hardware (timers, port série, convertisseur analogique, ...)

Phoenix65:

il faut que le dit timer soit relié au timer

Pas bien compris la...

Erreur ^^' je voulais dire "il faut que le timer soit relié au pin". Et encore la bien sur c'est un raccourci que je prends, mais dans le principe c'est ça

Timer = interruption(s) à un intervalle de temps précis -> applications gérant le temps de manière précise

Donc les timer sont des parties de code de bas niveau incorporé au firmware qui gère les I/O si je suis bien l'explication.

Phoenix65:
Donc les timer sont des parties de code de bas niveau incorporé au firmware qui gère les I/O si je suis bien l'explication.

Les timers sont des composants hardware, qui permettent via des interruptions d'appeler des morceaux de code dits "d'interruptions".
Pour mieux comprendre : http://www.atmel.com/Images/doc8161.pdf à partir de la page 94

En gros c'est des compteurs logiques (hardware)

Ok je vois en gros le principe. Pour le PDF c'est franchement trop complexe pour moi...

Et donc il est impossible de générer un PWM sur les sorties non notée PWM ?
Par exemple en mettant une sortie non PWM à HIGH pendant 2ms, puis LOW pendant 18ms avec une boucle ça irait pas ?

Si si, mais l'avantage du pwm c'est qu'il n'est pas interféré par le reste du code (dès que tu as une pause ça va perturber ton timing). D'ailleurs il y a une lib : Google Code Archive - Long-term storage for Google Code Project Hosting.

Du coup question bête, mais comment avoir plusieurs codes qui s'exécute en même temps ?
Genre avoir des tâches en parallèle de la principale ?

Tu peux utiliser les timers justement, pour éviter que ton programme ne reste "bloqué" que sur une action pendant un delay(). C'est pas réellement du multitaches mais ça s'en approche.
La base c'est cet exemple: http://www.arduino.cc/en/Tutorial/BlinkWithoutDelay
Après j'ai vu qu'il y avait des choses à faire avec les timers et les librairies qui vont bien, mais je me suis pas encore penché dessus suffisamment, je peux pas t'en dire plus pour le moment.

Mais ce signal PWM ne peut pas être défini en fréquence, c'est noté ici :

The frequency of the PWM signal is approximately 490 Hz.

Donc comment par exemple avoir un PWM de 20ms de long (50Hz donc) pour un servomoteur ?

Tu peux modifier la frequence du PWM mais il y aura des effets de bord, c'est à dire que par exemple les delay ne seront plus exact : Modifier la fréquence d’un PWM - PoBot

Phoenix65:
Du coup question bête, mais comment avoir plusieurs codes qui s'exécute en même temps ?
Genre avoir des tâches en parallèle de la principale ?

Une seule réponse possible à cette question :
P H Y S I Q U E M E N T I M P O S S I B L E

Un microcontrôleur ATmega est mono-processeur, 1 cpu = 1 tache en parallèle.
Exécuter plusieurs taches en parallèle est donc ... physiquement impossible.

Tu peut utiliser un système RTOS par contre (-> une tache à la fois mais avec un changement de tache toute les n millisecondes).
Un RTOS pour arduino que je connais bien pour avoir fait déjà plusieurs patchs dessus : DuinOS.

@B@tto : pour la fréquence quand tu dis plus exacte c'est dans quel ordre de grandeur ?
Car je rappelle que c'est pour piloter un servo moteur, donc une précision pas forcément parfaite.

en gros la manip consiste à modifier la fréquence qui est au coeur du système, ce qui modifie par conséquent celle du PWM. Mais du coup les delay sont affectés, ils sont toujours précis, mais delay(20) va en fait attendre 40 ms

Mais alors comment fonctionne la bibliothèque pour les servos ? Car selon la page de référence la dessus, le servo se branche (signal) sur une I/O PWM... Or justement la fréquence ne correspond pas.