Stevie Wray / Mbed 2 deprecated SkyFawkes

Dependencies:   mbed

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?

UserRevisionLine numberNew 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 }