PSI3422_Aula3
Dependencies: HC_SR04_Ultrasonic_Library mbed nRF24L01P
main.cpp
- Committer:
- gabrielkim13
- Date:
- 2017-08-16
- Revision:
- 0:48e6560d23a5
File content as of revision 0:48e6560d23a5:
/* 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);
}
}
}