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.
Revision 6:8a0250a4877a, committed 2015-02-11
- Comitter:
- therobotstudio
- Date:
- Wed Feb 11 16:18:15 2015 +0000
- Parent:
- 5:52e3137c2831
- Commit message:
- v1.0.0
Changed in this revision
--- a/include/eposCmd.h Wed Oct 29 13:40:24 2014 +0000 +++ b/include/eposCmd.h Wed Feb 11 16:18:15 2015 +0000 @@ -1,13 +1,41 @@ +/* + * Copyright (c) 2013, The Robot Studio + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * Created on: Feb 27, 2013 + * Author: Cyril Jourdan (cyril.jourdan@therobotstudio.com) + */ + #ifndef EPOSCMD_H #define EPOSCMD_H -//includes +/*** Includes ***/ #include "mbed.h" #include <stdint.h> - #include "registers.h" -//Define +/*** Define s ***/ #define NUMBER_MAX_EPOS2_PER_SLAVE 15 #define NUMBER_MSG_PER_PACKET 45 #define NUMBER_BYTES_PER_MSG 8
--- a/include/registers.h Wed Oct 29 13:40:24 2014 +0000 +++ b/include/registers.h Wed Feb 11 16:18:15 2015 +0000 @@ -1,3 +1,32 @@ +/* + * Copyright (c) 2013, The Robot Studio + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * Created on: Feb 27, 2013 + * Author: Cyril Jourdan (cyril.jourdan@therobotstudio.com) + */ + #ifndef REGISTERS_H #define REGISTERS_H
--- a/main.cpp Wed Oct 29 13:40:24 2014 +0000
+++ b/main.cpp Wed Feb 11 16:18:15 2015 +0000
@@ -1,9 +1,39 @@
+/*
+ * Copyright (c) 2013, The Robot Studio
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright notice, this
+ * list of conditions and the following disclaimer.
+ *
+ * * Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * Created on: Feb 27, 2013
+ * Author: Cyril Jourdan (cyril.jourdan@therobotstudio.com)
+ */
+
#define COMPILE_MAIN_CODE_TRS_SLAVE
#ifdef COMPILE_MAIN_CODE_TRS_SLAVE
-//include files
+/*** Includes ***/
#include "include/eposCmd.h"
+/*** Defines ***/
#define OPEN_ARROW 0x3C //< = 60
#define CLOSE_ARROW 0x3E //< = 62
#define NUMBER_OF_ARROWS 5
@@ -16,6 +46,7 @@
#define CALIB_DELAY 1500
#define NUMBER_OF_CALIB 1
+/*** Variables ***/
SPISlave device(p5, p6, p7, p8); // mosi, miso, sclk, ssel
DigitalIn sync_master(p11); //previously p25
@@ -40,47 +71,11 @@
int counter = 0;
-//5 variables for median poti position
-//int16_t potiVal[NB_SAMPLES_MEDIAN];
-//int16_t sortVal[NB_SAMPLES_MEDIAN];
-
int16_t forceVal[NB_SAMPLES_MEDIAN];
int16_t sortForceVal[NB_SAMPLES_MEDIAN];
//int16_t lastForceVal[NUMBER_EPOS2_BOARDS][NB_SAMPLES_MEDIAN];
-/*
-int16_t getMedianPotiVal(const int8_t nodeID)
-{
- //read poti
- for(int m=0; m<NB_SAMPLES_MEDIAN; m++)
- {
- getPotiPosition(nodeID);
- wait_us(1000);
-
- potiVal[m] = potiPosArray[nodeID - 1];
- sortVal[m] = potiVal[m];
-
- wait_us(100);
- }
-
- //sort values
- for(int m=1; m<NB_SAMPLES_MEDIAN; ++m)
- {
- int16_t n;
- n = sortVal[m];
- int p;
-
- for(p = m-1; (p >=0) && (n<sortVal[p]); p--)
- {
- sortVal[p+1] = sortVal[p];
- }
- sortVal[p+1] = n;
- }
-
- return sortVal[2];
-}
-*/
-
+/*** Functions ***/
bool verifyChecksum() //check the data comming from the master over SPI
{
for(int i=0; i<NUMBER_MAX_EPOS2_PER_SLAVE; i++)
@@ -197,7 +192,9 @@
boardStatus[nodeID-1] = 1;
//first step : fault reset on controlword
//pc.printf("Node %d - STEP 1 - faultResetControlword\n", nodeID);
- faultResetControlword(nodeID);
+
+ //Debug for fault detection on brachii
+ //faultResetControlword(nodeID);
break;
case COB_ID_SDO_SERVER_TO_CLIENT_DEFAULT : //SDO Acknoledgement frame
@@ -407,35 +404,48 @@
void calibrate()
{
pc.printf("- Start Calibration\n\r");
-
+
//set all boards to current mode
for(int i=1; i<=numberEpos2Boards; i++)
{
setModeOfOperationPDO(i, VALUE_CURRENT_MODE);
}
- wait_ms(CALIB_DELAY);
+ ledchain[2] = 1;
+
+ wait_ms(20);
for(int j=1; j<=numberEpos2Boards; j++)
{
- pc.printf("- Calibration number %d\n\r", j);
+ //pc.printf("- Calibration number %d\n\r", j);
//trigger current in certain order
- setCurrent(j, 150);
- wait_ms(CALIB_DELAY);
+ setCurrent(j, 100);
+ wait_ms(20);
}
-
+
+ ledchain[3] = 1;
+ /*
pc.printf("- Offsets will be recorded in 5 sec...");
wait_ms(1000);
pc.printf("4...");
+ ledchain[0] = 1;
wait_ms(1000);
+ ledchain[0] = 0;
+ ledchain[1] = 1;
pc.printf("3...");
wait_ms(1000);
+ ledchain[1] = 0;
+ ledchain[2] = 1;
pc.printf("2...");
wait_ms(1000);
+ ledchain[2] = 0;
+ ledchain[3] = 1;
pc.printf("1...");
wait_ms(1000);
+ ledchain[3] = 0;
pc.printf("0...");
-
+ */
+ /*
//save current encoder position as calib offset
for(int i=0; i<numberEpos2Boards; i++)
{
@@ -447,58 +457,22 @@
//pc.printf("%d\n\r", calibOffset[i]);
}
pc.printf("OK\n\r");
-
+ *//*
pc.printf("current to zero\n\r");
for(int i=0; i<numberEpos2Boards; i++)
{
int nodeid = i+1;
setCurrent(nodeid, 0);
wait_us(500);
- }
-
- //pc.printf("wait 5 sec now\n\r");
- //wait_ms(5000);
- //pc.printf("will restart now\n\r");
- //wait_ms(1000);
- /*
- pc.printf("\n\rCompute mean, min and max offsets\n\r");
+ }*/
+ //For case where motor start from zero
for(int i=0; i<numberEpos2Boards; i++)
- {
- meanCalibEnc[i] = 0;
- minDistFromMean[i] = 100000;
- maxDistFromMean[i] = 0;
-
- for(int j=0; j<NUMBER_OF_CALIB; j++)
- {
- meanCalibEnc[i] += tempCalibEnc[j][i];
- }
- meanCalibEnc[i] /=NUMBER_OF_CALIB;
- }
-
- for(int j=0; j<NUMBER_OF_CALIB; j++)
- {
- for(int i=0; i<numberEpos2Boards; i++)
- {
- distanceFromMean[j][i] = tempCalibEnc[j][i] - meanCalibEnc[i];
-
- if(distanceFromMean[j][i] < minDistFromMean[i]) minDistFromMean[i] = distanceFromMean[j][i];
- if(distanceFromMean[j][i] > maxDistFromMean[i]) maxDistFromMean[i] = distanceFromMean[j][i];
-
-
- }
- }
- */
- /*
- for(int i=0; i<numberEpos2Boards; i++)
- {
- // pc.printf("nodeID %d : min[%d] max[%d]\n\r", i+1, minDistFromMean[i], maxDistFromMean[i]);
- pc.printf("nodeID %d : tempCalibEnc[%d]\n\r", i+1, tempCalibEnc[i]);
-
- //update the offsets
- calibOffset[i] = tempCalibEnc[i];
- } */
+ {
+ calibOffset[i] = 0;
+ }
}
+/*** Main ***/
int main()
{
pc.baud(115200);
@@ -523,25 +497,16 @@
pc.printf("--- Initialise EPOS2 boards ---\n\r");
- /*
- for(int i=1; i<=NUMBER_EPOS2_BOARDS; i++)
- {
- if(initEposBoard(i) = EPOS2_OK) numberEpos2Boards++;
- }
- */
+ ledchain[0] = 1;
- //int i=1;
while(initEposBoard(numberEpos2Boards) == EPOS2_OK)
{
numberEpos2Boards++;
- //i++;
}
numberEpos2Boards--; //because it has been increment one time too much at the end of the while loop
-
- //initEposBoard(0);
- //ledchain[0] = 1;
+ ledchain[1] = 1;
pc.printf("--- Enable Interrupts ---\n\r");
//attach the interrupt function
@@ -549,27 +514,7 @@
__enable_irq();
pc.printf("--- Calibrate Arm ---\n\r");
- /*
- //test
- pc.printf("test home mode\n\r");
- setModeOfOperationPDO(1, VALUE_CURRENT_MODE);
- wait_ms(100);
- pc.printf("set current\n\r");
- setCurrent(1, 100);
- wait_ms(2000);
- getPosition(1);
- wait_ms(100);
- pc.printf("getPosition before home %d\n\r", encPosition[0]);
- pc.printf("set OBJECT_HOME_POSITION\n\r");
- setModeOfOperationPDO(1, 6);
- setObjectSDO(1, OBJECT_HOME_POSITION, encPosition[0]);
- wait_ms(100);
- getPosition(1);
- wait_ms(100);
- pc.printf("getPosition after home %d\n\r", encPosition[0]);
- //test
- */
- //if(calibDonePin)
+
calibrate();
device.reply(0x62); //Prime SPI with first reply
@@ -583,6 +528,11 @@
//then start the main loop
pc.printf("--- Start main loop ---\n\r");
+
+ ledchain[0] = 0;
+ ledchain[1] = 0;
+ ledchain[2] = 0;
+ ledchain[3] = 0;
while(1)
{
--- a/src/eposCmd.cpp Wed Oct 29 13:40:24 2014 +0000
+++ b/src/eposCmd.cpp Wed Feb 11 16:18:15 2015 +0000
@@ -1,3 +1,32 @@
+/*
+ * Copyright (c) 2013, The Robot Studio
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright notice, this
+ * list of conditions and the following disclaimer.
+ *
+ * * Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * Created on: Feb 27, 2013
+ * Author: Cyril Jourdan (cyril.jourdan@therobotstudio.com)
+ */
+
#include "../include/eposCmd.h"
CAN cantoepos(p9, p10);
@@ -384,10 +413,10 @@
if(cantoepos.frequency(1000000) != 1) return EPOS2_ERROR;
//First reset the node, that also clears the red LED that sometimes appears at the end of the CAN bus
- if(nodeID == 1) setNMT(nodeID, CS_RESET_COMMUNICATION);
- wait_ms(100);
- if(nodeID ==1) setNMT(nodeID, CS_RESET_NODE);
- wait_ms(100);
+ //if(nodeID == 1) setNMT(nodeID, CS_RESET_COMMUNICATION);
+ //wait_ms(100);
+ //if(nodeID ==1) setNMT(nodeID, CS_RESET_NODE);
+ //wait_ms(100);
//setObjectSDO(nodeID, OBJECT_MAXIMAL_FOLLOWING_ERROR, 0xFFFFFFFA);
setNMT(nodeID, CS_ENTER_PRE_OPERATIONAL);
@@ -400,7 +429,7 @@
setObjectSDO(nodeID, OBJECT_MAXIMAL_MOTOR_SPEED, 0x000030D4);
setObjectSDO(nodeID, OBJECT_THERMAL_TIME_CONSTANT_WINDING, 0x00B5);
- //Miscellaneous configuration : Disable sensor supervision by software, to prevent Position Sensor Breach Error
+ //Miscellaneous configuration : Set bit 0 to 1 to Disable sensor supervision by software, to prevent Position Sensor Breach Error
setObjectSDO(nodeID, OBJECT_MISCELLANEOUS_CONFIGURATION, 0x0000);
//set Position Mode parameters