
Passionné par les cassettes et le support « old school » des bandes magnétiques, ce projet avait pour but d’utiliser les principes élémentaires de la cassette (bande, mécanisme circulaire, transmission…) au sein d’une construction Arduino.
La première idée était de se servir de la bande magnétique comme unité de transmission du courant. Or, après de nombreuses tentatives infructueuses, et l’usage d’un voltmètre, il s’avère que ni la VHS ni la cassette audio ne possèdent cet essentiel attribut.
Il était donc impératif de changer d’approche. Si la bande n’est pas conductrice, peut être qu’un des attributs phare de la cassette se situe dans son mouvement de rotation perpétuel, défilement de la bande.
Servomoteur(s), révolution(s)
Pour toute rotation, il faut un moteur. Dans le cadre d’Arduino, on utilise des servomoteurs. Le petit problème que l’on rencontre vite quand on essaie de copier/coller des codes usant de servomoteurs depuis internet, c’est celui d’une libraire manquante. En effet, dans le logiciel Arduino, il faut spécifier l’usage de cette librairie propre au servomoteurs. Pour se faire, il faut suivre ce cheminement : » Sketch>Include Library>Servo.h » Dès lors, il est possible à tout moment de faire appel à cette librairie dans les lignes de code en utilisant le #include <Servo.h> (attention la majuscule est importante!). Toutes les informations concernant cette librairie se trouve sur le site officiel d’Arduino :
https://docs.arduino.cc/libraries/servo
Pour tester le servomoteur, j’ai utilisé le code suivant, modifié depuis une copie sur internet :
#include <Servo.h>
Servo myservo; // create servo object to control a servo
int pos = 0; // variable to store the servo position
void setup() {
myservo.attach(9); // attaches the servo on pin 9 to the servo object
}
void loop() {
for (pos = 0; pos <= 180; pos += 1) { // goes from 0 degrees to 180 degrees
myservo.write(pos); // tell servo to go to position in variable 'pos'
delay(15); // waits 15ms for the servo to reach the position
}
for (pos = 180; pos >= 0; pos -= 1) { // goes from 180 degrees to 0 degrees
myservo.write(pos); // tell servo to go to position in variable 'pos'
delay(15); // waits 15ms for the servo to reach the position
}
}




Seulement voilà, il y a un hic : la cassette possède un mouvement dit perpétuel, continu. Le servomoteur en ma possession n’effectue qu’une demie révolution avant de revenir sur place. Comment faire ? Il existe en fait une seconde catégorie de servomoteurs, dit servomoteurs continus. C’est ce composant qui sera le moteur véritable de notre projet, explicité sur ce site :
La particularité des servomoteurs, nous l’avons vu, est qu’on les dirige par le biais d’un angle inférieur ou égal à 180°. Ce qui fait sens pour un servomoteur classique qui effectue une demie révolution, mais moins de sens pour un servomoteur continu : une révolution correspond à 360 degrés, or ce chiffre n’existe pas pour Arduino. Cette donnée est mappée, ces chiffres correspondent dès lors à une certaine vitesse et sens de rotation comme expliqué ci-dessous :
- de 0 à 89 : le servomoteur effectue une révolution complète dans un sens arrière. 0 correspond à la vitesse la plus rapide en ce sens, et 89 la vitesse la plus lente de ce même sens.
- 90 : le servomoteur s’arrête. C’est son angle nul, son « stop ».
- de 91 à 180 : le servomoteur effectue une révolution complète dans le sens avant. 91 correspond à la vitesse la plus lente en ce sens, et 180 la vitesse la plus rapide de ce même sens.
A partir de là, il était question pour moi de mettre en oeuvre ce que je venais de comprendre. Le seul composant interactif que j’avais sur moi, ayant travaillé à la maison, était un simple bouton poussoir. L’idée était donc d’ordonner au servomoteur qu’à chaque pression du bouton, le servomoteur allait changer de sens. Dans un premier temps, il s’agissait pour moi de trouver la bonne vitesse de rotation :

