logiciel CNC pour arduino en java

Bonjour,

J'ai trouvé sur ce site une application CNC en java :

http://www.freewebs.com/adub/

L'adresse du zip pour télécharger les fichiers :

http://www.freewebs.com/adub/Slice_Dice_xml_reader.zip

Ca à l'air sympa et selon ce que dit la page d'accueil du site, ça devrait être compatible OS X.
Quand je lance l'application , elle ne s'affiche pas entièrement et ne fonctionne pas.

Dans le fichier .txt d'instructions il est précisé que l'application à été compilée sur Wind... et que ça pourrais générer des problèmes .... effectivement.

Est-ce que quelqu'un aurait une piste pour corriger ce problème ?

Tu as fait la dernière mise à jour Java ?
a+

Salut
Tu comptes utiliser ce logiciel pour piloter une CNC maison a base d'arduino?
Tiens nous au courant ^^

Salut Vincent,

J'ai fait les mises à jours java, sur mon Emac OS X.3.9 j'ai la version 1.4.2 (je ne peux pas avoir une version plus récente) j'ai également testé sur mon Powerbook OS X 1.5 (dernère version de java disponible) et là ça ne fonctionne pas non plus, Quand je clique sur l'icône de l'appli pour la lancer elle s'installe à moitié et j'ai ça :

Voici ce qui se trouve dans le fichier readme.txt :

This application was created on Windows, which doesn't

properly support setting files as "executable",

a necessity for applications on Mac OS X.



To fix this, use the Terminal on Mac OS X, and from this

directory, type the following:



chmod +x Slice_Dice_xml_reader.app/Contents/MacOS/JavaApplicationStub

J'ai donc "chmodé" pour avoir un accès universel, mais c'est toujours la même situation.

Pour répondre à melka, avec l'arduino j'aimerais faire du "motion-control", au sens large du terme, si en passant je peux me faire une CNC, je vais pas dire non ;D

Salut

J'ai la même chose, et le chmod ne change rien :frowning:
En tous cas, on comprend mieux pour les moteurs PAP maintenant ;D

a+

Et tu es sur PC ?

Non sur Mac (MacBook avec Leopard).
La solution serait peut être de récupérer les sources et les re-compiler sur Mac OS, mais je ne sais pas si c'est envisageable.

Un Mac user... ;D

...
La solution serait peut être de récupérer les sources et les re-compiler sur Mac OS...

