bipedalRobot_leg_i2c-spitter_Slave-Knee.ino (6598B)
1 #include <Arduino.h> 2 #include <Wire.h> 3 4 #define I2C_SLAVE_ADDR_0 0x60 5 #define I2C_SLAVE_ADDR_1 0x61 6 #define I2C_SLAVE_ADDR_2 0x61 7 #define I2C_SLAVE_ADDR_3 0x62 8 #define I2C_SLAVE_ADDR_4 0x62 9 #define I2C_SLAVE_ADDR_5 0x63 10 #define I2C_SLAVE_ADDR_6 0x63 11 #define I2C_SLAVE_ADDR_7 0x61 12 #define I2C_SLAVE_ADDR_8 0x61 13 #define I2C_SLAVE_ADDR_9 0x62 14 #define I2C_SLAVE_ADDR_10 0x62 15 16 //const int sclPin = D1; 17 //const int sdaPin = D2; 18 19 const unsigned int MAX_MESSAGE_LENGTH = 125; 20 21 int currentSpeed = 10; 22 int currentAmps = 1000; 23 float currentAngle = 0; 24 25 float current_kp = 6.00; 26 float current_ki = 5.00; 27 float current_kd = 0.01; 28 29 bool containsSemicolon = false; 30 bool requestFlagOn = false; 31 byte requestedAddress; 32 33 char readWire[8]; 34 35 void setup() 36 { 37 Serial.begin(115200); 38 Serial.setTimeout(10); 39 40 Wire.setClock(400000); 41 Wire.begin(); 42 //Wire.begin(sdaPin, sclPin); 43 } 44 45 void sendMessage(char message[], int message_pos) { 46 //Add null character to string 47 char *messageTrimmed = &message[1]; 48 bool useLocal = false; 49 int msgStart = 0; 50 51 if (message[0] == '0') { 52 Wire.beginTransmission(I2C_SLAVE_ADDR_0); 53 useLocal = true; 54 requestedAddress = I2C_SLAVE_ADDR_0; 55 } else if (message[0] == '1') { 56 Wire.beginTransmission(I2C_SLAVE_ADDR_1); 57 useLocal = true; 58 requestedAddress = I2C_SLAVE_ADDR_1; 59 } else if (message[0] == '2') { 60 Wire.beginTransmission(I2C_SLAVE_ADDR_2); 61 useLocal = true; 62 requestedAddress = I2C_SLAVE_ADDR_2; 63 } else if (message[0] == '3') { 64 Wire.beginTransmission(I2C_SLAVE_ADDR_3); 65 useLocal = true; 66 requestedAddress = I2C_SLAVE_ADDR_3; 67 } else if (message[0] == '4') { 68 Wire.beginTransmission(I2C_SLAVE_ADDR_4); 69 useLocal = true; 70 requestedAddress = I2C_SLAVE_ADDR_4; 71 } else if (message[0] == '5') { 72 Wire.beginTransmission(I2C_SLAVE_ADDR_5); 73 useLocal = true; 74 requestedAddress = I2C_SLAVE_ADDR_5; 75 } else if (message[0] == '6') { 76 Wire.beginTransmission(I2C_SLAVE_ADDR_6); 77 useLocal = true; 78 requestedAddress = I2C_SLAVE_ADDR_6; 79 } else if (message[0] == '7') { 80 Wire.beginTransmission(I2C_SLAVE_ADDR_7); 81 useLocal = true; 82 requestedAddress = I2C_SLAVE_ADDR_7; 83 } else if (message[0] == '8') { 84 Wire.beginTransmission(I2C_SLAVE_ADDR_8); 85 useLocal = true; 86 requestedAddress = I2C_SLAVE_ADDR_8; 87 } else if (message[0] == '9') { 88 Wire.beginTransmission(I2C_SLAVE_ADDR_9); 89 useLocal = true; 90 requestedAddress = I2C_SLAVE_ADDR_9; 91 } else if (message[0] == 'a') { 92 Wire.beginTransmission(I2C_SLAVE_ADDR_10); 93 useLocal = true; 94 requestedAddress = I2C_SLAVE_ADDR_10; 95 } 96 97 if (useLocal == true){ 98 msgStart = 1; 99 } 100 101 for (msgStart; msgStart < message_pos; msgStart++){ 102 Wire.write(message[msgStart]); 103 if (message[msgStart] == '@') { requestFlagOn = true; } 104 } 105 106 Wire.endTransmission(); 107 108 //Print the message (or do other things) 109 if (messageTrimmed[0] == 'm') { 110 messageTrimmed[0] = '0'; 111 112 if (messageTrimmed[1] == '-') { 113 messageTrimmed[1] = '0'; 114 float newAngle = atof(messageTrimmed); 115 currentAngle = -newAngle; 116 } else { 117 currentAngle = atof(messageTrimmed); 118 } 119 //Serial.print("New angle: "); 120 //Serial.println(currentAngle); 121 } 122 else if (messageTrimmed[0] == 's') { 123 messageTrimmed[0] = '0'; 124 int newSpeed = atoi(messageTrimmed); 125 currentSpeed = newSpeed; 126 //Serial.print("New speed: "); 127 //Serial.println(currentSpeed); 128 } 129 else if (messageTrimmed[0] == 'c') { 130 messageTrimmed[0] = '0'; 131 if (atoi(messageTrimmed) <= 1200) { 132 int newAmps = atoi(messageTrimmed); 133 currentAmps = newAmps; 134 //Serial.print("New current: "); 135 //Serial.println(currentAmps); 136 } else { 137 //Serial.println("Current too high!"); 138 } 139 } 140 141 // PID tuning on the fly 142 else if (messageTrimmed[0] == 'p') { 143 messageTrimmed[0] = '0'; 144 float new_kp = atof(messageTrimmed); 145 current_kp = new_kp; 146 //Serial.print("New kP: "); 147 //Serial.println(current_kp); 148 } 149 else if (messageTrimmed[0] == 'i') { 150 messageTrimmed[0] = '0'; 151 float new_ki = atof(messageTrimmed); 152 current_ki = new_ki; 153 //Serial.print("New kI: "); 154 //Serial.println(current_ki); 155 } 156 else if (messageTrimmed[0] == 'd') { 157 messageTrimmed[0] = '0'; 158 float new_kd = atof(messageTrimmed); 159 current_kd = new_kd; 160 //Serial.print("New kD: "); 161 //Serial.println(current_kd); 162 } 163 } 164 165 void loop() { 166 if (requestFlagOn == true){ 167 delay(10); 168 Wire.requestFrom(requestedAddress, 6, true); // request 8 bytes from selected slave device 169 170 int wireIndex = 0; 171 while(Wire.available()) // slave may send less than requested 172 { 173 readWire[wireIndex] = Wire.read(); // receive a byte as character 174 wireIndex++; 175 } 176 177 readWire[wireIndex] = '\0'; // assume it is a string, add zero-terminator 178 //Serial.print("Requested value: "); 179 Serial.println(readWire); 180 requestFlagOn = false; 181 } else { 182 //Check to see if anything is available in the serial receive buffer 183 while (Serial.available() > 0) 184 { 185 //Create a place to hold the incoming message 186 static char message[MAX_MESSAGE_LENGTH]; 187 static unsigned int message_pos = 0; 188 189 //Read the next available byte in the serial receive buffer 190 char inByte = Serial.read(); 191 192 //Message coming in (check not terminating character) and guard for over message size 193 if ( inByte != '\n' && (message_pos < MAX_MESSAGE_LENGTH - 1) ) 194 { 195 //Add the incoming byte to our message 196 message[message_pos] = inByte; 197 if (message[message_pos] == ';'){ 198 containsSemicolon = true; 199 } 200 message_pos++; 201 } 202 //Full message received... 203 else 204 { 205 message[message_pos] = '\0'; 206 if (containsSemicolon == true){ 207 char *moveStrings[6]; // an array of pointers to the pieces of the above array after strtok() 208 char *ptr = NULL; 209 int moveIndex = 0; 210 211 ptr = strtok(message, ";"); // delimiter 212 while (ptr != NULL) { 213 moveStrings[moveIndex] = ptr; 214 moveIndex++; 215 ptr = strtok(NULL, ";"); 216 } 217 int i; 218 for (i = 0; i < moveIndex; i++) { 219 int thisLength = strlen(moveStrings[i]) + 1; 220 sendMessage(moveStrings[i], thisLength); 221 } 222 }else{ 223 sendMessage(message, message_pos); 224 } 225 //Reset for the next message 226 message_pos = 0; 227 containsSemicolon = false; 228 } 229 } 230 } 231 }