lemueltra

pd_ros_escravo

Oct 9th, 2019
358
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #include <ros.h>
  2. #include <std_msgs/Float64.h>
  3.  
  4.  
  5. const int pwm = 11;
  6. const int dir1 = 8;
  7. const int dir2 = 9;
  8. const int pot_pin = A0;
  9. const int corr_pin = A1;
  10.  
  11. float angulo = 0;
  12. float setpoint = 150;
  13. float Kp = 5; // 10.3;
  14. float Kd = 10;//0.0512;
  15. float ultimo_erro = 0;
  16. float erro = 0;
  17. float delta_erro = 0;
  18. float termo_pd = 0;
  19. float termo_pd_escalonado = 0;
  20. float mV = 0;
  21. float Amp = 0;
  22.  
  23. int pot = 0;
  24. int corrente = 0;
  25. int mVperAmp = 66;
  26. int ACSoffset = 2500;
  27.  
  28. ros::NodeHandle nh;
  29.  
  30. std_msgs::Float64 posi;
  31. std_msgs::Float64 corr;
  32.  
  33. void setpoint_callback(const std_msgs::Float64& msg){
  34.     setpoint = msg.data;
  35. }
  36.  
  37. ros::Subscriber<std_msgs::Float64> ss("posicao_mestre", &setpoint_callback);
  38.  
  39. ros::Publisher p("posicao", &posi);
  40. ros::Publisher c("corrente", &corr);
  41.  
  42. void setup() {
  43.   nh.initNode();
  44.   nh.advertise(p);
  45.   nh.advertise(c);
  46.   nh.subscribe(ss);
  47.  
  48.   pinMode(pwm, OUTPUT);
  49.   pinMode(dir1, OUTPUT);
  50.   pinMode(dir2, OUTPUT);
  51. }
  52.  
  53. void loop(){
  54.   pd_calc();
  55.   pd_calc2();
  56.   pd_calc3();
  57.   pd_calc4();
  58.   pd_calc5();
  59.   pd_calc6();
  60.  
  61.   if (angulo < setpoint) {
  62.     digitalWrite(dir1, LOW);
  63.     digitalWrite(dir2, HIGH);
  64.   }
  65.   else {
  66.     digitalWrite(dir1, HIGH);
  67.     digitalWrite(dir2, LOW);
  68.   }
  69.  
  70.   analogWrite(pwm, termo_pd_escalonado);
  71.  
  72.   posi.data = angulo;
  73.   corr.data = Amp;
  74.  
  75.   p.publish( &posi );
  76.   c.publish( &corr );
  77.  
  78.   nh.subscribe(ss);
  79.   nh.spinOnce();
  80.  
  81.   delay(20);
  82. }
  83.  
  84. void pd_calc(){
  85.   pot = analogRead(pot_pin);
  86.   angulo = map(pot, 0, 1023, 0, 180);  
  87.   corrente = analogRead(corr_pin);
  88.   mV = (corrente / 1024.0) * 5000;
  89.   Amp = ((mV - ACSoffset) / mVperAmp);
  90.  
  91.   if (angulo > 165 or angulo < 15){ //FREIO!!
  92.     digitalWrite(dir1, LOW);
  93.     digitalWrite(dir2, LOW);
  94.     termo_pd_escalonado = 0;
  95.   }        
  96.   else {
  97.     erro = setpoint - angulo;
  98.     delta_erro = erro - ultimo_erro;
  99.     termo_pd = (Kp * erro) + (Kd * delta_erro);
  100.     termo_pd = constrain(termo_pd, -255, 255);
  101.     termo_pd_escalonado = abs(termo_pd);
  102.     ultimo_erro = erro;
  103.   }
  104. }
  105. void pd_calc2(){
  106.   pot = analogRead(pot_pin);
  107.   angulo = map(pot, 0, 1023, 0, 180);  
  108.   corrente = analogRead(corr_pin);
  109.   mV = (corrente / 1024.0) * 5000;
  110.   Amp = ((mV - ACSoffset) / mVperAmp);
  111.  
  112.   if (angulo > 165 or angulo < 15){ //FREIO!!
  113.     digitalWrite(dir1, LOW);
  114.     digitalWrite(dir2, LOW);
  115.     termo_pd_escalonado = 0;
  116.   }        
  117.   else {
  118.     erro = setpoint - angulo;
  119.     delta_erro = erro - ultimo_erro;
  120.     termo_pd = (Kp * erro) + (Kd * delta_erro);
  121.     termo_pd = constrain(termo_pd, -255, 255);
  122.     termo_pd_escalonado = abs(termo_pd);
  123.     ultimo_erro = erro;
  124.   }
  125. }
  126. void pd_calc3(){
  127.   pot = analogRead(pot_pin);
  128.   angulo = map(pot, 0, 1023, 0, 180);  
  129.   corrente = analogRead(corr_pin);
  130.   mV = (corrente / 1024.0) * 5000;
  131.   Amp = ((mV - ACSoffset) / mVperAmp);
  132.  
  133.   if (angulo > 165 or angulo < 15){ //FREIO!!
  134.     digitalWrite(8, LOW);
  135.     digitalWrite(9, LOW);
  136.     termo_pd_escalonado = 0;
  137.   }        
  138.   else {
  139.     erro = setpoint - angulo;
  140.     delta_erro = erro - ultimo_erro;
  141.     termo_pd = (Kp * erro) + (Kd * delta_erro);
  142.     termo_pd = constrain(termo_pd, -255, 255);
  143.     termo_pd_escalonado = abs(termo_pd);
  144.     ultimo_erro = erro;
  145.   }
  146. }
  147. void pd_calc4(){
  148.   pot = analogRead(pot_pin);
  149.   angulo = map(pot, 0, 1023, 0, 180);  
  150.   corrente = analogRead(corr_pin);
  151.   mV = (corrente / 1024.0) * 5000;
  152.   Amp = ((mV - ACSoffset) / mVperAmp);
  153.  
  154.   if (angulo > 165 or angulo < 15){ //FREIO!!
  155.     digitalWrite(8, LOW);
  156.     digitalWrite(9, LOW);
  157.     termo_pd_escalonado = 0;
  158.   }        
  159.   else {
  160.     erro = setpoint - angulo;
  161.     delta_erro = erro - ultimo_erro;
  162.     termo_pd = (Kp * erro) + (Kd * delta_erro);
  163.     termo_pd = constrain(termo_pd, -255, 255);
  164.     termo_pd_escalonado = abs(termo_pd);
  165.     ultimo_erro = erro;
  166.   }
  167. }
  168. void pd_calc5(){
  169.   pot = analogRead(pot_pin);
  170.   angulo = map(pot, 0, 1023, 0, 180);  
  171.   corrente = analogRead(corr_pin);
  172.   mV = (corrente / 1024.0) * 5000;
  173.   Amp = ((mV - ACSoffset) / mVperAmp);
  174.  
  175.   if (angulo > 165 or angulo < 15){ //FREIO!!
  176.     digitalWrite(8, LOW);
  177.     digitalWrite(9, LOW);
  178.     termo_pd_escalonado = 0;
  179.   }        
  180.   else {
  181.     erro = setpoint - angulo;
  182.     delta_erro = erro - ultimo_erro;
  183.     termo_pd = (Kp * erro) + (Kd * delta_erro);
  184.     termo_pd = constrain(termo_pd, -255, 255);
  185.     termo_pd_escalonado = abs(termo_pd);
  186.     ultimo_erro = erro;
  187.   }
  188. }
  189. void pd_calc6(){
  190.   pot = analogRead(pot_pin);
  191.   angulo = map(pot, 0, 1023, 0, 180);  
  192.   corrente = analogRead(corr_pin);
  193.   mV = (corrente / 1024.0) * 5000;
  194.   Amp = ((mV - ACSoffset) / mVperAmp);
  195.  
  196.   if (angulo > 165 or angulo < 15){ //FREIO!!
  197.     digitalWrite(8, LOW);
  198.     digitalWrite(9, LOW);
  199.     termo_pd_escalonado = 0;
  200.   }        
  201.   else {
  202.     erro = setpoint - angulo;
  203.     delta_erro = erro - ultimo_erro;
  204.     termo_pd = (Kp * erro) + (Kd * delta_erro);
  205.     termo_pd = constrain(termo_pd, -255, 255);
  206.     termo_pd_escalonado = abs(termo_pd);
  207.     ultimo_erro = erro;
  208.   }
  209. }
Advertisement
Add Comment
Please, Sign In to add comment