Skip to content

AtelierNum/projet_focus

Repository files navigation

WORK IN PROGRESS

Partie Fab

Vous devriez aussi vous referez aux connexions pour voire comment les composants doivent etre connectes entre eux.

Connexions

MP3V4 Arduino Uno MPR121
RX D2
TX D3
VCC 5V
GND GND
SCL SCL
SDA SDA
5V VIN
GND GND

Note : Pour vos futur circuits, c'est ce genre de tableeu que vous devriez en prendre note. Un dessin comme ci-dessus c'est ideal mais ca prend du temps, une photo c'est instantane mais c'est toujours illisible.

Partie Num

Télécharger le logiciel

Allez sur https://www.arduino.cc/en/software

Sélectionnez “Win 10 and newer” si vous êtes sur windows,

Ou sélectionnez “MacOS” si vous êtes sur MacOS.

Connecter la carte

Une fois que l’Arduino IDE est téléchargé, installé, et ouvert vous pouvez brancher votre Arduino Uno à votre PC. (Essayez de ne pas passer par un adaptateur si vous pouvez)

Sélectionnez votre Arduino dans le menu déroulant “Select Board”

Projet de base

void setup() {
  // put your setup code here, to run once:

}

void loop() {
  // put your main code here, to run repeatedly:

}

Normalement, vous n'avez encore rien fait d'autre que de selectionner votre carte et pourtant vous avez deja ce code dans la fenetre principale.

Tous les projets arduino partent de ce bout de code plutot que d'une page blanche. Si vous avez besoin d'une preuve supplementaire vous pouvez cliquer sur File > New en haut a gauche de la fenetre, et vous ouvrirez une nouvelle fenetre avec un projet tout neuf contenant quand meme ces quelques lignes.

Ce code est le cadre minimum. En echange de GRANDEMENT vous faciliter la tache comparer a un projet d'electronique pur, l'environement arduino vous demande d'avoir au moins ces deux blocs.

Chaque bloc a un nom et son contenu est delimite par ses accolades {} (le "void" on verra plus tard).

Le code qui est dans setup() s'executera au demarrage de l'arduino, et le code qui est dans le bloc loop() se relancera toujours des qu'il se finit.

Quand on avance dans le noir on met au moins les mains devant soi

C'est beaucoup d'informaton d'un coup, donc pratiquons un peu.

On va apprendre a faire l'une des manip' les plus essentielles, on va voir comment afficher des informations dans la console de votre ordinateur depuis le code de l'arduino. L'interet est que si on peut s'afficher des informations depuis l'arduino, on pourra surveiller le comportement du programme pour avoir des indices sur ce qui cloche quand on n'aura pas le resultat qu'on charche.

Si on copie ce code ci-dessous et qu'on l'utilise pour remplacer le code contenu dans votre editeur ...

// put your setup code here, to run once at the start
void setup() {

	//starts a connection between the Arduino and the computer
	Serial.begin(9600);//9600 is the number of times the signal can be updated per second in the wire (you have the absolute permission to not care about that, just put 9600)

	Serial.println("Hello :3");//send whatever is between the () to the computer
}

// put your main code here, to run over and over and over and...
void loop() {


}

... et que vous cliquer sur cette icone pour ouvrir la console ...

//TODO opening console image

... alors vous devriez y voir ce message

//TODO image de la console avec le message dedans

On peut aussi mettre le Serial.println() dans le loop comme ceci

// put your setup code here, to run once at the start
void setup() {
	//starts a connection between the Arduino and the computer
	Serial.begin(9600);//9600 is the number of times the signal can be updated per second in the wire (you have the absolute permission to not care about that, just put 9600)
}

// put your main code here, to run over and over and over and...
void loop() {
  Serial.println("Hello :3");//send whatever is between the () to the computer
}

... et constater que le message se repete bien a l'infini puisque le bloc loop() recommence des qu'il se fini.

//TODO image de la console qui stream hello non stop

D'ailleurs pour mieux se rendre compte du fait que ca defile, je vous activez l'option qui date les messages

//TODO image de l'option timestamp

Le code s'execute toujours une ligne apres l'autre, de haut en bas. On a d'abord Serial.begin() qui va ouvrir la connexion entre votre arduino et votre ordinateur, puis Serial.println() qui va envoyer un message a votre ordinateur suivi d'un retour a la ligne.

