Advertisement
Guest User

Arduino sketch robot tamiya

a guest
May 29th, 2016
536
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 8.69 KB | None | 0 0
  1. /********************************************************************/
  2. /*  Libraries                                                       */
  3. /********************************************************************/
  4. #include <Wire.h>
  5. #include <LSM303.h>
  6. #include <L3G.h>
  7. #include <SFE_BMP180.h>
  8.  
  9. #include <Servo.h>
  10.  
  11. #include <ros.h>
  12. #include <geometry_msgs/Twist.h>
  13. #include <ros_tamiya/Imu.h>
  14. #include <ros_tamiya/Motor.h>
  15. /********************************************************************/
  16.  
  17. /********************************************************************/
  18. /*  Arduino PIN Setup                                               */
  19. /********************************************************************/
  20. #define STERRING_WHEELS_PIN 8
  21. #define DRIVE_WHEELS_PIN 9
  22. #define LED_PIN 13
  23. #define GREEN_LED_PIN 3
  24. /********************************************************************/
  25.  
  26. /********************************************************************/
  27. /*  Main objects and global variables                               */
  28. /********************************************************************/
  29. Servo sterring_wheels;
  30. Servo drive_wheels;
  31.  
  32. SFE_BMP180 pressure;
  33. LSM303 compass;
  34. L3G gyro;
  35.  
  36. double baseline;
  37. byte loopCounter = 0;
  38. /********************************************************************/
  39.  
  40. /********************************************************************/
  41. /*  ROS Callbacks                                                   */
  42. /********************************************************************/
  43. void callback(const geometry_msgs::Twist& msg){
  44.     setDriverTo(msg.linear.x);
  45.     sterring_wheels.write(msg.angular.z);
  46.    
  47.     digitalWrite(GREEN_LED_PIN, HIGH);
  48.     delay(20);
  49.     digitalWrite(GREEN_LED_PIN, LOW);
  50. }
  51. /********************************************************************/
  52.  
  53. /********************************************************************/
  54. /*  ROS Setup                                                       */
  55. /********************************************************************/
  56. ros::NodeHandle nh;
  57. ros::Subscriber<geometry_msgs::Twist> sub("cmd_vel", callback);
  58.  
  59. ros_tamiya::Imu imu_msg;
  60. ros::Publisher pub_imu("imu", &imu_msg);
  61.  
  62. ros_tamiya::Motor motor_msg;
  63. ros::Publisher pub_motor("motor_position", &motor_msg);
  64. /********************************************************************/
  65.  
  66. /********************************************************************/
  67. /*  Arduino Setup function                                          */
  68. /********************************************************************/
  69. void setup() {
  70.   pinMode(LED_PIN, OUTPUT);
  71.   pinMode(GREEN_LED_PIN, OUTPUT);
  72.   digitalWrite(LED_PIN, HIGH);
  73.   digitalWrite(GREEN_LED_PIN, HIGH);
  74.  
  75.   /******************************************************/  
  76.   /* Setup motor drive and sterring
  77.   /******************************************************/
  78.   sterring_wheels.attach(STERRING_WHEELS_PIN);
  79.   drive_wheels.attach(DRIVE_WHEELS_PIN);
  80.   drive_wheels.writeMicroseconds(1600); // Neutral
  81.   sterring_wheels.write(95); // Neutral
  82.  
  83.   /******************************************************/
  84.  
  85.   /******************************************************/
  86.   /* Setup IMU sensor
  87.   /******************************************************/
  88.   Wire.begin();
  89.   compass.init();
  90.   compass.enableDefault();
  91.   compass.m_min = (LSM303::vector<int16_t>){-32767, -32767, -32767};
  92.   compass.m_max = (LSM303::vector<int16_t>){+32767, +32767, +32767};
  93.  
  94.   pressure.begin();
  95.  
  96.   // Get baseline to compute altitude
  97.   getTemperatureMsg();  
  98.   getPressureMsg();
  99.   baseline = imu_msg.pressure;
  100.  
  101.   gyro.init();
  102.   gyro.enableDefault();
  103.   /******************************************************/
  104.  
  105.   /******************************************************/
  106.   /* Setup ROS
  107.   /******************************************************/
  108.   nh.getHardware()->setBaud(115200);
  109.   nh.initNode();
  110.   nh.subscribe(sub);
  111.   nh.advertise(pub_motor);
  112.   nh.advertise(pub_imu);
  113.   /******************************************************/
  114.  
  115.   delay(1500);
  116.   digitalWrite(LED_PIN, LOW);
  117.   digitalWrite(GREEN_LED_PIN, LOW);
  118.  
  119. }
  120. /********************************************************************/
  121.  
  122. /********************************************************************/
  123. /* Arduino loop function                                            */
  124. /********************************************************************/
  125. void loop() {
  126.   nh.spinOnce();
  127.  
  128.   //if(loopCounter > 10){
  129.     loopCounter = 0;
  130.     getMagnetometerMsg();
  131.     getAccelerometerMsg();
  132.    
  133.     getTemperatureMsg();  
  134.     getPressureMsg();
  135.     getAltitudeMsg();
  136.     getGyroscopeMsg();
  137.    
  138.     motor_msg.motor_position = drive_wheels.read();
  139.     motor_msg.sterring_position = sterring_wheels.read();
  140.    
  141.    
  142.     pub_motor.publish(&motor_msg);
  143.     pub_imu.publish(&imu_msg);
  144.   //}
  145.   loopCounter++;
  146.   delay(1);
  147. }
  148. /********************************************************************/
  149.  
  150. /********************************************************************/
  151. /* Read magnetometer datas from sensor set it value to ros message  */
  152. /********************************************************************/
  153. void getMagnetometerMsg(){
  154.   compass.read();
  155.   imu_msg.heading = compass.heading();
  156.   imu_msg.magnetometer.x = compass.m.x;
  157.   imu_msg.magnetometer.y = compass.m.y;
  158.   imu_msg.magnetometer.z = compass.m.z;
  159. }
  160. /********************************************************************/
  161.  
  162. /********************************************************************/
  163. /* Read accelerometer datas from sensor set it value to ros message */
  164. /********************************************************************/
  165. void getAccelerometerMsg(){
  166.   compass.read();
  167.   imu_msg.accelerometer.x = compass.a.x;
  168.   imu_msg.accelerometer.y = compass.a.y;
  169.   imu_msg.accelerometer.z = compass.a.z;
  170. }
  171. /********************************************************************/
  172.  
  173. /********************************************************************/
  174. /* Read gyroscope datas from sensor set it value to ros message     */
  175. /********************************************************************/
  176. void getGyroscopeMsg(){
  177.   gyro.read();
  178.   imu_msg.gyroscope.x = gyro.g.x;
  179.   imu_msg.gyroscope.y = gyro.g.y;
  180.   imu_msg.gyroscope.z = gyro.g.z;
  181. }
  182. /********************************************************************/
  183.  
  184. /********************************************************************/
  185. /* Read temperature from sensor set it value to ros message         */
  186. /********************************************************************/
  187. void getTemperatureMsg(){
  188.   double T;
  189.   pressure.startTemperature();
  190.   pressure.getTemperature(T);
  191.   imu_msg.temperature = T;
  192. }
  193. /********************************************************************/
  194.  
  195. /********************************************************************/
  196. /* Read pressure from sensor set it value to ros message            */
  197. /********************************************************************/
  198. void getPressureMsg(){
  199.   double T, P;
  200.   T = (double)imu_msg.temperature;
  201.   pressure.startPressure(3);
  202.   pressure.getPressure(P, T);
  203.   imu_msg.pressure = (float)P;
  204. }
  205. /********************************************************************/
  206.  
  207. /********************************************************************/
  208. /* Read altitude from sensor set it value to ros message            */
  209. /********************************************************************/
  210. void getAltitudeMsg(){
  211.     imu_msg.altitude = (float)pressure.altitude((double)imu_msg.pressure, baseline);
  212. }
  213. /********************************************************************/
  214.  
  215. /********************************************************************/
  216. /* Read ros commands and control drive and sterring                 */
  217. /********************************************************************/
  218. // Must to be improved!!!
  219. void setDriverTo(int velocity){ // 1000:2000 (forward:backward)
  220.   int neutral = 1600;
  221.  
  222.   if (velocity < 1000) velocity = 1000;
  223.   else if (velocity > 2000) velocity = 2000;
  224.  
  225.   drive_wheels.writeMicroseconds(velocity); // Neutral
  226.   delay(1500);
  227.   drive_wheels.writeMicroseconds(neutral); // Neutral
  228.   delay(1500);
  229.   drive_wheels.writeMicroseconds(velocity); // Neutral
  230.   /*
  231.     if (v > 180 || v < 0) return;
  232.  
  233.         int pos = drive_wheels.read();
  234.  
  235.     int i = (v-pos)/abs(v-pos);
  236.  
  237.     while (drive_wheels.read() != v){
  238.         drive_wheels.write(drive_wheels.read() + i);
  239.             delayMicroseconds(50);
  240.     }
  241. */
  242. }
  243. /********************************************************************/
  244.  
  245. /********************************************************************/
  246. /* END OF CODE                                                      */
  247. /********************************************************************/
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement