Bonjour
Je suis étonné de la simplicité de construction, de "l’apparente finesse" de la trace
et de l'utilisation de bobines sans noyaux
Bonsoir Artouste
Je pense que fait office de noyau, la tige métallique (2:15) et le LASER qui s'aimante, un peu, peut-être quelque chose à l'intérieur du boitier.
Cordialement
jpbbricole
Bonjour
le "boitier laser" (laiton) est trés trés faiblement attiré par des aimants puissants, il y a peut être
un petit élément sensible au magnétisme , mais en tout cas AMHA pas suffisant pour réagir à un champ généré par une bobine à "air".
Je vais faire l’essai en collant orthogonalement 4 cubes de 4mm sur le boitier, l’idéal aurait été d'utiliser des anneaux magnétiques magnétisés diametralements et de positionner le laser au bout d'une CAP en 0.5mm, je vais tester çà semaine prochaine.
Pour être parfaitement franc , à cet instant je suis quand même de plus en plus "dubutatif " concernant la video .
Bonjour Artouste
J'ai essayé de trouver le nombre de tours du bobinage, je n'ai rien trouvé!
Je me suis intéressé au programme Arduino et Processing, le programme Arduino, dans le ZIP, ne doit pas être le juste, il ne se compile pas et ce n'est pas le même que celui de la vidéo.
Le truc qui m'intéresse dans ce montage, c'est le fait qu'il ne faille "que" un fichier G-.code pour afficher un dessin.
Cordialement
jpbbricole
Si je devais faire ce montage, j'y arriverais mais je ne pourrais afficher qu'un dessin extrèmement simple ou une seule lettre. Et pour faire la vidéo, je mettrais une feuille de papier d'alu derrière l'écran pour que cela n'affiche rien, et j'éclairerai l'écran par le devant avec un projecteur de diapo.
Ce qui me faire dire cela:
- quand on passe la video à la vitesse la plus basse on voit que pour le premier dessin le led fait deux oscillations verticales, trois en horizontal, puis deux ellipses. Le mouvement est exactement le même pour le titre qui se déplace, qu'il soit en bas de l'écran ou en haut de l'écran. Ce serait normal si il s'agissait d'un balayage complet, mais pas si il s'agit d'un affichage vectoriel.
On a vraiment l'impression qu'il n'y a aucun rapport entre la déviation de la LED et le dessin - quand on regarde l'écran image par image, mais pendant 10 images le dessin est complet et pendant 10 images il n'y a strictement rien d'affiché, alors que la led est toujours éclairée
+dans le premier dessin on a des traits d'une bonne finesse, mais dans le deuxième on a des traits rectangulaires. Pour faire des traits aussi épais, il faut passer une dizaine de fois et à cette vitesse (une image complète dure moins de 20ms sinon elle ne serait pas complète sur la vidéo), il y a forcément du dépassement. Or les bords sont parfaitement nets. - si on regarde la déviation maximale de la LED, on se demande comment on peut balayer l'image en entier
Un jour j'ai mis Windows 95 sur un arduino, mais c’était un premier avril:
http://pecheux.fr/WinXP/
Pour moi c'est dans le même style.
Bonjour Vileroi
sympa le XP ![]()
mes premiers essais avec le dispo ci-dessous confirme mon impression , la video semble bien être un "gros pipotage".
Cette vidéo du même auteur me semble être de la même veine (artefact/trace de montage )
Bonjour
Ce qui me fait aller dans le sens de vileroi
C'est l'image sur laquelle on arrive en suivant le lien sous la vidéo

