Jouet pour les chats

Hello,

J'ai finalement démonté ce traceur OCE 5120 qui trainait dans un coin depuis un moment ... pas d'utilité, et plein de pièces sympa à récupérer

Sur ce traceur, la découpe du papier rouleau est assurée par une petite souris (cutter qui fait un aller et retour) qui m'a toujours fait marrer

Le système est simple : un moteur CC, un câble qui déplace le chariot, et 2 détecteurs de fin de course NO

De là à en faire quelque chose ... il n'y a qu'un pas : une Arduino Nano, le controleur/pont en H MB3853 qui va avec (repris sur le traceur), 2vis et 3 écrous plus loin : voilà un jouet pour les chats !

Bon, pour l'instant, ils ne jouent pas trop avec, et mon épouse trouve que ça fait trop de bruit, mais bon, pour se faire la main, c'est un début !

Le code : (encore provisoire, je cherche une simulation qui attire bien les matous)

/*
  Controle moteur CC via MB3853
  Recup Traceur Oce5120
  (c) JDP 10/2014
  
  MB3853 : http://www.datasheetarchive.com/dlmain/Datasheets-12/DSA-233713.pdf
  Monté sur exemple page 5 de la Datasheet
  Capteurs : ceux du rail NO : montés suivant schéma pighxxx
  LM7812 : monté suivant schéma http://www.santerweb.net/iler-20-re-visted/lm7812-12v-linear-voltage-regulator/
*/

const int detecteurGauche = 2; // capteur gauche du rail
const int detecteurDroite = 3; // capteur droit du rail
const int in1 = 4; // entrée in1 du MB3853
const int in2 = 5; // entrée in2 du MB3853
const int inh = 6; // entrée inh du MB3853 
const int led = 7; // led de controle
unsigned long Timer;
String nextWay;

void setup() {
  // debug
  // Serial.begin(9600);
  // init du random
  randomSeed(analogRead(0));
  // init des E/S
  pinMode(detecteurGauche, INPUT);
  pinMode(detecteurDroite, INPUT);
  pinMode(in1, OUTPUT);
  pinMode(in2, OUTPUT);
  pinMode(inh, OUTPUT);
  pinMode(led, OUTPUT);
  // allume la led de controle 1 seconde
  digitalWrite(led, HIGH);
  delay(1000);
  digitalWrite(led, LOW);
  // démarre le moteur va à droite puis à gauche
  goAllRight();
  goAllLeft();
  nextWay="F"; // F : forward : R : Reverse
}

void loop() {
  // maj timer
  Timer=millis();
  animation2();
}

int aleaDelay() {
  // Renvoie un délai de 0 à 1000
  return random(0,1000);
}

int aleaWay() {
   // Renvoie 0 ou 1 aléatoirement. Destiné à définir si on change de sens ou pas
   int a = random(0,100);
   if (a > 50) {
     return 1;
   } else {
     return 0;
   }
}

void goAllRight() {
   // Va tout à droite (Forward)
   startMotor();
   while (getRightSensor() == 0) {
    // forward
    digitalWrite(in1, LOW);
    digitalWrite(in2, HIGH);
    nextWay="F";
  }
  stopMotor();
}

void goRight(unsigned long delay) {
   // Va à droite (Forward) pendant le délai. S'arrête si fin de course
   startMotor();
   Timer=millis();
   while ((unsigned long)(millis()-Timer) < delay) {
    // forward
    digitalWrite(in1, LOW);
    digitalWrite(in2, HIGH);
    nextWay="R";
    if (getRightSensor() == 1) {
      stopMotor();
      nextWay="R";
    }
  }
  stopMotor();
}

void goAllLeft() {
  // Va tout à gauche (Reverse)
  startMotor();
  while (getLeftSensor() == 0) {
    // reverse
    digitalWrite(in1, HIGH);
    digitalWrite(in2, LOW);
    nextWay="R";
  }
  stopMotor();
}

void goLeft(unsigned long delay) {
   // Va à gauche (Reverse) pendant le délai. S'arrête si fin de course
   startMotor();
   Timer=millis();
   while ((unsigned long)(millis()-Timer) < delay) {
    // reverse
    digitalWrite(in1, HIGH);
    digitalWrite(in2, LOW);
    nextWay="F";
    if (getLeftSensor() == 1) {
      stopMotor();
      nextWay="F";
    }
  }
  stopMotor();
}

int getRightSensor() {
  // Recupere le statut du capteur de fin de course droit
  if (digitalRead(detecteurDroite) == 0) {
    return 0;
  } else {
    return 1;
  }
}

int getLeftSensor() {
  // Recupere le statut du capteur de fin de course gauche
  if (digitalRead(detecteurGauche) == 0) {
    return 0;
  } else {
    return 1;
  }
}

void stopMotor() {
  // Stoppe le moteur via INH
  digitalWrite(inh, LOW);
  digitalWrite(led, LOW);
}

void startMotor() {
  // Démarre le moteur via INH
  digitalWrite(inh, HIGH);
  digitalWrite(led, HIGH);
}

void animation1() {
  // va au bout à gauche, à droite 1sec (*3), à gauche 1sec (*3)
  goAllLeft();
  goRight(1000);
  delay(1000);
  goRight(1000);
  delay(1000);
  goRight(1000);
  delay(1000);
  goLeft(1000);
  delay(1000);
  goLeft(1000);
  delay(1000);
  goLeft(1000);
  delay(10000);
}

void animation2() {
  // Animation aléatoire
  goRight(1250); // à peu près au milieu
  int count = random(100); // nb mouvements aléatoire
  int moves = 0;
  while (moves < count) {
    int myTime=aleaDelay();
    int myWay=aleaWay();
    // change de sens ?
    if (myWay == 1) {
      if (nextWay == "F") {
        nextWay="R";
      } else {
        nextWay="F";
      }
    }
    if (nextWay == "F") {
      goRight(myTime);
    } else {
      goLeft(myTime);
    }
    delay(500);
    moves++;
  }
  delay(60000);
}

Jacques

WP_20141019_004a.jpg