Guest User

Untitled

a guest
Apr 20th, 2018
68
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 10.60 KB | None | 0 0
  1. #include <Servo.h>
  2.  
  3. const bool testing = true;
  4.  
  5. int pos;
  6. int temp;
  7. unsigned long timeTaken;
  8.  
  9. const int angleStep = 1; // step in degrees to turn
  10. const int angleStepDelay = 1; // delay in ms between turning 1 step
  11.  
  12. const float inputscale = 255/100;
  13. const int MAXRANGE = 260; // max range of servo in degrees
  14. const float servoscale = 180/MAXRANGE;
  15.  
  16. // minimum delay in ms between instructions are performed
  17. // if our delay is 50 ms, and inst1 takes 10ms, it will wait 40ms before starting inst2
  18. // if inst1 takes more than 50ms, no delay
  19. // if inst1 is 0, no delay
  20. const int delayBetweenInst = 0;
  21.  
  22. // delay in ms to wait before rolling if vertical and lateral are in use
  23. const int rollDelay = 0;
  24.  
  25. // delay in ms to wait before using all servos to go backwards
  26. const int backwardDelay = 0;
  27.  
  28. const bool clearSerialAfterLoop = false; // set to true if arduino is lagging behind in commands
  29.  
  30. const int topServopin = A0;
  31. const int bottomServopin = A1;
  32. const int leftServopin = A2;
  33. const int rightServopin = A3;
  34.  
  35. const int mainThruster = 5;
  36.  
  37. const int topMotor = 3;
  38. const int topDir = 999; //################# CHANGE ME ############
  39. const int bottomMotor = 6;
  40. const int bottomDir = 999; //################# CHANGE ME ############
  41. const int leftMotor = 9;
  42. const int leftDir = 8; //################# CHANGE ME ############
  43. const int rightMotor = 11;
  44. const int rightDir = 12; //################# CHANGE ME ############
  45.  
  46.  
  47. float fowardinst;
  48. float verticalinst;
  49. float lateralinst;
  50. float rollrateinst;
  51. float pitchrateinst;
  52. float yawrateinst;
  53.  
  54. Servo topServo;
  55. Servo leftServo;
  56. Servo rightServo;
  57. Servo bottomServo;
  58.  
  59. // variable to store the servo position
  60. int topServopos = 0;
  61. int leftServopos = 0;
  62. int rightServopos = 0;
  63. int bottomServopos = 0;
  64.  
  65. void setup() {
  66. Serial.begin(9600);
  67.  
  68. topServo.attach(topServopin);
  69. bottomServo.attach(bottomServopin);
  70. leftServo.attach(leftServopin);
  71. rightServo.attach(rightServopin); // attaches the servo on pin to the servo object
  72.  
  73. pinMode(mainThruster, OUTPUT);
  74.  
  75. pinMode(topMotor, OUTPUT);
  76. pinMode(bottomMotor, OUTPUT);
  77. pinMode(leftMotor, OUTPUT);
  78. pinMode(rightMotor, OUTPUT);
  79. pinMode(topDir, OUTPUT);
  80. pinMode(bottomDir, OUTPUT);
  81. pinMode(leftDir, OUTPUT);
  82. pinMode(rightDir, OUTPUT);
  83. }
  84.  
  85. // start should be current position
  86. // end should be intended angle in degrees
  87. // returns final position
  88. int turn(Servo myservo, int start, int end) {
  89. end = end * servoscale;
  90. if (start < end) {
  91. for (pos = start; pos <= end; pos += angleStep) { // goes from start degrees to end degrees
  92. myservo.write(pos); // tell servo to go to position in variable 'pos'
  93. delay(angleStepDelay);
  94. }
  95. }else {
  96. for (pos = start; pos >= end; pos -= angleStep) { // goes from start degrees to end degrees
  97. myservo.write(pos); // tell servo to go to position in variable 'pos'
  98. delay(angleStepDelay);
  99. }
  100. }
  101. myservo.write(end);
  102. return end; //instead of having to write leftServopos = 270, it'll know it.
  103. }
  104.  
  105. void loop() {
  106.  
  107. while(Serial.available() > 0) //I'm using a while instead of an if to ensure I get all the data at once.
  108. { //Serial.available = how many coins left.
  109.  
  110. if (testing) {
  111. fowardinst = 0;
  112. verticalinst = 50;
  113. lateralinst = 0;
  114. rollrateinst = 0;
  115. pitchrateinst = 0;
  116. yawrateinst = 0;
  117.  
  118. temp = 62; // don't change
  119. }else {
  120. do {
  121. temp = Serial.read();
  122. } while (temp != 60); // temp != "<"
  123.  
  124. fowardinst = Serial.parseFloat();
  125. verticalinst = Serial.parseFloat();
  126. lateralinst = Serial.parseFloat();
  127. rollrateinst = Serial.parseFloat();
  128. pitchrateinst = Serial.parseFloat();
  129. yawrateinst = Serial.parseFloat();
  130.  
  131. temp = Serial.read();
  132. }
  133.  
  134.  
  135. if (temp == 62) // temp == ">"
  136. //check flow across prop, change servo values accordingly
  137. {
  138. //do pitch first figure this out, set motor ops. or individual operation
  139. if (pitchrateinst != 0) {
  140.  
  141. timeTaken = millis(); // time started
  142.  
  143. // #################### CHECK ANGLES ######################
  144. topServopos = turn(topServo,topServopos,90);
  145. bottomServopos = turn(bottomServo,bottomServopos,90);
  146. if(pitchrateinst > 0){
  147. digitalWrite(topDir,HIGH);
  148. digitalWrite(bottomDir,LOW);
  149. }else{
  150. pitchrateinst = pitchrateinst * -1;
  151. digitalWrite(topDir,LOW);
  152. digitalWrite(bottomDir,HIGH);
  153. }
  154. analogWrite(topMotor, inputscale*pitchrateinst);
  155. analogWrite(bottomMotor, inputscale*pitchrateinst);
  156.  
  157. timeTaken = millis() - timeTaken; // (current time) - (time started)
  158. if (timeTaken < delayBetweenInst) {
  159. delay(delayBetweenInst - timeTaken);
  160. }
  161. }else{ // pitch inst is 0
  162. analogWrite(topMotor,0);
  163. analogWrite(bottomMotor,0);
  164. }
  165.  
  166. //do vertical - up,down
  167. if (verticalinst != 0) {
  168.  
  169. timeTaken = millis(); // time started
  170.  
  171. // #################### CHECK ANGLES ######################
  172. leftServopos = turn(leftServo,leftServopos,90);
  173. rightServopos = turn(rightServo,rightServopos,270);
  174. if(verticalinst > 0) {
  175. digitalWrite(leftDir,HIGH);
  176. digitalWrite(rightDir,HIGH);
  177. }else{
  178. verticalinst = verticalinst * -1;
  179. digitalWrite(leftDir,LOW);
  180. digitalWrite(rightDir,LOW);
  181. }
  182. analogWrite(leftMotor, inputscale*verticalinst);
  183. analogWrite(rightMotor, inputscale*verticalinst);
  184.  
  185. timeTaken = millis() - timeTaken; // (current time) - (time started)
  186. if (timeTaken < delayBetweenInst) {
  187. delay(delayBetweenInst - timeTaken);
  188. }
  189. }else{ //vertical instruction is 0, turn off motors
  190. analogWrite(leftMotor,0);
  191. analogWrite(rightMotor,0);
  192. }
  193.  
  194. //do lateral - left,right
  195. if (lateralinst != 0) {
  196.  
  197. timeTaken = millis(); // time started
  198.  
  199. // #################### CHECK ANGLES ######################
  200. topServopos = turn(topServo,topServopos,180);
  201. bottomServopos = turn(bottomServo, bottomServopos,0);
  202. if(lateralinst > 0) {
  203. digitalWrite(topDir,HIGH);
  204. digitalWrite(bottomDir,HIGH);
  205. }else{
  206. lateralinst = lateralinst * -1;
  207. digitalWrite(topDir,LOW);
  208. digitalWrite(bottomDir,LOW);
  209. }
  210. analogWrite(topMotor, inputscale*lateralinst);
  211. analogWrite(bottomMotor, inputscale*lateralinst);
  212.  
  213. timeTaken = millis() - timeTaken; // (current time) - (time started)
  214. if (timeTaken < delayBetweenInst) {
  215. delay(delayBetweenInst - timeTaken);
  216. }
  217. }else{ //lateral instruction is 0, turn off motors
  218. analogWrite(topMotor,0);
  219. analogWrite(bottomMotor,0);
  220. }
  221.  
  222. //do yaw swoosh right,left
  223. if (yawrateinst != 0) {
  224.  
  225. timeTaken = millis(); // time started
  226.  
  227. // #################### CHECK ANGLES ######################
  228. leftServopos = turn(leftServo, leftServopos,90);
  229. rightServopos = turn(rightServo, rightServopos,90);
  230. if(yawrateinst > 0) {
  231. digitalWrite(leftDir,LOW);
  232. digitalWrite(rightDir,HIGH);
  233. }else{
  234. yawrateinst = yawrateinst * -1;
  235. digitalWrite(leftDir,HIGH);
  236. digitalWrite(rightDir,LOW);
  237. }
  238. analogWrite(leftMotor, inputscale*yawrateinst);
  239. analogWrite(rightMotor, inputscale*yawrateinst);
  240.  
  241. timeTaken = millis() - timeTaken; // (current time) - (time started)
  242. if (timeTaken < delayBetweenInst) {
  243. delay(delayBetweenInst - timeTaken);
  244. }
  245. }else{ //yawrateinstruction is 0
  246. analogWrite(leftMotor,0);
  247. analogWrite(rightMotor,0);
  248. }
  249.  
  250. //do roll cw/ccw
  251. if (rollrateinst != 0) {
  252.  
  253. timeTaken = millis(); // time started
  254.  
  255. if(verticalinst == 0) {
  256. // #################### CHECK ANGLES ######################
  257. leftServopos = turn(leftServo, leftServopos,0);
  258. rightServopos = turn(rightServo, rightServopos,180);
  259. if(rollrateinst > 0) {
  260. digitalWrite(leftDir,LOW);
  261. digitalWrite(rightDir,HIGH);
  262. }else{
  263. rollrateinst = rollrateinst * -1;
  264. digitalWrite(leftDir,LOW);
  265. digitalWrite(rightDir,HIGH);
  266. }
  267. analogWrite(leftMotor, inputscale*rollrateinst);
  268. analogWrite(rightMotor, inputscale*rollrateinst);
  269. }else{
  270. if (lateralinst != 0) {
  271. delay(rollDelay);
  272. }
  273. // #################### CHECK ANGLES ######################
  274. topServopos = turn(topServo, topServopos,0);
  275. bottomServopos = turn(bottomServo, bottomServopos,180);
  276. if(rollrateinst > 0) {
  277. digitalWrite(topDir,HIGH);
  278. digitalWrite(bottomDir,LOW);
  279. }else{
  280. rollrateinst = rollrateinst * -1;
  281. digitalWrite(topDir,LOW);
  282. digitalWrite(bottomDir,HIGH);
  283. }
  284. analogWrite(topMotor, inputscale*rollrateinst);
  285. analogWrite(bottomMotor, inputscale*rollrateinst);
  286. }
  287.  
  288. timeTaken = millis() - timeTaken; // (current time) - (time started)
  289. if (timeTaken < delayBetweenInst) {
  290. delay(delayBetweenInst - timeTaken);
  291. }
  292. }
  293.  
  294. //do foward
  295. if (fowardinst > 0) {
  296. analogWrite(mainThruster, inputscale*fowardinst );
  297. }else{
  298.  
  299. timeTaken = millis(); // time started
  300.  
  301. analogWrite(mainThruster, 0);
  302.  
  303. delay(backwardDelay);
  304. fowardinst = fowardinst*-1;
  305. // #################### CHECK ANGLES ######################
  306. topServopos = turn(topServo, topServopos,0);
  307. bottomServopos = turn(bottomServo, bottomServopos,0);
  308. leftServopos = turn(leftServo, leftServopos,0);
  309. rightServopos = turn(rightServo, rightServopos,0);
  310. digitalWrite(topDir,LOW);
  311. digitalWrite(bottomDir,LOW);
  312. digitalWrite(leftDir,LOW);
  313. digitalWrite(rightDir,LOW);
  314. analogWrite(topMotor,inputscale*fowardinst);
  315. analogWrite(bottomMotor,inputscale*fowardinst);
  316. analogWrite(leftMotor,inputscale*fowardinst);
  317. analogWrite(rightMotor,inputscale*fowardinst);
  318.  
  319. timeTaken = millis() - timeTaken; // (current time) - (time started)
  320. if (timeTaken < delayBetweenInst) {
  321. delay(delayBetweenInst - timeTaken);
  322. }
  323. }
  324. }
  325. else
  326. {
  327. //ERROR
  328. Serial.println("ERROR");
  329. }
  330. }
  331.  
  332. if (clearSerialAfterLoop == true)
  333. {
  334. Serial.flush();
  335. }
  336.  
  337. }
Add Comment
Please, Sign In to add comment