Ca fait perdre un peu de crédibilité à la démo et renforce l’idée du projecteur à diapo ou autre.
Le programme livré dans le ZIP, Laser_Display.ino,
#define LINE_BUFFER_LENGTH 512
const int Up = 3;
const int Down = 4;
const int Left = 5;
const int Right = 6;
const int Laser = 7;
int Laser = 0;
struct point {
float x;
float y;
float z;
};
struct point actuatorPos;
float StepInc = 1;
int StepDelay = 0;
int LineDelay = 50;
int laserDelay = 50;
float Xmin = 0;
float Xmax = 40;
float Ymin = 0;
float Ymax = 40;
float Zmin = 0;
float Zmax = 1;
float Xpos = Xmin;
float Ypos = Ymin;
float Zpos = Zmax;
boolean verbose = false;
void setup() {
Serial.begin( 9600 );
Laser.delay(200);
delay(200);
X.setSpeed(250);
Y.setSpeed(250);
Serial.println("Mini Plotter alive and kicking!");
Serial.print("X range is from ");
Serial.print(Xmin);
Serial.print(" to ");
Serial.print(Xmax);
Serial.println(" mm.");
Serial.print("Y range is from ");
Serial.print(Ymin);
Serial.print(" to ");
Serial.print(Ymax);
Serial.println(" mm.");
}
void loop()
{
delay(200);
char line[ LINE_BUFFER_LENGTH ];
char c;
int lineIndex;
bool lineIsComment, lineSemiColon;
lineIndex = 0;
lineSemiColon = false;
lineIsComment = false;
while (1) {
while ( Serial.available()>0 ) {
c = Serial.read();
if (( c == '\n') || (c == '\r') ) {
if ( lineIndex > 0 ) {
line[ lineIndex ] = '\0';
if (verbose) {
Serial.print( "Received : ");
Serial.println( line );
}
processIncomingLine( line, lineIndex );
lineIndex = 0;
}
else {
}
lineIsComment = false;
lineSemiColon = false;
Serial.println("ok");
}
else {
if ( (lineIsComment) || (lineSemiColon) ) {
if ( c == ')' ) lineIsComment = false;
}
else {
if ( c <= ' ' ) {
}
else if ( c == '/' ) {
}
else if ( c == '(' ) {
lineIsComment = true;
}
else if ( c == ';' ) {
lineSemiColon = true;
}
else if ( lineIndex >= LINE_BUFFER_LENGTH-1 ) {
Serial.println( "ERROR - lineBuffer overflow" );
lineIsComment = false;
lineSemiColon = false;
}
else if ( c >= 'a' && c <= 'z' ) {
line[ lineIndex++ ] = c-'a'+'A';
}
else {
line[ lineIndex++ ] = c;
}
}
}
}
}
}
void processIncomingLine( char* line, int charNB ) {
int currentIndex = 0;
char buffer[ 64 ];
struct point newPos;
newPos.x = 0.0;
newPos.y = 0.0;
while( currentIndex < charNB ) {
switch ( line[ currentIndex++ ] ) {
case 'U':
penUp();
break;
case 'D':
penDown();
break;
case 'G':
buffer[0] = line[ currentIndex++ ];
buffer[1] = '\0';
switch ( atoi( buffer ) ){
case 0:
case 1:
char* indexX = strchr( line+currentIndex, 'X' );
char* indexY = strchr( line+currentIndex, 'Y' );
if ( indexY <= 0 ) {
newPos.x = atof( indexX + 1);
newPos.y = actuatorPos.y;
}
else if ( indexX <= 0 ) {
newPos.y = atof( indexY + 1);
newPos.x = actuatorPos.x;
}
else {
newPos.y = atof( indexY + 1);
indexY = '\0';
newPos.x = atof( indexX + 1);
}
drawLine(newPos.x, newPos.y );
// Serial.println("ok");
actuatorPos.x = newPos.x;
actuatorPos.y = newPos.y;
break;
}
break;
case 'M':
buffer[0] = line[ currentIndex++ ];
buffer[1] = line[ currentIndex++ ];
buffer[2] = line[ currentIndex++ ];
buffer[3] = '\0';
switch ( atoi( buffer ) ){
case 300:
{
char* indexS = strchr( line+currentIndex, 'S' );
float Spos = atof( indexS + 1);
if (Spos == 30) {
penDown();
}
if (Spos == 50) {
penUp();
}
break;
}
case 114:
Serial.print( "Absolute position : X = " );
Serial.print( actuatorPos.x );
Serial.print( " - Y = " );
Serial.println( actuatorPos.y );
break;
default:
Serial.print( "Command not recognized : M");
Serial.println( buffer );
}
}
}
}
void drawLine(float x1, float y1) {
if (verbose)
{
Serial.print("fx1, fy1: ");
Serial.print(x1);
Serial.print(",");
Serial.print(y1);
Serial.println("");
}
if (x1 >= Xmax) {
x1 = Xmax;
}
if (x1 <= Xmin) {
x1 = Xmin;
}
if (y1 >= Ymax) {
y1 = Ymax;
}
if (y1 <= Ymin) {
y1 = Ymin;
}
if (verbose)
{
Serial.print("Xpos, Ypos: ");
Serial.print(Xpos);
Serial.print(",");
Serial.print(Ypos);
Serial.println("");
}
if (verbose)
{
Serial.print("x1, y1: ");
Serial.print(x1);
Serial.print(",");
Serial.print(y1);
Serial.println("");
}
// Convert coordinates to steps
x1 = (int)(x1*StepsPerMillimeterX);
y1 = (int)(y1*StepsPerMillimeterY);
float x0 = Xpos;
float y0 = Ypos;
long dx = abs(x1-x0);
long dy = abs(y1-y0);
int sx = x0<x1 ? StepInc : -StepInc;
int sy = y0<y1 ? StepInc : -StepInc;
long i;
long over = 0;
if (dx > dy) {
for (i=0; i<dx; ++i) {
myStepperX.step(sx);
over+=dy;
if (over>=dx) {
over-=dx;
myStepperY.step(sy);
}
delay(StepDelay);
}
}
else {
for (i=0; i<dy; ++i) {
myStepperY.step(sy);
over+=dx;
if (over>=dy) {
over-=dy;
myStepperX.step(sx);
}
delay(StepDelay);
}
}
if (verbose)
{
Serial.print("dx, dy:");
Serial.print(dx);
Serial.print(",");
Serial.print(dy);
Serial.println("");
}
if (verbose)
{
Serial.print("Going to (");
Serial.print(x0);
Serial.print(",");
Serial.print(y0);
Serial.println(")");
}
delay(LineDelay);
Xpos = x1;
Ypos = y1;
}
void penUp() {
penServo.write(Up);
delay(LineDelay);
Zpos=Zmax;
if (verbose) {
Serial.println("Pen up!");
}
}
void penDown() {
penServo.write(Down);
delay(LineDelay);
Zpos=Zmin;
if (verbose) {
Serial.println("Pen down.");
}
}
n’est pas « compilable » et la partie IDE Arduino ne correspond pas à ce programme (5 :10), il s’appelle Arduino_CNC.
Le seul truc que j’ai trouvé « vrai » est le fichier Arduino LOgo.gcode qui donne bien le logo Arduino.

Je pense que l’idée d’utiliser un fichier g-code pour faire ceci est assez bonne.
Comme je suis un grand naïf, j’ose espérer que ce n’est qu’une maladresse de sa part, surtout qu’il a fait pas mal d’autres démo qui ne peuvent pas être toutes des fakes.
Cordialement
Jpbbricole
bonsoir
le sujet est évoqué aujourd'hui sur hackaday avec des commentaires qui aboutissent aussi à lever des gros doutes
épilogue
le type a reconnu avoir "pipoté"
Mise à jour sur hackaday
This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.