Quand soudain miracle, je tombe sur une vidéo youtube expliquant très exactement comment contrôler des servomoteurs (positionnels, malheureusement, mais maintenant nous savons comment interpréter les données pour les convertir au servomoteur continu) à chaque pression du bouton pressoir :

Dans la légende de la vidéo, un lien dirige vers le code, que l’on peut aisément copier/collé dans le software d’Arduino. Il a fallu remanier le code, en supprimant les mentions superflues. Le code indique des notions d’angles qui concernent que les servomoteurs positionnels. M’en débarrasser permettait donc de voir plus clair dans la fabrication du nouveau code.



Mais m’en débarrasser totalement m’obligerait à réécrire une grosse partie du code. En fait, je vais simplement définir que mon angle d’origine est 81, soit, une vitesse lente, en sens arrière. Cela veut dire que par défaut, le servomoteur tourne en ce sens. Je crée ensuite deux données : sensAV et sensARR. Sens avant = 100 et sens arrière = 81. Dans le voidloop, j’écris donc que si les conditions angle à 81 et bouton pressé, alors le bouton passe à l’opération 1; et que si le bouton est préssé mais que l’angle est égal à 100, alors le bouton passe à l’opération 2. Opération 1 rétablit l’angle à sensAV; Opération 2 rétablit l’angle à sensARR. Dès lors, chaque pression du boutton fera repartir la roue dans l’autre sens.
Le code final ressemblera donc à ceci :
#include <Servo.h>
Servo myservo; // create servo object to control a servo
#define servoPin 3 //~
#define pushButtonPin 2
int angle = 81; // initial angle for servo (beteen 1 and 179)
const int sensARR = 81;
const int sensAV = 100;
const int type =2;//watch video for details. Link is at the top of this code (robojax)
int buttonPushed =0;
void setup() {
Serial.begin(9600); // setup serial
myservo.attach(servoPin); // attaches the servo on pin 3 to the servo object
pinMode(pushButtonPin,INPUT_PULLUP);
Serial.println("Robojax Servo Button ");
myservo.write(angle);//initial position
}
void loop() {
if(digitalRead(pushButtonPin) == LOW && angle == 81){
buttonPushed = 1;
} else if (digitalRead(pushButtonPin) == LOW && angle == 100){
buttonPushed = 2;
}
if( buttonPushed == 1 ) {
// change the angle for next time through the loop:
angle = sensAV ;
}
if( buttonPushed == 2 ) {
// change the angle for next time through the loop:
angle = sensARR ;
}
myservo.write(angle); // move the servo to desired angle
Serial.print("Moved to: ");
Serial.print(angle); // print the angle
Serial.println(" degree"); // waits for the servo to get there
}
Application(s)
Une fois ce système mis en place, j’ai réfléchi à un moyen de refabriquer une fausse bande magnétique qui pour le coup serait conductrice. EN réfléchissant aux pellicules argentiques, je me suis souvenu que j’utilisais des bandes adhésives en aluminium. En fabricant avec elles une simple boucle, j’avais dès lors une courroie qui pourrait emmener le mouvement. En fabriquant très simplement une base en carton, je pouvais mettre en place ce mécansime, à même hauteur et autour de deux axes :




On peut jouer très simplement sur ce mouvement rotatif, pour actionner des circuits. Le mouvement cinétique peut engendrer à la manière des engrenages le des tierces mécanismes. A cet égard, j’avais pensé très simplement connecter une led, reliée à une pile 5 volt dont le – est relié avec un fil conducteur à la bande métallique, le + sur la pile directement.




Malheureusement le petit prototype en cours est un peu fragile et on atteint vite la limite de stabilité. Il est temps pour moi de construire cette maquette dans une V2 plus solide, plus large, à partir de Blender, avant de l’imprimer en 3D et de vérifier ce proof of concept !