Configuration Jedicut avec USBSerial.dll

1
Bonjour,
J'ai réaliser une carte maison pour ma CNC Fil Chaud.
l'interfaçage sera assuré via une carte arduino (duemilanove).
J'ai fait des essais et ça fonctionne à merveille.
Il y'a un truc que je n'arrive pas à comprendre dans la configuration de ma machine au niveau de Jedicut : Les Vitesses:
Mes moteurs sont des NEMA 17 avec 200 pas.
J'utilise des tiges filetées de diamètre 6mm . Ainsi, le paramètre NBmm/pas = 1mm/ 200 pas = 0.005 mm/Pas
Pour les vitesses de découpe : il est important de savoir que dans le fichier (fcifmdlcnc.ino) a téléversé dans l'arduino, il y'a la procédure suivante :
/**********************************************************************************/
void sendMotorCmd(byte cmd)
{
PORTD = (PORTD & 0x0F) | (cmd & 0xf0); // Directions first!
PORTB = (PORTB & 0xF0) | (cmd & 0x0f); // and step
delayMicroseconds(25); // eventually wait a little bit and falling edge of step pulse
PORTB = (PORTB & 0xF0);
}
/**********************************************************************************/
Le delai d'attente est de 25 microseconde.
Théoriquement il ne faut pas dépasser les 1 seconde / 25 microseconde soit 40,000 Hz.
La vitesse théorique maximale est de 40,000 pas x .005 mm/pas = 200 mm/seconde.
D'après mes essais, la fréquence est modifiable via l'interface Options/Communication(il faut cocher "synchroniser la rotation des moteurs avec un timer externe", modifier la valeur de la fréquence et décocher "synchroniser la rotation des moteurs avec un timer externe")
Au fait j'aimerai bien avoir un retour d'expérience sur les fréquences que vous utilisez ainsi que vos vitesses de découpe et vos vitesses rapides.

Merci d'avance.

Re: Configuration Jedicut avec USBSerial.dll

2
Bonjour Samko,

Si tu n'as pas lu les discussions sur "jedicut + Arduino + Ramps" et "Adaptateur Arduino nano MM2001", je te recommande de lire le forum et de télécharger les dossiers complets, tu trouvera des réponses à ton problème.
En particulier la config de Jedicut sur les coefficients de vitesse et la nécessité de mettre un Hub sur la liaison USB.
Peux-tu nous dire quels drivers Moteur PAP tu utilises ?
A+

Re: Configuration Jedicut avec USBSerial.dll

5
J'ai suivi les consignes d'AERODEN. j'ai un peu modifié le programme de la carte arduino pour augmenter la fréquence.
La carte fonctionne à merveille! les mouvement des moteurs sont fluide et sans perte de pas avec une vitesse de 3.5mm/s ce qui est déjà pas mal!
pour la carte c'est un simple montage avec pour chaque moteur : un L297 qui commande 4 transistors TIP 122 et 4 diodes 1N5408 (pour la protection) sa fait presque dans les 12.5 euro le montage par moteur !
je me suis inspiré de ce site : http://www.skylar.co.za/electro/cnc/

Re: Configuration Jedicut avec USBSerial.dll

6
Bonjour SAMKO
Bravo pour ta réalisation, est-ce que tu peux nous dire ce que tu as modifié dans le code et si tu utilises un hub ? Est-ce qu tu obtiens les vitesses calculées par Jedicut dans la fenêtre de configuration ? Pour mettre le code dans ta réponse, tu cliques sur code dans le menu en bas, et tu colles celui-ci entre les balises.
Merci

Re: Configuration Jedicut avec USBSerial.dll

