Advertisement
Guest User

for andrew

a guest
Nov 20th, 2018
96
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.01 KB | None | 0 0
  1. #include <Servo.h>
  2. #include <SoftwareSerial.h>
  3.  
  4.  
  5. SoftwareSerial armSerial(2,4); //2 is rx, 4 is tx
  6. const int avg_len = 10;
  7. const int num_fingers = 3;
  8. const int fingerAdd[num_fingers] = {A0,A1,A2};
  9. const int servoAdd[num_fingers] = {11,10,9};
  10. int move_speed = 5;
  11. const int accel = 1;
  12. const int accel_end = 30;
  13. int avg_value[num_fingers][avg_len];
  14. int avg_avg[num_fingers] = {0,0,0};
  15. int servo_pos[num_fingers] = {0,0,0};
  16.  
  17. int input_pot = 0;
  18.  
  19. int act_pos[num_fingers] = {0,0,0};
  20.  
  21. Servo finger_servo[num_fingers];
  22.  
  23.  
  24. int max_val[num_fingers] = {0,0,0}; //= 265;
  25. int min_val[num_fingers] = {0,0,0};//= 160;
  26.  
  27.  
  28. void setup() {
  29. // put your setup code here, to run once:
  30. Serial.begin(57600);
  31. armSerial.begin(57600);
  32.  
  33.  
  34. Serial.println("Initializing Gauntlet");
  35. delay(1000);
  36. Serial.print("Squeeze in 3");
  37. delay(1000);
  38. Serial.print(" 2");
  39. delay(1000);
  40. Serial.print(" 1");
  41. delay(1000);
  42.  
  43.  
  44. for(int x = 0; x < num_fingers; x++)
  45. {
  46. finger_servo[x].attach(servoAdd[x]);
  47.  
  48. min_val[x] = readFingers(x);
  49. Serial.println(min_val[x]);
  50. }
  51.  
  52. delay(1000);
  53. Serial.print("Extend fingers in 3");
  54. delay(1000);
  55. Serial.print(" 2");
  56. delay(1000);
  57. Serial.print(" 1");
  58. delay(1000);
  59.  
  60.  
  61. for(int x = 0; x < num_fingers; x++)
  62. {
  63. max_val[x] = readFingers(x);
  64. Serial.println(max_val[x]);
  65. for(int i = 0; i < avg_len; i++) //clear array
  66. {
  67. avg_value[x][i] = 0;
  68. }
  69.  
  70. }
  71.  
  72.  
  73.  
  74.  
  75.  
  76.  
  77.  
  78. //initialization phase will be required with a glove, or use a flush timer but this solution would limit the ammount of time to perform operations
  79.  
  80. }
  81.  
  82.  
  83.  
  84. void loop() {
  85. // put your main code here, to run repeatedly:
  86.  
  87. // move_speed = map(analogRead(A1), 0,1023,1,10);
  88. //Serial.println(move_speed);
  89. for(int x = 0; x < num_fingers; x++)
  90. {
  91.  
  92. //delay(50);
  93. //shift array to the right
  94.  
  95.  
  96. for(int i = 1; i < avg_len; i++)
  97. {
  98. avg_value[x][i] = avg_value[x][i-1];
  99. }
  100.  
  101. avg_value[x][0] = readFingers(x); //FIX THIS NEXT TIME
  102. // Serial.print((String)x + " : " + (String)avg_value[x][0] +" ");
  103.  
  104. if(avg_value[x][0]> max_val[x])
  105. {
  106. avg_value[x][0] = (max_val[x]-min_val[x])/2;
  107. }
  108.  
  109. if(avg_value[x][0] < min_val[x])
  110. {
  111. avg_value[x][0] = (max_val[x]-min_val[x])/2;
  112. }
  113.  
  114. avg_avg[x] = 0;
  115.  
  116. for(int i = 0; i < avg_len; i++)
  117. {
  118. avg_avg[x] += avg_value[x][i];
  119. }
  120.  
  121. avg_avg[x] = avg_avg[x]/avg_len;
  122.  
  123. //Serial.println(avg_avg);
  124.  
  125. if(map(avg_avg[x], min_val[x], max_val[x], 0, 180) >= 0)
  126. {
  127. servo_pos[x] = map(avg_avg[x], min_val[x], max_val[x], 0, 180); //map the avg_val of finger to a servo
  128. }
  129.  
  130. int temp_move = move_speed;
  131.  
  132. if(act_pos[x]+ accel_end < servo_pos[x])
  133. {
  134. temp_move += move_speed;
  135. }
  136. else if(act_pos[x] - accel_end > servo_pos[x])
  137. {
  138. temp_move += move_speed;
  139. }
  140.  
  141. for(int i = temp_move; i >= 0; i--)
  142. {
  143. if((act_pos[x] + i) < servo_pos[x]) //adding move_speed keeps servo from overshooting
  144. {
  145. act_pos[x] += i;
  146. // Serial.print(i);
  147. break;
  148. }
  149. else if (act_pos[x] - i > servo_pos[x])
  150. {
  151. act_pos[x] -= i;
  152. //Serial.print(i);
  153. break;
  154. }
  155. }
  156.  
  157.  
  158. //Serial.println(servo_pos);
  159. //Serial.println(move_speed);//act_pos);
  160.  
  161. //Telemetry
  162.  
  163.  
  164. Serial.print((String)x + ": " + (String)servo_pos[x] + " ");
  165.  
  166.  
  167.  
  168. finger_servo[x].write(act_pos[x]);
  169.  
  170. delay(1);
  171. }
  172.  
  173.  
  174. Serial.println();
  175.  
  176.  
  177. }
  178.  
  179. int readFingers(int i)
  180. {
  181. int16_t adc[]={0,0,0,0}; // we read from the ADC, we have a sixteen bit integer as a result
  182. armSerial.flush();
  183. // adc[0] = (int16_t)((armSerial.readStringUntil('\t')).toInt());
  184. adc[0] = (int16_t)((armSerial.readStringUntil('\t')).toInt());
  185. adc[1] = (int16_t)((armSerial.readStringUntil('\t')).toInt());
  186. adc[2] = (int16_t)((armSerial.readStringUntil('\t')).toInt());
  187. adc[3] = (int16_t)((armSerial.readStringUntil('\r')).toInt());
  188.  
  189. return adc[i]; //map((adc[i] * 0.1875)/1000,0,3.3,0,255);
  190. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement