Go Down

Topic: SG90: renvoyer un signal analogique (Read 1 time) previous topic - next topic

kammo

Permet de lire la position d'un servo via une entrée analogique:

lien vers video

Code: [Select]
// 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);
  }
}

Meyer_JC

Bonjour,

j'ai vu votre présentation pour enregistre les positions d'un servo moteur et les reproduire ensuite. J'ai développé un petit système pour faire des panoramiques en photo. J'ai automatisé la prise de vue en x, en y le déplacement reste manuel. Pour le moment les valeurs de x sont fixées à priori dans le programme arduino. Votre système me permettrait de paramétrer les valeurs sur le terrain. Génial! Pourriez vous me donner un schéma de connexion du moteur sur votre système et un petit schéma de la modif sur le moteur.
Merci de votre aide.
JCM

Go Up