Abonnement aux commentaires

S'abonner pour recevoir les commentaires suivants par email

まこと の ブログ

MaKoTo no burogu — Journal de bord…

Aller au contenu | Aller au menu | Aller à la recherche

jubeat -6-

Suite de l'ouvrage précédent :

La ventilation :

  • J'en parlais dans le précédent billet, j'ai envisagé une partie de la ventilation par le dessous, en pratiquant des trous de ⌀ 10 mm.

dsc05242.jpg dsc05247.jpg

  • L'emplacement de ces prises d'air correspond donc aux emplacements des ouïes de l'ordi portable, et le trou pour le ventilateur de ⌀ 60 mm, à l'emplacement de l'évacuation de l'air du processeur :

dsc05244.jpg dsc05250.jpg
Ainsi l'air chaud sortant de l'ordi serait évacué directement hors de la caisse de la borne.

  • Pour apporter de l'air frais dans la caisse et expulser l'air chaud produit par l'écran de TV, j'ai opté pour un ventilateur de chaque côté de la borne, dans ce coin assez discret.

Sur la photo c'est un modèle à 3 fils que j'avais sous la main pour me servir de gabarit de découpe, que je n'ai donc pas utilisé car sa vitesse de rotation n'est pas pilotable.
Je me suis donc procuré deux ventilo de ⌀ 70 mm à 4 fils, pilotables par PWM.

  • Les ventilos sont donc connectés à un circuit à base d'Arduino pro mini, câblé sur une plaque à trous, et dont la finalité est de contrôler la vitesse des ventilateurs en fonctions de la température interne de la borne.

dsc05276.jpg
Pour cela un capteur de température DHT11 mesure la température toutes les secondes, et ajuste les vitesses des ventilos, indépendamment les un des autres.
J'ai déterminé les vitesses à force d'essais, jusqu'à obtenir quelque chose de satisfaisant en terme de compromis : nuisance sonore VS température interne.

  • Voici le schéma de câblage :


  • Et le code nécessaire : [1]
#include <dht.h>
#define dataPin 12 // Defines pin number to which the sensor is connected
dht DHT; // Creats a DHT object

// PWMs
int fan01Pin = 9;   // Ventil IN, 20% de plus que OUT
int fan02Pin = 10;  // Ventil OUT
int fan03Pin = 11;  // Ventil OUT PC,  20% de plus

int FanSpeed = 0;
int FanSpeed20 = 0;

void setup() {
  Serial.begin(9600);
  pinMode(fan01Pin, OUTPUT);
  pinMode(fan02Pin, OUTPUT);
  pinMode(fan03Pin, OUTPUT);  
}

