Fraiseuse CNC DIY v3 – Episode 1

Vous vous souvenez de ma « fraiseuse CNC v1« , c’était une première version, pas vraiment fonctionnelle mais qui m’a permis de me familiariser avec la fabrication d’une telle machine.

CNC Mill
CNC Mill

Ensuite, j’ai fabriqué la version actuelle, estampillée V2, tout à fait opérationnelle celle là.

Cnc mill
Cnc mill

Cependant, avec l’expérience, elle souffre de quelques limitations:

  • La première, la plus gênante est la surface de la table de fraisage, beaucoup trop restreinte ( 12 x 12 cm) alors que l’encombrement de la machine est assez conséquent. C’est essentiellement du à la conception de type fraiseuse avec une table X / Y mobile et un axe Z fixe.
  • Le deuxième soucis vient de la précision, elle est très bonne, mais encore insuffisante. J’arrive sans problème à faire des circuit imprimés mais ils ne sont pas parfaits. On doit pouvoir faire mieux.

Partant de ce constat, j’ai décidé de me lancer dans une 3° version qui j’espère sera plus performante. Avec toutefois 2 contraintes:

  • Le prix devra rester raisonnable
  • La fraiseuse devra pourvoir rentrer dans le caisson anti-bruit que j’ai fabriqué pour la V2. Ça limite la surface totale de la table de fraisage à une taille de 40x40cm ce qui, si je ne fais pas d’erreur de conception, devrait donner une surface utile d’environ 30x30cm ce qui est bien plus grand que la précédente.

Pour arriver à un bon résultat, j’ai cherché du matériel me permettant d’obtenir des mouvements linéaires très précis sans pour autant êtres ruineux. Pour cela, j’ai trouvé sur Ebay des arbres de précision avec des paliers en aluminium équipés de douilles à billes. Pour la structure de la machine et les différentes pièces mécaniques, je me suis orienté vers du polyéthylène haute densité ou PEHD, moins cher que le DELRIN. C’est un plastique très dur, facile à fraiser / couper qui sert notamment dans le domaine alimentaire pour faire des planches à découper la viande. Je vais utiliser la fraiseuse V2 pour fabriquer les petites pièces plastiques de la V3. Concernant les entrainements, je pense rester sur des tiges filetées de 6mm, même si le rendement n’est que de 30%, elles sont d’un coût < à 1€ / m alors que les vis à billes sont de l’ordre de 100 € / m…

Les premières pièces:

DIY CNC Parts
DIY CNC Parts

Voilà deux exemples glanés sur le net de ce que pourrait être la machine finale:

aliversionwk9

drawingfi4

Il ne me reste plus qu’à valider quelques « concepts » côté mécanique avant de me lancer dans la construction. La suite au prochain numéro.

Un bureau pour la rentrée

C’est la rentrée (enfin c’était), il faut changer le bureau du fiston. Aller un petit tour chez IK… Et là, rien ne plait, il faut un bureau pas trop large ~80cm, si possible dans les tons de gris / rouge. Bref le mouton à 5 pattes, introuvable… encore que, avec la génétique…

