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