Permet de lire la position d'un servo via une entrée analogique:
// un super mega code trop genial
// pour enregister des positions avec un servo
// et les lui faire lire tout seul comme un grand
// merci aux copains du forum Arduinno France
// kammo - 14/04/2018
#include <Servo.h> //on lance la bibliotheque
Servo servo; //on declare le servo
const byte ServoPin = 5; // servo sur pin 5
const byte LedPin = 13; // //on place une led sur D13
const byte RecordPin = 2; //bouton Record sur pin D0
const byte PlayPin = 3; //bouton play sur pin D1
byte Pos = 0; //variable compteur
const byte tailleMax = 10;
unsigned int tableau[tailleMax]; //tableau de stockage des positions
int AnalogLeft; //calibre la position à fond à gauche
int AnalogRight; //calibre la position à fond à droite
// le signal analogique du servo est lu sur le pinA0
void setup() {
Serial.begin(115200); //demarrage port serie
pinMode (LedPin, OUTPUT); //la led est une sortie
pinMode (RecordPin, INPUT_PULLUP); // bouton
pinMode (PlayPin, INPUT_PULLUP); // bouton
digitalWrite(ServoPin, LOW);
//calibration
Serial.println("Calibration");
digitalWrite(LedPin, HIGH); //led on
servo.attach(5); // attache le servo
Serial.println("Position 0");
servo.write(0); //servo en position digitale 0, à 0 il est à droite Oo
delay(1000);
AnalogRight = analogRead(A0); //calibre position 0
Serial.println("position 180");
servo.write(180); //servo en position 180, il est à donf à gauche
delay(1000);
AnalogLeft = analogRead(A0); //calibre 180
digitalWrite(LedPin, LOW); //led off
servo.detach(); //on met le servo tout mou
}
void loop() {
//détecter l'utilisation d'un bouton
//bouton RECORD
if (digitalRead(RecordPin) == LOW) { //Si bouton REC appuyé, j'ai vérifié, c'est bien HIGH
Flash(5); //fonction Flash, 5 flash, va servir aussi de debounce :-)
PosRec();
}
//bouton PLAY
if (digitalRead(PlayPin) == LOW) { //Si bouton PLAY appuyé
Flash(1); //fonction Flash, une fois, va servir aussi de debounce :-)
PosPlay();
}
}
void Debordement() { //si on deborde du tableau
Flash(10); //on clignote comme des foufous
Pos = tailleMax - 1; //rétablir une valeur max à Pos
Serial.println("débordement de tableau");
Flash(10);
PosPlay(); //on lance la lecture
}
void PosRec() { //fonction pour enregistrer des positions
digitalWrite(LedPin, HIGH); //allume la led
Serial.println("Record");
tableau[Pos] = analogRead(A0); //stocke le signal dans l'emplacement i du tableau position
Serial.println(Pos);
Serial.println(tableau[Pos]);
Pos++;
if (Pos >= tailleMax) Debordement();
digitalWrite(LedPin, LOW); //eteint la led
}
void PosPlay() { // fonction pour lire les données du tableau
servo.attach(ServoPin); //on attache le servo au pin5
Serial.println("Play");
digitalWrite(LedPin, HIGH); //allume led
delay(50); //pause
digitalWrite(LedPin, LOW); //eteint led
for (byte i = 0; i < Pos; i++) { //boucle pour lire toutes les valeurs existantes du tableau
//unsigned int PosEntier = (tableau[i] / 1.993) + 95.133; //on convertir le signal A0 en signal digital
int ValA0Brute = tableau[i];
int PosEntier = map (ValA0Brute, AnalogLeft , AnalogRight , 180 , 0); //hop on transforme les signaux A0 en signaux digitaux
servo.write(PosEntier); //on commande le servo
Flash(1);
delay(1000);
Serial.print(i);
Serial.print(F("\t"));
Serial.println(PosEntier);
}
Flash(2);
servo.detach();
}
void Flash(int N) { //fait N flashs
for (int i = 0; i < N; i++) {
digitalWrite(LedPin, HIGH);
delay(5);
digitalWrite(LedPin, LOW);
delay(95);
}
}