void loop() {
  int readData = DHT.read11(dataPin); // Reads the data from the sensor
  float t = DHT.temperature; // Gets the values of the temperature
  float h = DHT.humidity; // Gets the values of the humidity
  // send the square wave signal to the FAN:
  if (t <= 20)
  {
    FanSpeed = 0;
    analogWrite(fan01Pin, FanSpeed);
    analogWrite(fan02Pin, FanSpeed);
    analogWrite(fan03Pin, FanSpeed);
  }
  if (t == 21)
  {
    FanSpeed = 35;
    FanSpeed20 = (((FanSpeed * 20)/100) + FanSpeed);
    analogWrite(fan01Pin, FanSpeed20);
    analogWrite(fan02Pin, FanSpeed);
    analogWrite(fan03Pin, FanSpeed20);
  }
  if (t == 22)
  {
    FanSpeed = 42;
    FanSpeed20 = (((FanSpeed * 20)/100) + FanSpeed);
    analogWrite(fan01Pin, FanSpeed20);
    analogWrite(fan02Pin, FanSpeed);
    analogWrite(fan03Pin, FanSpeed20);
  }
  if (t == 23)
  {
    FanSpeed = 49;
    FanSpeed20 = (((FanSpeed * 20)/100) + FanSpeed);  
    analogWrite(fan01Pin, FanSpeed20);
    analogWrite(fan02Pin, FanSpeed);
    analogWrite(fan03Pin, FanSpeed20);
  }
  if (t == 24)
  {
    FanSpeed = 56;
    FanSpeed20 = (((FanSpeed * 20)/100) + FanSpeed);
    analogWrite(fan01Pin, FanSpeed20);
    analogWrite(fan02Pin, FanSpeed);
    analogWrite(fan03Pin, FanSpeed20);
  }  
  if (t == 25)
  {
    FanSpeed = 63;
    FanSpeed20 = (((FanSpeed * 20)/100) + FanSpeed);
    analogWrite(fan01Pin, FanSpeed20);
    analogWrite(fan02Pin, FanSpeed);
    analogWrite(fan03Pin, FanSpeed20);
  }
  if (t == 26)
  {
    FanSpeed = 70;
    FanSpeed20 = (((FanSpeed * 20)/100) + FanSpeed);
    analogWrite(fan01Pin, FanSpeed20);
    analogWrite(fan02Pin, FanSpeed);
    analogWrite(fan03Pin, FanSpeed20);
  }
  if (t == 27)
  {
    FanSpeed = 77;
    FanSpeed20 = (((FanSpeed * 20)/100) + FanSpeed);
    analogWrite(fan01Pin, FanSpeed20);
    analogWrite(fan02Pin, FanSpeed);
    analogWrite(fan03Pin, FanSpeed20);
  }
  if (t == 28)
  {
    FanSpeed = 84;
    FanSpeed20 = (((FanSpeed * 20)/100) + FanSpeed);
    analogWrite(fan01Pin, FanSpeed20);
    analogWrite(fan02Pin, FanSpeed);
    analogWrite(fan03Pin, FanSpeed20);
  }
  if (t == 29)
  {
    FanSpeed = 91;
    FanSpeed20 = (((FanSpeed * 20)/100) + FanSpeed);
    analogWrite(fan01Pin, FanSpeed20);
    analogWrite(fan02Pin, FanSpeed);
    analogWrite(fan03Pin, FanSpeed20);
  }
  if (t == 30)
  {
    FanSpeed = 98;
    FanSpeed20 = (((FanSpeed * 20)/100) + FanSpeed);
    analogWrite(fan01Pin, FanSpeed20);
    analogWrite(fan02Pin, FanSpeed);
    analogWrite(fan03Pin, FanSpeed20);
  }
  if (t == 31)
  {
    FanSpeed = 105;
    FanSpeed20 = (((FanSpeed * 20)/100) + FanSpeed);
    analogWrite(fan01Pin, FanSpeed20);
    analogWrite(fan02Pin, FanSpeed);
    analogWrite(fan03Pin, FanSpeed20);
  }
  if (t == 32)
  {
    FanSpeed = 112;
    FanSpeed20 = (((FanSpeed * 20)/100) + FanSpeed);
    analogWrite(fan01Pin, FanSpeed20);
    analogWrite(fan02Pin, FanSpeed);
    analogWrite(fan03Pin, FanSpeed20);
  }
  if (t == 33)
  {
    FanSpeed = 119;
    FanSpeed20 = (((FanSpeed * 20)/100) + FanSpeed);
    analogWrite(fan01Pin, FanSpeed20);
    analogWrite(fan02Pin, FanSpeed);
    analogWrite(fan03Pin, FanSpeed20);
  }
  if (t == 34)
  {
    FanSpeed = 126;
    FanSpeed20 = (((FanSpeed * 20)/100) + FanSpeed);
    analogWrite(fan01Pin, FanSpeed20);
    analogWrite(fan02Pin, FanSpeed);
    analogWrite(fan03Pin, FanSpeed20);
  }
  if (t == 35)
  {
    FanSpeed = 133;
    FanSpeed20 = (((FanSpeed * 20)/100) + FanSpeed);
    analogWrite(fan01Pin, FanSpeed20);
    analogWrite(fan02Pin, FanSpeed);
    analogWrite(fan03Pin, FanSpeed20);
  }
  if (t == 36)
  {
    FanSpeed = 140;
    FanSpeed20 = (((FanSpeed * 20)/100) + FanSpeed);
    analogWrite(fan01Pin, FanSpeed20);
    analogWrite(fan02Pin, FanSpeed);
    analogWrite(fan03Pin, FanSpeed20);
  }
  if (t == 37)
  {
    FanSpeed = 147;
    FanSpeed20 = (((FanSpeed * 20)/100) + FanSpeed);
    analogWrite(fan01Pin, FanSpeed20);
    analogWrite(fan02Pin, FanSpeed);
    analogWrite(fan03Pin, FanSpeed20);
  }
  if (t == 38)
  {
    FanSpeed = 154;
    FanSpeed20 = (((FanSpeed * 20)/100) + FanSpeed);
    analogWrite(fan01Pin, FanSpeed20);
    analogWrite(fan02Pin, FanSpeed);
    analogWrite(fan03Pin, FanSpeed20);
  }
  if (t == 39)
  {
    FanSpeed = 161;
    FanSpeed20 = (((FanSpeed * 20)/100) + FanSpeed);
    analogWrite(fan01Pin, FanSpeed20);
    analogWrite(fan02Pin, FanSpeed);
    analogWrite(fan03Pin, FanSpeed20);
  }
  if (t == 40)
  {
    FanSpeed = 168;
    FanSpeed20 = (((FanSpeed * 20)/100) + FanSpeed);
    analogWrite(fan01Pin, FanSpeed20);
    analogWrite(fan02Pin, FanSpeed);
    analogWrite(fan03Pin, FanSpeed20);
  }
  if (t == 41)
  {
    FanSpeed = 175;
    FanSpeed20 = (((FanSpeed * 20)/100) + FanSpeed);
    analogWrite(fan01Pin, FanSpeed20);
    analogWrite(fan02Pin, FanSpeed);
    analogWrite(fan03Pin, FanSpeed20);
  }
  if (t == 42)
  {
    FanSpeed = 182;
    FanSpeed20 = (((FanSpeed * 20)/100) + FanSpeed);
    analogWrite(fan01Pin, FanSpeed20);
    analogWrite(fan02Pin, FanSpeed);
    analogWrite(fan03Pin, FanSpeed20);
  }
  if (t == 43)
  {
    FanSpeed = 189;
    FanSpeed20 = (((FanSpeed * 20)/100) + FanSpeed);
    analogWrite(fan01Pin, FanSpeed20);
    analogWrite(fan02Pin, FanSpeed);
    analogWrite(fan03Pin, FanSpeed20);
  }
  if (t == 44)
  {
    FanSpeed = 196;
    FanSpeed20 = (((FanSpeed * 20)/100) + FanSpeed);
    analogWrite(fan01Pin, FanSpeed20);
    analogWrite(fan02Pin, FanSpeed);
    analogWrite(fan03Pin, FanSpeed20);
  }
  if (t == 45)
  {
    FanSpeed = 203;
    FanSpeed20 = (((FanSpeed * 20)/100) + FanSpeed);
    analogWrite(fan01Pin, FanSpeed20);
    analogWrite(fan02Pin, FanSpeed);
    analogWrite(fan03Pin, FanSpeed20);
  }
  if (t == 46)
  {
    FanSpeed = 210;
    FanSpeed20 = (((FanSpeed * 20)/100) + FanSpeed);
    analogWrite(fan01Pin, FanSpeed20);
    analogWrite(fan02Pin, FanSpeed);
    analogWrite(fan03Pin, FanSpeed20);
  }
  if (t >= 47)
  {
    FanSpeed = 212;   // Ventilo en vitesse max (254 - 20%)
    FanSpeed20 = (((FanSpeed * 20)/100) + FanSpeed);
    analogWrite(fan01Pin, FanSpeed20);
    analogWrite(fan02Pin, FanSpeed);
    analogWrite(fan03Pin, FanSpeed20);
  }
  
  // Printing the results on the serial monitor
  Serial.print("Temperature = ");
  Serial.print(t);
  Serial.print(" °C ");
  Serial.print("    FanSpeed = ");
  Serial.print(FanSpeed);
  Serial.print(" PWM ");
  Serial.print("    FanSpeed = ");
  Serial.print(FanSpeed20);
  Serial.println(" PWM ");
//  Serial.print("    Humidity = ");
//  Serial.print(h);
//  Serial.println(" % ");
  delay(1000); // Delays 1 seconds, as the DHT11 sampling rate is 1Hz
}
  • Voici le circuit suspendu dans la caisse, prés de l'écran, et le ventil' de droite qui aspire, celui de gauche qui expire.

