sylvie-2024

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

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 }