Practical Robotics Modular Robot Library
led.cpp@1:a6728adaf7e7, 2016-11-26 (annotated)
- Committer:
- jah128
- Date:
- Sat Nov 26 21:43:52 2016 +0000
- Revision:
- 1:a6728adaf7e7
- Parent:
- 0:8a2dd255c508
- Child:
- 3:8762f6b2ea8d
Added docs, debug
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 | void Led::set_green_led (char led, char brightness) |
jah128 | 0:8a2dd255c508 | 13 | { |
jah128 | 0:8a2dd255c508 | 14 | if(led < 8) { |
jah128 | 0:8a2dd255c508 | 15 | green_led_states [led] = brightness; |
jah128 | 0:8a2dd255c508 | 16 | char data[2]; |
jah128 | 0:8a2dd255c508 | 17 | data[0] = 3 + led + led; |
jah128 | 0:8a2dd255c508 | 18 | data[1] = brightness; |
jah128 | 0:8a2dd255c508 | 19 | if(i2c_lock==0){ |
jah128 | 0:8a2dd255c508 | 20 | i2c_lock = 1; |
jah128 | 0:8a2dd255c508 | 21 | primary_i2c.write(LED_ADDRESS,data,2); |
jah128 | 0:8a2dd255c508 | 22 | }i2c_lock = 0; |
jah128 | 0:8a2dd255c508 | 23 | } |
jah128 | 0:8a2dd255c508 | 24 | } |
jah128 | 0:8a2dd255c508 | 25 | |
jah128 | 0:8a2dd255c508 | 26 | void Led::set_red_led (char led, char brightness) |
jah128 | 0:8a2dd255c508 | 27 | { |
jah128 | 0:8a2dd255c508 | 28 | |
jah128 | 0:8a2dd255c508 | 29 | if(led < 8) { |
jah128 | 0:8a2dd255c508 | 30 | red_led_states [led] = brightness; |
jah128 | 0:8a2dd255c508 | 31 | char data[2]; |
jah128 | 0:8a2dd255c508 | 32 | data[0] = 2 + led + led; |
jah128 | 0:8a2dd255c508 | 33 | data[1] = brightness; |
jah128 | 0:8a2dd255c508 | 34 | if(i2c_lock==0){ |
jah128 | 0:8a2dd255c508 | 35 | i2c_lock = 1; |
jah128 | 0:8a2dd255c508 | 36 | primary_i2c.write(LED_ADDRESS,data,2); |
jah128 | 0:8a2dd255c508 | 37 | }i2c_lock = 0; |
jah128 | 0:8a2dd255c508 | 38 | } |
jah128 | 0:8a2dd255c508 | 39 | } |
jah128 | 0:8a2dd255c508 | 40 | |
jah128 | 0:8a2dd255c508 | 41 | int Led::reset_led_driver() |
jah128 | 0:8a2dd255c508 | 42 | { |
jah128 | 0:8a2dd255c508 | 43 | // The TLC59116 has a software reset option over i2c: |
jah128 | 0:8a2dd255c508 | 44 | // The bytes A5h, 5Ah are sent to special address D6h |
jah128 | 0:8a2dd255c508 | 45 | char data[2]; |
jah128 | 0:8a2dd255c508 | 46 | data[0] = 0xA5; |
jah128 | 0:8a2dd255c508 | 47 | data[1] = 0x5A; |
jah128 | 0:8a2dd255c508 | 48 | return primary_i2c.write(0xD6,data,2); |
jah128 | 0:8a2dd255c508 | 49 | } |
jah128 | 0:8a2dd255c508 | 50 | |
jah128 | 0:8a2dd255c508 | 51 | int Led::init_led_driver() |
jah128 | 0:8a2dd255c508 | 52 | { |
jah128 | 0:8a2dd255c508 | 53 | // This code enables the LED outputs so all LEDs are on, and are set to work on individual PWM control |
jah128 | 0:8a2dd255c508 | 54 | // |
jah128 | 0:8a2dd255c508 | 55 | // First we write 0x80 to the Mode 1 register (0x00) to enable the oscillator and register auto-increment |
jah128 | 0:8a2dd255c508 | 56 | char data[2]; |
jah128 | 0:8a2dd255c508 | 57 | data[0]=0x00; |
jah128 | 0:8a2dd255c508 | 58 | data[1]=0x80; |
jah128 | 0:8a2dd255c508 | 59 | int okay = primary_i2c.write(LED_ADDRESS,data,2,false); |
jah128 | 0:8a2dd255c508 | 60 | if(okay == 0) { |
jah128 | 0:8a2dd255c508 | 61 | // Now we turn all the LEDs the enable on PWM control |
jah128 | 0:8a2dd255c508 | 62 | data[0]=0x14; |
jah128 | 0:8a2dd255c508 | 63 | data[1]=0xAA; |
jah128 | 0:8a2dd255c508 | 64 | primary_i2c.write(LED_ADDRESS,data,2,false); |
jah128 | 0:8a2dd255c508 | 65 | data[0]=0x15; |
jah128 | 0:8a2dd255c508 | 66 | data[1]=0xAA; |
jah128 | 0:8a2dd255c508 | 67 | primary_i2c.write(LED_ADDRESS,data,2,false); |
jah128 | 0:8a2dd255c508 | 68 | data[0]=0x16; |
jah128 | 0:8a2dd255c508 | 69 | data[1]=0xAA; |
jah128 | 0:8a2dd255c508 | 70 | primary_i2c.write(LED_ADDRESS,data,2,false); |
jah128 | 0:8a2dd255c508 | 71 | data[0]=0x17; |
jah128 | 0:8a2dd255c508 | 72 | data[1]=0xAA; |
jah128 | 0:8a2dd255c508 | 73 | primary_i2c.write(LED_ADDRESS,data,2,false); |
jah128 | 0:8a2dd255c508 | 74 | } |
jah128 | 0:8a2dd255c508 | 75 | return okay; |
jah128 | 0:8a2dd255c508 | 76 | } |
jah128 | 0:8a2dd255c508 | 77 | |
jah128 | 0:8a2dd255c508 | 78 | int led_ticker_sub_state = 0; |
jah128 | 0:8a2dd255c508 | 79 | char led_ticker_state = 0; |
jah128 | 0:8a2dd255c508 | 80 | char increment = 1; |
jah128 | 0:8a2dd255c508 | 81 | Ticker led_ticker; |
jah128 | 0:8a2dd255c508 | 82 | |
jah128 | 0:8a2dd255c508 | 83 | void Led::start_test() |
jah128 | 0:8a2dd255c508 | 84 | { |
jah128 | 0:8a2dd255c508 | 85 | led_ticker.attach(this,&Led::test_ticker_routine,0.02); |
jah128 | 0:8a2dd255c508 | 86 | } |
jah128 | 0:8a2dd255c508 | 87 | |
jah128 | 0:8a2dd255c508 | 88 | void Led::test_ticker_routine() |
jah128 | 0:8a2dd255c508 | 89 | { |
jah128 | 0:8a2dd255c508 | 90 | led_ticker_sub_state += increment; |
jah128 | 0:8a2dd255c508 | 91 | increment += 1; |
jah128 | 0:8a2dd255c508 | 92 | if(led_ticker_sub_state > 250) { |
jah128 | 0:8a2dd255c508 | 93 | led_ticker_sub_state = 0; |
jah128 | 0:8a2dd255c508 | 94 | led_ticker_state ++; |
jah128 | 0:8a2dd255c508 | 95 | increment = 1; |
jah128 | 0:8a2dd255c508 | 96 | if (led_ticker_state == 24) led_ticker_state = 0; |
jah128 | 0:8a2dd255c508 | 97 | } |
jah128 | 0:8a2dd255c508 | 98 | char working_led = led_ticker_state % 8; |
jah128 | 0:8a2dd255c508 | 99 | |
jah128 | 0:8a2dd255c508 | 100 | if(led_ticker_state < 8 || led_ticker_state > 15) set_green_led(working_led, led_ticker_sub_state ); |
jah128 | 0:8a2dd255c508 | 101 | else set_green_led(working_led, 0); |
jah128 | 0:8a2dd255c508 | 102 | if(led_ticker_state > 7) set_red_led(working_led, led_ticker_sub_state ); |
jah128 | 0:8a2dd255c508 | 103 | else set_red_led(working_led, 0); |
jah128 | 0:8a2dd255c508 | 104 | if(led_ticker_sub_state == 0) { |
jah128 | 0:8a2dd255c508 | 105 | |
jah128 | 0:8a2dd255c508 | 106 | } |
jah128 | 0:8a2dd255c508 | 107 | } |