LEER REVOLUCIONES DC BRUSHLESS (ventilador PC) CON ARDUINO
DESCRIPCION:
Es un ventilador de PC llamado Brushless Fan donde por medio del programa Arduino uno, podemos ejecutar el codigo que lee las revoluciones en el ventilador.
import processing.serial.*;
int x=550;
int y=550;//el punto centro de la pantalla
int grados=0;//inicio de grados en el que se encuentra el triangulo
Serial port;//puerto por el que vamos a recibir los datos
int valor = 0;
//int valor2=550;
void setup()
{
//println(Serial.list());
port = new Serial(this, Serial.list()[0], 9600);
//new Serial(this, COM[5], 9600);
size(1000,600);//tamaño de la ventana
frameRate(100);// especifica el numero de fotogramas que muestra por segundo
smooth();//suavizar
fill(25,90,40);//color del triangulo ROJO
}
void draw ()
{
while (port.available() > 0)
{
String cadena =»00″+port.readString(); //Lectura de datos desde arduino
valor = int(cadena.substring(2,cadena.length()));
println(cadena + «:» + valor);
}
background (30,30,30);//color de fondo
pushMatrix();//entrada a la pila de matriz
translate(x, y);//trasladamos el triagulo en pantalla con respecto a su estado
rotate(radians(grados));//rotamos el triangulo el numero de grados indicado
triangle(0, 40, -40, -40, 40, -40);//pintar el triangulo
popMatrix();//restaura la pila de matriz
//Condiciones que dependen del los valores recibidos desde arduino (movimientos de joystick)
if (valor == 1)
{
valor=0;
y-=10;
if (y<10) y=30;
}
if (valor == 2)
{
valor=0;
y+=10;
if (y>400) y=400;
}
if (valor == 3)
{
valor=0;
x+=10;
if (x>400) x=400;
}
if (valor == 4)
{
valor=0;
x-=10;
if (x<10) x=30;
}
if (valor == 5)
{
valor=0;
grados+=5;
if (grados>360) grados=0;
}
if (valor == 6)
{
valor=0;
grados-=5;
if (grados<0) grados=360;
}
En este octavo laboratorio se realizara el control de leds por medio de un microcontrolador (ARDUINO) y la interfaz grafica de processing para controlar cada el encendido y apagado de cada led por individual.
LISTA DE ELEMENTOS
Los elementos a usar para este laboratorio son los siguientes:
8 — resistencias de 330 ohmios
1 — integrado IC74HC595
1 — plataforma arduino uno R3
1 — protoboard
8 — leds 5mm
Cable (conexiones)
DIAGRAMA Y ESQUEMA
MONTAJE
CODIGO ARDUINO
// Se definen la cantidad de pines que vamos a usar como PIN
#define PIN 3
// Se le dan nombres a los pines (7-9) del arduino
// que van a ser usados por el integrado respectivamente
// además el pin SH_CP osea Clock debe ser PWM(~)
const int Latch = 8;
const int Clock = 9;
const int Data = 7;
int Pins[PIN] = {
7,8,9};
// Inicializamos las variables que vamos a utilizar
int Lect = 0;
boolean OnLed = false;
int Dato = 0;
int i = 0;
int Led[]={1,2,4,8,16,32,64,128};
// Ciclo para activar los tres pines como salida
void setup() {
for (int j=0; j<PIN; j++){
pinMode(Pins[j], OUTPUT);
}
//Comunicación serial a 9600bps
Serial.begin(9600);
}
// Recibe la información de manera serial del processing
void loop()
{
if (Serial.available()>0) {
Lect = Serial.read(); //Leemos el Dato
//Se ingresa cuando OnLed es verdadero
//osea cuando algun Led esta en On «1»
if (OnLed)
{
Suma(Lect);
On(Dato);
OnLed = false;
}
else
{
//Se recibe la info si el Led esta On u Off «1» o «0»
i = Lect;
OnLed = true;
}
}
}
// Le va adicionando o sustraendo al Dato el valor del
// Led encendido o apagado
void Suma(int estadoLED){
if(estadoLED==0)
{
Dato = Dato-Led[i];
}else{
Dato = Dato+Led[i];
}
}
// Función para enviar los datos al Integrado IC 74HC595
// y se usa shiftOut para que el valor se lea en los ocho Leds
void On(int Valor)
{
digitalWrite(Latch, LOW);
shiftOut(Data, Clock, MSBFIRST, Valor);
digitalWrite(Latch, HIGH);
}
CODIGO PROCESSING
// Se utiliza las librerias ControlP5 y Serial del Processing
import controlP5.*;
import processing.serial.*;
// Se define la variable cP5 del tipo ControlP5
ControlP5 cP5;
// Se le da nombres al Serial
Serial serial;
int[] led = new int[] {
0, 0, 0, 0, 0, 0, 0, 0
};
// Configuración inicial
void setup() {
size(720, 290); //Tamaño de la ventana
noStroke();
cP5 = new ControlP5(this); //Crea el objeto ControlP5
// Crea el Knob del color Rojo
for (int i=0; i<led.length; i++)
{
cP5.addToggle(«led»+i, 35+i*70, 140, 30, 30)
.setMode(ControlP5.SWITCH);
}
String puerto = Serial.list()[0];
//Comunicación serial a 9600bps
serial = new Serial(this, puerto, 9600);
}
// Cada uno de los circuilos hecho toma el color determinado
// del Led que se tiene en la protoboard
void draw() {
background(0xFF555555);
fill(led[0] == 0 ? 0xFF222222 : color(255, 0,255 ));
ellipse(50, 100, 50, 50);
for (int i=1; i<4; i++) {
fill(led[i] == 0 ? 0xFF111111 : color(230,100, 50));
ellipse(50+i*70, 100, 50, 50);
}
for (int i=4; i<led.length; i++) {
fill(led[i] == 0 ? 0xFF111111 : color(120, 255, 10));
ellipse(50+i*70, 100, 50, 50);
}
fill(255);
textFont(createFont(«Gill Sans Ultra Bold», 60));
text(«Activa un Led», 60, 50);
fill(255);
textSize(30);
text(«ALEX FERNANDO GALLEGO «,50, 250);
}
// Como se va a actuar cuando ocurra un evento con los botones
void controlEvent(ControlEvent evento) {
String nombre = evento.getController().getName();
int valor = int(evento.getController().getValue());
// Guarda el valor de cada boton
for (int i=0; i<led.length; i++) {
if (nombre.equals(«led»+i)) {
led[i] = valor;
serial.write(i);
serial.write(valor);
println(«evento: » + i + » / valor: «+valor);
}
}
}
En este laboratorio se realizara el control de 8 leds por medio de un integrado IC 74HC595, el cual recibe los datos en forma serial y su salida es en forma paralela (8 bits).
Para esta practica, el procedimiento es crear 8 secuencias diferentes y por medio de un potenciometro ir graduando la secuencia a elegir. Gracias a la comunicación serial del arduino, este se puede comunicar de manera serial con el integrado por medio de 3 pines los cuales son:
pinLatch = 2;
pinReloj = 3;
pinDato = 4;
Este integrado tiene muchas aplicaciones, funciona como un multiplexor logrando así manejar muchos mas leds con varios de estos.
LISTA DE ELEMENTOS
Los materiales a usar para este laboratorio son los siguientes:
8 — resistencias de 330 ohmios
8 — leds 5mm
1 — potenciometro 10kohmios
1 — plataforma arduino uno R3
1 — integrado IC 74HC595
1 — protoboard
Cable (conexiones)
DIAGRAMA Y ESQUEMA
MONTAJE
CODIGO
// Se definen la cantidad de pines que vamos a usar como PIN
// y la entrada analoga A0 como la que se va a usar por el
// potenciómetro
#define PIN 3
#define Pot A0
// Se le dan nombres a los pines (7-9) del arduino
// que van a ser usados por el integrado respectivamente
// además el pin SH_CP osea Clock debe ser PWM(~)
const int Latch = 8;
const int Clock = 9;
const int Data = 7;
int led[PIN] = {
7,8,9};
// Ocho secuencias
int Serie1[7]={
129,66,36,24,24,36,66};
int Serie2[9]={
0,128,192,224,240,248,252,254,255};
int Serie3[12]={
255,126,60,24,16,8,16,8,24,60,126,255};
int Serie4[2]={
240,15};
int Serie5[14]={
129,0,131,133,137,145,161,0,193,161,145,137,133,131};
int Serie6[2]={
195,60};
int Serie7[11]={
1,0,1,0,15,0,15,0,255,255,0};
int Serie8[50]={
1,2,4,8,16,32,64,128,64,32,16,8,4,2,1,2,4,8,16,32,64,128,192,160,144,136,132,130,129,131,133,137,145,161,193,225,209,201,197,195,199,203,211,227,243,235,231,239,255,0};
// Ciclo para activar los tres pines como salida
// y el pin A0 como entrada
void setup() {
for (int i=0; i<PIN; i++){
pinMode(led[i], OUTPUT);
}
pinMode(Pot, INPUT);
}
// Recibe la info de la posición del potenciómetro
void loop()
{
int Pos = analogRead(Pot);
Pos = map(Pos, 0, 1023, 0,7);
Casos(Pos);
}
// Según la posición del potenciómetro escoge un caso
void Casos(int Valor)
{
switch(Valor)
{
case 0:
for(int j=0;j<7;j++)
{
On(Serie1[j]);
}
break;
case 1:
for(int j=0;j<9;j++)
{
On(Serie2[j]);
}
break;
case 2:
for(int j=0;j<12;j++)
{
On(Serie3[j]);
}
break;
case 3:
for(int j=0;j<2;j++)
{
On(Serie4[j]);
}
break;
case 4:
for(int j=0;j<14;j++)
{
On(Serie5[j]);
}
break;
case 5:
for(int j=0;j<2;j++)
{
On(Serie6[j]);
}
break;
case 6:
for(int j=0;j<11;j++)
{
On(Serie7[j]);
}
break;
case 7:
for(int j=0;j<50;j++)
{
On(Serie8[j]);
}
break;
}
}
// Función para enviar los datos al Integrado IC 74HC595
void On(int Valor)
{
digitalWrite(Latch, LOW);
shiftOut(Data, Clock, MSBFIRST, Valor);
digitalWrite(Latch, HIGH);
delay(100);
}
En el laboratorio 6 el objetivo es controlar un LED RGB desde el Arduino, vía PWM con una interfaz gráfica en Processing/ControlP5 para controlar el valor de cada color.
Para el tercer laboratorio se busca controlar el tiempo de cada led que se demora en encender y apagar, de tal forma que se se muevan de izquierda a derecha,usando los valores analógicos de dos Potenciómetros para controlar los tiempos en que el LED permanece encendido y apagado.
MATERIALES:
8— resistencias de 220 ohmios
1 — plataforma arduino uno R3
1 — protoboard
8 — leds
2 — potenciómetros
DIAGRAMA Y ESQUEMA
PROCESO MONTAJE
CODIGO
#define MAXLED 8 #define pot A0
int led[MAXLED] = {2,3,4,5,6,7,8,9};
void setup() { for (int i = 0; i < MAXLED; i++) { pinMode(led[i], OUTPUT) ; } }
void loop() { int valor = analogRead(pot); int i = map(valor, 0, 1000, 0, 9); prender(i,500); apagar(i, 100); }
void prender(int l, int t){ digitalWrite(l, HIGH); delay(t); }
void apagar(int l, int t){ digitalWrite(l, LOW); delay(t); }
En el laboratorio 4 el objetivo es controlar 8 LEDs desde el Arduino, un LED encendido que se mueve en forma continua de izquierda a derecha, vía una interfaz gráfica en Processing/ControlP5 para controlar el tiempo de encendido y el tiempo de apagado.
LISTA DE ELEMENTOS UTILIZADOS:
a- El computador
b- Software “Processing”
c- Software “fritzing”
d- Hardware Arduino UNO
e- 8 Leds
f- 8 Resistencias
g- Protoboard
h- Alambre para protoboard
DIAGRAMA Y ESQUEMA
PROCESO MONTAJE
CODIGO EN ARDUINO
#define MAXLED 8
int led[MAXLED] = {
2,3,4,5,6,7,8,9};
int marca = 0;
int prendido = 200;
int apagado = 100;
int i=0;
void setup()
{
Serial.begin(9600);
for(int i = 0; i < MAXLED ; i++)
{
pinMode(led[i], OUTPUT);
}
}
Este montaje es exactamente igual al de los 8 LEDs, pero añadiendo un potenciómetro. Este ejercicio consiste en controlar 8 LEDs encendidos que se muevan de izquierda a derecha según la posición del potencimetro.
MATERIALES:
8— resistencias de 220 ohmios 1 — plataforma arduino uno R3 1 — protoboard 8 — leds 1 — potenciómetro