jeudi 3 mars 2011

Controlling a fan with an Arduino, a nunchuk, a DS touch screen and a PID

Controlling a fan with an Arduino, a nunchuk, a DS touch screen and a PID:
I created a small application with an Arduino, which calculates and controls (with or without PID) the rotation speed of a fan from three items:
1- a Nintendo nunchuck 
2- a Nintendo DS screen 
3- a Temperature Sensor TMP36

A tilt sensor can switch off the fan if a vibration is detected, a red LED lights up and waits for user intervention.

This application could for example be used to regulate the temperature inside a box.

The fan speed is calculated by interruptions performed by the Arduino and generated through an optocoupler placed against the fan.
Note: the program would work equally well with a Hall effect sensor, but I left solution because my magnet was too strong and blocked my fan;-).

A PID Arduino library can control the rotation speed according to a setting point speed obtained using a correspondance between speed and temperature, vitesse_consigne = f (temperature).

video


1 - The DS screen is used to:
 - select different speeds by pressing the keys 0-9, minimum = 0 and at maximum = 2100 rpm (with a 9V battery).
 - switch to control or PID control temperature by pressing the C key
 - the E button stops the rotation of the fan



2 - The Nunchuk mode is activated by pressing constantly on Z button, the X acceleration then vary the fan speed, for values ​​ranging from speed 1 to 9 (same speeds as the DS screen).

 In "stand alone" mode, i.e. without RBBB plugged into the USB port of the PC, I placed an RGB LED that displays a color based on the rotational speed of the fan: e.g. red for the first gear and Green for the ninth speed. If the temperatrure is higher than 25°C, the speed is set to its maximum and the Blue led is lighted. 





PART2:
The embedded program in the arduino prints out information from different sensors.
 You can preview an example of what the program prints out, looking at the below field "Raw Output" T = 19.82 | rpm = 840 | (X, Y) = 1006, 1007 | RGBLED = 285, -30, 0 | Acc = 175, 124, 161 | to = 1.1 | joy = 125.128
 I then created a LabView program that formats that comes out the serial port and can either:
 - read this information if "Read" is enabled,
 - or write to the serial port to take control of the fan if "Write" is enabled.

video


 With the example above:

T = 19.82 | rpm = 840 | (X, Y) = 1006, 1007 | RGBLED = 285, -30, 0 | Acc = 175, 124, 161 | to = 1.1 | joy = 125.128


T: temperature
 rpm: fan speed
 (X, Y) coordinates of the DS screen
 RGBLED: intensity values ​​of the PWM pin for the LED Red, Green and Blue respectively
 acc: acceleration values ​​of the three axes X, Y, Z Nunchuck
 button: button states Z and C respectively Nunchuck (1: pressed, 0: released)
 Joy: values ​​of the two axes X, Y joystick Nunchuck

The codes are available here:
 http://code.google.com/p/my-arduino-projects/downloads/list

 Parts of the code are adapted from the following codes:
 Nunchuck management: http://www.windmeadow.com/node/42
 Touch Screen management: Mick Roberts: Beginning Arduino (from Apress)
 Debounce management: http://www.arduino.cc/en/Tutorial/Debounce

 PID management: http://www.arduino.cc/playground/Code/PIDLibrary
 The Labview code was adapted from code found here: http://web.me.com/iklln6/automation/LabVIEW.html

-----------------------------------------------------------------------------------------------------------------------
-----------------------------------------------------------------------------------------------------------------------
Régulation d'un ventilateur avec un arduino, un nunchuk, une DS touch screen et un PID:
 
J'ai créé une petite application avec un Arduino qui calcule et régule (avec ou sans PID) la vitesse de rotation d'un ventilateur à partir de trois objets:
1 - un nunchuck de Nintendo ou
2 - un écran de DS de Nintendo ou
3  - un capteur de température TMP36

Un capteur d'inclinaison permet de couper l'alimentation du ventilateur si une inclinaison est détectée, une led rouge s'allume alors et attend l'intervention de l'utilisateur. 
Cette application pourrait par exemple servir à réguler la température dans une enceinte.

La vitesse du ventilateur est calculée grâce à des interruptions interprétées par l'Arduino et générées par l'intermédiaire d'un optocoupleur placé face au ventilateur. Remarque: le programme marcherait tout aussi bien avec un capteur à effet Hall, mais j'ai abandonné cette solution car mon aimant était trop puissant et arrêtait mon ventilateur ;-).
Une librairie PID de l'Arduino permet de réguler la vitesse de rotation du moteur en fonction d'une vitesse de consigne obtenue à l'aide d'une abaque vitesse_consigne = f(température). 



1 - L'écran de DS permet de:
- sélectionner les différentes vitesses de rotation en appuyant sur les touches de 0 à 9, soit de minimum = 0 à maximum = 2100 rpm (avec une pile de 9V).
- passer en mode commande ou régulation PID en température en appuyant sur la touche C
- la touche E arrête la rotation du ventilateur

2 - Le mode Nunchuk s'active en appuyant constamment sur Z, l'accélération X fait alors varier la vitesse du ventilateur, pour des valeurs comprises entre la vitesse 1 à 9.

En mode "stand alone", c'est à dire sans brancher le RBBB sur le port USB du PC, j'ai placé une LED RGB qui affiche une couleur fonction de la vitesse de rotation du ventilateur: e.g. Rouge pour la première vitesse, et Verte pour la neuvième vitesse. Si la température dépasse 25°C, la vitesse du ventilateur est mise à son maximum et la diode bleu s'allume.


Le programme embarqué dans l'arduino sort les informations des différents capteurs.
Vous pouvez avoir un exemple d'aperçu de ce que sort le sketch en regardant le champ "Raw Output":
T=19.82|rpm=840|(X,Y)=1006, 1007|RGBLED=285, -30, 0|acc=175, 124, 161|but=1,1|joy=125,128

2ème partie:
J'ai alors créé un programme LabView qui formate ce qui sort du port série et permet de soit:
- lire ces informations si "Read" est activé,
- soit écrire sur le port série pour prendre la main du ventilateur si "Write" est activé.


Avec l'exemple ci-dessus: 
T=19.82|rpm=840|(X,Y)=1006, 1007|RGBLED=285, -30, 0|acc=175, 124, 161|but=1,1|joy=125,128

T: temperature
rpm: vitesse du ventilateur
(X,Y): coordonnées de l'écran de DS
RGBLED: valeurs d'intensité de la pin PWM pour la led Rouge, Vert, Bleu respectivement
acc: valeurs d'accélération des trois axes X, Y, Z du Nunchuck
but: états du bouton Z et C respectivement du Nunchuck (1: appuyé, 0: relaché)
joy: valeurs des deux axes X, Y du joystick du Nunchuck


Les codes sont disponibles ici:
http://code.google.com/p/my-arduino-projects/downloads/list

Les parties du code sont adaptées des codes suivants:
Gestion du Nunchuck: http://www.windmeadow.com/node/42
Gestion du Touch Screen:  Mickael Roberts: Beginning Arduino (from Apress)
Gestion du debounce:  http://www.arduino.cc/en/Tutorial/Debounce
Gestion du PID: http://www.arduino.cc/playground/Code/PIDLibrary
Le code Labview a été adapté du code trouvé ici: http://web.me.com/iklln6/automation/LabVIEW.html

1 commentaire:

  1. Dear Jérémie,

    thank you for this amazing tutorial!
    I've tried to access the website you posted: http://web.me.com/iklln6/automation/LabVIEW.html but unfortunately there is nothing there. I've tried to contact the owner of the storage but with no results. Could you please send me this Labview code from this site? BTW During my master's thesis I'm trying to connect ca.10 Arduinos over RS485 to Labview.

    Cheers!
    Matt
    PS. Nice Bossa Nova Songs on your Y-channel!

    RépondreSupprimer