Simply creates a servo object from a motor object, to allow the control of the angle.

Dependencies:   mbed

Fork of Lab5_Basic by ziad eldebri

Committer:
dogcatfee
Date:
Fri Nov 03 19:28:37 2017 -0700
Revision:
12:988fb6ffae63
Parent:
9:e2909d7f36b8
Cleanup, comment, position fixes.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
dogcatfee 12:988fb6ffae63 1 #include "mbed.h"
dogcatfee 12:988fb6ffae63 2 #include "Servo.h"
dogcatfee 12:988fb6ffae63 3 // gloabl varevlbe used only inseide the class
ziadeldebri 3:b787aa49b900 4 int value_current;
ziadeldebri 3:b787aa49b900 5 int value_target;
ziadeldebri 3:b787aa49b900 6 float value_target_raw;
ziadeldebri 3:b787aa49b900 7 Ticker tick;
ziadeldebri 3:b787aa49b900 8 SLCD slcd;
ziadeldebri 3:b787aa49b900 9 int n;
ziadeldebri 3:b787aa49b900 10 char buffer[50];
dogcatfee 12:988fb6ffae63 11 unsigned int counter;
dogcatfee 9:e2909d7f36b8 12
ziadeldebri 3:b787aa49b900 13 Servo::Servo(PinName analog_input,PinName Positive, PinName Negative,PinName Speed):
dogcatfee 12:988fb6ffae63 14 _feedback(analog_input), _motor(Positive,Negative,Speed)
dogcatfee 12:988fb6ffae63 15 {
dogcatfee 12:988fb6ffae63 16
ziadeldebri 3:b787aa49b900 17 }
dogcatfee 12:988fb6ffae63 18 /*
dogcatfee 12:988fb6ffae63 19 Degree should be a value from 0 to 180.
dogcatfee 12:988fb6ffae63 20 Degree is really from 0 to 100(percent).
dogcatfee 12:988fb6ffae63 21 */
dogcatfee 12:988fb6ffae63 22 void Servo::set(int degree)
dogcatfee 12:988fb6ffae63 23 {
dogcatfee 12:988fb6ffae63 24 /*
dogcatfee 12:988fb6ffae63 25 Sets value_target to the degree value that user wants servo to go to.
dogcatfee 12:988fb6ffae63 26 */
dogcatfee 12:988fb6ffae63 27 value_target = degree;
dogcatfee 12:988fb6ffae63 28 /*
dogcatfee 12:988fb6ffae63 29 Counter to store number of tries for motor to be in position.
dogcatfee 12:988fb6ffae63 30 */
dogcatfee 12:988fb6ffae63 31 counter = 0;
dogcatfee 12:988fb6ffae63 32 /*
dogcatfee 12:988fb6ffae63 33 Add the servo's move function to the ticker, runs every 1ms.
dogcatfee 12:988fb6ffae63 34 */
dogcatfee 12:988fb6ffae63 35 tick.attach(this, &Servo::move, 0.01); // set the ticker to call move every 0.001 sec
dogcatfee 12:988fb6ffae63 36 }
ziadeldebri 3:b787aa49b900 37
dogcatfee 12:988fb6ffae63 38 void Servo::move()
dogcatfee 12:988fb6ffae63 39 {
dogcatfee 12:988fb6ffae63 40 /*
dogcatfee 12:988fb6ffae63 41 value_target is destination
dogcatfee 12:988fb6ffae63 42 value_current is read from analog
dogcatfee 12:988fb6ffae63 43 slcd for the LCD display
dogcatfee 12:988fb6ffae63 44 */
ziadeldebri 3:b787aa49b900 45
dogcatfee 12:988fb6ffae63 46 /* Read the potentiometer value. */
dogcatfee 12:988fb6ffae63 47 value_current = _feedback*100;
dogcatfee 12:988fb6ffae63 48 /*
dogcatfee 12:988fb6ffae63 49 When target value is higher relative to
dogcatfee 12:988fb6ffae63 50 the value read from the potentiometer
dogcatfee 12:988fb6ffae63 51 rotate to the left (Couter-Clockwise).
dogcatfee 12:988fb6ffae63 52 */
dogcatfee 12:988fb6ffae63 53 if(value_target > value_current)
dogcatfee 12:988fb6ffae63 54 {
dogcatfee 12:988fb6ffae63 55 _motor.Direction(LEFT);
dogcatfee 12:988fb6ffae63 56 counter ++;
dogcatfee 12:988fb6ffae63 57 }
dogcatfee 12:988fb6ffae63 58 /*
dogcatfee 12:988fb6ffae63 59 When target value is lower relative to
dogcatfee 12:988fb6ffae63 60 the value read from the potentiometer
dogcatfee 12:988fb6ffae63 61 rotate to the right. (Clockwise).
dogcatfee 12:988fb6ffae63 62 */
dogcatfee 12:988fb6ffae63 63 else if(value_target < value_current)
dogcatfee 12:988fb6ffae63 64 {
dogcatfee 12:988fb6ffae63 65 _motor.Direction(RIGHT);
dogcatfee 12:988fb6ffae63 66 counter ++;
dogcatfee 12:988fb6ffae63 67 }
dogcatfee 12:988fb6ffae63 68 /*
dogcatfee 12:988fb6ffae63 69 When the motor has been set 2000 times
dogcatfee 12:988fb6ffae63 70 change the target value to the current
dogcatfee 12:988fb6ffae63 71 value of the analog reading, set the
dogcatfee 12:988fb6ffae63 72 counter to 0.
ziadeldebri 3:b787aa49b900 73
dogcatfee 12:988fb6ffae63 74 Used to prevent rocking between values
dogcatfee 12:988fb6ffae63 75 when the MBED cannot get the value from
dogcatfee 12:988fb6ffae63 76 the potentiometer.
dogcatfee 12:988fb6ffae63 77 */
dogcatfee 12:988fb6ffae63 78 else if(counter > 2000)
dogcatfee 12:988fb6ffae63 79 {
dogcatfee 12:988fb6ffae63 80 value_target = value_current;
dogcatfee 12:988fb6ffae63 81 counter = 0;
dogcatfee 12:988fb6ffae63 82 }
dogcatfee 12:988fb6ffae63 83 /*
dogcatfee 12:988fb6ffae63 84 If no if statements are true, stop
dogcatfee 12:988fb6ffae63 85 the motor and detatch the tick process.
dogcatfee 12:988fb6ffae63 86 */
dogcatfee 12:988fb6ffae63 87 else
dogcatfee 12:988fb6ffae63 88 {
dogcatfee 12:988fb6ffae63 89 tick.detach();
dogcatfee 12:988fb6ffae63 90 _motor.Stop();
dogcatfee 12:988fb6ffae63 91 }
dogcatfee 12:988fb6ffae63 92 /*
dogcatfee 12:988fb6ffae63 93 Sprintf to copy the current value into,
dogcatfee 12:988fb6ffae63 94 the buffer( n stores status of sprintf()).
dogcatfee 12:988fb6ffae63 95 */
dogcatfee 12:988fb6ffae63 96 n = sprintf (buffer, "%d", value_current);
dogcatfee 12:988fb6ffae63 97 slcd.clear(); /* Clear the SLCD */
dogcatfee 12:988fb6ffae63 98 slcd.Home(); /* Set the decimal point on SLCD */
dogcatfee 12:988fb6ffae63 99 slcd.printf(buffer); /* Write the buffer to the SLCD */
dogcatfee 12:988fb6ffae63 100 }
dogcatfee 12:988fb6ffae63 101 /*
dogcatfee 12:988fb6ffae63 102 Check function to write to SLCD,
dogcatfee 12:988fb6ffae63 103 not used.
dogcatfee 12:988fb6ffae63 104 */
dogcatfee 12:988fb6ffae63 105 void Servo::check()
dogcatfee 12:988fb6ffae63 106 {
dogcatfee 12:988fb6ffae63 107 value_current = _feedback*100;
ziadeldebri 3:b787aa49b900 108 n = sprintf (buffer, "%d", value_current);
ziadeldebri 3:b787aa49b900 109 slcd.clear();
dogcatfee 12:988fb6ffae63 110 slcd.Home();
ziadeldebri 3:b787aa49b900 111 slcd.printf(buffer);
dogcatfee 12:988fb6ffae63 112 }
dogcatfee 12:988fb6ffae63 113 /*
dogcatfee 12:988fb6ffae63 114 Returns current position of the analog dial.
dogcatfee 12:988fb6ffae63 115 0 to 100.
dogcatfee 12:988fb6ffae63 116 */
dogcatfee 12:988fb6ffae63 117 unsigned int Servo::get()
dogcatfee 12:988fb6ffae63 118 {
dogcatfee 12:988fb6ffae63 119 value_current = _feedback*100;
dogcatfee 12:988fb6ffae63 120 return value_current;
dogcatfee 12:988fb6ffae63 121 }