Practical Robotics Modular Robot Library
led.cpp@0:8a2dd255c508, 2016-11-26 (annotated)
- Committer:
- jah128
- Date:
- Sat Nov 26 17:28:53 2016 +0000
- Revision:
- 0:8a2dd255c508
- Child:
- 1:a6728adaf7e7
Initial commit
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
jah128 | 0:8a2dd255c508 | 1 | #include "robot.h" |
jah128 | 0:8a2dd255c508 | 2 | |
jah128 | 0:8a2dd255c508 | 3 | // The LED driver is quite powerful in terms of how it can be used (LEDs can be grouped, have individual and group PWM control, can be blinked etc). |
jah128 | 0:8a2dd255c508 | 4 | // |
jah128 | 0:8a2dd255c508 | 5 | // To keep things relatively simple, in this version of the code, we will not use the groups or blinking functions, and will have all LEDs enabled. |
jah128 | 0:8a2dd255c508 | 6 | // |
jah128 | 0:8a2dd255c508 | 7 | // Their state is controlled solely by each LEDs PWM control - which is a 1 byte value between 0 (fully off) and 255 (fully on) |
jah128 | 0:8a2dd255c508 | 8 | |
jah128 | 0:8a2dd255c508 | 9 | char red_led_states [8]; |
jah128 | 0:8a2dd255c508 | 10 | char green_led_states [8]; |
jah128 | 0:8a2dd255c508 | 11 | |
jah128 | 0:8a2dd255c508 | 12 | |
jah128 | 0:8a2dd255c508 | 13 | |
jah128 | 0:8a2dd255c508 | 14 | void Led::set_green_led (char led, char brightness) |
jah128 | 0:8a2dd255c508 | 15 | { |
jah128 | 0:8a2dd255c508 | 16 | if(led < 8) { |
jah128 | 0:8a2dd255c508 | 17 | green_led_states [led] = brightness; |
jah128 | 0:8a2dd255c508 | 18 | char data[2]; |
jah128 | 0:8a2dd255c508 | 19 | data[0] = 3 + led + led; |
jah128 | 0:8a2dd255c508 | 20 | data[1] = brightness; |
jah128 | 0:8a2dd255c508 | 21 | if(i2c_lock==0){ |
jah128 | 0:8a2dd255c508 | 22 | i2c_lock = 1; |
jah128 | 0:8a2dd255c508 | 23 | primary_i2c.write(LED_ADDRESS,data,2); |
jah128 | 0:8a2dd255c508 | 24 | }i2c_lock = 0; |
jah128 | 0:8a2dd255c508 | 25 | } |
jah128 | 0:8a2dd255c508 | 26 | } |
jah128 | 0:8a2dd255c508 | 27 | |
jah128 | 0:8a2dd255c508 | 28 | void Led::set_red_led (char led, char brightness) |
jah128 | 0:8a2dd255c508 | 29 | { |
jah128 | 0:8a2dd255c508 | 30 | |
jah128 | 0:8a2dd255c508 | 31 | if(led < 8) { |
jah128 | 0:8a2dd255c508 | 32 | red_led_states [led] = brightness; |
jah128 | 0:8a2dd255c508 | 33 | char data[2]; |
jah128 | 0:8a2dd255c508 | 34 | data[0] = 2 + led + led; |
jah128 | 0:8a2dd255c508 | 35 | data[1] = brightness; |
jah128 | 0:8a2dd255c508 | 36 | if(i2c_lock==0){ |
jah128 | 0:8a2dd255c508 | 37 | i2c_lock = 1; |
jah128 | 0:8a2dd255c508 | 38 | primary_i2c.write(LED_ADDRESS,data,2); |
jah128 | 0:8a2dd255c508 | 39 | }i2c_lock = 0; |
jah128 | 0:8a2dd255c508 | 40 | } |
jah128 | 0:8a2dd255c508 | 41 | } |
jah128 | 0:8a2dd255c508 | 42 | |
jah128 | 0:8a2dd255c508 | 43 | int Led::reset_led_driver() |
jah128 | 0:8a2dd255c508 | 44 | { |
jah128 | 0:8a2dd255c508 | 45 | // The TLC59116 has a software reset option over i2c: |
jah128 | 0:8a2dd255c508 | 46 | // The bytes A5h, 5Ah are sent to special address D6h |
jah128 | 0:8a2dd255c508 | 47 | char data[2]; |
jah128 | 0:8a2dd255c508 | 48 | data[0] = 0xA5; |
jah128 | 0:8a2dd255c508 | 49 | data[1] = 0x5A; |
jah128 | 0:8a2dd255c508 | 50 | return primary_i2c.write(0xD6,data,2); |
jah128 | 0:8a2dd255c508 | 51 | } |
jah128 | 0:8a2dd255c508 | 52 | |
jah128 | 0:8a2dd255c508 | 53 | int Led::init_led_driver() |
jah128 | 0:8a2dd255c508 | 54 | { |
jah128 | 0:8a2dd255c508 | 55 | // This code enables the LED outputs so all LEDs are on, and are set to work on individual PWM control |
jah128 | 0:8a2dd255c508 | 56 | // |
jah128 | 0:8a2dd255c508 | 57 | // First we write 0x80 to the Mode 1 register (0x00) to enable the oscillator and register auto-increment |
jah128 | 0:8a2dd255c508 | 58 | char data[2]; |
jah128 | 0:8a2dd255c508 | 59 | data[0]=0x00; |
jah128 | 0:8a2dd255c508 | 60 | data[1]=0x80; |
jah128 | 0:8a2dd255c508 | 61 | int okay = primary_i2c.write(LED_ADDRESS,data,2,false); |
jah128 | 0:8a2dd255c508 | 62 | if(okay == 0) { |
jah128 | 0:8a2dd255c508 | 63 | // Now we turn all the LEDs the enable on PWM control |
jah128 | 0:8a2dd255c508 | 64 | data[0]=0x14; |
jah128 | 0:8a2dd255c508 | 65 | data[1]=0xAA; |
jah128 | 0:8a2dd255c508 | 66 | primary_i2c.write(LED_ADDRESS,data,2,false); |
jah128 | 0:8a2dd255c508 | 67 | data[0]=0x15; |
jah128 | 0:8a2dd255c508 | 68 | data[1]=0xAA; |
jah128 | 0:8a2dd255c508 | 69 | primary_i2c.write(LED_ADDRESS,data,2,false); |
jah128 | 0:8a2dd255c508 | 70 | data[0]=0x16; |
jah128 | 0:8a2dd255c508 | 71 | data[1]=0xAA; |
jah128 | 0:8a2dd255c508 | 72 | primary_i2c.write(LED_ADDRESS,data,2,false); |
jah128 | 0:8a2dd255c508 | 73 | data[0]=0x17; |
jah128 | 0:8a2dd255c508 | 74 | data[1]=0xAA; |
jah128 | 0:8a2dd255c508 | 75 | primary_i2c.write(LED_ADDRESS,data,2,false); |
jah128 | 0:8a2dd255c508 | 76 | } |
jah128 | 0:8a2dd255c508 | 77 | return okay; |
jah128 | 0:8a2dd255c508 | 78 | } |
jah128 | 0:8a2dd255c508 | 79 | |
jah128 | 0:8a2dd255c508 | 80 | int led_ticker_sub_state = 0; |
jah128 | 0:8a2dd255c508 | 81 | char led_ticker_state = 0; |
jah128 | 0:8a2dd255c508 | 82 | char increment = 1; |
jah128 | 0:8a2dd255c508 | 83 | Ticker led_ticker; |
jah128 | 0:8a2dd255c508 | 84 | |
jah128 | 0:8a2dd255c508 | 85 | void Led::start_test() |
jah128 | 0:8a2dd255c508 | 86 | { |
jah128 | 0:8a2dd255c508 | 87 | led_ticker.attach(this,&Led::test_ticker_routine,0.02); |
jah128 | 0:8a2dd255c508 | 88 | } |
jah128 | 0:8a2dd255c508 | 89 | |
jah128 | 0:8a2dd255c508 | 90 | void Led::test_ticker_routine() |
jah128 | 0:8a2dd255c508 | 91 | { |
jah128 | 0:8a2dd255c508 | 92 | led_ticker_sub_state += increment; |
jah128 | 0:8a2dd255c508 | 93 | increment += 1; |
jah128 | 0:8a2dd255c508 | 94 | if(led_ticker_sub_state > 250) { |
jah128 | 0:8a2dd255c508 | 95 | led_ticker_sub_state = 0; |
jah128 | 0:8a2dd255c508 | 96 | led_ticker_state ++; |
jah128 | 0:8a2dd255c508 | 97 | increment = 1; |
jah128 | 0:8a2dd255c508 | 98 | if (led_ticker_state == 24) led_ticker_state = 0; |
jah128 | 0:8a2dd255c508 | 99 | } |
jah128 | 0:8a2dd255c508 | 100 | char working_led = led_ticker_state % 8; |
jah128 | 0:8a2dd255c508 | 101 | |
jah128 | 0:8a2dd255c508 | 102 | if(led_ticker_state < 8 || led_ticker_state > 15) set_green_led(working_led, led_ticker_sub_state ); |
jah128 | 0:8a2dd255c508 | 103 | else set_green_led(working_led, 0); |
jah128 | 0:8a2dd255c508 | 104 | if(led_ticker_state > 7) set_red_led(working_led, led_ticker_sub_state ); |
jah128 | 0:8a2dd255c508 | 105 | else set_red_led(working_led, 0); |
jah128 | 0:8a2dd255c508 | 106 | if(led_ticker_sub_state == 0) { |
jah128 | 0:8a2dd255c508 | 107 | |
jah128 | 0:8a2dd255c508 | 108 | } |
jah128 | 0:8a2dd255c508 | 109 | } |
jah128 | 0:8a2dd255c508 | 110 | |
jah128 | 0:8a2dd255c508 | 111 | /* |
jah128 | 0:8a2dd255c508 | 112 | |
jah128 | 0:8a2dd255c508 | 113 | //Setup the LED driver [TLC59116]; address is 1100 000 (0xC0) {defined by LED_ADDRESS} |
jah128 | 0:8a2dd255c508 | 114 | //Enable the output oscillator in mode 1 register (00h) |
jah128 | 0:8a2dd255c508 | 115 | |
jah128 | 0:8a2dd255c508 | 116 | char ret_data[32]; |
jah128 | 0:8a2dd255c508 | 117 | for(int i=0;i<31;i++){ |
jah128 | 0:8a2dd255c508 | 118 | data[0]=i; |
jah128 | 0:8a2dd255c508 | 119 | primary_i2c.write(LED_ADDRESS,data,1,false); |
jah128 | 0:8a2dd255c508 | 120 | primary_i2c.read(LED_ADDRESS,ret_data+i,1); |
jah128 | 0:8a2dd255c508 | 121 | } |
jah128 | 0:8a2dd255c508 | 122 | for(int i=0;i<31;i++){ |
jah128 | 0:8a2dd255c508 | 123 | pc.printf("Register %X : %X\n",i,ret_data[i]); |
jah128 | 0:8a2dd255c508 | 124 | } |
jah128 | 0:8a2dd255c508 | 125 | |
jah128 | 0:8a2dd255c508 | 126 | wait(2); |
jah128 | 0:8a2dd255c508 | 127 | data[0]=0x00; |
jah128 | 0:8a2dd255c508 | 128 | data[1]=0x00; |
jah128 | 0:8a2dd255c508 | 129 | primary_i2c.write(LED_ADDRESS,data,2,false); |
jah128 | 0:8a2dd255c508 | 130 | |
jah128 | 0:8a2dd255c508 | 131 | wait(0.05); |
jah128 | 0:8a2dd255c508 | 132 | data[0]=0x14; |
jah128 | 0:8a2dd255c508 | 133 | data[1]=0x55; |
jah128 | 0:8a2dd255c508 | 134 | primary_i2c.write(LED_ADDRESS,data,2,false); |
jah128 | 0:8a2dd255c508 | 135 | wait(0.05); |
jah128 | 0:8a2dd255c508 | 136 | data[0]=0x15; |
jah128 | 0:8a2dd255c508 | 137 | data[1]=0x66; |
jah128 | 0:8a2dd255c508 | 138 | primary_i2c.write(LED_ADDRESS,data,2,false); |
jah128 | 0:8a2dd255c508 | 139 | wait(0.05); |
jah128 | 0:8a2dd255c508 | 140 | data[0]=0x16; |
jah128 | 0:8a2dd255c508 | 141 | data[1]=0x66; |
jah128 | 0:8a2dd255c508 | 142 | primary_i2c.write(LED_ADDRESS,data,2,false); |
jah128 | 0:8a2dd255c508 | 143 | wait(0.05); |
jah128 | 0:8a2dd255c508 | 144 | data[0]=0x17; |
jah128 | 0:8a2dd255c508 | 145 | data[1]=0x55; |
jah128 | 0:8a2dd255c508 | 146 | primary_i2c.write(LED_ADDRESS,data,2,false); |
jah128 | 0:8a2dd255c508 | 147 | |
jah128 | 0:8a2dd255c508 | 148 | for(int i=0;i<31;i++){ |
jah128 | 0:8a2dd255c508 | 149 | data[0]=i; |
jah128 | 0:8a2dd255c508 | 150 | primary_i2c.write(LED_ADDRESS,data,1,false); |
jah128 | 0:8a2dd255c508 | 151 | primary_i2c.read(LED_ADDRESS,ret_data+i,1); |
jah128 | 0:8a2dd255c508 | 152 | } |
jah128 | 0:8a2dd255c508 | 153 | for(int i=0;i<31;i++){ |
jah128 | 0:8a2dd255c508 | 154 | pc.printf("Register %X : %X\n",i,ret_data[i]); |
jah128 | 0:8a2dd255c508 | 155 | } |
jah128 | 0:8a2dd255c508 | 156 | |
jah128 | 0:8a2dd255c508 | 157 | */ |