Advertisement
Guest User

Untitled

a guest
Jan 17th, 2021
189
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #include <ros.h>
  2. //#include <mypackage/Encoder.h>
  3. //#include <std_msgs/String.h>
  4. #include <std_msgs/Int32.h>
  5. #include <std_msgs/Float32.h>
  6. #include <digitalWriteFast.h>  
  7. // Quadrature encoders
  8. // Left encoder
  9. #define c_LeftEncoderInterruptA 0
  10. #define c_LeftEncoderInterruptB 1
  11. #define c_LeftEncoderPinA 2
  12. #define c_LeftEncoderPinB 3
  13. #define LeftEncoderIsReversed
  14.  
  15. volatile bool _LeftEncoderASet;
  16. volatile bool _LeftEncoderBSet;
  17. volatile bool _LeftEncoderAPrev;
  18. volatile bool _LeftEncoderBPrev;
  19. volatile long _LeftEncoderTicks = 0;
  20. volatile long _RightEncoderTicks = 0;
  21. long _PastRightEncoderTicks = 0;
  22. long _PastLeftEncoderTicks = 0;
  23.  
  24. //int currentLoopTime = 0;
  25. //int pastLoopTime = -50;
  26.  
  27. ros::NodeHandle nh;
  28.  
  29. //mypackage::Encoder encoder_msg;
  30. //std_msgs::String str_msg;
  31. std_msgs::Float32 lwheel_rate_data;
  32. std_msgs::Float32 rwheel_rate_data;
  33. std_msgs::Int32 lwheel_ticks_data;
  34. std_msgs::Int32 rwheel_ticks_data;
  35.  
  36. ros::Publisher lwheel_ticks("lwheel_ticks", &lwheel_ticks_data);
  37. ros::Publisher rwheel_ticks("rwheel_ticks", &rwheel_ticks_data);
  38. ros::Publisher lwheel_rate("lwheel_rate", &lwheel_rate_data);
  39. ros::Publisher rwheel_rate("rwheel_rate", &rwheel_rate_data);
  40.  
  41. void setup()
  42. {
  43.   Serial.begin(9600);
  44.   //nh.initNode()j;
  45.   //nh.advertise(encoder);
  46.   // Quadrature encoders
  47.   // Left encoder
  48.   pinMode(c_LeftEncoderPinA, INPUT);      // sets pin A as input
  49.   digitalWrite(c_LeftEncoderPinA, LOW);  // turn on pullup resistors
  50.   pinMode(c_LeftEncoderPinB, INPUT);      // sets pin B as input
  51.   digitalWrite(c_LeftEncoderPinB, LOW);  // turn on pullup resistors
  52.   attachInterrupt(c_LeftEncoderInterruptA, HandleLeftMotorInterruptA, CHANGE);
  53.   attachInterrupt(c_LeftEncoderInterruptB, HandleLeftMotorInterruptB, CHANGE);
  54.   nh.initNode();
  55.   nh.advertise(lwheel_ticks);
  56.   nh.advertise(rwheel_ticks);
  57.   nh.advertise(lwheel_rate);
  58.   nh.advertise(rwheel_rate);
  59. }
  60.  
  61. void loop()
  62. {
  63.  
  64.   lwheel_ticks_data.data = _LeftEncoderTicks;
  65.   rwheel_ticks_data.data = _RightEncoderTicks;
  66.   lwheel_ticks.publish( &lwheel_ticks_data );
  67.   rwheel_ticks.publish( &rwheel_ticks_data );
  68.   lwheel_rate.publish( &lwheel_rate_data );
  69.   rwheel_rate.publish( &rwheel_rate_data );
  70.  
  71.   nh.spinOnce();
  72.   delay(100);
  73. }
  74.  
  75. // Interrupt service routines for the left motor's quadrature encoder
  76. void HandleLeftMotorInterruptA(){
  77.   _LeftEncoderBSet = digitalReadFast(c_LeftEncoderPinB);
  78.   _LeftEncoderASet = digitalReadFast(c_LeftEncoderPinA);
  79.  
  80.   _LeftEncoderTicks+=ParseEncoder();
  81.  
  82.   _LeftEncoderAPrev = _LeftEncoderASet;
  83.   _LeftEncoderBPrev = _LeftEncoderBSet;
  84. }
  85.  
  86. // Interrupt service routines for the right motor's quadrature encoder
  87. void HandleLeftMotorInterruptB(){
  88.   // Test transition;
  89.   _LeftEncoderBSet = digitalReadFast(c_LeftEncoderPinB);
  90.   _LeftEncoderASet = digitalReadFast(c_LeftEncoderPinA);
  91.  
  92.   //_PastLeftEncoderTicks = _LeftEncoderTicks;
  93.   _LeftEncoderTicks+=ParseEncoder();
  94.  
  95.   _LeftEncoderAPrev = _LeftEncoderASet;
  96.   _LeftEncoderBPrev = _LeftEncoderBSet;
  97. }
  98.  
  99. int ParseEncoder(){
  100.   if(_LeftEncoderAPrev && _LeftEncoderBPrev){
  101.     if(!_LeftEncoderASet && _LeftEncoderBSet) return 1;
  102.     if(_LeftEncoderASet && !_LeftEncoderBSet) return -1;
  103.   }else if(!_LeftEncoderAPrev && _LeftEncoderBPrev){
  104.     if(!_LeftEncoderASet && !_LeftEncoderBSet) return 1;
  105.     if(_LeftEncoderASet && _LeftEncoderBSet) return -1;
  106.   }else if(!_LeftEncoderAPrev && !_LeftEncoderBPrev){
  107.     if(_LeftEncoderASet && !_LeftEncoderBSet) return 1;
  108.     if(!_LeftEncoderASet && _LeftEncoderBSet) return -1;
  109.   }else if(_LeftEncoderAPrev && !_LeftEncoderBPrev){
  110.     if(_LeftEncoderASet && _LeftEncoderBSet) return 1;
  111.     if(!_LeftEncoderASet && !_LeftEncoderBSet) return -1;
  112.   }
  113. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement