Team 5 AUH / Mbed 2 deprecated Team5_AUH_robot

Dependencies:   mbed

Fork of Team5_AUH_robot by Kasper Martensen

Committer:
mathiasbergma
Date:
Mon Nov 09 15:13:17 2020 +0000
Revision:
17:d6e8234ffc91

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mathiasbergma 17:d6e8234ffc91 1 /* m3pi Library
mathiasbergma 17:d6e8234ffc91 2 *
mathiasbergma 17:d6e8234ffc91 3 * Copyright (c) 2007-2010 cstyles
mathiasbergma 17:d6e8234ffc91 4 *
mathiasbergma 17:d6e8234ffc91 5 * Permission is hereby granted, free of charge, to any person obtaining a copy
mathiasbergma 17:d6e8234ffc91 6 * of this software and associated documentation files (the "Software"), to deal
mathiasbergma 17:d6e8234ffc91 7 * in the Software without restriction, including without limitation the rights
mathiasbergma 17:d6e8234ffc91 8 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
mathiasbergma 17:d6e8234ffc91 9 * copies of the Software, and to permit persons to whom the Software is
mathiasbergma 17:d6e8234ffc91 10 * furnished to do so, subject to the following conditions:
mathiasbergma 17:d6e8234ffc91 11 *
mathiasbergma 17:d6e8234ffc91 12 * The above copyright notice and this permission notice shall be included in
mathiasbergma 17:d6e8234ffc91 13 * all copies or substantial portions of the Software.
mathiasbergma 17:d6e8234ffc91 14 *
mathiasbergma 17:d6e8234ffc91 15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
mathiasbergma 17:d6e8234ffc91 16 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
mathiasbergma 17:d6e8234ffc91 17 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
mathiasbergma 17:d6e8234ffc91 18 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
mathiasbergma 17:d6e8234ffc91 19 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
mathiasbergma 17:d6e8234ffc91 20 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
mathiasbergma 17:d6e8234ffc91 21 * THE SOFTWARE.
mathiasbergma 17:d6e8234ffc91 22 */
mathiasbergma 17:d6e8234ffc91 23 //test
mathiasbergma 17:d6e8234ffc91 24 #include "mbed.h"
mathiasbergma 17:d6e8234ffc91 25 #include "m3pi.h"
mathiasbergma 17:d6e8234ffc91 26
mathiasbergma 17:d6e8234ffc91 27 m3pi::m3pi(PinName nrst, PinName tx, PinName rx) : Stream("m3pi"), _nrst(nrst), _ser(tx, rx) {
mathiasbergma 17:d6e8234ffc91 28 _ser.baud(115200);
mathiasbergma 17:d6e8234ffc91 29 reset();
mathiasbergma 17:d6e8234ffc91 30 }
mathiasbergma 17:d6e8234ffc91 31
mathiasbergma 17:d6e8234ffc91 32 m3pi::m3pi() : Stream("m3pi"), _nrst(p23), _ser(p9, p10) {
mathiasbergma 17:d6e8234ffc91 33 _ser.baud(115200);
mathiasbergma 17:d6e8234ffc91 34 reset();
mathiasbergma 17:d6e8234ffc91 35 }
mathiasbergma 17:d6e8234ffc91 36
mathiasbergma 17:d6e8234ffc91 37
mathiasbergma 17:d6e8234ffc91 38 void m3pi::reset () {
mathiasbergma 17:d6e8234ffc91 39 _nrst = 0;
mathiasbergma 17:d6e8234ffc91 40 wait (0.01);
mathiasbergma 17:d6e8234ffc91 41 _nrst = 1;
mathiasbergma 17:d6e8234ffc91 42 wait (0.1);
mathiasbergma 17:d6e8234ffc91 43 }
mathiasbergma 17:d6e8234ffc91 44
mathiasbergma 17:d6e8234ffc91 45 void m3pi::left_motor (float speed) {
mathiasbergma 17:d6e8234ffc91 46 motor(0,speed);
mathiasbergma 17:d6e8234ffc91 47 }
mathiasbergma 17:d6e8234ffc91 48
mathiasbergma 17:d6e8234ffc91 49 void m3pi::right_motor (float speed) {
mathiasbergma 17:d6e8234ffc91 50 motor(1,speed);
mathiasbergma 17:d6e8234ffc91 51 }
mathiasbergma 17:d6e8234ffc91 52
mathiasbergma 17:d6e8234ffc91 53 void m3pi::forward (float speed) {
mathiasbergma 17:d6e8234ffc91 54 motor(0,speed);
mathiasbergma 17:d6e8234ffc91 55 motor(1,speed);
mathiasbergma 17:d6e8234ffc91 56 }
mathiasbergma 17:d6e8234ffc91 57
mathiasbergma 17:d6e8234ffc91 58 void m3pi::backward (float speed) {
mathiasbergma 17:d6e8234ffc91 59 motor(0,-1.0*speed);
mathiasbergma 17:d6e8234ffc91 60 motor(1,-1.0*speed);
mathiasbergma 17:d6e8234ffc91 61 }
mathiasbergma 17:d6e8234ffc91 62
mathiasbergma 17:d6e8234ffc91 63 void m3pi::left (float speed) {
mathiasbergma 17:d6e8234ffc91 64 motor(0,speed);
mathiasbergma 17:d6e8234ffc91 65 motor(1,-1.0*speed);
mathiasbergma 17:d6e8234ffc91 66 }
mathiasbergma 17:d6e8234ffc91 67
mathiasbergma 17:d6e8234ffc91 68 void m3pi::right (float speed) {
mathiasbergma 17:d6e8234ffc91 69 motor(0,-1.0*speed);
mathiasbergma 17:d6e8234ffc91 70 motor(1,speed);
mathiasbergma 17:d6e8234ffc91 71 }
mathiasbergma 17:d6e8234ffc91 72
mathiasbergma 17:d6e8234ffc91 73 void m3pi::stop (void) {
mathiasbergma 17:d6e8234ffc91 74 motor(0,0.0);
mathiasbergma 17:d6e8234ffc91 75 motor(1,0.0);
mathiasbergma 17:d6e8234ffc91 76 }
mathiasbergma 17:d6e8234ffc91 77
mathiasbergma 17:d6e8234ffc91 78 void m3pi::motor (int motor, float speed) {
mathiasbergma 17:d6e8234ffc91 79 char opcode = 0x0;
mathiasbergma 17:d6e8234ffc91 80 if (speed > 0.0) {
mathiasbergma 17:d6e8234ffc91 81 if (motor==1)
mathiasbergma 17:d6e8234ffc91 82 opcode = M1_FORWARD;
mathiasbergma 17:d6e8234ffc91 83 else
mathiasbergma 17:d6e8234ffc91 84 opcode = M2_FORWARD;
mathiasbergma 17:d6e8234ffc91 85 } else {
mathiasbergma 17:d6e8234ffc91 86 if (motor==1)
mathiasbergma 17:d6e8234ffc91 87 opcode = M1_BACKWARD;
mathiasbergma 17:d6e8234ffc91 88 else
mathiasbergma 17:d6e8234ffc91 89 opcode = M2_BACKWARD;
mathiasbergma 17:d6e8234ffc91 90 }
mathiasbergma 17:d6e8234ffc91 91 unsigned char arg = 0x7f * abs(speed);
mathiasbergma 17:d6e8234ffc91 92
mathiasbergma 17:d6e8234ffc91 93 _ser.putc(opcode);
mathiasbergma 17:d6e8234ffc91 94 _ser.putc(arg);
mathiasbergma 17:d6e8234ffc91 95 }
mathiasbergma 17:d6e8234ffc91 96
mathiasbergma 17:d6e8234ffc91 97 float m3pi::battery() {
mathiasbergma 17:d6e8234ffc91 98 _ser.putc(SEND_BATTERY_MILLIVOLTS);
mathiasbergma 17:d6e8234ffc91 99 char lowbyte = _ser.getc();
mathiasbergma 17:d6e8234ffc91 100 char hibyte = _ser.getc();
mathiasbergma 17:d6e8234ffc91 101 float v = ((lowbyte + (hibyte << 8))/1000.0);
mathiasbergma 17:d6e8234ffc91 102 return(v);
mathiasbergma 17:d6e8234ffc91 103 }
mathiasbergma 17:d6e8234ffc91 104
mathiasbergma 17:d6e8234ffc91 105 float m3pi::line_position() {
mathiasbergma 17:d6e8234ffc91 106 int pos = 0;
mathiasbergma 17:d6e8234ffc91 107 _ser.putc(SEND_LINE_POSITION);
mathiasbergma 17:d6e8234ffc91 108 pos = _ser.getc();
mathiasbergma 17:d6e8234ffc91 109 pos += _ser.getc() << 8;
mathiasbergma 17:d6e8234ffc91 110
mathiasbergma 17:d6e8234ffc91 111 float fpos = ((float)pos - 2048.0)/2048.0;
mathiasbergma 17:d6e8234ffc91 112 return(fpos);
mathiasbergma 17:d6e8234ffc91 113 }
mathiasbergma 17:d6e8234ffc91 114
mathiasbergma 17:d6e8234ffc91 115 char m3pi::sensor_auto_calibrate() {
mathiasbergma 17:d6e8234ffc91 116 _ser.putc(AUTO_CALIBRATE);
mathiasbergma 17:d6e8234ffc91 117 return(_ser.getc());
mathiasbergma 17:d6e8234ffc91 118 }
mathiasbergma 17:d6e8234ffc91 119
mathiasbergma 17:d6e8234ffc91 120
mathiasbergma 17:d6e8234ffc91 121 void m3pi::calibrate(void) {
mathiasbergma 17:d6e8234ffc91 122 _ser.putc(PI_CALIBRATE);
mathiasbergma 17:d6e8234ffc91 123 }
mathiasbergma 17:d6e8234ffc91 124
mathiasbergma 17:d6e8234ffc91 125 void m3pi::reset_calibration() {
mathiasbergma 17:d6e8234ffc91 126 _ser.putc(LINE_SENSORS_RESET_CALIBRATION);
mathiasbergma 17:d6e8234ffc91 127 }
mathiasbergma 17:d6e8234ffc91 128
mathiasbergma 17:d6e8234ffc91 129 void m3pi::PID_start(int max_speed, int a, int b, int c, int d) {
mathiasbergma 17:d6e8234ffc91 130 _ser.putc(max_speed);
mathiasbergma 17:d6e8234ffc91 131 _ser.putc(a);
mathiasbergma 17:d6e8234ffc91 132 _ser.putc(b);
mathiasbergma 17:d6e8234ffc91 133 _ser.putc(c);
mathiasbergma 17:d6e8234ffc91 134 _ser.putc(d);
mathiasbergma 17:d6e8234ffc91 135 }
mathiasbergma 17:d6e8234ffc91 136
mathiasbergma 17:d6e8234ffc91 137 void m3pi::PID_stop() {
mathiasbergma 17:d6e8234ffc91 138 _ser.putc(STOP_PID);
mathiasbergma 17:d6e8234ffc91 139 }
mathiasbergma 17:d6e8234ffc91 140
mathiasbergma 17:d6e8234ffc91 141 float m3pi::pot_voltage(void) {
mathiasbergma 17:d6e8234ffc91 142 int volt = 0;
mathiasbergma 17:d6e8234ffc91 143 _ser.putc(SEND_TRIMPOT);
mathiasbergma 17:d6e8234ffc91 144 volt = _ser.getc();
mathiasbergma 17:d6e8234ffc91 145 volt += _ser.getc() << 8;
mathiasbergma 17:d6e8234ffc91 146 return(volt);
mathiasbergma 17:d6e8234ffc91 147 }
mathiasbergma 17:d6e8234ffc91 148
mathiasbergma 17:d6e8234ffc91 149
mathiasbergma 17:d6e8234ffc91 150 void m3pi::leds(int val) {
mathiasbergma 17:d6e8234ffc91 151
mathiasbergma 17:d6e8234ffc91 152 BusOut _leds(p20,p19,p18,p17,p16,p15,p14,p13);
mathiasbergma 17:d6e8234ffc91 153 _leds = val;
mathiasbergma 17:d6e8234ffc91 154 }
mathiasbergma 17:d6e8234ffc91 155
mathiasbergma 17:d6e8234ffc91 156
mathiasbergma 17:d6e8234ffc91 157 void m3pi::locate(int x, int y) {
mathiasbergma 17:d6e8234ffc91 158 _ser.putc(DO_LCD_GOTO_XY);
mathiasbergma 17:d6e8234ffc91 159 _ser.putc(x);
mathiasbergma 17:d6e8234ffc91 160 _ser.putc(y);
mathiasbergma 17:d6e8234ffc91 161 }
mathiasbergma 17:d6e8234ffc91 162
mathiasbergma 17:d6e8234ffc91 163 void m3pi::cls(void) {
mathiasbergma 17:d6e8234ffc91 164 _ser.putc(DO_CLEAR);
mathiasbergma 17:d6e8234ffc91 165 }
mathiasbergma 17:d6e8234ffc91 166
mathiasbergma 17:d6e8234ffc91 167 int m3pi::print (char* text, int length) {
mathiasbergma 17:d6e8234ffc91 168 _ser.putc(DO_PRINT);
mathiasbergma 17:d6e8234ffc91 169 _ser.putc(length);
mathiasbergma 17:d6e8234ffc91 170 for (int i = 0 ; i < length ; i++) {
mathiasbergma 17:d6e8234ffc91 171 _ser.putc(text[i]);
mathiasbergma 17:d6e8234ffc91 172 }
mathiasbergma 17:d6e8234ffc91 173 return(0);
mathiasbergma 17:d6e8234ffc91 174 }
mathiasbergma 17:d6e8234ffc91 175
mathiasbergma 17:d6e8234ffc91 176 int m3pi::_putc (int c) {
mathiasbergma 17:d6e8234ffc91 177 _ser.putc(DO_PRINT);
mathiasbergma 17:d6e8234ffc91 178 _ser.putc(0x1);
mathiasbergma 17:d6e8234ffc91 179 _ser.putc(c);
mathiasbergma 17:d6e8234ffc91 180 wait (0.001);
mathiasbergma 17:d6e8234ffc91 181 return(c);
mathiasbergma 17:d6e8234ffc91 182 }
mathiasbergma 17:d6e8234ffc91 183
mathiasbergma 17:d6e8234ffc91 184 int m3pi::_getc (void) {
mathiasbergma 17:d6e8234ffc91 185 char r = 0;
mathiasbergma 17:d6e8234ffc91 186 return(r);
mathiasbergma 17:d6e8234ffc91 187 }
mathiasbergma 17:d6e8234ffc91 188
mathiasbergma 17:d6e8234ffc91 189 int m3pi::putc (int c) {
mathiasbergma 17:d6e8234ffc91 190 return(_ser.putc(c));
mathiasbergma 17:d6e8234ffc91 191 }
mathiasbergma 17:d6e8234ffc91 192
mathiasbergma 17:d6e8234ffc91 193 int m3pi::getc (void) {
mathiasbergma 17:d6e8234ffc91 194 return(_ser.getc());
mathiasbergma 17:d6e8234ffc91 195 }
mathiasbergma 17:d6e8234ffc91 196
mathiasbergma 17:d6e8234ffc91 197
mathiasbergma 17:d6e8234ffc91 198
mathiasbergma 17:d6e8234ffc91 199
mathiasbergma 17:d6e8234ffc91 200
mathiasbergma 17:d6e8234ffc91 201 #ifdef MBED_RPC
mathiasbergma 17:d6e8234ffc91 202 const rpc_method *m3pi::get_rpc_methods() {
mathiasbergma 17:d6e8234ffc91 203 static const rpc_method rpc_methods[] = {{ "forward", rpc_method_caller<m3pi, float, &m3pi::forward> },
mathiasbergma 17:d6e8234ffc91 204 { "backward", rpc_method_caller<m3pi, float, &m3pi::backward> },
mathiasbergma 17:d6e8234ffc91 205 { "left", rpc_method_caller<m3pi, float, &m3pi::left> },
mathiasbergma 17:d6e8234ffc91 206 { "right", rpc_method_caller<m3pi, float, &m3pi::right> },
mathiasbergma 17:d6e8234ffc91 207 { "stop", rpc_method_caller<m3pi, &m3pi::stop> },
mathiasbergma 17:d6e8234ffc91 208 { "left_motor", rpc_method_caller<m3pi, float, &m3pi::left_motor> },
mathiasbergma 17:d6e8234ffc91 209 { "right_motor", rpc_method_caller<m3pi, float, &m3pi::right_motor> },
mathiasbergma 17:d6e8234ffc91 210 { "battery", rpc_method_caller<float, m3pi, &m3pi::battery> },
mathiasbergma 17:d6e8234ffc91 211 { "line_position", rpc_method_caller<float, m3pi, &m3pi::line_position> },
mathiasbergma 17:d6e8234ffc91 212 { "sensor_auto_calibrate", rpc_method_caller<char, m3pi, &m3pi::sensor_auto_calibrate> },
mathiasbergma 17:d6e8234ffc91 213
mathiasbergma 17:d6e8234ffc91 214
mathiasbergma 17:d6e8234ffc91 215 RPC_METHOD_SUPER(Base)
mathiasbergma 17:d6e8234ffc91 216 };
mathiasbergma 17:d6e8234ffc91 217 return rpc_methods;
mathiasbergma 17:d6e8234ffc91 218 }
mathiasbergma 17:d6e8234ffc91 219 #endif