Pages: [1] 2   Go Down
Author Topic: -Aide- Sculpture et arduino sur Télécran  (Read 1712 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 31
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset



Bonjour

Je suis Débutant en électronique, je souhaiterais réaliser une sculpture mettant en jeu de l’électronique et un télécran. Je suis parvenu à trouver pas mal de projet similaire au mien sur instructables et sur des blogs, je me suis donc fourni en matériel adéquate c'est à dire une carte arduino uno et un shield de commande de chez adafruit http://mchobby.be/wiki/index.php?title=AdaFruit_Motor_Shield_Utiliser ainsi que deux moteurs pas à pas de 5V. Voilà pour le début. Je parviens à commander les moteurs via l'IDE arduino, et le bricolage qui consistera à connecter ceux-ci au télécran ne devrait pas poser de problème.

Mon cahier des charges est le suivant :

-Je souhaiterais que les moteurs dessinent le signe infini sur le télécran.
-Le dessin devrait se répéter indéfiniment.

Je me suis donc penché sur la question d'abord en cherchant du côté de Grbl mais il semblerait que le pont en H de chez Adafruit ne sois pas compatible de plus je souhaiterais que le montage soit autonome c'est à dire que l'algorithme soit stocké dans la carte arduino puis exécuté bêtement indéfiniment.
J'ai exploré cette piste http://fr.wikipedia.org/wiki/Algorithme_de_trac%C3%A9_d%27arc_de_cercle_de_Bresenham mais mes connaissances mathématique sont beaucoup trop faibles pour aller plus loin.

C'est pourquoi je me tourne vers vous pour savoir si quelqu'un souhaiterait m'aider pour élaborer la programmation de cette sculpture.

Merci d'avance de votre aide
Logged

france
Offline Offline
God Member
*****
Karma: 15
Posts: 846
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Une courbe mathématique qui s'appelle le Lemniscate de Bernouilli ressemble beaucoup au signe infini.


Son équation polaire est très simple

Les valeurs X et Y des moteurs sont fournies par

Voir ici http://www.mathcurve.com/courbes2d/lemniscate/lemniscate.shtml
Logged

Christian

Offline Offline
Newbie
*
Karma: 0
Posts: 31
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Merci Christian_R
Effectivement Le lemniscate de Bernouilli serait parfait comme motif pour mon tracé, par contre mon niveau en mathématique étant particulièrement bas, il me faudrait encore de l'aide afin de transposer ces équations en algorithm utilisant les librairies Arduino motor stepper. Quoiqu'il en soit je te remercie pour l'élévation de ma culture.
Bien cordialement
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 31
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

La suite ici mais je ne parviens pas à comprendre pourquoi mes moteurs ne tournent pas ?
Code:
#include <AFMotor.h>

float x, y, oldx, oldy;
float t, s;
 
float a = 1.0;
float b = a/1.3;
 
float c = 0.0;
float cc;
 
float d = 0.0;
float dd;
 
float e = 0.0;
float ee;

// two stepper motors one on each port
AF_Stepper motorA(512, 1);
AF_Stepper motorB(512, 2);

void setup()

  Serial.begin(9600);// set up Serial library at 9600 bps
}

void loop()
{
  t++;
  if (t > 360){
    t = 0;
    cc = c;
    c = random(-0.1, 0.1);
 
    dd = d;
    d = random(-0.1, 0.1);
  }
 
  x = a * sin(radians(t)) + (t * c + (360 - t) * cc) / 360;
  y = b * sin(radians(t)) * cos(radians(t)) + (t * d + (360 - t) * dd) / 360;
 
 
 oldx = x;
 oldy = y;
 
 motorA.step(oldx - x,FORWARD,SINGLE);
 motorB.step(oldy - y,FORWARD,SINGLE);
 
 Serial.println(x);
}
Logged

france
Offline Offline
God Member
*****
Karma: 15
Posts: 846
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Comment sont branchés les moteurs ?
Il faut indiquer au programme quels Pins on doit activer.
Chercher d'abord à un faire tourner un, puis deux, avant de rajouter les autres instructions.
Logged

Christian

France
Offline Offline
Faraday Member
**
Karma: 36
Posts: 3425
There is an Arduino for that
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hé hé sacré blagueur!!!

Code:
oldx = x;
 oldy = y;
 
 motorA.step(oldx - x,FORWARD,SINGLE);
 motorB.step(oldy - y,FORWARD,SINGLE);

Avec les lignes dans cet ordre oldx - x et oldy - y sont toujours à zéro.

Moi j'écrirais plutôt comme ça:
Code:
motorA.step(oldx - x,FORWARD,SINGLE);
 motorB.step(oldy - y,FORWARD,SINGLE);

 oldx = x;
 oldy = y;
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 31
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Comment sont branchés les moteurs ?
Il faut indiquer au programme quels Pins on doit activer.
Chercher d'abord à un faire tourner un, puis deux, avant de rajouter les autres instructions.

Eh bien j'utilise un shield adafruit http://www.adafruit.com/products/81 d'après ce que j'ai pus lire "The stepper motor library step() routine does not have the ability to run both motors at a time. Instead, you will have to 'interleave' the calls. For example, to have both motors step forward 100 times you must write code like this:

for (i=0; i<100; i++) {
motor1.step(1, FORWARD, SINGLE);
motor2.step(1, FORWARD, SINGLE);
}

If you want more intelligent control, check out the AccelStepper library (in the Downloads section) which has some concurrent stepper motor control examples"

Je vais tenter de comprendre les détails des exemples AccelStepper library  smiley-roll
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 31
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hé hé sacré blagueur!!!