7
j'ai un petit soucis avec les axes Y:
Au début l'axe Y1 avait un problème électronique , une piste qui était foutue, je l'ai réparé!
Maintenant, l'axe Y2 qui me fait des siennes j'ai des pertes de pas pourtant les deux moteurs des axes Y sont identiques, j'ai pensé à une sous alimentation (j'utilise une alimentation de PC) alors j'ai débranché les deux axes des X mais le problème persiste. il y'a des temps ou il y'a des perte de pas et en d'autres non.
<---------------------------------------------------------------------------------->
/* Copyright 2013 Martin

This file is part of jedicutplugin.

fcifmdlcnc is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.

fcifmdlcnc is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with Foobar. If not, see <http://www.gnu.org/licenses/>.

This version of the code is for the letmathe mdlcnc board. For
other boards this code must be adapted accordingly !!!
*/
/*
The jedicut communication configuration for Clock and Direction must be fixed set to the below values,
only the wires to the specific board may be different -- wire to -->

Function Number in jedicut configuration Arduino Pin e.g. Lethmate MDLCNC board SubD25 pin
(fixed !!)
EngineX1 Clock 2 D8 (PB0) -- wire to --> 2
EngineX2 Clock 3 D9 (PB1) -- wire to --> 6
EngineY1 Clock 4 D10 (PB2) -- wire to --> 4
EngineY2 Clock 5 D11 (PB3) -- wire to --> 8
EngineX1 Direction 6 D4 (PD4) -- wire to --> 3
EngineX2 Direction 7 D5 (PD5) -- wire to --> 7
EngineY1 Direction 8 D6 (PD6) -- wire to --> 5
EngineY2 Direction 9 D7 (PD7) -- wire to --> 9

All Engines On/Off - D12 (PB4) -- wire to --> 1
Heating On/off - D2 (PD2) -- wire to --> 14
Heating PWM - D3 (PD3) -- wire to --> -
*/


#include <avr/interrupt.h>
#include <avr/io.h>

// Ringbuffer for the commands
#define CMD_BUFFER_SIZE 600 // must be even !
volatile byte cmdArray[CMD_BUFFER_SIZE];
volatile int arrayIdxRead = 0;
volatile int arrayIdxWrite = 0;
volatile int cmdCounter = 0;
volatile boolean ovf = false;

volatile bool isrActive = false;

/**********************************************************************************/
void setup()
{

Serial.begin(115200); // opens serial port, sets data rate to 115200 bps

pinMode(13,OUTPUT); // Led Pin used for signaling an underflow condition

pinMode(12,OUTPUT); // All axis on/off

pinMode(2,OUTPUT); // PD2, Heat Relay on/off low active for letmathe mdlcnc
digitalWrite(2, HIGH); // Off

pinMode(3,OUTPUT); // PWM for wire heating
analogWrite(3, 0); // Off

// Motor Pins
pinMode(8,OUTPUT); // PB0, X1 Clock
pinMode(9,OUTPUT); // PB1, X2 Clock
pinMode(10,OUTPUT); // PB2, Y1 Clock
pinMode(11,OUTPUT); // PB3, Y2 Clock
pinMode(8,OUTPUT); // PB0, X1 Clock
pinMode(9,OUTPUT); // PB1, X2 Clock
pinMode(10,OUTPUT); // PB2, Y1 Clock
pinMode(11,OUTPUT); // PB3, Y2 Clock

digitalWrite(4,HIGH); // PD4, X1 Direction
digitalWrite(5,HIGH); // PD5, X2 Direction
digitalWrite(6,HIGH); // PD6, Y1 Direction
digitalWrite(7,HIGH); // PD7, Y2 Direction

// using timer1 (because timer2 is used for pwm on pin3 and timer0 is used for delay functions)
// using Fast PWM (Mode 15)
TCCR1A = 0x03; // wgm11=1 wgm0=10
TCCR1B = 0x1C; // wgm13=1 wgm12=1 cs12=1 cs11=0 cs10=0 /256 prescaler
// OCR1A = 255; // Timer compare register. 255 = 250Hz, 127 = 500Hz, 63 = 1 KHz
OCR1A = 127; // Timer compare register. 255 = 250Hz, 127 = 500Hz, 63 = 1 KHz
TIMSK1 = (1 << OCIE1A); // Timer interrupt enable for match to OCR1A
TIFR1 = 0; // Clear flags.
TCNT1 = 0;
sei();

}

/**********************************************************************************/
void sendMotorCmd(byte cmd)
{
PORTD = (PORTD & 0x0F) | (cmd & 0xf0); // Directions first!
PORTB = (PORTB & 0xF0) | (cmd & 0x0f); // and step
delayMicroseconds(25); // eventually wait a little bit
delayMicroseconds(5); // eventually wait a little bit
// and falling edge of step pulse
PORTB = (PORTB & 0xF0);
}



