Advertisement
bitwise_gamgee

Untitled

Jul 5th, 2023
197
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.57 KB | None | 0 0
  1. #include <Servo.h>
  2. #include <SoftwareSerial.h>
  3. #include <PID_v1.h>
  4.  
  5. #define DISABLED_PIN 255
  6. #define DATA_N 13
  7.  
  8. Servo servo1;
  9. Servo servo2;
  10. Servo servo3;
  11. Servo servo4;
  12.  
  13. SoftwareSerial IMU(2, DISABLED_PIN); // RX and TX
  14.  
  15. double Roll_Setpoint, Roll_Input, Roll_Output;
  16. double Pitch_Setpoint, Pitch_Input, Pitch_Output;
  17. double Kp = 2, Ki = 0.2, Kd = 0.2;
  18.  
  19. PID Roll_PID(&Roll_Input, &Roll_Output, &Roll_Setpoint, Kp, Ki, Kd, REVERSE);
  20. PID Pitch_PID(&Pitch_Input, &Pitch_Output, &Pitch_Setpoint, Kp, Ki, Kd, REVERSE);
  21.  
  22. void setup() {
  23.   Serial.begin(9600);
  24.   IMU.begin(9600); // Start serial to IMU
  25.  
  26.   setupServos();
  27.   setupPID();
  28.  
  29.   Roll_Setpoint = 0;
  30.   Pitch_Setpoint = 0;
  31. }
  32.  
  33. void loop() {
  34.   float euler[DATA_N];
  35.   String dt = "";
  36.  
  37.   if (EBimuAsciiParser(euler, DATA_N)) {
  38.     Roll_Input = euler[0];
  39.     Pitch_Input = euler[1];
  40.  
  41.     computePID();
  42.  
  43.     int servo1Pos = map(Roll_Output, 0, 255, 0, 80);
  44.     int servo2Pos = map(Pitch_Output, 0, 255, 0, 80);
  45.  
  46.     controlServos(servo1Pos, servo2Pos);
  47.  
  48.     dt = ("/*" + String(euler[2]) + "," + String(euler[1]) + "," + String(euler[0]) + "*/");
  49.     delay(40);
  50.     Serial.print(servo1Pos);
  51.     Serial.println(dt);
  52.   }
  53. }
  54.  
  55. void setupServos() {
  56.   servo1.attach(9);
  57.   servo2.attach(10);
  58.   servo3.attach(11);
  59.   servo4.attach(12);
  60.  
  61.   servo1.write(80);
  62.   servo2.write(80);
  63.   servo3.write(80);
  64.   servo4.write(80);
  65. }
  66.  
  67. void setupPID() {
  68.   Roll_PID.SetMode(AUTOMATIC);
  69.   Pitch_PID.SetMode(AUTOMATIC);
  70.   Roll_PID.SetOutputLimits(0, 255);
  71.   Pitch_PID.SetOutputLimits(0, 255);
  72. }
  73.  
  74. void computePID() {
  75.   Roll_PID.Compute();
  76.   Pitch_PID.Compute();
  77. }
  78.  
  79. void controlServos(int servo1Pos, int servo2Pos) {
  80.   if (Roll_Input < 0) {
  81.     servo1.write(servo1Pos);
  82.     servo3.write(80);
  83.   } else {
  84.     servo3.write(servo1Pos);
  85.     servo1.write(80);
  86.   }
  87.  
  88.   if (Pitch_Input > 0) {
  89.     servo2.write(servo2Pos);
  90.     servo4.write(80);
  91.   } else {
  92.     servo4.write(-servo1Pos);
  93.     servo2.write(80);
  94.   }
  95. }
  96.  
  97. int EBimuAsciiParser(float *item, int number_of_item) {
  98.   static char sbuf[SBUF_SIZE];
  99.   static signed int sbuf_cnt = 0;
  100.  
  101.   int rbytes = IMU.available();
  102.   for (int n = 0; n < rbytes; n++) {
  103.     sbuf[sbuf_cnt] = IMU.read();
  104.  
  105.     if (sbuf[sbuf_cnt] == 0x0a) {
  106.       char *addr = strtok(sbuf, ",");
  107.       for (int i = 0; i < number_of_item; i++) {
  108.         item[i] = atof(addr);
  109.         addr = strtok(NULL, ",");
  110.       }
  111.       return 1;
  112.     } else if (sbuf[sbuf_cnt] == '*') {
  113.       sbuf_cnt = -1;
  114.     }
  115.    
  116.     sbuf_cnt++;
  117.     if (sbuf_cnt >= SBUF_SIZE) {
  118.       sbuf_cnt = 0;
  119.     }
  120.   }
  121.   return 0;
  122. }
  123.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement