
Nous continuons à publier un aperçu du cours en ligne «Construction de robots et autres périphériques Arduino», commençant ici .
Alors, combien de temps cela a été court, la deuxième semaine du cours de robotique en ligne du MIPT s'est terminée. Franchement, la semaine a été très remplie de sujets variés.
Voici un exemple de liste que je me suis alloué:
- Diviseur de tension. Utilisation d'une photorésistance et d'une thermistance
- Signal analogique. Largeur du signal
- Communication via le port série. Environnement de traitement
- Signal numérique. Boutons et options de connexion. Résistance pull-up
- Expressions logiques, instructions if et else
- Buzzer, barre LED, indicateur à sept segments
- Microcircuits. Onduleur logique 74HC04, registre à décalage 74HC595
- Programmes de débogage
- Modules externes
- Une variante d'un système de surveillance prêt à l'emploi qui affiche la température et le niveau d'éclairage sur l'échelle LED, ainsi qu'un haut-parleur qui fonctionne lorsqu'une certaine température est dépassée
Ayant passé avec succès le test et collecté les schémas proposés dans les leçons, j'ai réfléchi à la façon d'améliorer tel ou tel schéma ou de collecter quelque chose de moi.
La première chose qui m'est venue à l'esprit a été la modernisation du capteur de lumière. L'implémentation proposée dans la leçon a simplement pris la valeur de la photorésistance et l'a envoyée au port série.
La version améliorée devrait utiliser un indicateur à sept segments pour afficher les nombres de 0 (éclairage minimum) à 9 (éclairage maximum). L'indicateur doit être connecté via un registre à décalage. Deux boutons doivent être utilisés pour régler les niveaux d'éclairage minimum et maximum. Le registre à décalage est nécessaire afin de ne pas utiliser la broche Arduino sur chaque segment, mais d'utiliser à la place moins de broches. En fait, le registre à décalage convertit la sortie de données série (un bit par unité de temps) en parallèle (plusieurs bits par unité de temps). Dans notre cas, au lieu de sept broches Arduino, nous n'en avons besoin que de trois.
Dans l'éditeur Fritzing, j'ai eu un tel appareil.

De cette façon, il semble en direct.