/**********************************************************************************/
void handleCommand()
{

byte val = cmdArray[arrayIdxRead+1]; // The command parameter value
switch(cmdArray[arrayIdxRead])
{
case 'A': // All Motors on/off
if(val == '1') {digitalWrite(12, HIGH);}
else {digitalWrite(12, LOW);}
break;
case 'H': // Wire Heat ON/OFF (may be programmed as PWM (analog out))
if(val > 0) {digitalWrite(2, LOW);}
else {digitalWrite(2, HIGH);}
analogWrite(3,val*2.55); // PWM for wire heating (stretch 0-100% to a range of 0-255)
break;
case 'M': // Motor step Command
sendMotorCmd(val);
break;
case 'F': // Change the timer frequency, the time between two steps
// OCR1A values 255 = 250Hz 190 = 328Hz 127 = 500hz 63 = 1 Khz
/* if(val>127) val =127; // restrict from 0 to 127 corresponds to 1kHz to 0.5kHz
OCR1A = 63 + val; */
// OCR1A values 255 = 250Hz 190 = 328Hz 127 = 500Hz 63 = 1 kHz 31 = 2KHz 15 = 4 kHz
if (val > 255) val = 255; // restrict from 1 à 255 corresponds à 250Hz à 20 kHz
if (val < 1) val = 1; // restrict from 1 à 255 corresponds à 250Hz à 20 kHz
break;
}

}

/**********************************************************************************/
ISR(TIMER1_COMPA_vect) {

if (isrActive) return;
isrActive = true;
sei(); // reenable interrupts, to not miss serial data

do {
// check if the buffer is empty
if((arrayIdxRead != arrayIdxWrite) || ovf)
{

handleCommand();
arrayIdxRead += 2;
if(arrayIdxRead==CMD_BUFFER_SIZE) arrayIdxRead=0;

noInterrupts();
cmdCounter--;
interrupts();

if (ovf && (cmdCounter<CMD_BUFFER_SIZE/2-25))
{
Serial.write('C');
ovf = false;
}
digitalWrite(13, LOW); // underflow led off
}
else
{
// underflow !!
digitalWrite(13, HIGH); // underflow led on
break;
}
} while(cmdArray[arrayIdxRead] != 'M'); // only motor commands will wait for next sync, all others can be handled immediately

cli();

isrActive = false;
}

/**********************************************************************************/
/**** The main loop *****/
/**********************************************************************************/
void loop()
{
if (Serial.available() > 0)
{
// Each command consists of 2 bytes
Serial.readBytes((char*)&cmdArray[arrayIdxWrite],2);

// korrekt the write index
arrayIdxWrite+=2;
if(arrayIdxWrite==CMD_BUFFER_SIZE) arrayIdxWrite=0;

noInterrupts();
cmdCounter++;
interrupts();


// check for oncoming overflow
if(cmdCounter >= CMD_BUFFER_SIZE/2-20)
{
ovf = true;
Serial.write('S'); // Stop transmission, Buffer full
}

}
}

Re: Configuration Jedicut avec USBSerial.dll

9
J'ai regardé ton programme, il y a 2 erreurs : le port PD n'était pas déclaré en output d'un part et le compteur OCR1A n'était pas mis à la valeur de Jedicut.

Ton code

Code : Tout sélectionner

// Motor Pins 
pinMode(8,OUTPUT); // PB0, X1 Clock
pinMode(9,OUTPUT); // PB1, X2 Clock
pinMode(10,OUTPUT); // PB2, Y1 Clock
pinMode(11,OUTPUT); // PB3, Y2 Clock
pinMode(8,OUTPUT); // PB0, X1 Clock
pinMode(9,OUTPUT); // PB1, X2 Clock
pinMode(10,OUTPUT); // PB2, Y1 Clock
pinMode(11,OUTPUT); // PB3, Y2 Clock

digitalWrite(4,HIGH); // PD4, X1 Direction
digitalWrite(5,HIGH); // PD5, X2 Direction
digitalWrite(6,HIGH); // PD6, Y1 Direction
digitalWrite(7,HIGH); // PD7, Y2 Direction
Après modif

