-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathMoving-Mic.ino
322 lines (235 loc) · 8.84 KB
/
Moving-Mic.ino
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
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
// MovingMic.ino
// Simon Girard - 2024 - TE:AV
// H24 - 243.B40 - Projet en électronique
/*
- MICROPHONE ASSERVIS - MOVING MIC -
Crédis :
* --------------------------------------------------------------------------------
https://github.com/Francien99/Stepper-driver/blob/master/Stepper_driver.ino
Copyright (C) 2017 F. Ramakers.
* --------------------------------------------------------------------------------
*/
//// IMPORTATION DES BIBLIOTHÈQUES ////
#include <DMXSerial.h> // Gère le DMX
// #include <LiquidCrystal.h> // Gère l'écran à cristaux liquide
// #include <LCDMenuLib2.h> // Gère le menu
#define _DEBUG true
//// DÉCLARATION DES CONSTANTES ET VARIABLES ////
/// CONSTANTES ///
/// BROCHES VERS PBL3775 ///
// MOTEUR PANORAMIQUE //
// const byte PANO_DIS1 = ; // Non connecté
// const byte PANO_DIS2 = ; // Non connecté
const byte PANO_PHASE1 = 5;
const byte PANO_PHASE2 = 7;
const byte PANO_VR1 = 4;
const byte PANO_VR2 = 6;
const byte PANO_INTERUPT = 52; // Interrupteur de l'axe panoramique
// MOTEUR D'INCLINAISON //
// const byte INCL_DIS1 = ; // Non connecté
// const byte INCL_DIS2 = ; // Non connecté
const byte INCL_PHASE1 = 11;
const byte INCL_PHASE2 = 9;
const byte INCL_VR1 = 10;
const byte INCL_VR2 = 8;
const byte INCL_INTERUPT = 53; // Interrupteur de l'axe d'inclinaison
/// BROCHES DES DELS D'ÉTAT ///
const byte DEL_ALIM = 39;
const byte DEL_DMX = 43;
/// MOTEURS ///
const int INCL_BUFFER = 1; // Rapport de vitesse les deux axes
const int VEC_PAS_PANO = 2900; // Nombre de pas que l'axe peut faire au total (du début à la fin)
const int VEC_PAS_INCL = 640;
/* !!! NON IMPLÉMENTÉ !!!
/// ÉCRAN À CRISTAUX LIQUIDE ///
const int ECL_RS = 31; // Broche RS de L'ÉCL
const int ECL_EN = 29; // Broche EN de L'ÉCL
const byte ECL_D4 = 27; // Broche D4 de L'ÉCL
const byte ECL_D5 = 25; // Broche D5 de L'ÉCL
const byte ECL_D6 = 23; // Broche D6 de L'ÉCL
const byte ECL_D7 = 21; // Broche D7 de L'ÉCL
*/
/// VARIABLES ///
/// MOTEURS ///
// Position des moteurs
int panoEtapePas = 4; // Compte l'étape actuelle du cheminement du moteur
int inclEtapePas = 4; // Compte l'étape actuelle du cheminement du moteur
signed long panoPosition = 50;
signed long inclPosition = 50;
// Calibration
int inclBuffer = 0; // voir INCL_BUFFER
// Moteur Panoramique
signed long panoNivHaut = 2890;
signed long panoNivBas = 0;
// Moteur d'inclinaison
signed long inclNivHaut = 630;
signed long inclNivBas = 0;
/// DMX ///
char DMX_Mode = 0; // Mode DMX du "Projecteur"
int DMXAdrDepart = 1; // Adresse de départ DMX
int DMXAdrPano = 3; // Adresse de la position panoramique
int DMXAdrIncl = 5; // Adresse de la position panoramique
/// Écran à cristaux liquide ///
//LiquidCrystal lcd(ECL_RS, ECL_EN, ECL_D4, ECL_D5, ECL_D6, ECL_D7);
//// FONCTION D'INITIALISATION ////
void setup() {
// Initialisation des broches
pinMode(PANO_PHASE1, OUTPUT);
pinMode(PANO_PHASE2, OUTPUT);
pinMode(PANO_VR1, OUTPUT);
pinMode(PANO_VR2, OUTPUT);
pinMode(INCL_PHASE1, OUTPUT);
pinMode(INCL_PHASE2, OUTPUT);
pinMode(INCL_VR1, OUTPUT);
pinMode(INCL_VR2, OUTPUT);
pinMode(INCL_INTERUPT, INPUT_PULLUP);
pinMode(PANO_INTERUPT, INPUT_PULLUP);
pinMode(DEL_ALIM, OUTPUT);
pinMode(DEL_DMX, OUTPUT);
digitalWrite(DEL_ALIM, HIGH);
// Initialisation Serial (Port 0)
Serial.begin(115200);
Serial.println(" -- Microphone asservis -- ");
Serial.println(" -- Version 1.0 -- \n");
/*
// Écran à cristaux liquide
lcd.begin(16, 2);
lcd.setCursor(0,0), lcd.print(" Initialisation ");
*/
// initialisation des moteurs
initialisationMoteur(PANO_PHASE1, PANO_PHASE2, PANO_VR1, PANO_VR2); // Moteur panoramique
initialisationMoteur(INCL_PHASE1, INCL_PHASE2, INCL_VR1, INCL_VR2); // Moteur d'inclinaison
// initialisation du DMX (Port 1)
DMXSerial.init(DMXReceiver);
DMXSerial.write(DMXAdrPano, 0);
DMXSerial.write(DMXAdrIncl, 0);
// Calibration des moteurs
Serial.println("Calibration de l'axe panoramique...");
calibrationMoteur(PANO_PHASE1, PANO_PHASE2, panoEtapePas, PANO_INTERUPT);
panoPosition = 0;
Serial.println("Axe panoramique calibré!\n");
Serial.println("Calibration de l'axe d'inclinaison...");
calibrationMoteur(INCL_PHASE1, INCL_PHASE2, inclEtapePas, INCL_INTERUPT);
Serial.println("Axe d'inclinaison calibré!\n");
inclPosition = 0;
}
//// FONCTION DE BOUCLE ////
void loop() {
// Reception du paquet DMX
unsigned long lastPacket = DMXSerial.noDataSince();
if (lastPacket < 500) { // Vérifie si le DMX est connecté
digitalWrite(DEL_DMX, HIGH); // DEL d'état du DMX à ON - DMX détecté
// Recalibration des moteurs
if (digitalRead(PANO_INTERUPT) == LOW && (panoPosition != 0)) {
panoPosition == 0;
if (_DEBUG) {Serial.println("Axe panoramique recalibré.");}
}
if ((digitalRead(INCL_INTERUPT) == LOW) && (inclPosition != 0)) {
inclPosition == 0;
if (_DEBUG) {Serial.println("Axe d'inclinaison recalibré.");}
}
// Calcul de la nouvelle position des moteurs
signed long panoNouvPos = map(DMXSerial.read(DMXAdrPano), 0, 255, panoNivBas, panoNivHaut);
signed long inclNouvPos = map(DMXSerial.read(DMXAdrIncl), 0, 255, inclNivBas, inclNivHaut);
// Déplacement des moteurs
// Panoramique
if (panoPosition < panoNouvPos) {
panoEtapePas = avancerMoteur(PANO_PHASE1, PANO_PHASE2, panoEtapePas, 1, 0);
panoPosition++;
if (_DEBUG) {Serial.print("Position du pano: "); Serial.println(panoPosition);}
}
else if (panoPosition > panoNouvPos) {
panoEtapePas = reculerMoteur(PANO_PHASE1, PANO_PHASE2, panoEtapePas, 1, 0);
panoPosition--;
if (_DEBUG) {Serial.print("Position du pano: "); Serial.println(panoPosition);}
}
// Inclinaison
if (inclBuffer == INCL_BUFFER) {
inclBuffer = 0;
if (inclPosition < inclNouvPos) {
inclEtapePas = avancerMoteur(INCL_PHASE1, INCL_PHASE2, inclEtapePas, 1, 0);
inclPosition++;
if (_DEBUG) {Serial.print("Position du incl: "); Serial.println(inclPosition);}
}
else if (inclPosition > inclNouvPos) {
inclEtapePas = reculerMoteur(INCL_PHASE1, INCL_PHASE2, inclEtapePas, 1, 0);
inclPosition--;
if (_DEBUG) {Serial.print("Position du incl: "), Serial.println(inclPosition);}
}
else {
inclBuffer++;
}
delay(2); // Délai de sécurité
}
else {
digitalWrite(DEL_DMX, LOW); // DEL d'état du DMX à OFF - Perte de comunication avec le DMX
Serial.print("signal DMX perdu...")
}
}
//// FONCTION ////
/// MOTEURS ///
int avancerMoteur(char moteurP1, char moteurP2, int etapePas, signed long nbPas, int delaiPas) { // FULL STEP MODE // Fait avancer les moteurs
for (int i = 0; i <nbPas; i++) { // counting makes sure the stepper will continue from last step it took (important if step method is called >1 time)
if (etapePas < 4) {
etapePas++;
}
else {
etapePas = 1;
}
if (etapePas == 1) { // Pas 1
digitalWrite(moteurP1, HIGH);
}
else if (etapePas == 2) { // Pas 2
digitalWrite(moteurP2, LOW);
}
else if (etapePas == 3) { // Pas 3
digitalWrite(moteurP1, LOW);
}
else { // Pas 4
digitalWrite(moteurP2, HIGH);
}
//delay(delaiPas); // Délai entre les pas (Vitesse du moteur)
}
return etapePas;
}
int reculerMoteur(char moteurP1, char moteurP2, int etapePas, signed long nbPas, int delaiPas) { // FULL STEP MODE, OPPOSITE DIRECTION // Fait reculer les moteurs
for (int i = 0; i < nbPas; i++) {
if (etapePas > 1) {
etapePas--;
}
else {
etapePas = 4;
}
if (etapePas == 1) { // Pas 1
digitalWrite(moteurP1, HIGH);
}
else if (etapePas == 2) { // Pas 2
digitalWrite(moteurP2, LOW);
}
else if (etapePas == 3) { // Pas 3
digitalWrite(moteurP1, LOW);
}
else if (etapePas == 4) { // Pas 4
digitalWrite(moteurP2, HIGH);
}
//delay(delaiPas); // Délai entre les pas (Vitesse du moteur)
}
return etapePas;
}
/// Initialisation des moteurs ///
void initialisationMoteur(char moteurP1, char moteurP2, char moteurVr1, char moteurVr2) { // Initialise la position du moteur
// phase high: because this is the state needed for the first step the stepper needs to take
digitalWrite(moteurP1, LOW);
digitalWrite(moteurP2, HIGH);
// vRef is always set to HIGH (100%) in "Full Step Mode" and "Half Step Mode".
// Note: in "modified half step mode, it is set to 140%, I don't know if this is possible with Arduino.
digitalWrite(moteurVr1, HIGH); // vRef pin is always HIGH.
digitalWrite(moteurVr2, HIGH);
}
int calibrationMoteur(char moteurP1, char moteurP2, int etapePas, byte moteurInterupt) { // Cablibre les moteurs
while (digitalRead(moteurInterupt) == HIGH) {
etapePas = reculerMoteur(moteurP1, moteurP2, etapePas, 1, 0);
delay(4);
}
return etapePas;
}