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