Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
main.cpp@0:d665d69947ab, 2019-02-23 (annotated)
- Committer:
- Stevie
- Date:
- Sat Feb 23 14:16:20 2019 +0000
- Revision:
- 0:d665d69947ab
- Child:
- 1:08315c315df0
Working SPI communications to set simple motor speed (no closed loop control)
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
Stevie | 0:d665d69947ab | 1 | #include "mbed.h" |
Stevie | 0:d665d69947ab | 2 | |
Stevie | 0:d665d69947ab | 3 | SPISlave rpi(PB_5, PB_4, PB_3, PA_15); //setup SPI pins to talk to the raspberry pi |
Stevie | 0:d665d69947ab | 4 | //PA_9 - MLB //PA_8 - MLF //PA_10 - MRF //PA_11 - MRB |
Stevie | 0:d665d69947ab | 5 | PwmOut MRB(PA_11); //back right motor |
Stevie | 0:d665d69947ab | 6 | PwmOut MRF(PA_10); //front right motor |
Stevie | 0:d665d69947ab | 7 | PwmOut MLB(PA_9); //back left motor |
Stevie | 0:d665d69947ab | 8 | PwmOut MLF(PA_8); //front left motor |
Stevie | 0:d665d69947ab | 9 | DigitalOut RAIN1(PC_6); //PC_9 - Left //PC_6 - Right |
Stevie | 0:d665d69947ab | 10 | DigitalOut RAIN2(PB_9); // PC_8 - Left //PB_9 - Right |
Stevie | 0:d665d69947ab | 11 | DigitalOut RSTANDBY(PC_5); //PB_8 - Left //PC_5 - Right |
Stevie | 0:d665d69947ab | 12 | DigitalOut LAIN1(PC_9); |
Stevie | 0:d665d69947ab | 13 | DigitalOut LAIN2(PC_8); |
Stevie | 0:d665d69947ab | 14 | DigitalOut LSTANDBY(PB_8); |
Stevie | 0:d665d69947ab | 15 | //InterruptIn ENCODER1(PC_7); //PC_12 - MLB //PC_11 - MLF //PB_7 - MRF //PB_6 - MRB |
Stevie | 0:d665d69947ab | 16 | //DigitalIn ENCODER2(PB_6); //PD_2 - MLB //PC_10 - MLF //PA_13 - MRF //PC_7 - MRB |
Stevie | 0:d665d69947ab | 17 | int m_speed_ref [4] = {0,0,0,0}; //setup array for 4 motor speeds |
Stevie | 0:d665d69947ab | 18 | float m_duty [4] = {0.0, 0.0, 0.0, 0.0}; //setup array for motor pwm duty |
Stevie | 0:d665d69947ab | 19 | int m_distance_ref [4] = {0,0,0,0}; //setup array for 4 motor distances |
Stevie | 0:d665d69947ab | 20 | int max_accel = 0; //for storing the maximum acceleration |
Stevie | 0:d665d69947ab | 21 | int adc_values[10] = {0,0,0,0,0,0,0,0,0,0}; //setup array for ADC values |
Stevie | 0:d665d69947ab | 22 | |
Stevie | 0:d665d69947ab | 23 | |
Stevie | 0:d665d69947ab | 24 | int main() |
Stevie | 0:d665d69947ab | 25 | { |
Stevie | 0:d665d69947ab | 26 | int i = 0; //temp counter variable |
Stevie | 0:d665d69947ab | 27 | int v = 0; //temp SPI variable |
Stevie | 0:d665d69947ab | 28 | |
Stevie | 0:d665d69947ab | 29 | //setup driver pins |
Stevie | 0:d665d69947ab | 30 | LAIN1 = 1; |
Stevie | 0:d665d69947ab | 31 | LAIN2 = 0; |
Stevie | 0:d665d69947ab | 32 | LSTANDBY = 1; |
Stevie | 0:d665d69947ab | 33 | RAIN1 = 1; |
Stevie | 0:d665d69947ab | 34 | RAIN2 = 0; |
Stevie | 0:d665d69947ab | 35 | RSTANDBY = 1; |
Stevie | 0:d665d69947ab | 36 | // Set PWM |
Stevie | 0:d665d69947ab | 37 | MRB.period_us(100); |
Stevie | 0:d665d69947ab | 38 | MRB.write(0.0); |
Stevie | 0:d665d69947ab | 39 | MRF.period_us(100); |
Stevie | 0:d665d69947ab | 40 | MRF.write(0.0); |
Stevie | 0:d665d69947ab | 41 | MLB.period_us(100); |
Stevie | 0:d665d69947ab | 42 | MLB.write(0.0); |
Stevie | 0:d665d69947ab | 43 | MLF.period_us(100); |
Stevie | 0:d665d69947ab | 44 | MLF.write(0.0); |
Stevie | 0:d665d69947ab | 45 | |
Stevie | 0:d665d69947ab | 46 | //setup Spi |
Stevie | 0:d665d69947ab | 47 | // rpi.reply(0x00); //set default reply |
Stevie | 0:d665d69947ab | 48 | |
Stevie | 0:d665d69947ab | 49 | while (1) { |
Stevie | 0:d665d69947ab | 50 | |
Stevie | 0:d665d69947ab | 51 | //write motor speed |
Stevie | 0:d665d69947ab | 52 | for (i=0;i<=3;i++){ |
Stevie | 0:d665d69947ab | 53 | m_duty[i] = float(m_speed_ref[i])/100.0; |
Stevie | 0:d665d69947ab | 54 | } |
Stevie | 0:d665d69947ab | 55 | /* MRB.write(m_speed_ref[0]/100); |
Stevie | 0:d665d69947ab | 56 | MRF.write(m_speed_ref[1]/100); |
Stevie | 0:d665d69947ab | 57 | MLB.write(m_speed_ref[2]/100); |
Stevie | 0:d665d69947ab | 58 | MLF.write(m_speed_ref[3]/100); */ |
Stevie | 0:d665d69947ab | 59 | MRB.write(m_duty[0]); |
Stevie | 0:d665d69947ab | 60 | MRF.write(m_duty[1]); |
Stevie | 0:d665d69947ab | 61 | MLB.write(m_duty[2]); |
Stevie | 0:d665d69947ab | 62 | MLF.write(m_duty[3]); |
Stevie | 0:d665d69947ab | 63 | |
Stevie | 0:d665d69947ab | 64 | //do SPI communication stuff |
Stevie | 0:d665d69947ab | 65 | if(rpi.receive()) { |
Stevie | 0:d665d69947ab | 66 | v = rpi.read(); // Read byte from master |
Stevie | 0:d665d69947ab | 67 | if(v == char('S')){ |
Stevie | 0:d665d69947ab | 68 | rpi.reply(0x01); |
Stevie | 0:d665d69947ab | 69 | for (i=0;i<=3;i++){ |
Stevie | 0:d665d69947ab | 70 | m_speed_ref[i] = rpi.read() - 128; |
Stevie | 0:d665d69947ab | 71 | rpi.reply(m_speed_ref[i]); |
Stevie | 0:d665d69947ab | 72 | } |
Stevie | 0:d665d69947ab | 73 | v = rpi.read(); //last bit setup a blank reply |
Stevie | 0:d665d69947ab | 74 | rpi.reply(0x00); |
Stevie | 0:d665d69947ab | 75 | } |
Stevie | 0:d665d69947ab | 76 | else if(v == char('D')){ |
Stevie | 0:d665d69947ab | 77 | rpi.reply(0x02); |
Stevie | 0:d665d69947ab | 78 | for (i=0;i<=3;i++){ |
Stevie | 0:d665d69947ab | 79 | m_speed_ref[i] = rpi.read() - 128; |
Stevie | 0:d665d69947ab | 80 | rpi.reply(m_speed_ref[i]); |
Stevie | 0:d665d69947ab | 81 | } |
Stevie | 0:d665d69947ab | 82 | for (i=0;i<=3;i++){ |
Stevie | 0:d665d69947ab | 83 | m_distance_ref[i] = rpi.read() - 128; |
Stevie | 0:d665d69947ab | 84 | rpi.reply(m_distance_ref[i]); |
Stevie | 0:d665d69947ab | 85 | } |
Stevie | 0:d665d69947ab | 86 | v = rpi.read(); //last bit setup a blank reply |
Stevie | 0:d665d69947ab | 87 | rpi.reply(0x00); |
Stevie | 0:d665d69947ab | 88 | } |
Stevie | 0:d665d69947ab | 89 | else if(v == char('A')){ |
Stevie | 0:d665d69947ab | 90 | rpi.reply(0x03); |
Stevie | 0:d665d69947ab | 91 | max_accel = rpi.read(); |
Stevie | 0:d665d69947ab | 92 | rpi.reply(max_accel); |
Stevie | 0:d665d69947ab | 93 | v = rpi.read(); //last bit setup a blank reply |
Stevie | 0:d665d69947ab | 94 | rpi.reply(0x00); |
Stevie | 0:d665d69947ab | 95 | } |
Stevie | 0:d665d69947ab | 96 | else if(v == char('V')){ |
Stevie | 0:d665d69947ab | 97 | rpi.reply(0x04); |
Stevie | 0:d665d69947ab | 98 | v = rpi.read(); |
Stevie | 0:d665d69947ab | 99 | if(v <= 9){ //check the ADC to be addressed exists |
Stevie | 0:d665d69947ab | 100 | rpi.reply(adc_values[v]); |
Stevie | 0:d665d69947ab | 101 | } |
Stevie | 0:d665d69947ab | 102 | v = rpi.read(); //last bit setup a blank reply |
Stevie | 0:d665d69947ab | 103 | rpi.reply(0x00); |
Stevie | 0:d665d69947ab | 104 | } |
Stevie | 0:d665d69947ab | 105 | } |
Stevie | 0:d665d69947ab | 106 | } |
Stevie | 0:d665d69947ab | 107 | } |