Texteur 001 – poète frustre

Je livre de façon un peu brute , le code de cette ”machine” à poème potentiel.

La série “texteur” se composent de boites qui affichent des textes/mots suivant des règles propres à chaque machine.
Cette première occurrence (j’espère bien en développer d’autres) compose un “poème” de structure simple, du type verbe + déterminant.

texteur_p001 encoursle texte initialetexteur_p001: Le disque à motstexteur_p001: version non finalisée des entrailles

Le Texteur se compose:

  • d’une led d’état,
  • d’un interrupteur de mode d’écriture,
  • d’un “bouton” (microswitch) d’écriture,
  • d’un servomoteur et d’un microcontroleur (sous la forme d’un/e Lylipad).

La led signale lorsque le microcontroleur sélectionne un mot et l’affiche.
L’interrupteur permet de passer la machine d’un mode autonome à asservi.
En mode AUTONOME, le microcontoleur génère une phrase toutes les 3 secondes.
En mode MANUEL, il attend que l’on appuie sur le bouton (placé sous le disque) pour composer une phrase.
Le programme a été écrit avec l’IDE Arduino.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
#include <Servo.h>
 
/*  texteur 006
    sans interrupts, règle les pb de delay dans l'interrupt()
    code par mrbbp
*/
 
 
const int inteGauche = 7;  // pin pour inte pour mode auto ou aléatoire
const int led= 4;          // pin pour led
const int bouton= 2;
const int nbrPas = 12;
const int delayPas = 100;
const int delayAttente = 3000;
 
volatile int motAncien = 0;
volatile int motEncours = 0;
volatile boolean drapo = false;
 
Servo monServo;
 
void setup() 
{ 
  // init des i/o
  pinMode(led, OUTPUT);
  pinMode(inteGauche, INPUT);
  pinMode(bouton, INPUT);
 
  Serial.begin(9600);
  Serial.println("init Servos");
  monServo.attach(9, 580, 2580);
  monServo.write(0);
 
   // clignotement led
  digitalWrite(led, HIGH);
  delay(50);
  digitalWrite(led, LOW);
  delay(50);
  digitalWrite(led, HIGH);
  delay(50);
  digitalWrite(led, LOW);
   delay(50);
  digitalWrite(led, HIGH);
  delay(50);
  digitalWrite(led, LOW);
  delay(1800);
  // un petit clignotement de plus
  digitalWrite(led, HIGH);
  delay(50);
  digitalWrite(led, LOW);
  delay(150);
  Serial.println("init ok"); 
}
 
 
void loop() 
{ 
  if (digitalRead(inteGauche) == HIGH) {
    Serial.print("\nmode auto --- ");
    compose();
    delay(delayAttente);
  } else {
    if (digitalRead(bouton) == HIGH && !drapo) {
      drapo = true;
      Serial.println("mode Manuel");
      compose();
      delay(1000);
    } else {
      //Serial.println("bouton OFF");
     delay(15); 
    }
  }
}
 
void compose() {
  digitalWrite(led, HIGH);
  while ( motEncours == motAncien) {
    motEncours=(int(random(8)));
  }
  Serial.print("mots : ");
  Serial.print(motAncien);
  Serial.print(" --> ");
  Serial.println(motEncours);
  deplacement();
  motAncien = motEncours;
  Serial.println("\nfin du cycle d'écriture");
}
 
void deplacement() {
  //Serial.println("debut deplacement()");
  if (!monServo.attached()) {
    monServo.attach(9, 580, 2580);
  }
 if (motEncours > motAncien) {
    // avance
    for (int i = motAncien+1; i<= motEncours; i++) {
      if (i== 0) {
        monServo.write(5);
      } else {
        monServo.write(i*(180/nbrPas)); 
      }
      Serial.print(i);
      delay(delayPas);
    }
  } else {
    // recule
    for (int i=motAncien-1; i>= motEncours; i--) {
      if (i== 0) {
        monServo.write(5);
      } else {
        monServo.write(i*(180/nbrPas)); 
      }
      Serial.print(i);
      delay(delayPas);
    }
  }
  digitalWrite(led, LOW);
  //Serial.println("\nfin deplacement()");
  monServo.detach();
  if (drapo) { drapo = !drapo ;}
}

À propos de cet article