D'ailleurs vous pouvez essayer d'inverser l'ordre des lignes, de mettre l'ouverture de la connexion APRES l'envoi du message pour constater que ca ne marche pas, peut importe combien de fois vous appuierez sur le bouton reset dans le coin de l'arduino, on ne verra pas de nouveau message si les etapes ne sont pas faites dans l'ordre.

Le 9600 correspond au type de connexion qu'on essaye d'etablir, il faut juste que la valeur dans le code et la valeur dans la console correspondent.

//TODO image avec le code a gauche et la console a droite et une fleche qui relie les deux baud rate

Vous pourriez replacer 9600 par 115200 a ces deux endroits, ca marcherait aussi.

Pour ce qui est de Serial.println() vous pouvez changer le texte par ce que vous voulez mais vous remarquerez que si vous retirez les guillemets " le code ne sera plus valide. Et c'est normal parce que Serial.println() affichera la valeur qui est entre ses parantheses et que si vous mettez des guillemets alors c'est litterallement du texte et qui si vous n'en mettez pas c'est du code et Serial.println() affichera le resultat.

Comme ceci :

void setup() {
	Serial.begin(9600);
}

void loop() {
  Serial.println("8 + 3");
  Serial.println(8 + 3);
}

Le premier Serial.println() affichera litteralement 8 + 3 tandis que le deuxieme va executer le code entre les parantheses et le donner a Serial.println() pour affichage.

Qu'est ce qu'il se passe si vous essayez le code ci-dessous?

void setup() {
	Serial.begin(9600);
}

void loop() {
  Serial.println(test);
}

Vous aurez cette erreur de compilation :

// TODO image de l'erreur "variable non declaree"

C:\Users\quelque\part\sur\mon\disque\sketch_jul9a.ino:6:18: error: 'test' was not declared in this scope
   Serial.println(test);
                  ^~~~

Deja vous remarquerez que j'ai "oublie" de mettre des guillemets autour du de test, ce qui fait que test est vu comme du code et non comme du texte. Lorseque nous avons un nom quelconque qui ne fait pas partie du langage lui alors on considerera que c'est une variable, ou une fonction si elle a une paire de paranthesese a sa droite, comme ceci maVariable et maFonction()

Ici, test est une variables parce que les parantheses sont celles de Serial.println(), si test etait une fonction on ecrirait ceci Serial.println(test()).

Une variable est un nom auquel on fait correspondre une valeur, l'interet etant que cette valeur est reutilisable et modifiable pendant le code s'execute.

Deja voyons comment creer une variable

void setup() {
	Serial.begin(9600);
}

void loop() {
  int test = 5;

  Serial.println(test);
}

L'erreur est partie, on peut donc mettre le code sur la carte et voir dans la console la valeur que represente test autrement dit 5.

Une variable peut contenir une valeur mais seulement une valeur d'un certain type et c'est a ca que sert int, il specifique cette variable ne peut contenir que des nombres entiers (des "integer" en anglais).

Au final, la ligne pour creer une variable c'est d'abord son type puis son nom et tres souvent sa valeur de depart.

Au dela de tout ca, une variable se comporte comme une valeur et on peut ecrire ceci

void setup() {
	Serial.begin(9600);
}

void loop() {
  int test = 5;

  Serial.println(test + 3);
}

Mais comme je disais on peut la changer comme ceci

void setup() {
	Serial.begin(9600);
}

void loop() {
  int test = 5;

  Serial.println(test);

  test = 8;

  Serial.println(test);

  test = test + 3;

  Serial.println(test);
}

On peut noter plusieurs choses de cet example

  • on constate bien qu'afficher regulierement la variable permet de suivre son evolution
  • on specifie type (int) de la variable qu'au moment de sa creation
  • test = test + 3 est mathematiquement incorrect mais on s'en fiche parce qu'ici = veut dire "devient egal a" donc cette ligne veux dire "test devient egal a lui meme plus 3".

C'est sympa tout ca mais c'est fatiguant de travailler avec des valeurs qui ne representent rien donc voyens comment brancher un bouton et le code qui va avec.

// TODO le quintessentiel fritzing d'un bouton de merde

void setup() {
	Serial.begin(9600);

  pinMode(3,INPUT_PULLUP);
}

void loop() {
  int buttonValue = 0;

  buttonValue = digitalRead(3);

  Serial.println(buttonValue);
}

Les pin digitales peuvent etre utilisees de plusieures manieres, mais seulement d'une seule maniere a la fois, la fonction pinMode() permet de choisir comment une pin digitale est utilisee.

