A very simple demo program that makes the 4 leds on the board change their brightness using PWMs, in a semi random way.
main.cpp@0:3b13b6c5de1f, 2009-11-25 (annotated)
- Committer:
- Fiuba
- Date:
- Wed Nov 25 23:18:51 2009 +0000
- Revision:
- 0:3b13b6c5de1f
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
Fiuba | 0:3b13b6c5de1f | 1 | /* Codigo de ejemplo para probar los PWMs, Tickers, Timer... |
Fiuba | 0:3b13b6c5de1f | 2 | * La idea es prender los leds en forma "random" y que los leds cambien su intensidad |
Fiuba | 0:3b13b6c5de1f | 3 | * cambiando el duty del PWM que se les manda, simulando "estrellas". |
Fiuba | 0:3b13b6c5de1f | 4 | * El comportamiento random lo sacamos del valor de un timer al momento de la lectura. Probamos usar el ADC, |
Fiuba | 0:3b13b6c5de1f | 5 | * no logramos que varie. |
Fiuba | 0:3b13b6c5de1f | 6 | * El codigo tiene muchos valores "magicos" que salen de probar cosas para que el efecto "quede lindo". |
Fiuba | 0:3b13b6c5de1f | 7 | * Copiright Joaquin de Andres, Lucas Chiesa under the GNU GPL Version 2 or later. |
Fiuba | 0:3b13b6c5de1f | 8 | */ |
Fiuba | 0:3b13b6c5de1f | 9 | |
Fiuba | 0:3b13b6c5de1f | 10 | #include "mbed.h" |
Fiuba | 0:3b13b6c5de1f | 11 | |
Fiuba | 0:3b13b6c5de1f | 12 | // Cramos un tipo para guardar el estado actual de cada led. |
Fiuba | 0:3b13b6c5de1f | 13 | // NOTA: APAGADO ahora no apaga los leds, sino que les baja el brillo mucho mas rapido porque sino quedaba feo. |
Fiuba | 0:3b13b6c5de1f | 14 | typedef enum {SUBIENDO, BAJANDO, APAGADO} led_status; |
Fiuba | 0:3b13b6c5de1f | 15 | |
Fiuba | 0:3b13b6c5de1f | 16 | // Creamos los PWMs que vamos a usar para alimentar los LEDs. |
Fiuba | 0:3b13b6c5de1f | 17 | PwmOut led1(LED1); |
Fiuba | 0:3b13b6c5de1f | 18 | PwmOut led2(LED2); |
Fiuba | 0:3b13b6c5de1f | 19 | PwmOut led3(LED3); |
Fiuba | 0:3b13b6c5de1f | 20 | PwmOut led4(LED4); |
Fiuba | 0:3b13b6c5de1f | 21 | |
Fiuba | 0:3b13b6c5de1f | 22 | // Creamos un timer. |
Fiuba | 0:3b13b6c5de1f | 23 | Timer t; |
Fiuba | 0:3b13b6c5de1f | 24 | |
Fiuba | 0:3b13b6c5de1f | 25 | // Creamos 4 tickers, cada uno puede tener 1 solo callback. |
Fiuba | 0:3b13b6c5de1f | 26 | Ticker tick1; |
Fiuba | 0:3b13b6c5de1f | 27 | Ticker tick2; |
Fiuba | 0:3b13b6c5de1f | 28 | Ticker tick3; |
Fiuba | 0:3b13b6c5de1f | 29 | Ticker tick4; |
Fiuba | 0:3b13b6c5de1f | 30 | |
Fiuba | 0:3b13b6c5de1f | 31 | led_status led1_status = SUBIENDO; |
Fiuba | 0:3b13b6c5de1f | 32 | led_status led2_status = BAJANDO; |
Fiuba | 0:3b13b6c5de1f | 33 | led_status led3_status = SUBIENDO; |
Fiuba | 0:3b13b6c5de1f | 34 | led_status led4_status = BAJANDO; |
Fiuba | 0:3b13b6c5de1f | 35 | |
Fiuba | 0:3b13b6c5de1f | 36 | // Handlers para cambiar el PWM de cada led. Como se les pueden pasar argumentos, creamos una para cada uno. |
Fiuba | 0:3b13b6c5de1f | 37 | // Supongo que se podria ver alguna forma de reutilizar el codigo. |
Fiuba | 0:3b13b6c5de1f | 38 | void led1_tick() { |
Fiuba | 0:3b13b6c5de1f | 39 | switch (led1_status) { |
Fiuba | 0:3b13b6c5de1f | 40 | case SUBIENDO: |
Fiuba | 0:3b13b6c5de1f | 41 | led1 = (led1 < 1)? (led1 + 0.001) : led1; |
Fiuba | 0:3b13b6c5de1f | 42 | break; |
Fiuba | 0:3b13b6c5de1f | 43 | case BAJANDO: |
Fiuba | 0:3b13b6c5de1f | 44 | led1 = (led1 > 0.003)? (led1 - 0.003) : led1; |
Fiuba | 0:3b13b6c5de1f | 45 | break; |
Fiuba | 0:3b13b6c5de1f | 46 | case APAGADO: |
Fiuba | 0:3b13b6c5de1f | 47 | led1 = (led1 >= 0.01)? (led1 - 0.01) : led1; |
Fiuba | 0:3b13b6c5de1f | 48 | } |
Fiuba | 0:3b13b6c5de1f | 49 | } |
Fiuba | 0:3b13b6c5de1f | 50 | |
Fiuba | 0:3b13b6c5de1f | 51 | void led2_tick() { |
Fiuba | 0:3b13b6c5de1f | 52 | switch (led2_status) { |
Fiuba | 0:3b13b6c5de1f | 53 | case SUBIENDO: |
Fiuba | 0:3b13b6c5de1f | 54 | led2 = (led2 < 1)? (led2 + 0.002) : led2; |
Fiuba | 0:3b13b6c5de1f | 55 | break; |
Fiuba | 0:3b13b6c5de1f | 56 | case BAJANDO: |
Fiuba | 0:3b13b6c5de1f | 57 | led2 = (led2 > 0.001)? (led2 - 0.001) : led2; |
Fiuba | 0:3b13b6c5de1f | 58 | break; |
Fiuba | 0:3b13b6c5de1f | 59 | case APAGADO: |
Fiuba | 0:3b13b6c5de1f | 60 | led2 = (led2 >= 0.01)? (led2 - 0.01) : led2; |
Fiuba | 0:3b13b6c5de1f | 61 | } |
Fiuba | 0:3b13b6c5de1f | 62 | } |
Fiuba | 0:3b13b6c5de1f | 63 | |
Fiuba | 0:3b13b6c5de1f | 64 | void led3_tick() { |
Fiuba | 0:3b13b6c5de1f | 65 | switch (led3_status) { |
Fiuba | 0:3b13b6c5de1f | 66 | case SUBIENDO: |
Fiuba | 0:3b13b6c5de1f | 67 | led3 = (led3 < 1)? (led3 + 0.003) : led3; |
Fiuba | 0:3b13b6c5de1f | 68 | break; |
Fiuba | 0:3b13b6c5de1f | 69 | case BAJANDO: |
Fiuba | 0:3b13b6c5de1f | 70 | led3 = (led3 > 0.004)? (led3 - 0.004) : led3; |
Fiuba | 0:3b13b6c5de1f | 71 | break; |
Fiuba | 0:3b13b6c5de1f | 72 | case APAGADO: |
Fiuba | 0:3b13b6c5de1f | 73 | led3 = (led3 >= 0.01)? (led3 - 0.01) : led3; |
Fiuba | 0:3b13b6c5de1f | 74 | } |
Fiuba | 0:3b13b6c5de1f | 75 | } |
Fiuba | 0:3b13b6c5de1f | 76 | |
Fiuba | 0:3b13b6c5de1f | 77 | void led4_tick() { |
Fiuba | 0:3b13b6c5de1f | 78 | switch (led4_status) { |
Fiuba | 0:3b13b6c5de1f | 79 | case SUBIENDO: |
Fiuba | 0:3b13b6c5de1f | 80 | led4 = (led4 < 1)? (led4 + 0.001) : led4; |
Fiuba | 0:3b13b6c5de1f | 81 | break; |
Fiuba | 0:3b13b6c5de1f | 82 | case BAJANDO: |
Fiuba | 0:3b13b6c5de1f | 83 | led4 = (led4 > 0.001)? (led4 - 0.001) : led4; |
Fiuba | 0:3b13b6c5de1f | 84 | break; |
Fiuba | 0:3b13b6c5de1f | 85 | case APAGADO: |
Fiuba | 0:3b13b6c5de1f | 86 | led4 = (led4 >= 0.01)? (led4 - 0.01) : led4; |
Fiuba | 0:3b13b6c5de1f | 87 | } |
Fiuba | 0:3b13b6c5de1f | 88 | } |
Fiuba | 0:3b13b6c5de1f | 89 | |
Fiuba | 0:3b13b6c5de1f | 90 | // Esta funcion devuelve un estado segun la variable aux que se le pasa. |
Fiuba | 0:3b13b6c5de1f | 91 | led_status set_status (int aux) { |
Fiuba | 0:3b13b6c5de1f | 92 | if (aux == 0 ) { |
Fiuba | 0:3b13b6c5de1f | 93 | return SUBIENDO; |
Fiuba | 0:3b13b6c5de1f | 94 | } else if (aux == 1) { |
Fiuba | 0:3b13b6c5de1f | 95 | return BAJANDO; |
Fiuba | 0:3b13b6c5de1f | 96 | } else { |
Fiuba | 0:3b13b6c5de1f | 97 | return APAGADO; |
Fiuba | 0:3b13b6c5de1f | 98 | } |
Fiuba | 0:3b13b6c5de1f | 99 | } |
Fiuba | 0:3b13b6c5de1f | 100 | |
Fiuba | 0:3b13b6c5de1f | 101 | int main() { |
Fiuba | 0:3b13b6c5de1f | 102 | // Condiciones iniciales distintas para cada led. |
Fiuba | 0:3b13b6c5de1f | 103 | led1 = 0; |
Fiuba | 0:3b13b6c5de1f | 104 | led2 = 0.5; |
Fiuba | 0:3b13b6c5de1f | 105 | led3 = 0.6; |
Fiuba | 0:3b13b6c5de1f | 106 | led4 = 1; |
Fiuba | 0:3b13b6c5de1f | 107 | |
Fiuba | 0:3b13b6c5de1f | 108 | int aux; |
Fiuba | 0:3b13b6c5de1f | 109 | |
Fiuba | 0:3b13b6c5de1f | 110 | // Hacemos que cada led cambie a distinta frecuencia, y sin que sean multiplos. |
Fiuba | 0:3b13b6c5de1f | 111 | tick1.attach(&led1_tick, 0.002); |
Fiuba | 0:3b13b6c5de1f | 112 | tick2.attach(&led2_tick, 0.005); |
Fiuba | 0:3b13b6c5de1f | 113 | tick3.attach(&led3_tick, 0.003); |
Fiuba | 0:3b13b6c5de1f | 114 | tick4.attach(&led4_tick, 0.001); |
Fiuba | 0:3b13b6c5de1f | 115 | |
Fiuba | 0:3b13b6c5de1f | 116 | // No hay que olvidarse de iniciar el timer para que esto ande!! |
Fiuba | 0:3b13b6c5de1f | 117 | t.start(); |
Fiuba | 0:3b13b6c5de1f | 118 | wait(0.2); |
Fiuba | 0:3b13b6c5de1f | 119 | |
Fiuba | 0:3b13b6c5de1f | 120 | while (1) { |
Fiuba | 0:3b13b6c5de1f | 121 | // Para cada led, leemos el valor del timer (en distintas unidades), |
Fiuba | 0:3b13b6c5de1f | 122 | // le hacemos modulo 3, y eso lo usamos como valor "random" para cambiar el estado de los leds. |
Fiuba | 0:3b13b6c5de1f | 123 | |
Fiuba | 0:3b13b6c5de1f | 124 | aux = t.read_us(); |
Fiuba | 0:3b13b6c5de1f | 125 | aux = aux % 3; |
Fiuba | 0:3b13b6c5de1f | 126 | led1_status = set_status(aux); |
Fiuba | 0:3b13b6c5de1f | 127 | wait(0.001); |
Fiuba | 0:3b13b6c5de1f | 128 | |
Fiuba | 0:3b13b6c5de1f | 129 | aux = t.read_us(); |
Fiuba | 0:3b13b6c5de1f | 130 | aux = aux % 3; |
Fiuba | 0:3b13b6c5de1f | 131 | led2_status = set_status(aux); |
Fiuba | 0:3b13b6c5de1f | 132 | wait(0.002); |
Fiuba | 0:3b13b6c5de1f | 133 | |
Fiuba | 0:3b13b6c5de1f | 134 | aux = t.read_us(); |
Fiuba | 0:3b13b6c5de1f | 135 | aux = aux % 3; |
Fiuba | 0:3b13b6c5de1f | 136 | led3_status = set_status(aux); |
Fiuba | 0:3b13b6c5de1f | 137 | wait(0.005); |
Fiuba | 0:3b13b6c5de1f | 138 | |
Fiuba | 0:3b13b6c5de1f | 139 | aux = t.read_us()-0.5; |
Fiuba | 0:3b13b6c5de1f | 140 | aux = aux % 3; |
Fiuba | 0:3b13b6c5de1f | 141 | led4_status = set_status(aux); |
Fiuba | 0:3b13b6c5de1f | 142 | |
Fiuba | 0:3b13b6c5de1f | 143 | wait(1); |
Fiuba | 0:3b13b6c5de1f | 144 | } |
Fiuba | 0:3b13b6c5de1f | 145 | } |