dsc05450.jpg dsc05447.jpg dsc05385.jpg dsc05448.jpg

J'ai donc dû rajouter une alimentation 12V pour alimenter ce circuit et alors utiliser un câble IEC en Y pour dédoubler une des deux arrivées 220 V.

  • Pour habiller les ventilos, j'ai modélisé et imprimé des grilles, et voici au passage les grilles que j'ai faites pour les hauts-parleurs :

dsc05422.jpg dsc05432.jpg dsc05433.jpg dsc05437.jpg

Les coins-coins :

  • J'ai une nouvelle fois eu recours à mon imprimante3D, décidément un outil formidable, pour modèliser et imprimer les quatre coins du cube visibles, avec des petits ergots dépassant, permettant aux coins de tenir en place.

dsc05413.jpg dsc05414.jpg
dsc05415.jpg dsc05416.jpg dsc05417.jpg dsc05436.jpg

  • Entre temps le film protecteur de la plaque plexi devant l'écran a été retiré, et j'en profite également pour montrer la jointure réalisée à l'aide de joint isolant pour fenêtre, collé le long du bezel en métal.

dsc05435.jpg dsc05434.jpg

Le « monnayeur » :

  • On va profiter de l'emplacement du monnayeur pour mettre un panneau de commande qui rassemble les boutons de contrôles, comme le bouton power de l'ordi, les boutons de la TV ainsi que son capteur infrarouge/témoin, une prise USB pour la maintenance de l'ordi, une prise jack pour le casque et son potentiomètre de réglage du volume.
  • Après quelques heures de travail et d'impression 3D, voici les pièces qui vont constituer l'ensemble :