Il ne reste plus qu’une solution, ressortir la scie sauteuse, la règle et le crayon. Et pour être  moderne, on va jouer avec Sketchup pour concevoir un modèle 3D du bureau (on va ainsi vérifier qu’il convienne à Madame 😉

croquis

– Oui, c’est bien comme ça, avec du gris et du rouge, ça sera parfait !

– Clic, Clic… Zut, Clic, Clic, Ouf !

modèle Sketchup

Après un petit tour dans une grande surface du bricolage, nous voici avec les différents éléments du futur bureau.

Making of - 01

  1. Des pieds (à découper)
  2. 1 plaque de MDF 18mm en 800×500
  3. 1 plaque de MDF 10mm en 800×400
  4. des vis
  5. deux appliques murales
  6. du fils électrique, 1 interrupteur, 1 prise male
  7. 4 fixations pour pieds
  8. 4 ecrous à frapper
  9. de la tige filetée M8
  10. de la peinture
  11. Un jeu de rangements en bois (à peindre)

L’assemblage est simple et ne nécessite que peu d’outillage.

Découpe des pieds et perçage.

Making of - 02

Insertion et collage à l’epoxy d’écrous à frapper.

Making of - 03

Fixation des supports pour les pieds

Making of - 04

Making of - 05

Assemblage de l’arrière du bureau avec tourillons et collage.

Making of - 06

On serre le tout bien fort pendant quelques heures.

Making of - 07

La boite de rangements est collée et vissée par l’arrière.

Making of - 08

Ça commence à prendre forme, reste la mise en peinture et l’installation des lampes.

Making of - 09

Et voilà pour la peinture (Monocouche acrylique).

Making of - 10

Les lampes sont installée puis les câbles électriques sont passés à l’arrière du bureau.

Making of - 11

C’est fini, fiston à son bureau aux bonnes dimensions, pour un coût d’environ 50 €.

Pour ceux qui veulent, voilà le modèle Sketchup du bureau.

Fraisage d’un engrenage sur ma CNC.

Après quelques tests, j’ai quelque peu amélioré ma fraiseuse. L’axe des Z, peu précis a été remplacé. La précision est maintenant au rendez-vous. J’ai usiné plusieurs circuits imprimés sans problème. Le seul soucis rencontré est venu du réglage du zéro sur l’axe des Z ce qui conditionne la précision pour ôter le cuivre d’un circuit imprimé sans pour autant emporter l’époxy de la plaque. Le réglage manuel étant impossible pour obtenir une bonne précision, j’ai utilisé un réglage automatique par contact. J’ai utilisé une broche libre de la carte d’interface pour réaliser un contact de calibrage. Une petite plaque conductrice est posée sur la matière à usiner, une pince est fixée sur la fraise, machine éteinte. Ensuite EMC2 pilote la machine jusqu’à ce que le contact avec la pièce soit établi. Le zero est alors calculé en déduisant l’épaisseur de ma plaque conductrice.

Voilà la démo en video:

[bliptv]2153801[/bliptv]

Pour ce qui est du fraisage de pièces, je n’ai pas trouvé sous linux de programme satisfaisant permettant de créer des « pocket », je ne sais faire que des fraisages simples. J’ai donc utilisé un freeware « Cambam » pour windows au travers de Virtualbox. Les dessins sont fait avec QCAD sous linux puis convertis en GCODE par Cambam. L’ensemble est ensuite usiné avec EMC2 sous Linux.

La forme à fraiser.

Cambam1

Le chemin de l’outil en vert.

Cambam2

Et voilà la séquence d’usinage. Vous remarquerez facilement qu’il y a une erreur dans mon test, j’aurais du commencer par le centre de la pièce et non par les bords… mais bon, pour un test, le résultat est très concluant, la machine a réalisé 6 passes de 1 mm pour découper la plaque de plastique.

[bliptv]2162993[/bliptv]

Arduino PhotoLab – Schéma

Comme promis, voici le schéma de la carte principale du montage Arduino PhotoLab

Je débute avec Eagle alors mon schéma n’est pas forcément très clair, mais bon…

photolab

Le voici au format Eagle

  • Prise SENSORS: branchement des capteurs
  • Prise TTL: Branchement d’un convertisseur USB/TTL pour reprogrammer l’arduino.
  • Prise STROBE: Sortie pour la prise de commande du flash ou de l’appareil photo suivant l’usage.
  • Prise POWER: Alimentation 5V par transfo ou pack de piles.

Les 4 boutons permettent de se ballader dans les menus pour choisir les capteurs et changer les valeurs.

Il reste quelques ports dispo sur l’arduino pour un usage futur…

Je n’ai pas mis le schéma des capteurs. Vous pouvez en trouver plein sur le playground arduino ici. Il suffit d’utiliser une prise jack 3.5mm male et de la brancher sur la prise SENSORS. Vous avez alors VCC,  GND, DATA. Où DATA est un voltage entre 0 et 5 v.

Je ne suis pas sûr que mon système soit utilisable tel quel chez vous, mais vous pouvez vous en inspirer pour créer le votre. En tout cas, chez moi ça marche très bien 🙂

Pour ce qui est du code, le voici:

[code]

#include <LCD4Bit.h>

//BUG ?
#undef int()
// END BUG
#include <stdio.h>

LCD4Bit lcd = LCD4Bit(2);

//#define DEBUG 1

// global defs
#define shootPin  11
#define sensorPin 4
#define bt1Pin 3
#define bt2Pin 4
#define bt3Pin 5
#define bt4Pin 6
#define ledPin 13 //digital

#define MAXMENU 4

#define MENUSENSOR 1
#define MENUSTROBEDELAY 2
#define MENURUN 3

#define MODESENSOR 1

#define NO 0
#define YES 1
#define TEST 2

#define SOUNDSENSOR 0
#define IRSENSOR 1
#define CONTACTSENSOR 2
#define LIGHTSENSOR 3

volatile unsigned int menu0Pos = MENUSENSOR;
volatile unsigned int debounce = 0;
volatile unsigned int modeSensor = 0;
volatile unsigned int modeDrop= 0;
volatile unsigned int modeApp = MODESENSOR;
volatile unsigned int sensorType = IRSENSOR;
volatile unsigned int firstPass = 0;
volatile unsigned int sndLevel = 0;

volatile int strobeDelay = 10;

void setup() {
pinMode(ledPin,OUTPUT);
pinMode(shootPin,OUTPUT);
pinMode(bt1Pin,INPUT);
pinMode(bt2Pin,INPUT);
pinMode(bt3Pin,INPUT);
pinMode(bt4Pin,INPUT);
setLed(1);
lcd.init();

/*lcd.commandWrite(0x0F);//cursor on, display on, blink on.  (nasty!)
*/
lcd.clear();
lcd.printIn(« equinoxefr.org »);
lcd.cursorTo(2, 0);  //line=2, x=0.
lcd.printIn(« Photo lab v0.3″);
delay(2000);
fillLine(2, »FW Trigger »);
delay(2000);
lcd.clear();
setLed(0);
#ifdef DEBUG
Serial.begin (9600);
Serial.println(« start »);                // a personal quirk
#endif
}

void loop() {
int val=0;
int keyFactor=1;

/////////////////////////////////////////////////////////////////////////////////////////////////////////////
//  SENSOR SECTION
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
if (modeSensor)
{
while (1)
{
val=analogRead(sensorPin);
switch (sensorType)
{
case LIGHTSENSOR:

if (val > 500)
{
shoot();
}
//      char buffer[50];
//      strobeDelay=getValue(strobeDelay,-1,9999);
//      itoa(strobeDelay,buffer,DEC);
//      fillLine(2,buffer);
break;

case IRSENSOR:

if (val < 900)
{
shoot();
}
//      char buffer[50];
//      strobeDelay=getValue(strobeDelay,-1,9999);
//      itoa(strobeDelay,buffer,DEC);
//      fillLine(2,buffer);
break;

case SOUNDSENSOR:
if (firstPass)
{
fillLine(2, »Getting snd level »);
sndLevel=soundLevel();
clearLcdLine(2);
firstPass=0;
}
val = analogRead(sensorPin);

if ((val > (sndLevel + 40)) && (val < 1024))
{
shoot();
}

break;

case CONTACTSENSOR:
if ( val < 500)
{
shoot();
}
break;
}
}
}

/*
#ifdef DEBUG
Serial.println(menu0Pos,DEC);
#endif
*/
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
//  MENU SECTION
/////////////////////////////////////////////////////////////////////////////////////////////////////////////

switch (menu0Pos)
{
case MENUSTROBEDELAY:
fillLine(1, »Strobe delay ms »);
modeSensor=0;
strobeDelay=getValue(strobeDelay,-1,9999);
if (strobeDelay==-1)
{
fillLine(2, »not used »);
}
else
{
char buffer[50];
itoa(strobeDelay,buffer,DEC);
fillLine(2,buffer);
}
break;
case MENUSENSOR:
fillLine(1, »Select sensor »);
sensorType=getValue(sensorType,0,3);
switch(sensorType)
{
case SOUNDSENSOR:
fillLine(2, »SOUND »);
firstPass=1;
break;
case IRSENSOR:
fillLine(2, »IR BARRIER »);
break;
case CONTACTSENSOR:
fillLine(2, »CONTACT »);
break;
case LIGHTSENSOR:
fillLine(2, »IR LIGHT »);
break;
}
//digitalWrite(ledPin, HIGH);
modeSensor=0;
break;

case MENURUN:
if (!modeSensor)
{
fillLine(1, »***SHOOT MODE*** »);
}
modeSensor=1;
break;
}
getMenu();
}

//
//  soundLevel()
//
int soundLevel()
{
int value=analogRead(sensorPin);

Serial.println(« Getting sound level… »);
for(int i=0; i < 50 && !modeSensor; i++)
{
value = ( value + analogRead(sensorPin) ) / 2;
delay(50);
}
Serial.println(« Done! »);

return value;

}

void clearLcdLine(int line)
{
lcd.cursorTo(line, 0);
lcd.printIn( »                     « );
}

void fillLine(int line,char* str)
{
char buffer[21];
int len=strlen(str);
for (int i=0;i<20;i++)
{
if (i < len)
{
buffer[i]=str[i];
}
else
{
buffer[i]=’ ‘;
}
}
lcd.cursorTo(line,0);
lcd.printIn(buffer);
}

void shoot()
{
if (strobeDelay > 0 )
{
delay(strobeDelay);
}
digitalWrite(shootPin,HIGH);
delay(10);
digitalWrite(shootPin,LOW);
fillLine(2, »Shoot ! »);
digitalWrite(ledPin,HIGH);
delay(3000);
digitalWrite(ledPin,LOW);
clearLcdLine(2);

}

void getMenu()
{
int bt1=digitalRead(bt3Pin);
int bt2=digitalRead(bt4Pin);

if (!bt1 && !bt2)
{
return;
}

if (bt1 && menu0Pos < MAXMENU)
{
menu0Pos++;
}
if (bt2 && menu0Pos > 0)
{
menu0Pos–;
}

}

int getValue(int value, int mini, int maxi)
{
unsigned int keyFactor=1;
int bt1=digitalRead(bt1Pin);
int bt2=digitalRead(bt2Pin);

if  (value < 50 )
{
keyFactor=1;
}
else
{
if (value >= 50 )
{
keyFactor=10;
}
}
if  ( bt1 )
{
value+=keyFactor;
}
if  ( bt2 )
{
value-=keyFactor;
}

if ( value <= mini)
{
value=mini;
}
else
{
if (value >= maxi)
{
value=maxi;
}
}
/*
if ( bt1 && bt2 )
{
modeSensor=0;
fillLine(2, »switch off »);
}
*/
return value;

}

void setLed(int value)
{
if (value)
{
digitalWrite(ledPin,HIGH);
}
else
{
digitalWrite(ledPin,LOW);
}
}
[/code]