sylvie-2024

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs | README | LICENSE

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 }