Outils pour utilisateurs

Outils du site


wiki:projets:argile-numerique-arduino:argile-numerique-arduino

ARDUINO /// L'argile numérique

  • Porteur du projet : Justine Boudeville
  • Date : 20/03/2019
  • Contexte : Evaluation Arduino et utilisation des différents capteurs.
  • Licence : Libre !

DESCRIPTION

Dans le cadre de mon mémoire, j'aimerais travailler autour de la notion du voyage. Mon projet est de partir, dès que j’aurais finis mon DSAA, quelques années découvrir le monde. La fin de mes études approchant, c’est le thème que j’aimerais traiter pour mon mémoire de fin d’études. J’aimerais faire de mon mémoire un champ d’exploration de mon avenir. Il me permettrait de l'anticiper et de devenir une designer sur le terrain, une designer nomade. Je traite les notions de : rencontres, liens, culture, civilisations, s’approprier, ramener, réseau, langage graphiques, universel, fablab, découverte, sérendipité… J'aimerais relier le projet Arduino au projet d'expression plastique “motif du vivant”.

INTENTION

“Regarde moi ça de plus près! Oh j’avais pas vu, c’est beau!” Le château Borély est rempli de motifs, je m’appuie sur le fragment, en conduisant le regard sur un détail en particulier. J’envisage de nouvelles approches graphiques qui révèlent entre la dualité entre notre perception du sensible et les éléments signifiants de notre environnement. Je m'attarde donc sur les détails de l'environnement du château Borély. De ce fait, j'aimerais faire apparaître des motifs imaginaires, et m'attarder sur ces derniers.

Pour cela, j'utilise des potentiomètres.

MATERIAUX

Illustrations, Arduino, Seeeduino, 3 Potentiomètres et Processing.

ILLUSTRATIONS

Du fait de mes 2 intentions graphiques, j'ai crée 2 illustrations, et donc 2 programmes. (1. Créer un motif du vivant, 2. S'attarder sur des détails d'un motif.)

1. Créer du vivant.

Le but est de mettre la fleur dans le vase, en faisant bouger les potentiomètres.

2. S'attarder sur des détails d'un motif.

