1. Ce site utilise des cookies. En continuant à utiliser ce site, vous acceptez l'utilisation des cookies. En savoir plus.

cherche aide pour codage PID sur arduino !

Discussion dans 'Electronique spécifique CNC' créé par Doctor_itchy, 15 Juin 2013.

  1. Doctor_itchy

    Doctor_itchy Modérateur

    Messages:
    3 554
    Inscrit:
    20 Avril 2007
    cherche aide pour codage PID sur arduino !
    hello as tous :)

    voila j'ai besoin d'un pro de l'arduino et servo , j'explique

    je suis occuper a fabriquer une cnc graveuse laser sur base d'une imprimante jet d'encre epson PRO taille A2 (imprimais des plans ) j'ai garder le châssis la mécanique et les moteur qui sont des bon moteur DC sur roulement ! avec encodeur quad , trouvant les prix des drivers servo assez elever (70€ le moins chère ) et n'en trouvant pas d'occasion je me suis décider et j'ai acheter sur ebay des drivers 4ampere DC ultracompact de 40*40*32mm contrôler en pwm high et pwm low , entrée enable et sortie current sense , j'ai acheter deux petite arduino NANO , j'ai assemblé le tout , et coder sur base d'un code venant de chez makerbot , cela fonctionne le servo est bien "servo"


    par contre le code trouver n’intègre pas de PID , donc la posistion demandée n'est pas tjrs la meme , bcp d'erreur de pas :/ se code est opensource et doit etre amélioré ! , j'ai bien commencer en integrant une sortie enabled , modifier le pinout initial ect mais le pid j'ai tenter et je patauge :/

    si une personne a un code opensource qui gere les entrée step/dir , encodeur , et sortie pour pont en H deux fils avec le PID et que cela fonctionne nikel , je prend :)

    j'ai beau chercher sur le net j'ai trouver du code pid mais il sont tous différent , j'ai meme le code du yapsci ( qui tourne sur pic mais le code est en C++ donc portable ) et je n'arrive pas a l’intégré ( et j'aimerais un autotune si possible :) )

    au pro de l'arduino merci d'avance :)

    P1040148.JPG
    ↑  le drivers


    P1040149.JPG
    ↑  l'arduino


    P1040150.JPG
    ↑  la carte interface entre arduino et drivers qui serais faite " correctement " des que la machine fonctionneras :)


    P1040152.JPG
    ↑  en test sur le moteur :)
     
  2. chlore

    chlore Compagnon

    Messages:
    2 329
    Inscrit:
    10 Mars 2007
    Localité:
    Candulonts
    cherche aide pour codage PID sur arduino !
    Bonjour

    Avant de parler PID je vois deux problèmes potentiels :

    1 - Est-ce que les signaux A et B de l'encodeur sont gérés par des interruptions ?
    2 - Est-ce que l'adressage des sorties se fait à l'aide d'une librairie "rapide" (du genre digitalwritefast.h) ou mieux par adressage direct des ports I/O. Si c'est la librairie standard de l'arduino pour les entrées/sorties il y a de grandes chances que cela marche sur 3 pattes car elle est très chronophage
     
  3. gaston48

    gaston48 Compagnon

    Messages:
    6 193
    Inscrit:
    26 Février 2008
    Localité:
    59000
    cherche aide pour codage PID sur arduino !
    Bonjour,


    Doc ! mais quand vas-tu te mettre à Linuxcnc/emc2 ? :wink:
    tu serais opérationnel depuis longtemps ...
     
  4. Doctor_itchy

    Doctor_itchy Modérateur

    Messages:
    3 554
    Inscrit:
    20 Avril 2007
    cherche aide pour codage PID sur arduino !
    haaa emc² ben si je l'utilise sur mes autres cnc :wink:

    mais ici c'est un projet as base d'un controleur autonome qui tient dans l'imprimante avec un ecran 128*64 graphique sur un pic ( schéma et code de arnaud :) ) un pc ne rentre pas :/ donc je met le code sur une carte sd et la machine execute , et comme j'ai tout pour le faire :)


    pour le code

    c'est baser sur le code makerbot servo !

    tout tient dans un seul programme , pas de librairie (j'ai d'autre code avec librairie , mais il ne gere pas les entrée stepdir et me font plien d'erreur en compilation :/

    l'encodeur est addressé comme suit

    #define QUAD_A_PIN 7 //encodeur
    #define QUAD_B_PIN 2 //encodeur

    et dans void setup

    pinMode(QUAD_A_PIN, INPUT);
    pinMode(QUAD_B_PIN, INPUT);

    et dans les derniere ligne


    void read_quadrature_a()
    {
    // found a low-to-high on channel A
    if (digitalRead(QUAD_A_PIN) == HIGH)
    {
    // check channel B to see which way
    if (digitalRead(QUAD_B_PIN) == LOW)
    position--;
    else
    position++;
    } // found a high-to-low on channel A
    else
    { // check channel B to see which way
    if (digitalRead(QUAD_B_PIN) == LOW)
    position++;
    else
    position--;
    }
    }

    void read_quadrature_b()
    {
    // found a low-to-high on channel A
    if (digitalRead(QUAD_B_PIN) == HIGH)
    {
    // check channel B to see which way
    if (digitalRead(QUAD_A_PIN) == LOW)
    position++;
    else
    position--;
    } // found a high-to-low on channel A
    else
    { // check channel B to see which way
    if (digitalRead(QUAD_A_PIN) == LOW)
    position--;
    else
    position++;
    }

    les sortie sont gérée direct sur le code principal

    genre

    digitalWrite(MOTOR_RPWM_PIN, LOW);
    digitalWrite(MOTOR_LPWM_PIN, LOW);

    et

    analogWrite(MOTOR_LPWM_PIN, motor_speed);


    je pense que je vais devoir refaire un code complet :/
     
  5. Doctor_itchy

    Doctor_itchy Modérateur

    Messages:
    3 554
    Inscrit:
    20 Avril 2007
    cherche aide pour codage PID sur arduino !
    j'ai un autre coe qui gere le codeur avec des interruption :) , mais celui la controle le tout via les entrée analog , pour un potard :/ , j'ai encore un autre code qui lui ne fait que balader le chariot de droite a gauche , j'ai potasser le codage arduino mais je suis un peu perdu avec tout ses codes ! , mais j'en démors pas ^^
     
  6. chlore

    chlore Compagnon

    Messages:
    2 329
    Inscrit:
    10 Mars 2007
    Localité:
    Candulonts
    cherche aide pour codage PID sur arduino !
    Bonjour

    Effectivement à la vue du code il ne semble pas (pas de déclaration) que les signaux du codeur soient traités par des interruptions.
    A mon avis il est impératif que cela soit le cas sinon tu ne seras jamais sur que tu n'as pas loupé des "ticks".
    De même je pense qu'il aussi impératif que tu lises les entrées de la façon la plus rapide possible et donc soit en utilisant la librairie "digitalwritefast" soit en codant en "vrai" C c'est à dire en adressant directement sur les ports I/O (PORTB, ...).
    Soit tu n'utilises qu'une seule interruption (sur A) puis tu lis B pour incrémenter / décrémenter la valeur absolue des "ticks". Soit tu utilises les deux interruptions dispo sur la NANO et tu fais pareil pour B en lisant A. Dans un cas tu est en "x2" dans l'autre en "x4"

    Pour le PID , la majorité des codes que j'ai vu "strappent" la valeur temps et calculent le PID à intervalle donné en utilisant une interruption logicielle (timer), cela simplifie le code (pour une régulation de température c'est suffisant) mais Je ne pense pas que pour un servo cela soit très adapté surtout si il y des rampes d'accélération ou de ralentissement sans parler que cela risque d'entrer en conflit avec la gestion des entrées A-B.
     
  7. Doctor_itchy

    Doctor_itchy Modérateur

    Messages:
    3 554
    Inscrit:
    20 Avril 2007
    cherche aide pour codage PID sur arduino !
    okay :) , tu as un exemple de code pour l'encodeur ? avec des interruption ?

    car oui j'ai bien l'impression que le code zap des impultion du codeur ( et le moteur ne tourne pas a fond , il doit etre a 300tmins alors que en dc 24V directement il tourne a 2000tmins .... ( et tout est as fond sur mach3 !!! )

    bien que je pense avoir un code avec ça , il faudrais que je l'essaie mais je doit supprimé le controle par pot analogique et mettre en step dir , se soir cafer fort papier crayon , bien assis et je tente ça :)

    nuit blanche en vue haha ^^ et la nano va chauffer :)

    je suppose que si le code n'integre pas de pid la précision ne sera pas au top non plus :)
    je mettrais mon code ici tantot si tu sais m'aider , car le c++ et moi houlaaaa :/
     
  8. gaston48

    gaston48 Compagnon

    Messages:
    6 193
    Inscrit:
    26 Février 2008
    Localité:
    59000
    cherche aide pour codage PID sur arduino !
    ???

    j’insiste peut être lourdement mais avec emc2 configuré avec pwm high et pwm low etc tu testes et mets au point ,
    avec tout le conforts, tous les éléments de ton imprimante: encodeurs, servomoteurs, drives, jeux, PID, FF, etc
    (emc2 n’est pas seulement un interpolateur comme mach3, il sait faire l’acquisistion de codeurs et piloter un pont en H)
    Peut être que seule une action proportionnelle P est suffisante ?
    A la fin, tu bascules le juste nécessaire sur Arduino.
     
  9. Doctor_itchy

    Doctor_itchy Modérateur

    Messages:
    3 554
    Inscrit:
    20 Avril 2007
    cherche aide pour codage PID sur arduino !
    ha oui vu comme ça :) pour ajuster le pid et co

    mais j'aimerais faire un code qui fait de l'auto pid , donc ajustement auto :)

    pas pour se soir finalement :/
     
  10. chlore

    chlore Compagnon

    Messages:
    2 329
    Inscrit:
    10 Mars 2007
    Localité:
    Candulonts
    cherche aide pour codage PID sur arduino !
    Bonjour

    Ici un exemple de code pour décodage complet (x4) des signaux A-B avec interruption (changement d'état) et utilisation de la librairie "digitalwritefast".

    @Gaston48 : j'ai quelques doutes sur la capacité d'un PC à générer un signal PWM tout en surveillant les signaux d'un codeur sur son port parallèle et ce quelque soit l'OS/programme derrière.
     
  11. nopxor

    nopxor Compagnon

    Messages:
    1 363
    Inscrit:
    27 Mai 2010
    Localité:
    Yvelines
    cherche aide pour codage PID sur arduino !
    Bonjour,

    Arduino -> 16 Mhz , PC -> ~= 1.6 GHz
    Soit une cadence 100 fois plus élevée.
    Même en tenant compte de RISC / CISC, la puissance de calcul d'un PC est énorme.
    Et le noyau temps réel linux est optimisé pour l'application CNC.
     
  12. gaston48

    gaston48 Compagnon

    Messages:
    6 193
    Inscrit:
    26 Février 2008
    Localité:
    59000
    cherche aide pour codage PID sur arduino !
    Pour être à l’aise il faut doper les entrées / sorties avec une carte à FPGA Mesa.
    Le premier prix étant de 88 euros sur port // ou USB.

    http://www.duzi.cz/shop_cnc/index.php?main_page=index&cPath=1_4

    Suivant ces cartes, les fréquence d’échantillonnage des encodeurs sont de 33 ou 50 Mhz.
    Celles des PDM ou PWM sont de 2 MHz et 190 KHz.
    Par défaut, une boucle PID est calculé toutes les 1 ms … ce qui nous ferait tous les 0.01 mm
    pour une avance de travail de 800 mm/mn. certains descendesnt à 0.1 ms
     
    Dernière édition par un modérateur: 16 Avril 2015
  13. chlore

    chlore Compagnon

    Messages:
    2 329
    Inscrit:
    10 Mars 2007
    Localité:
    Candulonts
    cherche aide pour codage PID sur arduino !
    Ok, donc il faut rajouter (acheter) une carte ... tout ca pour mettre au point sur du matériel qui n'a strictement aucun rapport avec la finalité : l'arduino fonctionne, le circuit à L298 fonctionne, le moteur fonctionne : c'est juste du logiciel à faire
    Soit le Doc veut un truc autonome à bas cout soit il prend un PC avec une carte + drivers mais pour la mise au point je ne vois pas l’intérêt ou il y a quelque chose que je n'ai pas saisi
     
  14. coredump

    coredump Compagnon

    Messages:
    3 404
    Inscrit:
    8 Janvier 2007
    Localité:
    Côte d'azur
    cherche aide pour codage PID sur arduino !
    Mais 0 entrée/sortie rapide. Du coup faut passer sur du Mesa qui fait un support matériel des encodeurs et PWM.
     
  15. gaston48

    gaston48 Compagnon

    Messages:
    6 193
    Inscrit:
    26 Février 2008
    Localité:
    59000
    cherche aide pour codage PID sur arduino !
    Je ne pense pas me tromper en disant que la config de prédilection de Doc, c’est Mach3 + la carte YAPSC de Max-Mod + servomoteur DC à balais …
    Il se trouve que ma Max-Mod n’assure plus le suivi de sa carte, d’où les tentatives infructueuses de recherche par Doc de driver DC à entrées step/dir lowcost style leadshines ( http://www.usinages.com/post590280.html#p590280 ) par exemple.

    J’essaye de convaincre Doc d’utiliser Emc2 non pas comme un Mach3 sur Linux, mais comme une vrais cnc.
    Il faut "juste" investir dans une carte à 90 euros. Les drivers en H des moteurs restent ceux à base de L298.
    Et pour l’avenir, la possibilité aussi d’exploiter les anciens servodriveDC à entrées +/- 10v.
    Ou comme Biduleur, la possibilité de se faire des drivers en H beaucoup plus puissants.
     
    Dernière édition par un modérateur: 16 Avril 2015
Chargement...

Partager cette page