en este laboratorio se controlan 8 LEDs desde arduino atraves de un IC 74Hc595 definiendo mínimo 8 patrones de movimiento que son controlados desde una interfaz gráfica en processing/controlIp5.
materiales
- placa arduino +cable de comunicacion +pc con ide arduino y processing
- 8 LEDs + 8 resistencias 1kohm + protoboard
- jumper varios
- 1 Ic 74HC595
diagrama en fritzing
montaje de componentes
codigo arduino
// pin que envia los datos al 74HC595
int data_pin = 9;
// pin que conecta el latch
int latch_pin = 10;
// pin que conecta el reloj
int clock_pin = 11;
// Guardamos el valor lo que recibimos via serial
int valor, val;
char letr;
//primera secuencia : arreglo de dos en dos.
int ledS1[4] = {3, 12, 48, 192};
//segunda secuencia : arreglo de uno en uno
int ledS2[8] = {1, 2, 4, 8, 16, 32, 64, 128};
//segunda secuencia : arreglo de uno en uno
int ledS3[8] = {1, 4, 2, 8, 16, 64, 32, 128};
//segunda secuencia : arreglo de uno en uno
int ledS4[2] = {255, 0};
//segunda secuencia : arreglo de un leds de los extremos al medio
int ledS5[12] = {1,128,2,64,4,32,8,16,4,32,2,64};
//tercera secuencia
int ledS6[22] = {1,4,2,8,4,16,8,32,16,64,32,128,32,64,16,32,8,16,4,8,2,4};
//cuarta secuencia
int ledS7[12] = {1,16,2,32,4,64,8,128,4,64,2,32};
//cuarta secuencia
int ledS8[14] = {1,2,4,8,16,32,64,128,64,32,16,8,4,2};
void setup() {
// La comunicacion serial sera a 9600 baudios
Serial.begin(9600);
// establecer pines a la salida para que pueda controlar el 74HC595
pinMode(data_pin, OUTPUT);
pinMode(latch_pin, OUTPUT);
pinMode(clock_pin, OUTPUT);
}
void loop() {
// send data only when you receive data:
if (Serial.available() > 0) {
letr = Serial.read();
val = Serial.parseInt();
Serial.print(letr);
Serial.println(val);
}
// toma el latch_pin en bajo (LOW), para que los LEDs no cambien, mientras
// se envian los datos (en bits).
digitalWrite(latch_pin, LOW);
// cambiar los bits ej. 0000 0001 0002 0003...
shiftOut(data_pin, clock_pin, MSBFIRST, val);
//toma el latch_pin en alto (HIGH), para que los LEDs se iliminen
digitalWrite(latch_pin, HIGH);
// se hace una pausa antes del siguiente valor
//delay(500);
if (val == 1) { //Si es 1 inicie funcion de secuencia1
secuencia1();
}
if (val == 2) { //Si es 2 inicie funcion de secuencia2
secuencia2();
}
if (val == 3) { //Si es 3 inicie funcion de secuencia3
secuencia3();
}
if (val == 4) { //Si es 4 inicie funcion de secuencia4
secuencia4();
}
if (val == 5) { //Si es 5 inicie funcion de secuencia5
secuencia5();
}
if (val == 6) { //Si es 6 inicie funcion de secuencia7
secuencia6();
}
if (val == 7) { //Si es 7 inicie funcion de secuencia7
secuencia7();
}
if (val == 8) { //Si es 4 inicie funcion de secuencia8
secuencia8();
}
}
void secuencia1() {
//recorre el arreglo donde se difinio la secuencia
for (int i = 0; i < 4; i++) {
// toma el latch_pin en bajo (LOW), para que los LEDs no cambien, mientras
// se envian los datos (en bits).
digitalWrite(latch_pin, LOW);
// cambiar los bits ej. 0000 0001 0002 0003...
shiftOut(data_pin, clock_pin, MSBFIRST, ledS1[i]);
//toma el latch_pin en alto (HIGH), para que los LEDs se iliminen
digitalWrite(latch_pin, HIGH);
// se hace una pausa antes del siguiente valor
delay(200);
}
}
void secuencia2() {
//recorre el arreglo donde se difinio la secuencia
for (int i = 0; i < 8; i++) {
// toma el latch_pin en bajo (LOW), para que los LEDs no cambien, mientras
// se envian los datos (en bits).
digitalWrite(latch_pin, LOW);
// cambiar los bits ej. 0000 0001 0002 0003...
shiftOut(data_pin, clock_pin, MSBFIRST, ledS2[i]);
//toma el latch_pin en alto (HIGH), para que los LEDs se iliminen
digitalWrite(latch_pin, HIGH);
// se hace una pausa antes del siguiente valor
delay(200);
}
}
void secuencia3() {
//recorre el arreglo donde se difinio la secuencia
for (int i = 0; i < 8; i++) {
// toma el latch_pin en bajo (LOW), para que los LEDs no cambien, mientras
// se envian los datos (en bits).
digitalWrite(latch_pin, LOW);
// cambiar los bits ej. 0000 0001 0002 0003...
shiftOut(data_pin, clock_pin, MSBFIRST, ledS3[i]);
//toma el latch_pin en alto (HIGH), para que los LEDs se iliminen
digitalWrite(latch_pin, HIGH);
// se hace una pausa antes del siguiente valor
delay(200);
}
}
void secuencia4() {
//recorre el arreglo donde se difinio la secuencia
for (int i = 0; i < 2; i++) {
// toma el latch_pin en bajo (LOW), para que los LEDs no cambien, mientras
// se envian los datos (en bits).
digitalWrite(latch_pin, LOW);
// cambiar los bits ej. 0000 0001 0002 0003...
shiftOut(data_pin, clock_pin, MSBFIRST, ledS4[i]);
//toma el latch_pin en alto (HIGH), para que los LEDs se iliminen
digitalWrite(latch_pin, HIGH);
// se hace una pausa antes del siguiente valor
delay(200);
}
}
void secuencia5() {
//recorre el arreglo donde se difinio la secuencia
for (int i = 0; i < 12; i++) {
// toma el latch_pin en bajo (LOW), para que los LEDs no cambien, mientras
// se envian los datos (en bits).
digitalWrite(latch_pin, LOW);
// cambiar los bits ej. 0000 0001 0002 0003...
shiftOut(data_pin, clock_pin, MSBFIRST, ledS5[i]);
//toma el latch_pin en alto (HIGH), para que los LEDs se iliminen
digitalWrite(latch_pin, HIGH);
// se hace una pausa antes del siguiente valor
delay(200);
}
}
void secuencia6() {
//recorre el arreglo donde se difinio la secuencia
for (int i = 0; i < 22; i++) {
// toma el latch_pin en bajo (LOW), para que los LEDs no cambien, mientras
// se envian los datos (en bits).
digitalWrite(latch_pin, LOW);
// cambiar los bits ej. 0000 0001 0002 0003...
shiftOut(data_pin, clock_pin, MSBFIRST, ledS6[i]);
//toma el latch_pin en alto (HIGH), para que los LEDs se iliminen
digitalWrite(latch_pin, HIGH);
// se hace una pausa antes del siguiente valor
delay(200);
}
}
void secuencia7() {
//recorre el arreglo donde se difinio la secuencia
for (int i = 0; i < 12; i++) {
// toma el latch_pin en bajo (LOW), para que los LEDs no cambien, mientras
// se envian los datos (en bits).
digitalWrite(latch_pin, LOW);
// cambiar los bits ej. 0000 0001 0002 0003...
shiftOut(data_pin, clock_pin, MSBFIRST, ledS7[i]);
//toma el latch_pin en alto (HIGH), para que los LEDs se iliminen
digitalWrite(latch_pin, HIGH);
// se hace una pausa antes del siguiente valor
delay(200);
}
}
void secuencia8() {
//recorre el arreglo donde se difinio la secuencia
for (int i = 0; i < 14; i++) {
// toma el latch_pin en bajo (LOW), para que los LEDs no cambien, mientras
// se envian los datos (en bits).
digitalWrite(latch_pin, LOW);
// cambiar los bits ej. 0000 0001 0002 0003...
shiftOut(data_pin, clock_pin, MSBFIRST, ledS8[i]);
//toma el latch_pin en alto (HIGH), para que los LEDs se iliminen
digitalWrite(latch_pin, HIGH);
// se hace una pausa antes del siguiente valor
delay(200);
}
}
codigo de processing
import controlP5.*;
import processing.serial.*;
ControlP5 cp5;
int colorDeFondo = color (215, 215, 215);
int val; // Data received from the serial port
RadioButton radioButton;
Serial serial; // definir la variable serial del tipo Serial
int lf = 10; // ASCII linefeed
void setup() {
size(400, 300);
noStroke();
// Print a list of the serial ports, for debugging purposes:
println("Puertos usados:");
printArray(Serial.list());
cp5 = new ControlP5(this);
radioButton = cp5.addRadioButton("radioButton")
.setPosition(20, 50)
.setSize(40, 20)
.setColorForeground(color(120))
.setColorActive(color(255))
.setColorLabel(color(0))
.setItemsPerRow(4)
.setSpacingColumn(50)
.setSpacingRow(20)
.addItem("Patron 1", 1)
.addItem("Patron 2", 2)
.addItem("Patron 3", 3)
.addItem("Patron 4", 4)
.addItem("Patron 5", 5)
.addItem("Patron 6", 6)
.addItem("Patron 7", 7)
.addItem("Patron 8", 8)
;
for (Toggle t : radioButton.getItems ()) {
//t.captionLabel().setColorBackground(color(255,80));
t.captionLabel().style().moveMargin(-7, 0, 0, -3);
t.captionLabel().style().movePadding(7, 0, 0, 3);
t.captionLabel().style().backgroundWidth = 45;
t.captionLabel().style().backgroundHeight = 13;
}
/*
cp5.addButton("Enviar")
.setPosition(100, 320)
.setSize(80,40)
;
*/
serial = new Serial(this, Serial.list()[0], 9600);
serial.bufferUntil(lf);
}
void draw() {
background(colorDeFondo);
}
//Majejando los radioButtons con el teclado
void keyPressed() {
switch(key) {
case('0'):
radioButton.deactivateAll();
break;
case('1'):
radioButton.activate(0);
break;
case('2'):
radioButton.activate(1);
break;
case('3'):
radioButton.activate(2);
break;
case('4'):
radioButton.activate(3);
break;
case('5'):
radioButton.activate(4);
break;
case('6'):
radioButton.activate(5);
break;
case('7'):
radioButton.activate(6);
break;
case('8'):
radioButton.activate(7);
break;
}
}
void controlEvent(ControlEvent evento) {
if (evento.isFrom(radioButton)) {
int total = 0;
total = (int)evento.getValue();
println("\nValor a ser enviado por Serial = " + total);
//serial.write(total+"");
serial.write("P"+total);
}
//println(serial.readString());
}
video
No hay comentarios.:
Publicar un comentario