For YRL Robot Arm

Dependents:   PR_RobotArm_Show_Positions

Fork of PR-RobotArmController by James Hilder

Files at this revision

API Documentation at this revision

Comitter:
jah128
Date:
Fri Mar 03 13:37:44 2017 +0000
Parent:
0:b14dfd8816da
Commit message:
fixed wrist bug;

Changed in this revision

SerialHalfDuplex.cpp Show annotated file Show diff for this revision Revisions of this file
SerialHalfDuplex.h Show annotated file Show diff for this revision Revisions of this file
robotarm.cpp Show annotated file Show diff for this revision Revisions of this file
robotarm.h Show annotated file Show diff for this revision Revisions of this file
servo.cpp Show annotated file Show diff for this revision Revisions of this file
diff -r b14dfd8816da -r aa92ba95a4bb SerialHalfDuplex.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/SerialHalfDuplex.cpp	Fri Mar 03 13:37:44 2017 +0000
@@ -0,0 +1,80 @@
+ /* NB This is part of an older MBED library, included so the older code runs on the
+  * newer MBED library.  There is probably a better implementation.... - jah */
+
+ /* mbed Microcontroller Library
+ * Copyright (c) 2006-2012 ARM Limited
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ *
+ * NOTE: This is an unsupported legacy untested library.
+ */
+#include "SerialHalfDuplex.h"
+ 
+#if DEVICE_SERIAL
+ 
+#include "pinmap.h"
+#include "serial_api.h"
+#include "gpio_api.h"
+ 
+namespace mbed {
+ 
+SerialHalfDuplex::SerialHalfDuplex(PinName tx, PinName rx, const char *name)
+    : Serial(tx, rx, name) {
+    _txpin = tx;
+    
+    // set as input 
+    gpio_set(_txpin); 
+    pin_mode(_txpin, PullNone); // no pull
+    pin_function(_txpin, 0);    // set as gpio
+}
+ 
+// To transmit a byte in half duplex mode:
+// 1. Disable interrupts, so we don't trigger on loopback byte
+// 2. Set tx pin to UART out
+// 3. Transmit byte as normal
+// 4. Read back byte from looped back tx pin - this both confirms that the
+//    transmit has occurred, and also clears the byte from the buffer.
+// 5. Return pin to input mode
+// 6. Re-enable interrupts
+ 
+int SerialHalfDuplex::_putc(int c) {
+    int retc;
+    
+    // TODO: We should not disable all interrupts
+    __disable_irq();
+    
+    serial_pinout_tx(_txpin);
+    
+    Serial::_putc(c);
+    retc = Serial::getc();       // reading also clears any interrupt
+    
+    pin_function(_txpin, 0);
+    
+    __enable_irq();
+    
+    return retc;
+}
+ 
+int SerialHalfDuplex::_getc(void) {
+    return Serial::_getc();
+}
+ 
+} // End namespace
+ 
+#endif
\ No newline at end of file
diff -r b14dfd8816da -r aa92ba95a4bb SerialHalfDuplex.h
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/SerialHalfDuplex.h	Fri Mar 03 13:37:44 2017 +0000
@@ -0,0 +1,210 @@
+ /* NB This is part of an older MBED library, included so the older code runs on the
+  * newer MBED library.  There is probably a better implementation.... - jah */
+
+/* mbed Microcontroller Library
+ * Copyright (c) 2006-2012 ARM Limited
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ *
+ * NOTE: This is an unsupported legacy untested library.
+ */
+#ifndef MBED_SERIALHALFDUPLEX_H
+#define MBED_SERIALHALFDUPLEX_H
+
+#include "device.h"
+ 
+#if DEVICE_SERIAL
+ 
+#include "Serial.h"
+#include "PinNames.h"
+#include "PeripheralNames.h"
+ 
+namespace mbed {
+ 
+/* Class: SerialHalfDuplex
+ * A serial port (UART) for communication with other devices using  
+ * Half-Duplex, allowing transmit and receive on a single
+ * shared transmit and receive line. Only one end should be transmitting 
+ * at a time.
+ * 
+ * Both the tx and rx pin should be defined, and wired together. 
+ * This is in addition to them being wired to the other serial 
+ * device to allow both read and write functions to operate.
+ *
+ *  Example:
+ *  > // Send a byte to a second HalfDuplex device, and read the response
+ *  >
+ *  > #include "mbed.h"
+ *  >
+ *  > // p9 and p10 should be wired together to form "a"
+ *  > // p28 and p27 should be wired together to form "b"
+ *  > // p9/p10 should be wired to p28/p27 as the Half Duplex connection
+ *  >
+ *  > SerialHalfDuplex a(p9, p10);
+ *  > SerialHalfDuplex b(p28, p27);
+ *  >
+ *  > void b_rx() { // second device response
+ *  >     b.putc(b.getc() + 4);
+ *  > }
+ *  >   
+ *  > int main() {
+ *  >     b.attach(&b_rx);
+ *  >     for(int c = 'A'; c < 'Z'; c++) {
+ *  >         a.putc(c);
+ *  >         printf("sent [%c]\n", c);
+ *  >         wait(0.5);   // b should respond
+ *  >         if(a.readable()) {
+ *  >             printf("received [%c]\n", a.getc());
+ *  >         }
+ *  >     }
+ *  > }
+ * 
+ * For Simplex and Full-Duplex Serial communication, see <Serial>
+ */
+class SerialHalfDuplex : public Serial {
+ 
+public:
+    /* Constructor: SerialHalfDuplex
+     * Create a half-duplex serial port, connected to the specified transmit
+     * and receive pins.
+     *
+     * These pins should be wired together, as well as to the target device
+     *
+     * Variables:
+     *  tx - Transmit pin
+     *  rx - Receive pin
+     */
+    SerialHalfDuplex(PinName tx, PinName rx, const char *name = NULL);
+ 
+#if 0       // Inherited from Serial class, for documentation
+    /* Function: baud
+     *  Set the baud rate of the serial port
+     *
+     * Variables:
+     *  baudrate - The baudrate of the serial port (default = 9600).
+     */
+    void baud(int baudrate);
+ 
+    enum Parity {
+        None = 0
+        , Odd
+        , Even
+        , Forced1
+        , Forced0
+    };
+ 
+    /* Function: format
+     *  Set the transmission format used by the Serial port
+     *
+     * Variables:
+     *  bits - The number of bits in a word (5-8; default = 8)
+     *  parity - The parity used (Serial::None, Serial::Odd, 
+Serial::Even, Serial::Forced1, Serial::Forced0; default = Serial::None)
+     *  stop - The number of stop bits (1 or 2; default = 1)
+     */
+    void format(int bits = 8, Parity parity = Serial::None, int stop_bits 
+= 1);
+ 
+    /* Function: putc
+     *  Write a character
+     *
+     * Variables:
+     *  c - The character to write to the serial port
+     */
+    int putc(int c);
+ 
+    /* Function: getc
+     *  Read a character
+     *
+     * Read a character from the serial port. This call will block
+     * until a character is available. For testing if a character is
+     * available for reading, see <readable>.
+     *
+     * Variables:
+     *  returns - The character read from the serial port
+     */
+    int getc();
+ 
+    /* Function: printf
+     *  Write a formated string
+     *
+     * Variables:
+     *  format - A printf-style format string, followed by the
+     *      variables to use in formating the string.
+     */
+    int printf(const char* format, ...);
+ 
+    /* Function: scanf
+     *  Read a formated string
+     *
+     * Variables:
+     *  format - A scanf-style format string,
+     *      followed by the pointers to variables to store the results.
+     */
+    int scanf(const char* format, ...);
+ 
+    /* Function: readable
+     *  Determine if there is a character available to read
+     *
+     * Variables:
+     *  returns - 1 if there is a character available to read, else 0
+     */
+    int readable();
+ 
+    /* Function: writeable
+     *  Determine if there is space available to write a character
+     *
+     * Variables:
+     *  returns - 1 if there is space to write a character, else 0
+     */
+    int writeable();
+ 
+    /* Function: attach
+     *  Attach a function to call whenever a serial interrupt is generated
+     *
+     * Variables:
+     *  fptr - A pointer to a void function, or 0 to set as none
+     */
+    void attach(void (*fptr)(void));
+ 
+    /* Function: attach
+     *  Attach a member function to call whenever a serial interrupt is generated
+     *
+     * Variables:
+     *  tptr - pointer to the object to call the member function on
+     *  mptr - pointer to the member function to be called
+     */
+    template<typename T>
+    void attach(T* tptr, void (T::*mptr)(void));
+ 
+#endif
+ 
+protected:
+    PinName     _txpin;
+ 
+    virtual int _putc(int c);
+    virtual int _getc(void);
+ 
+}; // End class SerialHalfDuplex
+ 
+} // End namespace
+ 
+#endif
+ 
+#endif
\ No newline at end of file
diff -r b14dfd8816da -r aa92ba95a4bb robotarm.cpp
--- a/robotarm.cpp	Fri Mar 03 13:28:54 2017 +0000
+++ b/robotarm.cpp	Fri Mar 03 13:37:44 2017 +0000
@@ -20,7 +20,7 @@
 short target_base = 2048;
 short target_shoulder = 2048;
 short target_elbow = 2048;