Le but est de s'attarder sur un motif en particulier, grâce à une loupe que l'utilisateur contrôle grâce à la souris (je n'ai pas réussi à utiliser les potentiomètres dans ce programme.)

Le circuit

   - Potentiomètres reliés aux entrées analogiques A0, A2 et A6 de la Seeduino Lotus

Programme Arduino

On se base sur l'exemple trouvé dans Fichier > Exemple > Communication > Serialcallresponse.

int firstSensor = 0;    // premier capteur analogique
int secondSensor = 0;   // second capteur analogique
int thirdSensor = 0;    // troisième capteur analogique
int forthSensor = 0; // quatrième capteur analogique
int inByte = 0;         // octet de série entrant

void setup() {
  // démarre le port série à 9600 bps:
  Serial.begin(9600);
  while (!Serial) {
    ; // Attend que le port série se connecte. Nécessaire pour le port USB natif uniquement
  }

  pinMode(2, INPUT);   // le capteur numérique est sur la broche numérique 2
  establishContact();  // Envoie un octet pour établir le contact jusqu'à ce que le destinataire réponde
}

void loop() {
  // si nous obtenons un octet valide, lisons les entrées analogiques:
  if (Serial.available() > 0) {
    // obtenir l'octet entrant:
    inByte = Serial.read();
    // lit la première entrée analogique, divise par 4 pour obtenir la plage 0-255:
    firstSensor = analogRead(A0) / 4;
    // retarde 10 ms pour permettre à l'ADC de récupérer:
    delay(10);
    // lit la deuxième entrée analogique, divisez par 4 pour obtenir la plage 0-255:
    secondSensor = analogRead(A2) / 4;
    delay(10);

    // lit la deuxième entrée analogique, divisez par 4 pour obtenir la plage 0-255:
    thirdSensor = analogRead(A6) / 4;
    delay(10);

    // lit la deuxième entrée analogique, divisez par 4 pour obtenir la plage 0-255:
    forthSensor = analogRead(A6) / 4;
    
    
    // envoie les valeurs du capteur:
    Serial.write(firstSensor);
    Serial.write(secondSensor);
    Serial.write(thirdSensor);
    Serial.write(forthSensor);
  }
}

void establishContact() {
  while (Serial.available() <= 0) {
    Serial.print('A');   // envoie un A majuscule
    delay(300);
  }
}

Programme processing

/// librairies
import processing.serial.*;


// variables globales
PImage im; // une image
PImage im2; // une image

color bgcolor;           // Couleur de fond
color fgcolor;           // La couleur de remplissage

Serial myPort;                       // Le port série
int[] serialInArray = new int[4];    // Où allons-nous mettre ce que nous recevons
int serialCount = 0;                 // Nombre de octets reçus
int xpos1, ypos1, xpos2, ypos2;      // Position de départ des images 1 et 2
boolean firstContact = false;        // Si nous avons entendu parler du microcontrôleur

void setup() {
  size(1500, 900);  // taille de l'écran
  noStroke();      // pas de contour

  bgcolor = color(255);   // couleurs
  fgcolor = color(255, 100, 1000);

  // initialisation des variables globales
  im = loadImage("vase.png"); // importer image vase
  im2 = loadImage("fleurs.png"); // importer image fleurs

  // Définir la position de départ des images
  xpos1 = width/2;
  ypos1= height/2;
  xpos2 = width/200;
  ypos2= height/200;


  // Imprimez une liste des ports série, à des fins de débogage:
  printArray(Serial.list());

  // Je sais que le premier port de la liste des séries sur mon mac
  // est toujours mon adaptateur FTDI, alors j'ouvre Serial.list () [0].
  // Sur les machines Windows, cela ouvre généralement COM1.
  // Ouvre le port que tu utilises.
  String portName = Serial.list()[7];
  myPort = new Serial(this, portName, 9600);
}

void draw() {
  background(bgcolor);
  fill(fgcolor);
  // dessine la forme

  image(im, xpos1, ypos1, 200, 350);
  image(im2, xpos2, ypos2, 200, 280);
}

void serialEvent(Serial myPort) {
  // lit un octet depuis le port série:
  int inByte = myPort.read();
  // si c'est le premier octet reçu, et que c'est un A,
  // efface le tampon série et remarque que tu as
  // a eu le premier contact du microcontrôleur.
  // Sinon, ajoutez l'octet entrant au tableau:
  if (firstContact == false) {
    if (inByte == 'A') { 
      myPort.clear();          // efface le tampon du port série
      firstContact = true;     // vous avez eu le premier contact du microcontrôleur
      myPort.write('A');       // écris A
    }
  } else {
    // Ajoute le dernier octet du port série à la matrice:
    serialInArray[serialCount] = inByte;
    serialCount++;

    // Si nous avons 4 octets:
    if (serialCount > 3 ) {
      xpos1 = serialInArray[0];
      ypos1 = serialInArray[1];
      xpos2 = serialInArray[2];
      ypos2 = serialInArray[3];


      // affiche les valeurs (à des fins de débogage uniquement):
      println(xpos1 + "\t" + ypos1 + "\t" + xpos2 + "\t" + ypos2 );

      // Envoyer un A majuscule pour demander de nouvelles lectures de capteur:
      myPort.write('A');
      // Réinitialiser Serial:
      serialCount = 0;
    }
  }
}

Deuxième programme processing

NB : La loupe : Le programme marche mais je n'arrive pas à le relier avec les potentiomètres. Il marche avec la souris. J'aurais aimé le faire marcher avec les capteurs.

// variables globales
PImage lustre; // importer image
PImage magnified, normal; // loupe
color bgcolor; // Couleur de fond
color fgcolor; // La couleur de remplissage

void setup() {
  fullScreen(); //taille de l'écran
  bgcolor = color(255); // couleur de fond
  fgcolor = color(0);
  // importer l'image lustre
  lustre = loadImage("lustre.png");
  lustre(); // variable lustre
  // ne pas faire apparaître le curseur
  noCursor();
}

// réglages image
void lustre() {  
  noStroke(); // pas de contour
  translate(width/200, height/100); //hauteur & largeur
  alvos();
  normal=get(); 
  scale(1.5);
  alvos();
  magnified=get();
}

void alvos() {
  background(255);
  for (int i=1; i>0; i--) {
    fill(0, 0, 0);
    image(lustre, 900, 1000);
    fill(255);
    image(lustre, 0, 0);
  }
}
// Dessin d'un cercle dans une autre toile qui sera le masque
void draw() {
  background(255);
  fill(0);
  ellipse(mouseX, mouseY, 120, 120);
  lustre=get();
  // Applique le masque à l'image, celle-ci est maintenant trouée
  normal.mask(lustre); 
  background(255);
  // dessine l'image agrandie sous l'image normale et ajuste sa position
  image(magnified, -(mouseX/2)/2, -(mouseY/2)/2); 
  // dessine l'image normale
  image(normal, 0, 0);   
  //gestion taille coulour epaisseur rond
  strokeWeight(4);
  noFill();
  stroke(0, 0, 0);
  // dessine le "cercle d'objectif", la loupe
  ellipse(mouseX, mouseY, 120, 120);
}

Références artistiques

wiki/projets/argile-numerique-arduino/argile-numerique-arduino.txt · Dernière modification: 2019/05/22 17:51 (modification externe)