bipedalRobot_leg_i2c-spitter_Slave-Thigh.ino (6498B)
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 0x64 12 #define I2C_SLAVE_ADDR_8 0x64 13 #define I2C_SLAVE_ADDR_9 0x64 14 #define I2C_SLAVE_ADDR_10 0x64 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 requestedAddress = I2C_SLAVE_ADDR_7; 82 } else if (message[0] == '8') { 83 Wire.beginTransmission(I2C_SLAVE_ADDR_8); 84 requestedAddress = I2C_SLAVE_ADDR_8; 85 } else if (message[0] == '9') { 86 Wire.beginTransmission(I2C_SLAVE_ADDR_9); 87 requestedAddress = I2C_SLAVE_ADDR_9; 88 } else if (message[0] == 'a') { 89 Wire.beginTransmission(I2C_SLAVE_ADDR_10); 90 requestedAddress = I2C_SLAVE_ADDR_10; 91 } 92 93 if (useLocal == true){ 94 msgStart = 1; 95 } 96 97 for (msgStart; msgStart < message_pos; msgStart++){ 98 Wire.write(message[msgStart]); 99 if (message[msgStart] == '@') { requestFlagOn = true; } 100 } 101 102 Wire.endTransmission(); 103 104 //Print the message (or do other things) 105 if (messageTrimmed[0] == 'm') { 106 messageTrimmed[0] = '0'; 107 108 if (messageTrimmed[1] == '-') { 109 messageTrimmed[1] = '0'; 110 float newAngle = atof(messageTrimmed); 111 currentAngle = -newAngle; 112 } else { 113 currentAngle = atof(messageTrimmed); 114 } 115 //Serial.print("New angle: "); 116 //Serial.println(currentAngle); 117 } 118 else if (messageTrimmed[0] == 's') { 119 messageTrimmed[0] = '0'; 120 int newSpeed = atoi(messageTrimmed); 121 currentSpeed = newSpeed; 122 //Serial.print("New speed: "); 123 //Serial.println(currentSpeed); 124 } 125 else if (messageTrimmed[0] == 'c') { 126 messageTrimmed[0] = '0'; 127 if (atoi(messageTrimmed) <= 1200) { 128 int newAmps = atoi(messageTrimmed); 129 currentAmps = newAmps; 130 //Serial.print("New current: "); 131 //Serial.println(currentAmps); 132 } else { 133 //Serial.println("Current too high!"); 134 } 135 } 136 137 // PID tuning on the fly 138 else if (messageTrimmed[0] == 'p') { 139 messageTrimmed[0] = '0'; 140 float new_kp = atof(messageTrimmed); 141 current_kp = new_kp; 142 //Serial.print("New kP: "); 143 //Serial.println(current_kp); 144 } 145 else if (messageTrimmed[0] == 'i') { 146 messageTrimmed[0] = '0'; 147 float new_ki = atof(messageTrimmed); 148 current_ki = new_ki; 149 //Serial.print("New kI: "); 150 //Serial.println(current_ki); 151 } 152 else if (messageTrimmed[0] == 'd') { 153 messageTrimmed[0] = '0'; 154 float new_kd = atof(messageTrimmed); 155 current_kd = new_kd; 156 //Serial.print("New kD: "); 157 //Serial.println(current_kd); 158 } 159 } 160 161 void loop() { 162 if (requestFlagOn == true){ 163 delay(10); 164 Wire.requestFrom(requestedAddress, 6, true); // request 8 bytes from selected slave device 165 166 int wireIndex = 0; 167 while(Wire.available()) // slave may send less than requested 168 { 169 readWire[wireIndex] = Wire.read(); // receive a byte as character 170 wireIndex++; 171 } 172 173 readWire[wireIndex] = '\0'; // assume it is a string, add zero-terminator 174 //Serial.print("Requested value: "); 175 Serial.println(readWire); 176 requestFlagOn = false; 177 } else { 178 //Check to see if anything is available in the serial receive buffer 179 while (Serial.available() > 0) 180 { 181 //Create a place to hold the incoming message 182 static char message[MAX_MESSAGE_LENGTH]; 183 static unsigned int message_pos = 0; 184 185 //Read the next available byte in the serial receive buffer 186 char inByte = Serial.read(); 187 188 //Message coming in (check not terminating character) and guard for over message size 189 if ( inByte != '\n' && (message_pos < MAX_MESSAGE_LENGTH - 1) ) 190 { 191 //Add the incoming byte to our message 192 message[message_pos] = inByte; 193 if (message[message_pos] == ';'){ 194 containsSemicolon = true; 195 } 196 message_pos++; 197 } 198 //Full message received... 199 else 200 { 201 message[message_pos] = '\0'; 202 if (containsSemicolon == true){ 203 char *moveStrings[6]; // an array of pointers to the pieces of the above array after strtok() 204 char *ptr = NULL; 205 int moveIndex = 0; 206 207 ptr = strtok(message, ";"); // delimiter 208 while (ptr != NULL) { 209 moveStrings[moveIndex] = ptr; 210 moveIndex++; 211 ptr = strtok(NULL, ";"); 212 } 213 int i; 214 for (i = 0; i < moveIndex; i++) { 215 int thisLength = strlen(moveStrings[i]) + 1; 216 sendMessage(moveStrings[i], thisLength); 217 } 218 }else{ 219 sendMessage(message, message_pos); 220 } 221 //Reset for the next message 222 message_pos = 0; 223 containsSemicolon = false; 224 } 225 } 226 } 227 }