Code : Tout sélectionner

// Motor Pins 
pinMode(8,OUTPUT); // PB0, X1 Clock
pinMode(9,OUTPUT); // PB1, X2 Clock
pinMode(10,OUTPUT); // PB2, Y1 Clock
pinMode(11,OUTPUT); // PB3, Y2 Clock
pinMode(4,OUTPUT); // PD4, X1 Direction
pinMode(5,OUTPUT); // PD5, X2 Direction
pinMode(6,OUTPUT); // PD6, Y1 Direction
pinMode(7,OUTPUT); // PD7, Y2 Direction

//Init toutes les directions dans le même sens
digitalWrite(4,HIGH); // PD4, X1 Direction
digitalWrite(5,HIGH); // PD5, X2 Direction
digitalWrite(6,HIGH); // PD6, Y1 Direction
digitalWrite(7,HIGH); // PD7, Y2 Direction
Un peu plus loin ton code:

Code : Tout sélectionner

case 'F': // Change the timer frequency, the time between two steps
// OCR1A values 255 = 250Hz 190 = 328Hz 127 = 500hz 63 = 1 Khz
/* if(val>127) val =127; // restrict from 0 to 127 corresponds to 1kHz to 0.5kHz
OCR1A = 63 + val; */
// OCR1A values 255 = 250Hz 190 = 328Hz 127 = 500Hz 63 = 1 kHz 31 = 2KHz 15 = 4 kHz
if (val > 255) val = 255; // restrict from 1 à 255 corresponds à 250Hz à 20 kHz
if (val < 1) val = 1; // restrict from 1 à 255 corresponds à 250Hz à 20 kHz
break;
}

}
Ma modif :

Code : Tout sélectionner

case 'F': // Change the timer frequency, the time between two steps
// OCR1A values 255 = 250Hz 190 = 328Hz 127 = 500hz 63 = 1 Khz
/* if(val>127) val =127; // restrict from 0 to 127 corresponds to 1kHz to 0.5kHz
OCR1A = 63 + val; */
// OCR1A values 255 = 250Hz 190 = 328Hz 127 = 500Hz 63 = 1 kHz 31 = 2KHz 15 = 4 kHz
if (val > 255) val = 255; // restrict from 1 à 255 corresponds à 250Hz à 20 kHz
if (val < 1) val = 1; // restrict from 1 à 255 corresponds à 250Hz à 20 kHz
OCR1A = val;  // Positionnement du compteur à la valeur de Jedicut
break;
}

}
Cela devrait beaucoup mieux fonctionner.
N'oublies pas les config de Jedicut . (Fréquence Timer et coefficient de vitesse).
En PJ le nouveau fichier, attention il est en .dat, le renommer en .ino
A+

Re: Configuration Jedicut avec USBSerial.dll

10
Merci pour ton coup de pousse!
Au fait je me suis trompé dans le fichier que j'ai envoyé (j'ai essayer de reconstituer le fichier en question : mon atelier est dans un cellier et la bas j'ai pas de connexion).
J'ai déjà fait ce que vous m'avez mentionné.
Je pense que le problème provient d'un autre truc.
je mets les deux axes des Y au même niveau; je fais des vas et des viens et ils ne sont plus au même niveau (surtout si change de sens ou de vitesse)!
Je pense que j'ai trouvé le problème : les moteurs des X et les moteurs des Y sont de deux types distincts (récupération de seringue automatique) .
pour les moteurs des X j'ai essayé avec une vitesse de 3.2 mm /seconde en vitesse lente et en 4.5 mm/seconde en vitesse rapide: ça fonctionne à merveille!
pour les moteurs des Y j'ai diminué les valeurs: 2 mm /seconde en vitesse lente et 2.6 mm/seconde en vitesse rapide:à priori ça fonctionne à merveille!
J'ai fait des test sur les moteurs par paire. j'attends de terminer ma mécanique pour faire des tests grandeurs nature!
L'année dernière et j'ai eu les mêmes problèmes mais j'avais pensé que le problème venait de mes moteurs PAP ou de mon électronique!
Est ce que ce que je peux configurer deux vitesses une pour les axes des X et une autre pour les axes des Y?
`); }); })(jQuery, window, document, phpbb);