-short target_wrist = 2048;
+short target_wrist = 512;
 
 void Robotarm::init()
 {
diff -r b14dfd8816da -r aa92ba95a4bb robotarm.h
--- a/robotarm.h	Fri Mar 03 13:28:54 2017 +0000
+++ b/robotarm.h	Fri Mar 03 13:37:44 2017 +0000
@@ -48,6 +48,8 @@
 #define SHOULDER_LIMIT_HIGH 3400
 #define ELBOW_LIMIT_LOW 380
 #define ELBOW_LIMIT_HIGH 3720
+#define WRIST_LIMIT_LOW 300
+#define WRIST_LIMIT_HIGH 700
 #define USE_LIMIT_WARNING 1
 
 #define BASE 10
diff -r b14dfd8816da -r aa92ba95a4bb servo.cpp
--- a/servo.cpp	Fri Mar 03 13:28:54 2017 +0000
+++ b/servo.cpp	Fri Mar 03 13:37:44 2017 +0000
@@ -100,7 +100,7 @@
           case BASE: return BASE_LIMIT_LOW;
           case SHOULDER: return SHOULDER_LIMIT_LOW;
           case ELBOW: return ELBOW_LIMIT_LOW;
-          //case WRIST: return WRIST_LIMIT_LOW;   
+          case WRIST: return WRIST_LIMIT_LOW;   
         }
     }
     return 0;
@@ -114,7 +114,7 @@
           case BASE: return BASE_LIMIT_HIGH;
           case SHOULDER: return SHOULDER_LIMIT_HIGH;
           case ELBOW: return ELBOW_LIMIT_HIGH;
-         // case WRIST: return WRIST_LIMIT_HIGH;   
+          case WRIST: return WRIST_LIMIT_HIGH;   
         }
     }
     return 4095;   
@@ -572,7 +572,7 @@
        case(BASE):if(INVERT_BASE == 1)position=4095-position;break;
        case(SHOULDER):if(INVERT_SHOULDER == 1)position=4095-position;break;
        case(ELBOW):if(INVERT_ELBOW == 1)position=4095-position;break;
-       case(WRIST):if(INVERT_BASE == 1)position=4095-position;break;
+       case(WRIST):if(INVERT_WRIST == 1)position=1023-position;break;
    
     }
     return (position);