C'est aussi ce que je pensais, mais je ne sais pas faire ça... j'utilise Xcode (ou plutôt j'essaye).

J'ai posé la question sur les forums Mactronique et Macgénération, mais pour l'instant je n'ai pas encore de réponse.

Dans le fichier pour Windows il y a un fichier data, ce dernier manque dans le fichier OSX, il suffit de le transférer dans "application.macosx" et là La fenête s'ouvre correctement.

Sur mon eMac tout l'affichage clignote comme si je n'avais pas assez de ressource CPU, cela ne se produit pas sur le PowerBook.

Ensuite lorsque j'essaye de télécharger les fichiers xml (qui contiennent les coordonnées des mouvement), la fenêtre reste noire. :-?

En fait ça à l'air de bien marcher, il faut cocher les cases "Show Move" et "Sim Mod" , charger un fichier xml (zip), cliquer sur "Send Data" et ...... :smiley: Coooool

Si l'on est pas en mode démo, le logiciele doit attendre une réponse de l'Arduino et bloque l'étape, comme le sketch fourni dans le zip qui se trouve dans le dossier Slice_Dice_xmlreader est en processing, je n'ai pas pu (su ?) le charger complètement avec arduino 0010, j'ai du mettre 1 ligne en commentaire et je pense que ça porte à conséquence. :-?

Dans le fichier xyz_gcode_interpreter (à dézipper) il y a trois fichiers .pde:

-xyz_gcode_interpreter.pde

-linear_interpolation.pde

-notes.pde (pas de code, mais des notes)

Il faut prendre le premier et faire un nouveau sketch dans l'ide arduino, puis faire glisser par dessus le deuxième.
Le nom des deux dois se voir en haut de la fenêtre, lors de la compilation les deux sont pris en compte.

En faisant des essais à "blanc", la plaque Arduino branchée seulement sur l'usb et rien d'autre (pas de moteurs), les lumières TX/RX clignote à chaque fois que je clique sur "continue" dans l'appli java.
Je pensais que les lumières TX/RX clignoteraient en continu, mais je dois chaque fois cliquer sur "continue" pour passer au Step suivant.
Je me demande si l'appli java n'attend pas un message de confirmation de la plaque Arduino pour continuer, mais je ne vois pas où cela se trouve dans le .pde. :-/

Je fais des essais entre l'Arduino et le tableau de contrôle CNC, l'Arduino devrait renvoyer quelque chose en confirmation pour passer de Step en Step, mais ce n'est pas le cas, le programme en java se met en pause après chaque étape et il faut le relancer.
J'ai placé des led sur les pins 2,3,4,5,7,8,10.
la led 10 reste allumée en permanence (PWM chauffe fil) et décochant la case "Heater c" et en mettant la valeur à zéro, la led ne s'éteint pas. Les autres ne s'allument pas lors du passage à un autre step.

D'après ce que j'ai pu comprendre dans le fichier java, il envoie des paquets comme ça :

UX+000006Y+000003Z+000002E1*

U : début du string
X-Y-Z : paramètre des trois axes en +/-

  • : fin de string

Il me semble avoir encore vu quelque part qu'après l'* il y a encore un "/0" (mais je ne suis pas sur).

Par contre le string "UX+000006Y+000003Z+000002E1" est converti en Ascii 0-9.

j'ai essayé d'envoyer des paquets directement avec le Serila monitor d'Arduino 0010, mais rien ne bouge

Est -ce que l'Arduino reçoit "UX+000006Y+000003Z+000002E1" car il l'aurait convertit à nouveau en caractères ou est-ce qu'il reçoit "858843484848484854..." ?

Est-ce qu'il y a un moyen de récupérer ce qu'il y a en sortie du panneau de contrôle et de l'afficher quelque part ?

J'y ai passé la journée et je pense avoir grillé un Atmega :frowning:

je n'arrive toujours pas à avoir cette confirmation de la part de l'Arduino.

J'ai déplacé un bout de code pour voir si j'arrive à envoyer des données au tableau de commande :

Cette partie qui se trouve à la fin de yxz_gcode_interpreter.pde :

int CheckTemp(boolean sendBack){
   // read adc pin and optionally send it back to Processing.
   thermistorValue = analogRead( thermistorPin );
   if(thermistorValue < MaxTempReading && thermistorValue > MinTempReading){ tempOK = true; }
   else{ tempOK = false;}
   int t = thermistorValue;
   if(sendBack){ // send temp back to processing if true or too hot/cold
      Serial.print("UT");
      Serial.print(t,DEC);// string representation
      Serial.print("*");
      Serial.print(10,BYTE);
   }
}

Légérement modifiée et placée au début :

void loop(){
   tempOK = false;
   int t = thermistorValue;
 
      Serial.print("UT");
      Serial.print(t,DEC);// string representation
      Serial.print("*");
      Serial.print(10,BYTE);

Au tableau je peux lire une valeur de température, valeur 341 (j'ai mis un capteur de lumière sur la pin a2) :

En haut du tableau sous "Status", il y a en rouge un "paused with 5 NACK", je ne sais pas exactement ce que c'est, je pense à une non-réponse de l'Arduino :

Une nouvelle journée à faire des essais et à imprimer le .pde pour le scruter....
Je cherche le petit "truc" qui fait que l'Arduino n'interprète pas ce qui sort du tableau CNC.

J'ai fini par me dire qu'il fallait tout supprimer et ne garder que la base.
J'ai supprimé:

-le contrôle de redondance cyclique (CRC, j'ai pas encore vraiment compris comment il fonctionne ::slight_smile: )
-les contrôle de présences de l'extrudeur ou du fil chaud
-la mesure de température du fil chaud
-le contrôle temporisé d'entrée de flux
-la gestion des moteurs (avant / arrière / stop...)

J'ai gardé :

-la lecture du flux
-l'envoi de confirmation (ACK)
-le placement du flux dans un tableau
-la lecture du tableau

Sur les sorties Digitales j'ai mis 4 leds :

-une qui s'allume dès la mise en tension de l'Arduino (pour être sur que du courant sort et que le programme commence), elle devrait s'éteindre lorsqu'un 'U' est lu et se rallumer au bout de 1 seconde.

-trois autres qui correspondent à 'X', 'Y', 'Z', qui devraient s'allumer à la lecture d'une de ces lettres puis s'éteindre au bout de 2 seconde.

Voici le .pde dans cette configuration :

#define maxLength   261
#define ACK          6 //confirmation de récéption

char buffer[maxLength];

int pin1 = 2 ;
int pin2 = 4 ;
int pin3 = 5 ;
int bufferLength     = 0;
int heaterPin        = 10;

void setup(){
    Serial.begin(19200);
    pinMode(pin1,OUTPUT);
    pinMode(pin2,OUTPUT);
    pinMode(pin3,OUTPUT);
    pinMode(heaterPin,OUTPUT);
      clearBuffer();
}

void loop(){
  
  digitalWrite(heaterPin,HIGH);
  
   if ( Serial.available() > 0){
      char c = 0;
      
      while (c != 10){ // retour de ligne en fin de paquet
         c = Serial.read();  
       buffer[bufferLength] = c;
       bufferLength++;         
       parseBuffer();
        Serial.print(ACK,BYTE);//ACK = 006
       clearBuffer(); 
}}}

void clearBuffer(){
  
     bufferLength = 0;
   for(int i = 0; i < maxLength; i++){buffer[i] = 0;}
}

void parseBuffer(){
  
      for (int i = 0; i < bufferLength-3; i++){
       switch (buffer[i]){
         case 'U':
            digitalWrite(heaterPin,LOW);
            delay(1000);
            digitalWrite(heaterPin,HIGH);
         break;
         case 'X':
            digitalWrite(pin1, HIGH);
            delay(2000);
            digitalWrite(pin1, LOW);
            break;
         case 'Y':
            digitalWrite(pin2, HIGH);
            delay(2000);
            digitalWrite(pin2, LOW);
            break;
         case 'Z':
            digitalWrite(pin3, HIGH);
            delay(2000);
            digitalWrite(pin3, LOW);
            break;
       } 
   }
}

Le tableau de commande CNC est tel quel (je ne sais pas compiler en java donc pas de modifs pour le moment).
Je charge le fichiers "123block.xml", j'envoie les données (Send Data).
Le xml est lu, l'écran montre l'avancée de "l'usinage".
L'Arduino reçoit et envoie bien des infos, les led RX / TX clignotent comme je l'imaginais au début des essais.

Je m'aperçois que malgré une lecture de quelque chose, mes leds restent en l'état, je n'arrive pas à lire ou interpréter le flux entrant . :frowning:

Est-ce que quelqu'un aurait une idée du problème ?

Je viens de faire un essai en prenant directement la valeur de c (85 pour 'U'):

...
while (c != 10){ // retour de ligne en fin de paquet
         c = Serial.read(); 
        if (c == 85){ digitalWrite(heaterPin,LOW); // 85 = U
            delay(1000);
            digitalWrite(heaterPin,HIGH);}
...

Et là ça clignote.

Maintenant, il faut que je trouve comment convertir ça en caractère.

Finalement j'ai replacé chaque partie de code l'une après l'autre et testé à chaque ajouts ou modifications.

Pour le moment j'ai mis cette ligne en commentaire :

// moveSteppers(xsteps, ysteps, zsteps, dirx, diry, dirz);

Ceci pour mettre de coté "linear_interpolation.pde".

Dans cette partie j'ai mis la fonction clearBuffer() en commentaire :

 Serial.print(ACK,BYTE);//ACK = 006
  // clearBuffer();  déplacé à la fin de clearBuffer()
      done = true;

J'ai replacé la fonction clearBuffer() à la fin de la fonction parseBuffer() :

 ...
   break;
         case 'Z':
            zsteps = makeLong(i+1);
            if ( zsteps < 0 ){ zsteps = -zsteps; dirz = -1; }
            break;
            case 10 :
          { clearBuffer();}
          break;
       }

Maintenant les leds clignotent, apparemment le buffer était vidé avant sa lecture.

La fonction fonction calcCRC() bloque tout, j'en ai mis une partie en commentaire et j'ai gardé le boléen bufferReady :

 /*if (calcCRC() == buffer[bufferLength-2]){
         done = false;
         pause = false;*/

         bufferReady = true; // crc ok

      /*}else{// uh-oh. wrong crc, send NAK 
         clearBuffer();
         Serial.print(NAK,BYTE);// NAK = 025
      }*/

Je n'arrive toujours pas à comprendre comment va cette fonction, j'ai simplement compris qu'elle compare la fin du string et que cela doit correspondre à un certain caractère qui se trouve entre LF et '*' cette valeur CRC peut être LF, STOP, ACK ou Nak.

L'autre problème réside dans le fait que la fonction ChekTemp() qui lit la valeur du capteur de température n'a pas l'air de fonctionner, ce qui n'arrange pas les choses c'est que je ne comprend pas le boléen "sendBack" :

int CheckTemp(boolean sendBack){
   // read adc pin and optionally send it back to Processing.
   thermistorValue = analogRead( thermistorPin );
   if(thermistorValue < MaxTempReading && thermistorValue > MinTempReading){ tempOK = true; }
   else{ tempOK = false;}
   int t = thermistorValue;
   if(sendBack){ // send temp back to processing if true or too hot/cold
      Serial.print("UT");
      Serial.print(t,DEC);// string représentation
      Serial.print("*");
      Serial.print(10,BYTE);
   }
}

Mais pour l'instant j'avance quand même ;).

Je me suis aperçu que lorsque je mets tout les "clearBuffer()" en commentaire, les leds clignotent, mais au bout d'un moment elles s'allument dans une position et ne bougent plus.

 ...
     moveSteppers(xsteps, ysteps, zsteps, dirx, diry, dirz);
         Serial.print(ACK,BYTE);//ACK = 006

         clearBuffer(); 

         done = true;
   }...

J'ai essayé de déplacer l'appel à la fonction clearBuffer(), mais chaque fois que je la remet en fonction les leds restent éteintes.

Pour le branchement des moteurs il me semble que sur ce site il y a la solution.

Dans le chapitre "Two-Wire Connection".

Comme l'ULN 2004 ne supporte pas plus que 500mA j'essaie de "piloter" des tip120 avec.

J'ai modifié le schéma cité dans le message précédent de cette façon (c'est un ULN 2004 que j'ai):

J'ai eu quelque soucis, mais ce matin j'ai trouvé le problème, le montage que j'avais mettait chaque fois deux Tip120 sur le même radiateur en alu et de ce fait ils s'actionnaient en même temps...