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