Pour pinMode on donne d'abord le numero de la pin concernee (ici D3) et le mode qu'on veut lui donner (ici INPUT_PULLUP).

Il existe seulement 3 modes :

  • INPUT : pour lire la presence ou non de voltage sur la pin
  • OUTPUT : pour controler la presence de voltage sur la pin
  • INPUT_PULLUP : comme INPUT sauf la pin presente un voltage en permanence sauf quand elle est connectee au ground.

Donc si on reprend notre montage, il y aura toujours du voltage sur la pin D3 sauf lorsequ'on appuie sur le bouton.

Nous avons aussi digitalRead() qui est nouveau, cette fonction fait quelque chose que l'on avait pas encore vu jusqu'ici, elle rend un resultat. Pour savoir quelle sera la valeur de buttonValue on va executer puis remplacer digitalRead(3) par son resultat. Cette modification ne dure que le temps d'executer la ligne et ne modifie pas le code.

Donc, si notre bouton n'est pas enfonce alors digitalRead(3) vaudra 1 parcequ'il y a du voltage et donc buttonValue vaudra 1 a partir de cette ligne. En revanche si le bouton est enfonce alors digitalRead(3) et donc buttonValue vaudront 0.

Et evidemement on fini par s'afficher le contenu de buttonValue sans quoi il serait impossible de savoir si ce que l'on a fait marche correctement.

Si a tout cela on ajoute la fonction digitalWrite() qui permet de controler la presence ou l'abscence de voltage sur une pin digitale, on peut faire ceci :

void setup() {
	Serial.begin(9600);

  pinMode(3,INPUT_PULLUP);
  pinMode(4,OUTPUT);
}

void loop() {
  int buttonValue = 0;

  buttonValue = digitalRead(3);

  Serial.println(buttonValue);

  digitalWrite(4,buttonValue);
}

La fonction digitalWrite() prend d'abord le numero de la pin digitale que l'on veux changer (ici D4) et si on veux que cette pin aie du voltage avec la valeur 1 ou non avec la valeur 0.

On sait que buttonValue vaux 1 lorse que le bouton n'est pas presse et 0 lorsequ'il l'est donc la LED sur la pin D4 devrait etre allumee etre allumee par defaut et devrait s'eteindre lorseque l'on presse le bouton.

On peut maintenant dire qu'on a un systeme avec une entree, le bouton, et une sortie, la LED.

Il est important de garder le Seral.println() meme si on a un retour visuel avec la LED! Pourquoi? Parce que si vous avez un probleme, comment est-ce que vous pouvez savoir si ca viens du bouton duquel on n'arrive pas a recuperer la valeur ou de la LED au travers de laquelle on n'arrive pas a faire passer un courant?

On ne peux pas. C'est pour ca que je parlais d'utiliser Serial.println() pour s'afficher des valeurs intermediaires, ca nous permet de compartimenter notre code en plus petit bout dont le comportement est verifiable et validable.

Tout ceci etant dit, je vous rapelle qu'on peut changer la valeur contenue dans une variable, donc on peut essayer ceci

void setup() {
	Serial.begin(9600);

  pinMode(3,INPUT_PULLUP);
  pinMode(4,OUTPUT);
  pinMode(5,INPUT_PULLUP);
}

void loop() {
  int blinkDelay = 1000;
  int goFaster = 0;
  int goSlower = 0;

  goFaster = 1 - digitalRead(3);
  goSlower = 1 - digitalRead(5);

  blinkDelay = blinkDelay - goFaster + goSlower;

  digitalWrite(4,1);
  delay(blinkDelay);

  digitalWrite(4,0);
  delay(blinkDelay);

  Serial.println(blinkDelay);
}

Donc en principe :

  • goFaster vaux 1 quand le bouton 3 est appuye
  • goSlower vaux 1 quand le bouton 5 est appuye
  • ou ils valent 0 que leur bouton n'est pas appuye.

On s'en sert pour reduire et augmenter la valeur du temps qu'on restera eteint et allume. Plus blinkDelay est grand, plus on va attendre et plus le clignotement de la LED.

Mais si vous essayez ce code pour voir?

Il y a un truc qui ne va pas, on est d'accord?

On ne peux pas aller en dessous de 999 ni au dessus de 1001. Pourquoi?

On se rapelle qu'avec int blinkDelay = 1000; on creer la varibable parce qu'on precise son type (int) donc des que loop() est fini on recommence et on creer blinkDelay a nouveau.

