Practical Robotics Modular Robot Library

Dependents:   ModularRobot

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?

UserRevisionLine numberNew 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 */