Practical Robotics Modular Robot Library
led.cpp
- Committer:
- jah128
- Date:
- 2016-11-26
- Revision:
- 0:8a2dd255c508
- Child:
- 1:a6728adaf7e7
File content as of revision 0:8a2dd255c508:
#include "robot.h" // 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). // // 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. // // Their state is controlled solely by each LEDs PWM control - which is a 1 byte value between 0 (fully off) and 255 (fully on) char red_led_states [8]; char green_led_states [8]; void Led::set_green_led (char led, char brightness) { if(led < 8) { green_led_states [led] = brightness; char data[2]; data[0] = 3 + led + led; data[1] = brightness; if(i2c_lock==0){ i2c_lock = 1; primary_i2c.write(LED_ADDRESS,data,2); }i2c_lock = 0; } } void Led::set_red_led (char led, char brightness) { if(led < 8) { red_led_states [led] = brightness; char data[2]; data[0] = 2 + led + led; data[1] = brightness; if(i2c_lock==0){ i2c_lock = 1; primary_i2c.write(LED_ADDRESS,data,2); }i2c_lock = 0; } } int Led::reset_led_driver() { // The TLC59116 has a software reset option over i2c: // The bytes A5h, 5Ah are sent to special address D6h char data[2]; data[0] = 0xA5; data[1] = 0x5A; return primary_i2c.write(0xD6,data,2); } int Led::init_led_driver() { // This code enables the LED outputs so all LEDs are on, and are set to work on individual PWM control // // First we write 0x80 to the Mode 1 register (0x00) to enable the oscillator and register auto-increment char data[2]; data[0]=0x00; data[1]=0x80; int okay = primary_i2c.write(LED_ADDRESS,data,2,false); if(okay == 0) { // Now we turn all the LEDs the enable on PWM control data[0]=0x14; data[1]=0xAA; primary_i2c.write(LED_ADDRESS,data,2,false); data[0]=0x15; data[1]=0xAA; primary_i2c.write(LED_ADDRESS,data,2,false); data[0]=0x16; data[1]=0xAA; primary_i2c.write(LED_ADDRESS,data,2,false); data[0]=0x17; data[1]=0xAA; primary_i2c.write(LED_ADDRESS,data,2,false); } return okay; } int led_ticker_sub_state = 0; char led_ticker_state = 0; char increment = 1; Ticker led_ticker; void Led::start_test() { led_ticker.attach(this,&Led::test_ticker_routine,0.02); } void Led::test_ticker_routine() { led_ticker_sub_state += increment; increment += 1; if(led_ticker_sub_state > 250) { led_ticker_sub_state = 0; led_ticker_state ++; increment = 1; if (led_ticker_state == 24) led_ticker_state = 0; } char working_led = led_ticker_state % 8; if(led_ticker_state < 8 || led_ticker_state > 15) set_green_led(working_led, led_ticker_sub_state ); else set_green_led(working_led, 0); if(led_ticker_state > 7) set_red_led(working_led, led_ticker_sub_state ); else set_red_led(working_led, 0); if(led_ticker_sub_state == 0) { } } /* //Setup the LED driver [TLC59116]; address is 1100 000 (0xC0) {defined by LED_ADDRESS} //Enable the output oscillator in mode 1 register (00h) char ret_data[32]; for(int i=0;i<31;i++){ data[0]=i; primary_i2c.write(LED_ADDRESS,data,1,false); primary_i2c.read(LED_ADDRESS,ret_data+i,1); } for(int i=0;i<31;i++){ pc.printf("Register %X : %X\n",i,ret_data[i]); } wait(2); data[0]=0x00; data[1]=0x00; primary_i2c.write(LED_ADDRESS,data,2,false); wait(0.05); data[0]=0x14; data[1]=0x55; primary_i2c.write(LED_ADDRESS,data,2,false); wait(0.05); data[0]=0x15; data[1]=0x66; primary_i2c.write(LED_ADDRESS,data,2,false); wait(0.05); data[0]=0x16; data[1]=0x66; primary_i2c.write(LED_ADDRESS,data,2,false); wait(0.05); data[0]=0x17; data[1]=0x55; primary_i2c.write(LED_ADDRESS,data,2,false); for(int i=0;i<31;i++){ data[0]=i; primary_i2c.write(LED_ADDRESS,data,1,false); primary_i2c.read(LED_ADDRESS,ret_data+i,1); } for(int i=0;i<31;i++){ pc.printf("Register %X : %X\n",i,ret_data[i]); } */