Les bases ont été prises pour travailler avec un registre à décalage et une photorésistance.
Notez que la résistance est connectée sur la carte quelque peu différemment que dans le tutoriel vidéo - là, nous avons pris la valeur de tension sur la photorésistance par rapport à la terre, et dans le circuit, nous supprimons la chute de tension par rapport à l'alimentation. Ceci est fait pour simplifier un peu le programme - avec une augmentation du niveau d'éclairage, la résistance de la photorésistance diminue. Par conséquent, au même courant, la chute de tension diminue. Par conséquent, à l'entrée analogique, plus la tension est élevée, plus le niveau d'éclairage est élevé et vice versa.
A vous maintenant de finaliser le code source. Le même programme a été utilisé comme base pour afficher la valeur sur un indicateur à sept segments.
Code de programme// , #define DATA_PIN 13 #define LATCH_PIN 12 #define CLOCK_PIN 11 // , #define BTN_MIN 3 #define BTN_MAX 2 // , #define SENS_PIN A5 // , byte d0 = 0b01111101; byte d1 = 0b00100100; byte d2 = 0b01111010; byte d3 = 0b01110110; byte d4 = 0b00100111; byte d5 = 0b01010111; byte d6 = 0b01011111; byte d7 = 0b01100100; byte d8 = 0b01111111; byte d9 = 0b01110111; // int min_light = 0; int max_light = 1023; // int value; // , . . int output; // int digit; void setup() { // pinMode(DATA_PIN, OUTPUT); pinMode(CLOCK_PIN, OUTPUT); pinMode(LATCH_PIN, OUTPUT); // Serial.begin(9600); // pinMode(BTN_MIN, INPUT_PULLUP); pinMode(BTN_MAX, INPUT_PULLUP); } void loop() { // value = analogRead(SENS_PIN); output = value; // - if (!digitalRead(BTN_MIN)) min_light = value; if (!digitalRead(BTN_MAX)) max_light = value - 10; // if (value < min_light) output = min_light; if (value > max_light) output = max_light; // , digit = map(value, min_light, max_light, 0, 9); // Serial.println("Value: " + String(value) + " Output: " + String(output) + " Min: " + String(min_light) + " Max: " + String(max_light) + " Current : " + String(value) + " Digit: " + String(digit)); // if (digit == 0) { digitalWrite(LATCH_PIN, LOW); shiftOut(DATA_PIN, CLOCK_PIN, LSBFIRST, d0); digitalWrite(LATCH_PIN, HIGH); } else if (digit == 1) { digitalWrite(LATCH_PIN, LOW); shiftOut(DATA_PIN, CLOCK_PIN, LSBFIRST, d1); digitalWrite(LATCH_PIN, HIGH); } else if (digit == 2) { digitalWrite(LATCH_PIN, LOW); shiftOut(DATA_PIN, CLOCK_PIN, LSBFIRST, d2); digitalWrite(LATCH_PIN, HIGH); } else if (digit == 3) { digitalWrite(LATCH_PIN, LOW); shiftOut(DATA_PIN, CLOCK_PIN, LSBFIRST, d3); digitalWrite(LATCH_PIN, HIGH); } else if (digit == 4) { digitalWrite(LATCH_PIN, LOW); shiftOut(DATA_PIN, CLOCK_PIN, LSBFIRST, d4); digitalWrite(LATCH_PIN, HIGH); } else if (digit == 5) { digitalWrite(LATCH_PIN, LOW); shiftOut(DATA_PIN, CLOCK_PIN, LSBFIRST, d5); digitalWrite(LATCH_PIN, HIGH); } else if (digit == 6) { digitalWrite(LATCH_PIN, LOW); shiftOut(DATA_PIN, CLOCK_PIN, LSBFIRST, d6); digitalWrite(LATCH_PIN, HIGH); } else if (digit == 7) { digitalWrite(LATCH_PIN, LOW); shiftOut(DATA_PIN, CLOCK_PIN, LSBFIRST, d7); digitalWrite(LATCH_PIN, HIGH); } else if (digit == 8) { digitalWrite(LATCH_PIN, LOW); shiftOut(DATA_PIN, CLOCK_PIN, LSBFIRST, d8); digitalWrite(LATCH_PIN, HIGH); } else if (digit == 9) { digitalWrite(LATCH_PIN, LOW); shiftOut(DATA_PIN, CLOCK_PIN, LSBFIRST, d9); digitalWrite(LATCH_PIN, HIGH); } // delay(10); }
Parmi les caractéristiques - lors du réglage du niveau maximal d'éclairage, nous avons dû soustraire une constante (max_light = valeur - 10), sélectionnée empiriquement. Ceci est nécessaire pour éviter un "cliquetis" au niveau maximum d'éclairage, car la valeur de tension prise à la photorésistance est instable.
Nous compilons l'esquisse, la chargeons dans l'Arduino et vérifions.
D'abord dans le moniteur de port ...

Et puis vivre
Comme vous pouvez le voir, l'appareil fonctionne correctement comme décrit. Bien sûr, il y a encore place à amélioration - par exemple, vous pouvez ajouter un signal audio lorsque l'éclairage tombe en dessous d'un certain niveau - cela signifie que vous devez allumer un éclairage supplémentaire sur le lieu de travail. À l'avenir, il sera également possible de modifier le programme lui-même, en utilisant des tableaux et des fonctions supplémentaires.
En conclusion, je répète encore une fois que la semaine s'est avérée très mouvementée sur différents sujets. Notez que depuis la publication du cours dans l'IDE Arduino, la fonction Serial Plotter intégrée est apparue, qui chevauche partiellement les fonctions d'environnement de traitement considérées dans les leçons. De plus, à la fin de la semaine, les auteurs ont proposé l'idée de modularité lorsque le dispositif final est assemblé à partir d'éléments prêts à l'emploi - des modules, par exemple, des boutons avec une résistance de rappel déjà intégrée, un capteur de lumière prêt à l'emploi, où une photorésistance et une résistance conventionnelle sont déjà assemblées dans un diviseur de tension, etc. Cependant, l'appareil peut être facilement assemblé sur une planche à pain, ce qui a été fait. La question s'adresse aux lecteurs, avez-vous déjà fait un étui pour vos appareils? Quels matériaux avez-vous utilisés pour cela? Peut-être que le carton, le contreplaqué, le plexiglas ou, ce qui n'est pas rare aujourd'hui, a été imprimé sur une imprimante 3D?