Code:
oldx = x;
 oldy = y;
 
 motorA.step(oldx - x,FORWARD,SINGLE);
 motorB.step(oldy - y,FORWARD,SINGLE);

Avec les lignes dans cet ordre oldx - x et oldy - y sont toujours à zéro.

Moi j'écrirais plutôt comme ça:
Code:
motorA.step(oldx - x,FORWARD,SINGLE);
 motorB.step(oldy - y,FORWARD,SINGLE);

 oldx = x;
 oldy = y;


Merci pour ta réponse  fdufnews
Ok mais les valeurs qui me sont données dans le moniteur série sont les mêmes que les lignes
oldx = x;
oldy = y;
soient placées avant ou après
 smiley-sweat
Logged

france
Offline Offline
God Member
*****
Karma: 15
Posts: 846
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Il faut mémoriser oldx et oldy juste avant de recalculer les nouveaux x et y.

Idéalement il faudrait aussi initialiser explicitement t, oldx, oldy dans le void setup ()
Logged

Christian

France
Offline Offline
Faraday Member
**
Karma: 36
Posts: 3425
There is an Arduino for that
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hé hé sacré blagueur!!!

Code:
oldx = x;
 oldy = y;
 
 motorA.step(oldx - x,FORWARD,SINGLE);
 motorB.step(oldy - y,FORWARD,SINGLE);

Avec les lignes dans cet ordre oldx - x et oldy - y sont toujours à zéro.

Moi j'écrirais plutôt comme ça:
Code:
motorA.step(oldx - x,FORWARD,SINGLE);
 motorB.step(oldy - y,FORWARD,SINGLE);

 oldx = x;
 oldy = y;


Merci pour ta réponse  fdufnews
Ok mais les valeurs qui me sont données dans le moniteur série sont les mêmes que les lignes
oldx = x;
oldy = y;
soient placées avant ou après
 smiley-sweat

Peut être que la console te donnes la même chose (ce qui n'est pas étonnant puisque le print est à la fin) par contre vu des lignes motorA.step et motorB.step ce n'est pas pareil dans un cas la différence est systématiquement nulle dans l'autre c'est l'écart d'une itération à l'autre
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 31
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Il faut mémoriser oldx et oldy juste avant de recalculer les nouveaux x et y.

Idéalement il faudrait aussi initialiser explicitement t, oldx, oldy dans le void setup ()

Salut Christian R
Initialiser explicitement tu veux dire quelque chose de ce genre :
void setup()

  Serial.begin(9600);// set up Serial library at 9600 bps
  oldx = 0;
  oldy = 0;
  t = 0;
}

En même temps dans le code original processing il y'avait cette ligne  line(x * 300, y * 300, oldX * 300, oldY * 300); j'ai donc testé en appliquant la multiplication à x et y et les valeurs qui me sont retournées dans le moniteur série sont plus grande. En y regardant bien mes moteurs tourne mais sur des pas très petits puis se bloquent je ne saisis pas très bien pourquoi mais c'est fascinant
Peut être saurez vous m'aiguiller encore  smiley-kitty
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 31
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset


Peut être que la console te donnes la même chose (ce qui n'est pas étonnant puisque le print est à la fin) par contre vu des lignes motorA.step et motorB.step ce n'est pas pareil dans un cas la différence est systématiquement nulle dans l'autre c'est l'écart d'une itération à l'autre
[/quote]

Merci fdufnews
ça doit te paraître très simple comme remarque mais comme j'essais d'apprendre c'est très utile même si je ne suis pas encore parvenu à faire tourner mes moteurs pour obtenir ce que je veux je persiste  smiley-draw
Logged

france
Offline Offline
God Member
*****
Karma: 15
Posts: 846
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Peux tu ajouter un Serial.println(oldx - x); pour voir ce qui se passe sur les moteurs ?
Il faudra sans doute mettre un facteur d'échelle : multiplier (oldx - x) par une constante pour avoir l'amplitude de mouvement voulue.
Logged

Christian

Offline Offline
Newbie
*
Karma: 0
Posts: 31
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Peux tu ajouter un Serial.println(oldx - x); pour voir ce qui se passe sur les moteurs ?
Il faudra sans doute mettre un facteur d'échelle : multiplier (oldx - x) par une constante pour avoir l'amplitude de mouvement voulue.


En vérité avec
Code:
void loop()
{
  t++;
  if (t > 360){
    t = 0;
    cc = c;
    c = random(-0.1, 0.1);
 
    dd = d;
    d = random(-0.1, 0.1);
  }
 
  x = a * sin(radians(t)) + (t * c + (360 - t) * cc) / 360;
  y = b * sin(radians(t)) * cos(radians(t)) + (t * d + (360 - t) * dd) / 360;
 
 motorA.step((oldx - x)*10,FORWARD,SINGLE);
 motorB.step((oldy - y)*10,FORWARD,SINGLE);
 
 oldx = x;
 oldy = y;
 
 delay(500);
 Serial.println(oldx-x);
}

Le moniteur Série retourne 0.00 pour (oldx-x) quand tu parlais de multiplication par une constante tu voyais quelque chose comme cela
Code:
motorA.step((oldx - x)*10,FORWARD,SINGLE);
 motorB.step((oldy - y)*10,FORWARD,SINGLE);
Logged

france
Offline Offline
God Member
*****
Karma: 15
Posts: 846
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Oui, mais un affichage de contrôle à mettre juste après motorA.step
Logged

Christian

Pages: [1] 2   Go Up
Jump to: