PSI3422_Aula3
Dependencies: HC_SR04_Ultrasonic_Library mbed nRF24L01P
Revision 0:48e6560d23a5, committed 2017-08-16
- Comitter:
- gabrielkim13
- Date:
- Wed Aug 16 12:36:27 2017 +0000
- Commit message:
- PSI3422_Aula3
Changed in this revision
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/HC_SR04_Ultrasonic_Library.lib Wed Aug 16 12:36:27 2017 +0000 @@ -0,0 +1,1 @@ +http://mbed.org/users/ejteb/code/HC_SR04_Ultrasonic_Library/#e0f9c9fb4cf3
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Wed Aug 16 12:36:27 2017 +0000 @@ -0,0 +1,261 @@ +/* Libraries */ +#include "mbed.h" +#include "ultrasonic.h" +#include "nRF24L01P.h" + +#define DEBUG + +/* Encoder Defines */ +#define LEFT_ENC PTD4 +#define RIGHT_ENC PTA12 + +#define HOLES_ENC 20 + +#define DEBOUNCE_MS 5 + +/* HC-SR04 Defines */ +#define TRIG_PIN PTD7 +#define ECHO_PIN PTD6 + +#define REFRESH 0.050 +#define TIMEOUT 0.100 + +#define N_AVERAGES 10 + +/* L298 Defines */ +#define LEFTA_PIN PTB1 +#define LEFTB_PIN PTB0 +#define RIGHTA_PIN PTB2 +#define RIGHTB_PIN PTB3 + +#define LEFT 0 +#define RIGHT 1 + +#define PWM_FREQUENCY 1000.0 +#define PWM_STEP 0.1 +#define PWM_DELAY_US 50 + +/* nRF24L01 Defines */ +#define MOSI_PIN PTD2 +#define MISO_PIN PTD3 +#define SCK_PIN PTD1 +#define CSN_PIN PTD5 +#define CE_PIN PTD0 +#define IRQ_PIN PTA13 + +#define TRANSFER_SIZE 3 + +/* Encoder Functions */ +void leftInterrupt(); +void rightInterrupt(); + +/* HC-SR04 Functions */ +void distanceUpdate(int); + +/* L298 Functions */ +void setSpeed(unsigned char, float); + +#ifdef DEBUG +Serial pc(USBTX, USBRX); +#endif + +/* Encoder Variables */ +InterruptIn leftEncoder(LEFT_ENC); +InterruptIn rightEncoder(RIGHT_ENC); + +Timer debounce; + +unsigned char leftCounts = 0; +unsigned char rightCounts = 0; + +/* HC-SR04 Variables */ +ultrasonic hcsr04(TRIG_PIN, ECHO_PIN, REFRESH, TIMEOUT, &distanceUpdate); + +unsigned long int distanceSum = 0; +unsigned int currentDistance = 0; +unsigned int previousDistance = 0; +unsigned int averagedDistance = 0; + +/* L298 Variables */ +PwmOut leftOutA(LEFTA_PIN); +PwmOut leftOutB(LEFTB_PIN); +PwmOut rightOutA(RIGHTA_PIN); +PwmOut rightOutB(RIGHTB_PIN); + +float leftSpeed = 0.0; +float rightSpeed = 0.0; + +/* nRF24L01 Variables */ +nRF24L01P nRF24(MOSI_PIN, MISO_PIN, SCK_PIN, CSN_PIN, CE_PIN, IRQ_PIN); + +/* Main */ +int main() { + signed char txData[TRANSFER_SIZE], rxData[TRANSFER_SIZE]; + + // Encoder initialization + // leftEncoder.rise(&leftInterrupt); + // rightEncoder.rise(&rightInterrupt); + + // HCSR04 initialization + hcsr04.startUpdates(); + + // L298 initialization + leftOutA.period_us(1000000.0 / PWM_FREQUENCY); + leftOutB.period_us(1000000.0 / PWM_FREQUENCY); + rightOutA.period_us(1000000.0 / PWM_FREQUENCY); + rightOutB.period_us(1000000.0 / PWM_FREQUENCY); + + // nRF24L01 initialization + nRF24.powerUp(); + nRF24.setRfFrequency(2450); + + #ifdef DEBUG + pc.printf("nRF24L01+ Frequency : %d MHz\r\n", nRF24.getRfFrequency()); + pc.printf("nRF24L01+ Output power : %d dBm\r\n", nRF24.getRfOutputPower()); + pc.printf("nRF24L01+ Data Rate : %d kbps\r\n", nRF24.getAirDataRate()); + pc.printf("nRF24L01+ TX Address : 0x%010llX\r\n", nRF24.getTxAddress()); + pc.printf("nRF24L01+ RX Address : 0x%010llX\r\n", nRF24.getRxAddress()); + #endif + + nRF24.setTransferSize(TRANSFER_SIZE); + + nRF24.setReceiveMode(); + nRF24.enable(); + + // Main loop + while(1) { + if (averagedDistance < 10) { + setSpeed(LEFT, 0.0); + setSpeed(RIGHT, 0.0); + } else { + setSpeed(LEFT, 1.0); + setSpeed(RIGHT, 1.0); + } + + #ifdef DEBUG + pc.printf("Distance: %dcm\r\n", averagedDistance); + #endif + + hcsr04.checkDistance(); + + wait_us(PWM_DELAY_US); + } +} + +/* Left Encoder Interrupt */ +void leftInterrupt() { + debounce.reset(); + debounce.start(); + while (leftEncoder.read()); + debounce.stop(); + + if (debounce.read_ms() >= DEBOUNCE_MS) { + leftCounts++; + + if (leftCounts >= HOLES_ENC) { + leftCounts = 0; + + #ifdef DEBUG + pc.printf("Left spin!\r\n"); + #endif + } + } +} + +/* Right Encoder Interrupt */ +void rightInterrupt() { + debounce.reset(); + debounce.start(); + while (rightEncoder.read()); + debounce.stop(); + + if (debounce.read_ms() >= DEBOUNCE_MS) { + rightCounts++; + + if (rightCounts >= HOLES_ENC) { + rightCounts = 0; + + #ifdef DEBUG + pc.printf("Right spin!\r\n"); + #endif + } + } +} + +/* HC-SR04 Interrupt */ +void distanceUpdate(int distance) { + currentDistance = distance; + + distanceSum -= previousDistance; + distanceSum += currentDistance; + + averagedDistance = distanceSum / N_AVERAGES; + + previousDistance = currentDistance; +} + +/* L298 Set Speed */ +void setSpeed(unsigned char motor, float setSpeed) { + float speed = 0.0; + + // Check for invalid PWM values + if (setSpeed > 1.0) { + speed = 1.0; + } else if (setSpeed < -1.0) { + speed = -1.0; + } else { + speed = setSpeed; + } + + // Left Motor + if (motor == LEFT) { + // Limit PWM variation to fixed step + if (speed > leftSpeed) { + if (speed - leftSpeed > PWM_STEP) { + leftSpeed += PWM_STEP; + } else { + leftSpeed = speed; + } + } else if (speed < leftSpeed) { + if (leftSpeed - speed > PWM_STEP) { + leftSpeed -= PWM_STEP; + } else { + leftSpeed = speed; + } + } + + // Drive L298 inputs according to leftSpeed + if (leftSpeed >= 0.0) { + leftOutA.write(leftSpeed); + leftOutB.write(0.0); + } else { + leftOutA.write(0.0); + leftOutB.write(-leftSpeed); + } + // Right Motor + } else if (motor == RIGHT) { + // Limit PWM variation to fixed step + if (speed > rightSpeed) { + if (speed - rightSpeed > PWM_STEP) { + rightSpeed += PWM_STEP; + } else { + rightSpeed = speed; + } + } else if (speed < rightSpeed) { + if (rightSpeed - speed > PWM_STEP) { + rightSpeed -= PWM_STEP; + } else { + rightSpeed = speed; + } + } + + // Drive L298 inputs according to rightSpeed + if (rightSpeed >= 0.0) { + rightOutA.write(rightSpeed); + rightOutB.write(0.0); + } else { + rightOutA.write(0.0); + rightOutB.write(-rightSpeed); + } + } +} \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed.bld Wed Aug 16 12:36:27 2017 +0000 @@ -0,0 +1,1 @@ +http://mbed.org/users/mbed_official/code/mbed/builds/fd96258d940d \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/nRF24L01P.lib Wed Aug 16 12:36:27 2017 +0000 @@ -0,0 +1,1 @@ +http://developer.mbed.org/users/Owen/code/nRF24L01P/#8ae48233b4e4