dsc05372.jpg dsc05376.jpg
J'ai vissé le cadre sur la borne, et de me rendre compte que la prise USB n'a pas suffisamment de recul pour passer, tout comme la nappe multicolore au bout de laquelle le connecteur 10 pins n'a pas la possibilité de sortir.

  • Après avoir agrandis le trou et creusé le bois, le connecteur est accessible. Il sert donc à relier facilement 2 boutons depuis l'Arduino, le bouton power et la led depuis l'ordi, ainsi que la fiche jack. Le second connecteur 3 pins, concerne lui le bouton power et aussi la led de l'ordi…

dsc05454.jpg dsc05453.jpg

  • Pour déporter le bouton power, j'ai simplement soudé deux fils en parallèle sur le bouton existant, percé la coque de l'ordi et fait cheminer le fil jusqu'à la façade du monnayeur. J'ai donc fait de même pour la led témoins (câblage non visible sur la photo).

dsc05170.jpg dsc05171.jpg dsc05172.jpg

  • Ensuite j'ai pu procéder à la mise en place de toutes ces interfaces sur la façade, voici le double potentiométre logarithmique de 1 kΩ pour le volume du casque :

dsc05457.jpg dsc05466.jpg

  • Voilà pour le reste…

dsc05468.jpg dsc05470.jpg dsc05471.jpg dsc05472.jpg
J'ai dû coller une bande de plastique blanc en angle tout le long pour rigidifier un peu la façade un peu trop souple. C'est un prototype, je pense la refaire un acrylique plus tard, et plus épais donc.

  • Et ce que ça donne une fois fermé.

dsc05421.jpg dsc05438.jpg

Le meuble d’accueil :

