Michael Antonucci / Mbed 2 deprecated Antonucci_A5_2_PWM_Servo

Dependencies:   mbed

Committer:
michael_antonucci
Date:
Wed Nov 16 04:52:35 2022 +0000
Revision:
0:6d9c7e98dab0
Working servo code. Has a bug where the button needs to be pressed twice at first. Not sure how to resolve

Who changed what in which revision?

UserRevisionLine numberNew contents of line
michael_antonucci 0:6d9c7e98dab0 1 //Assignment 5 Exercise 2
michael_antonucci 0:6d9c7e98dab0 2 //Author: Michael Antonucci
michael_antonucci 0:6d9c7e98dab0 3 //Last Modified: 11/15/2022
michael_antonucci 0:6d9c7e98dab0 4
michael_antonucci 0:6d9c7e98dab0 5 #include "mbed.h"
michael_antonucci 0:6d9c7e98dab0 6
michael_antonucci 0:6d9c7e98dab0 7 DigitalOut myled(LED1); //Specify inputs and variables
michael_antonucci 0:6d9c7e98dab0 8 DigitalIn button(p17);
michael_antonucci 0:6d9c7e98dab0 9 Serial pc(USBTX,USBRX);
michael_antonucci 0:6d9c7e98dab0 10 PwmOut servo(p21);
michael_antonucci 0:6d9c7e98dab0 11 Timer timePressed;
michael_antonucci 0:6d9c7e98dab0 12
michael_antonucci 0:6d9c7e98dab0 13
michael_antonucci 0:6d9c7e98dab0 14 void servo_angle(float angle) //declare the angle function
michael_antonucci 0:6d9c7e98dab0 15 {
michael_antonucci 0:6d9c7e98dab0 16 float pulseCoeff = 10.0;
michael_antonucci 0:6d9c7e98dab0 17 float pulseOffset = 400;
michael_antonucci 0:6d9c7e98dab0 18 float pulseWidth;
michael_antonucci 0:6d9c7e98dab0 19
michael_antonucci 0:6d9c7e98dab0 20 //Make sure angles are within bounds
michael_antonucci 0:6d9c7e98dab0 21 if (angle < 0) {
michael_antonucci 0:6d9c7e98dab0 22 angle = 0;
michael_antonucci 0:6d9c7e98dab0 23 } else if (angle > 180) {
michael_antonucci 0:6d9c7e98dab0 24 angle = 180.0;
michael_antonucci 0:6d9c7e98dab0 25 }
michael_antonucci 0:6d9c7e98dab0 26
michael_antonucci 0:6d9c7e98dab0 27 //Calculate the pulsewidth for the desired angle and issue command:
michael_antonucci 0:6d9c7e98dab0 28 pulseWidth = pulseCoeff * angle + pulseOffset;
michael_antonucci 0:6d9c7e98dab0 29 servo.pulsewidth(pulseWidth/1000000.000);
michael_antonucci 0:6d9c7e98dab0 30 }
michael_antonucci 0:6d9c7e98dab0 31
michael_antonucci 0:6d9c7e98dab0 32 int main()
michael_antonucci 0:6d9c7e98dab0 33 {
michael_antonucci 0:6d9c7e98dab0 34 wait(3);
michael_antonucci 0:6d9c7e98dab0 35 float angle; //store angle data
michael_antonucci 0:6d9c7e98dab0 36 angle = 0; //set to zero
michael_antonucci 0:6d9c7e98dab0 37 servo_angle(angle);
michael_antonucci 0:6d9c7e98dab0 38 pc.printf("The servo angle is: %5.2f\r\n",angle);
michael_antonucci 0:6d9c7e98dab0 39 while(1) {
michael_antonucci 0:6d9c7e98dab0 40
michael_antonucci 0:6d9c7e98dab0 41 while(button.read()==0) { //while button is not pressed
michael_antonucci 0:6d9c7e98dab0 42 wait(0.1);
michael_antonucci 0:6d9c7e98dab0 43 if (button.read()==1) { //if pressed
michael_antonucci 0:6d9c7e98dab0 44 angle=angle+30;
michael_antonucci 0:6d9c7e98dab0 45 servo_angle(angle);
michael_antonucci 0:6d9c7e98dab0 46 timePressed.start(); //Start button timer
michael_antonucci 0:6d9c7e98dab0 47 pc.printf("The servo angle is: %5.2f\r\n",angle);
michael_antonucci 0:6d9c7e98dab0 48 }
michael_antonucci 0:6d9c7e98dab0 49 }
michael_antonucci 0:6d9c7e98dab0 50 while(button.read()==1) { //while button is pressed
michael_antonucci 0:6d9c7e98dab0 51 wait(0.1);
michael_antonucci 0:6d9c7e98dab0 52 if (button.read()==0) { //if released
michael_antonucci 0:6d9c7e98dab0 53 timePressed.stop(); //Stop button timer
michael_antonucci 0:6d9c7e98dab0 54 }
michael_antonucci 0:6d9c7e98dab0 55 }
michael_antonucci 0:6d9c7e98dab0 56 if (angle >= 180) { //Reset Servo if angle is greater than 180
michael_antonucci 0:6d9c7e98dab0 57 angle = 0;
michael_antonucci 0:6d9c7e98dab0 58 servo_angle(angle);
michael_antonucci 0:6d9c7e98dab0 59 pc.printf("The servo angle is: %5.2f\r\n",angle);
michael_antonucci 0:6d9c7e98dab0 60 }
michael_antonucci 0:6d9c7e98dab0 61 if (timePressed.read_ms()>= 3000) { //Reset servo if timer is greater than 3 seconds
michael_antonucci 0:6d9c7e98dab0 62 angle = 0;
michael_antonucci 0:6d9c7e98dab0 63 servo_angle(angle);
michael_antonucci 0:6d9c7e98dab0 64 pc.printf("The servo angle is: %5.2f\r\n",angle);
michael_antonucci 0:6d9c7e98dab0 65 }
michael_antonucci 0:6d9c7e98dab0 66 timePressed.reset(); //Reset button timer
michael_antonucci 0:6d9c7e98dab0 67
michael_antonucci 0:6d9c7e98dab0 68 }
michael_antonucci 0:6d9c7e98dab0 69 }