Library for Pololu m3pi line-following robot. Implements the serial slave commands. for MBED OS V6
Diff: m3pi.cpp
- Revision:
- 10:c3617fcf2c58
- Parent:
- 9:074ce6197b51
--- a/m3pi.cpp Mon Mar 19 13:06:40 2018 +0000 +++ b/m3pi.cpp Thu Nov 12 22:37:20 2020 +0000 @@ -5,17 +5,17 @@ m3pi::m3pi() { - _serial = new Serial(p9,p10); + _serial = new BufferedSerial(p9,p10); _reset = new DigitalOut(p8); _last_line_position = 0.0; - + // initialise the arrays _bar_graph[0] = ' '; for (int i = 0; i < 6; i++) { - _bar_graph[i+1] = i; + _bar_graph[i+1] = i; } for (int i = 0; i < 5; i++) { - _values[i]=0; + _values[i]=0; } } @@ -30,7 +30,7 @@ void m3pi::init() { - _serial->baud(115200); + _serial->set_baud(115200); reset(); // hard rest of 3pi stop(); // stop motors lcd_clear(); // clear LCD @@ -38,28 +38,41 @@ /////////////////////////////// serial slave commands //////////////////////////////// -void m3pi::scan() +void m3pi::scan() { get_calibrated_values(_values); } void m3pi::get_signature(char *signature) { - _serial->putc(0x81); - _serial->gets(signature,7); + char buff[7]; + //_serial->putc(0x81); + buff[1]=0x81; + _serial->write(buff,1); + //_serial->gets(signature,7); + _serial->read(buff,7); } void m3pi::get_raw_values(unsigned int *values) { + char buff[1]; // send command + while (_serial->readable() ) { // flush buffer - _serial->getc(); + //_serial->getc(); + _serial->sync(); + } - + char vals[10]; // array to receive 10 byte return message - _serial->putc(0x86); // send command + + //_serial->putc(0x86); + buff[0]=0x86; + _serial->write(buff,1); for (int i=0; i < 10; i++) { - vals[i] = _serial->getc(); + //vals[i] = _serial->getc(); + _serial->read(buff,1); + vals[i] = buff[0]; } for(int i=0; i<5; i++) { // construct the 2-byte values @@ -69,28 +82,44 @@ void m3pi::get_calibrated_values(unsigned int *values) { + char buff[1]; + while (_serial->readable() ) { // flush buffer - _serial->getc(); + //_serial->getc(); + _serial->sync(); } - + char vals[10]; // array to receive 10 byte return message - _serial->putc(0x87); // send command - + //_serial->putc(0x87); // send command + buff[0]=0x87; + _serial->write(buff,1); + for (int i=0; i < 10; i++) { - vals[i] = _serial->getc(); + //vals[i] = _serial->getc(); + _serial->read(buff,1); + vals[i] = buff[0]; } - + for(int i=0; i<5; i++) { // construct the 2-byte values values[i] = (vals[2*i+1] << 8) | vals[2*i]; } - + } float m3pi::get_trimpot_value() { - _serial->putc(0xB0); - char lsb = _serial->getc(); - char msb = _serial->getc(); + char buff[1]; + + //_serial->putc(0xB0); + buff[0]=0xB0; + _serial->write(buff,1); + + char lsb;// = _serial->getc(); + _serial->read(buff,1); + lsb = buff[0]; + char msb;// = _serial->getc(); + _serial->read(buff,1); + msb = buff[0]; // trimpot value in the range 0 - 1023 float value = ( msb<<8 | lsb ) / 1023.0; return value; @@ -99,9 +128,16 @@ float m3pi::get_battery_voltage() { - _serial->putc(0xB1); - char lsb = _serial->getc(); - char msb = _serial->getc(); + char buff[1]; + //_serial->putc(0xB1); + buff[0]=0xB1; + _serial->write(buff,1); + char lsb;// = _serial->getc(); + _serial->read(buff,1); + lsb = buff[0]; + char msb;// = _serial->getc(); + _serial->read(buff,1); + msb = buff[0]; // Battery in mV so convert to volts float voltage = ( msb<<8 | lsb ) / 1000.0; return voltage; @@ -109,33 +145,55 @@ void m3pi::play_music(const char notes[],int length) { + char buff[1]; + length = length < 0 ? 0 : length; length = length > 100 ? 100 : length; - _serial->putc(0xB3); - _serial->putc(length); + //_serial->putc(0xB3); + buff[0]=0xB3; + _serial->write(buff,1); + + //_serial->putc(length); + buff[0]=length; + _serial->write(buff,1); for (int i = 0 ; i < length ; i++) { - _serial->putc(notes[i]); + //_serial->putc(notes[i]); + buff[0]=notes[i]; + _serial->write(buff,1); } } void m3pi::calibrate() { - _serial->putc(0xB4); + char buff[1]; + //_serial->putc(0xB4); + buff[0]=0xB4; + _serial->write(buff,1); } void m3pi::reset_calibration() { - _serial->putc(0xB5); + char buff[1]; + //_serial->putc(0xB5); + buff[0]=0xB5; + _serial->write(buff,1); } float m3pi::get_line_position() { - _serial->putc(0xB6); + char buff[1]; + //_serial->putc(0xB6); + buff[0]=0xB6; + _serial->write(buff,1); - char lsb = _serial->getc(); - char msb = _serial->getc(); + char lsb;// = _serial->getc(); + _serial->read(buff,1); + lsb = buff[0]; + char msb;// = _serial->getc(); + _serial->read(buff,1); + msb = buff[0]; int position = (msb<<8 | lsb); return float(position - 2000)/2000.0; @@ -143,33 +201,55 @@ void m3pi::lcd_clear() { - _serial->putc(0xB7); + char buff[1]; + //_serial->putc(0xB7); + buff[0]=0xB7; + _serial->write(buff,1); } void m3pi::lcd_print(char text[],int length) { + char buff[1]; + length = length < 0 ? 0 : length; length = length > 8 ? 8 : length; - _serial->putc(0xB8); - _serial->putc(length); + //_serial->putc(0xB8); + buff[0]=0xB8; + _serial->write(buff,1); + + //_serial->putc(length); + buff[0]=length; + _serial->write(buff,1); for (int i = 0 ; i < length ; i++) { - _serial->putc(text[i]); + //_serial->putc(text[i]); + buff[0]=text[i]; + _serial->write(buff,1); } } void m3pi::lcd_goto_xy(int x, int y) { - _serial->putc(0xB9); - _serial->putc(x); - _serial->putc(y); + char buff[1]; + //_serial->putc(0xB9); + buff[0]=0xB9; + _serial->write(buff,1); + //_serial->putc(x); + buff[0]=x; + _serial->write(buff,1); + //_serial->putc(y); + buff[0]=y; + _serial->write(buff,1); } void m3pi::auto_calibrate() { - _serial->putc(0xBA); - + char buff[1]; + //_serial->putc(0xBA); + buff[0]=0xBA; + _serial->write(buff,1); + while(1) { // wait for serial response if (_serial->readable()) { break; @@ -181,36 +261,54 @@ void m3pi::left_motor(float speed) { + char buff[1]; // check within bounds speed = speed > 1.0 ? 1.0 : speed; speed = speed < -1.0 ? -1.0 : speed; if (speed > 0.0) { // forward - _serial->putc(0xC1); + //_serial->putc(0xC1); + buff[0]=0xC1; + _serial->write(buff,1); char s = char(127.0*speed); - _serial->putc(s); + //_serial->putc(s); + buff[0]=s; + _serial->write(buff,1); } else { // backward - speed is negative - _serial->putc(0xC2); + //_serial->putc(0xC2); + buff[0]=0xC2; + _serial->write(buff,1); char s = char(-127.0*speed); - _serial->putc(s); + //_serial->putc(s); + buff[0]=s; + _serial->write(buff,1); } } void m3pi::right_motor(float speed) { + char buff[1]; // check within bounds speed = speed > 1.0 ? 1.0 : speed; speed = speed < -1.0 ? -1.0 : speed; if (speed > 0.0) { // forward - _serial->putc(0xC5); + //_serial->putc(0xC5); + buff[0]=0xC5; + _serial->write(buff,1); char s = char(127.0*speed); - _serial->putc(s); + //_serial->putc(s); + buff[0]=s; + _serial->write(buff,1); } else { // backward - speed is negative - _serial->putc(0xC6); + //_serial->putc(0xC6); + buff[0]=0xC6; + _serial->write(buff,1); char s = char(-127.0*speed); - _serial->putc(s); + //_serial->putc(s); + buff[0]=s; + _serial->write(buff,1); } } @@ -281,9 +379,15 @@ void m3pi::display_signature(int x,int y) { - _serial->putc(0x81); - char buffer[7]; // including NULL terminator - _serial->gets(buffer,7); + char buffer[7]; // including NULL terminator + + //_serial->putc(0x81); + buffer[0]=0x81; + _serial->write(buffer,1); + + + //_serial->gets(buffer,7); + _serial->read(buffer,7); lcd_goto_xy(x,y); lcd_print(buffer,6); @@ -293,31 +397,31 @@ { // initialise array to ASCII '0' lcd_goto_xy(1,y); - + char sensor_values[5]; - + // loop through sensor for (int sensor = 0 ; sensor < 5 ; sensor++) { - // get the value and put it in the correct bin + // get the value and put it in the correct bin // (7 bins in the range 0 to 1000 - char value = char(values[sensor]/(1000.0/7.0)); + char value = char(values[sensor]/(1000.0/7.0)); // use the bin to select the bar graph icon to display sensor_values[sensor] = _bar_graph[value]; - } - + } + lcd_print(sensor_values,5); } -void m3pi::display_data() +void m3pi::display_data() { - display_sensor_values(_values,1); - - char buffer[8]={0}; + display_sensor_values(_values,1); + + char buffer[8]= {0}; sprintf(buffer,"% .3f",_last_line_position); lcd_goto_xy(0,0); - lcd_print(buffer,6); - + lcd_print(buffer,6); + } unsigned int m3pi::get_sensor_array_value(unsigned int values[]) @@ -368,18 +472,20 @@ return _last_line_position; } -float m3pi::read_line() { - return calc_line_position(_values); +float m3pi::read_line() +{ + return calc_line_position(_values); } + /////////////////////////////// private methods //////////////////////////////// void m3pi::reset() { // pulse the reset line (active-high) _reset->write(1); - wait_ms(100); + ThisThread::sleep_for(100ms); _reset->write(0); - wait_ms(100); + ThisThread::sleep_for(100ms); } \ No newline at end of file