Bon ayé, on a un appareil correct pour jouer.
Facile à mettre en marche, hop, on bascule l'interrupteur 220 V, le témoin rouge s'allume, on pose le doigt sur le contact power de l'écran qui s'illumine alors, et on presse le bouton power de l'ordi, et le système d'exploitation démarre et lance le jeu.
Aussi facile à éteindre, suffit de faire exactement dans l'ordre inverse. Car presser le bouton power de l'ordi déclenche (via l'ACPI) l'extinction propre du système d'exploitation. À noter qu'éteindre l'écran est en fait facultatif, puisqu'il sera coupé de toute manière par l'interrupteur 220 V.

  • Bon, mais reste à trouver une place à ce « bartop », et à défaut de bar disponible, si tant est qu'il soit à la bonne hauteur, j'ai dû me résoudre à concevoir un meuble sur mesure, afin que l'arrête de la cornière de face atteigne 95 cm de haut par rapport au sol.

  • Après l'avoir dessiné et établit un plan de découpe à fournir au marchand, je suis revenu chez moi avec le bois nécessaire pré-découpé, et il ne restait plus qu'à assembler le lego

Enfin ça c'était ce que j'imaginais, car j'ai eu des mauvaises surprises avec quelques découpes pas bien d'équerres… J'ai fait découper pour me simplifier la vie, et non hein, faut qu'on me la complique -_-;
Si j'avais su j'aurais découpé ça moi-même avec ma sautteuse, plutôt que de perdre mon temps à bricoler pour rattraper ces erreurs… Bref.

  • Pour faciliter l'assemblage, j'ai bricolé une équerre pour maintenir les pièces avec des serres joint pendant l'oppération de vissage.

dsc05364.jpg dsc05365.jpg

  • Ce qui fût bien utile, car ce genre de bois n'est pas toujours parfaitement plan.

dsc05369.jpg dsc05370.jpg

  • Ici j'ai dû utiliser un tasseau pour contraindre la planche et permettre un vissage correct, car la planche était arquée.

dsc05371.jpg dsc05362.jpg

  • Dans mon stock de récup « trouvé dans la rue », il y avait ce contre-plaqué quasi pile à la bonne largeur, (mais malheureusement trop court en hauteur), que j'ai recoupé pour former le fond, afin de rigidifier le meuble.

dsc05446.jpg dsc05440.jpg
Pour le devant, j'ai utilisé des (trop) petites équerres métallique, pensant que ce serait suffisant, mais le meuble brimballe encore trop. Il faut préciser que la profondeur du meuble de 60 cm n'aide en rien, car la souplesse du bois joue aussi sur ce phénomène.

  • En attendant donc de trouver une solution, comme une porte hyper ajustée par exemple (comme sur la candycab), j'ai utilisé une des étagéres fixée ainsi à la verticale, et ça ne bouge plus du tout !



  • Petit bilan :

Il ne reste « plus grand chose à faire », enfin, c'est toujours ce que je crois et à chaque fois je me fait surprendre…

- Les cornières à limer en arrondis.
- La façade du monnayeur à refaire propre.
- La déco, qui comprend le surfaçage et la mise en peinture de la borne, ainsi que la rénovation du panel (peinture + polissage des touches).
- Étudier la mise en place d'un lecteur RFID.
- Une démo vidéo à filmer.
- Faire la porte du meuble d'accueil, et le poncer avant de le vernir.

Pour info, la borne pése 18 Kg (hors meuble d'accueil), et reste relativement simple à manipuler même si ce n'est pas facile à soulever.

À suivre…

Note

[1] Voire les commentaires ci-dessous, y'a plus malin…

Commentaires

1. Le samedi, 30 octobre 2021, 20:51 par Samaël

Encore bravo pour cette superbe borne.
Petite optim de code possible : utiliser un Switch case car ta température ne peut pas rentrer dans 2 if donc il ne sert a rien de tous les tester séquentiellement comme c'est le cas ici.

2. Le samedi, 8 janvier 2022, 11:24 par kao_chen

Salut, ça à l'air pas mal, tu dois pouvoir factoriser ta fonction loop ()comme ceci pour limiter la répétition. A tester:

void loop() {
int readData = DHT.read11(dataPin); // Reads the data from the sensor
float t = DHT.temperature; // Gets the values of the temperature
float h = DHT.humidity; // Gets the values of the humidity
// send the square wave signal to the FAN:

if (t <= 20)
{
FanSpeed = 0;
FanSpeed20 = FanSpeed;
}
if (t > 20 && t < 47)
{
FanSpeed = 35 + (t - 20) * (7)) //a chaque élévation de 1°, j'ajoute 7 à la vitesse
FanSpeed20 = (((FanSpeed * 20)/100) + FanSpeed);
}

if (t >= 47)
{
FanSpeed = 212; // Ventilo en vitesse max (254 - 20%)
FanSpeed20 = (((FanSpeed * 20)/100) + FanSpeed);
}

analogWrite(fan01Pin, FanSpeed20);
analogWrite(fan02Pin, FanSpeed);
analogWrite(fan03Pin, FanSpeed20);


// Printing the results on the serial monitor
Serial.print("Temperature = ");
Serial.print(t);
Serial.print(" °C ");
Serial.print(" FanSpeed = ");
Serial.print(FanSpeed);
Serial.print(" PWM ");
Serial.print(" FanSpeed = ");
Serial.print(FanSpeed20);
Serial.println(" PWM ");
// Serial.print(" Humidity = ");
// Serial.print(h);
// Serial.println(" % ");
delay(1000); // Delays 1 seconds, as the DHT11 sampling rate is 1Hz
}

Il doit y avoir plus simple encore, un switch pourrais aider

3. Le mercredi, 18 mai 2022, 21:55 par Makoto

Effectivement Samaël, le switch case eu été mieux, et ne me souvenant plus de la syntaxe, c'est par pure paresse que je me suis contenté de ce code-ci…
Et voici que kao_chen arrive avec une nouvelle approche qui tient sur une page, testée et validée !
Je l'implémenterais d'ici peu dans le prochain billet Sound Voltex qui intégrera le même type de circuit.
Merci à vous :)

Ajouter un commentaire

Le code HTML est affiché comme du texte et les adresses web sont automatiquement transformées.

Fil des commentaires de ce billet