Ok, donc on peut mettre int blinkDelay = 1000; dans le setup() du coup? Comme ca elle sera creee pendant le setup puis elle ne sera pas recreee par la suite, nous laissant donc accumuler des changement, non?

Si vous essayez ca vous verrez l'erreur ci-dessous

// TODO screenshot de l'erreur blinkDelay not defined ou un truc du genre

Une variable n'existe que dans la parie d'accolade dans laquelle elle a ete creee, donc si je le creer dans setup() je ne pourrait m'en servir que dans setup() et d'ailleurs elle est plus exactement detruite lorseque l'on atteint l'accolade fermante } de setup.

Mais on peut la creer en dehors de setup() et loop() des la premiere ligne, ce qui fait qu'elle existera des le tout debut, qu'elle sera accessible partout, et qu'elle ne sera jamais detruite.

int blinkDelay = 1000;

void setup() {
	Serial.begin(9600);

  pinMode(3,INPUT_PULLUP);
  pinMode(4,OUTPUT);
  pinMode(5,INPUT_PULLUP);
}

void loop() {
  int goFaster = 0;
  int goSlower = 0;

  goFaster = 1 - digitalRead(3);
  goSlower = 1 - digitalRead(5);

  blinkDelay = blinkDelay - goFaster + goSlower;

  digitalWrite(4,1);
  delay(blinkDelay);

  digitalWrite(4,0);
  delay(blinkDelay);

  Serial.println(blinkDelay);
}

Pourquoi on ne fait pas ca pour toutes les variables? Pour rendre le programme plus simple et plus facile a comprendre on donne juste ce qu'il faut de permissions. Si tous nos elements pouvaient tout faire tout le temps bonjour l'angoisse quand il faudra trouver la cause d'un probleme.

Le module tactile

Circuit

importer la lib

// Depuis le manageur de librairies

code d'exemple

"en theorie on devrait aller dans file > examples > maLib mais bon on va faire plus simple"

Le lecteur MP3

Preparer la carte micro-SD

// attention, pas de Mac

Circuit

importer la lib

// Depuis github // import from .zip

Tout ensemble

Circuit

C.f. la partie connexions commune avec la partie fab.

Le code

#include <Wire.h>
#include "Adafruit_MPR121.h"
#include <SoftwareSerial.h>
#include "WT2605C_Player.h"

SoftwareSerial SSerial(2, 3);  // RX, TX
#define mp3Serial SSerial

WT2605C<SoftwareSerial> Mp3Player;
int maxVolume = 30;

Adafruit_MPR121 cap = Adafruit_MPR121();
uint16_t lasttouched = 0;
uint16_t currtouched = 0;

void setup() {
  Serial.begin(9600);

  mp3Serial.begin(115200);
  delay(1);
  Mp3Player.init(mp3Serial);

  Mp3Player.volume(maxVolume / 4);

  // Mp3Player.playMode(WT2605C_CYCLE);
  // Mp3Player.playMode(WT2605C_SINGLE_CYCLE);
  // Mp3Player.playMode(WT2605C_DIR_CYCLE);
  // Mp3Player.playMode(WT2605C_RANDOM);
  Mp3Player.playMode(WT2605C_SINGLE_SHOT);

  if (!cap.begin(0x5A)) {
    Serial.println("MPR121 not found, check wiring?");
  } else {
    Serial.println("MPR121 found!");
  }
}

void loop() {
  // Get the currently touched pads
  currtouched = cap.touched();

  if (isMprPinTouched(0)) {
    Mp3Player.playSDRootSong(0);
    delay(2);
  }

  if (isMprPinTouched(1)) {
    Mp3Player.playSDRootSong(1);
    delay(2);
  }

  if (isMprPinTouched(2)) {
    Mp3Player.playSDRootSong(2);
    delay(2);
  }

  if (isMprPinTouched(10)) {
    Mp3Player.next();
    delay(2);
  }

  if (isMprPinTouched(11)) {
    Mp3Player.pause_or_play();
    delay(2);
  }

  // reset our state
  lasttouched = currtouched;
}

bool isMprPinTouched(uint8_t pin) {
  bool pinTouching = currtouched & (1 << pin);
  bool pinWasTouching = lasttouched & (1 << pin);

  if (pinTouching && !pinWasTouching) {
    return true;
  }

  return false;
}

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

Packages

Contributors

Languages