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.
Fork of Timer by
Revision 71:5590dbe8393a, committed 2016-05-05
- Comitter:
- Jagang
- Date:
- Thu May 05 03:47:05 2016 +0000
- Parent:
- 63:176d04975f06
- Child:
- 74:07cdad6e861a
- Commit message:
- Uodate Controlleur, ajout des mouvement d et c, ajout des AX12
Changed in this revision
--- a/AX12/AX12.cpp Wed May 04 21:51:00 2016 +0000
+++ b/AX12/AX12.cpp Thu May 05 03:47:05 2016 +0000
@@ -98,6 +98,19 @@
return(rVal);
}
+int AX12::setSpeed(int speed)
+{
+ char data[2];
+
+ data[0] = speed & 0xFF;
+ data[1] = speed >> 8;
+
+ // write the packet, return the error code
+ int rVal = write(_ID, 0x20, 2, data);
+
+ return(rVal);
+}
+
// set continuous rotation speed from -1 to 1
int AX12::setCRSpeed(float speed) {
--- a/AX12/AX12.h Wed May 04 21:51:00 2016 +0000
+++ b/AX12/AX12.h Thu May 05 03:47:05 2016 +0000
@@ -134,6 +134,11 @@
* 1.0 = full speed clock wise
*/
int setCRSpeed(float speed);
+
+ /** Set the speed of the servo
+ *
+ */
+ int setSpeed(int speed);
/** Set the clockwise limit of the servo
--- a/ControlleurPince/ControlleurPince.cpp Wed May 04 21:51:00 2016 +0000
+++ b/ControlleurPince/ControlleurPince.cpp Thu May 05 03:47:05 2016 +0000
@@ -2,12 +2,27 @@
#include "defines.h"
#include "ControlleurPince.h"
-ControlleurPince::ControlleurPince(Stepper &p_RMot, Stepper &p_ZMot, Stepper &p_LMot, DigitalIn &p_EnR, DigitalIn &p_EnZ, DigitalIn &p_EnL):
- RMot(p_RMot), ZMot(p_ZMot), LMot(p_LMot), EnR(p_EnR), EnZ(p_EnZ), EnL(p_EnL)
+ControlleurPince::ControlleurPince(Stepper &p_RMot, Stepper &p_ZMot, Stepper &p_LMot, DigitalIn &p_EnR, DigitalIn &p_EnZ, DigitalIn &p_EnL, AX12 &_Lax12, AX12 &_Rax12) :
+ RMot(p_RMot), ZMot(p_ZMot), LMot(p_LMot), EnR(p_EnR), EnZ(p_EnZ), EnL(p_EnL), Lax12(_Lax12), Rax12(_Rax12)
{
pos_r = 0;
pos_z = 0;
pos_l = 0;
+
+
+}
+
+void ControlleurPince::init()
+{
+ Lax12.setMode(0);
+ wait(0.01);
+ Rax12.setMode(0);
+ wait(0.01);
+
+ Lax12.setMaxTorque(200);
+ wait(0.01);
+ Rax12.setMaxTorque(200);
+ wait(0.01);
}
@@ -34,9 +49,53 @@
{
if(z > 0.f && z < 100.f)
{
- logger.printf("Move by %f \n\r",z-pos_z);
- ZMot.mm(z-pos_z);
-
+ ZMot.mm(z-pos_z,true);
pos_z = z;
}
+
+ if(delta >= 0 || center >= -500)
+ {
+ if(delta < 0)
+ delta = 130 - pos_r - pos_l;
+ if(center < -500)
+ center = - pos_r/2 + pos_l/2;
+
+
+
+ /*
+ => pos_l = center*2 + pos_r
+ delta = 130 - pos_r - center*2 - pos_r
+ => 2*pos_r = 130 - center*2 - delta
+ => pos_r = (130-delta)/2 - center
+ => pos_l = (130-delta)/2 + center
+ */
+
+ float r = (130.f-delta)/2.f - center;
+ float l = (130.f-delta)/2.f + center;
+
+ RMot.mm(r-pos_r,true);
+ pos_r = r;
+
+ LMot.mm(l-pos_l,true);
+ pos_l = l;
+
+ }
+
+ while(! (RMot.done() && ZMot.done() && LMot.done()))
+ wait(DELAY);
+}
+
+void ControlleurPince::close()
+{
+ Lax12.setGoal(150);
+ Rax12.setGoal(150);
+ wait(0.2);
+}
+
+
+void ControlleurPince::open()
+{
+ Lax12.setGoal(100);
+ Rax12.setGoal(200);
+ wait(0.2);
}
\ No newline at end of file
--- a/ControlleurPince/ControlleurPince.h Wed May 04 21:51:00 2016 +0000
+++ b/ControlleurPince/ControlleurPince.h Thu May 05 03:47:05 2016 +0000
@@ -1,6 +1,7 @@
#ifndef CONTROLLEUR_PINCE_H
#define CONTROLLEUR_PINCE_H
+//#include "defines.h"
#include "Stepper.h"
#include "mbed.h"
@@ -9,10 +10,14 @@
public:
- ControlleurPince(Stepper &p_RMot, Stepper &p_ZMot, Stepper &p_LMot, DigitalIn &p_EnR, DigitalIn &p_EnZ, DigitalIn &p_EnL);
-
- void home(bool r=true, bool z=true, bool l=true);
- void setPos(float z, float delta, float center);
+ ControlleurPince(Stepper &p_RMot, Stepper &p_ZMot, Stepper &p_LMot, DigitalIn &p_EnR, DigitalIn &p_EnZ, DigitalIn &p_EnL, AX12 &_Lax12, AX12 &_Rax12);
+
+ void init();
+ void home(bool r=true, bool z=true, bool l=true);
+ void setPos(float z, float delta, float center = -600);
+
+ void close();
+ void open();
private:
@@ -20,6 +25,8 @@
DigitalIn &EnR, &EnZ, &EnL;
+ AX12 &Lax12, &Rax12;
+
float pos_r,pos_z,pos_l;
};
--- a/StepperMotor/Stepper.cpp Wed May 04 21:51:00 2016 +0000
+++ b/StepperMotor/Stepper.cpp Thu May 05 03:47:05 2016 +0000
@@ -10,15 +10,33 @@
Step_Per_MM = step_per_mm;
}
-void Stepper::step(int number, int dir, float speed)
+bool Stepper::step(int _number, int _dir, float _speed, bool _async)
{
- if (dir == HAUT) {
- direction = 0;
- } else if (dir == BAS) {
- direction = 1;
+ if(done())
+ {
+ dir = _dir;
+ number = _number;
+ speed = _speed;
+ async = _async;
+
+ if (dir == HAUT)
+ direction = 0;
+ else if (dir == BAS)
+ direction = 1;
+
+ ticker.attach(this,&Stepper::tick,_speed);
+ if(!_async)
+ while(!done())
+ wait(speed);
+
+ return true;
}
- // Step...
+ return false;
+
+
+
+ /* Step...
for(int i=0; i<number && !(minEndStop.read() == 0 && dir == BAS); i++)
{
stepPin = 1;
@@ -26,18 +44,39 @@
stepPin = 0;
wait_us(5);
wait(speed);
+ }*/
+}
+
+bool Stepper::mm(int _number, int _dir, bool _async)
+{
+ return step(_number*Step_Per_MM, _dir, DELAY-0.001, _async);
+}
+
+bool Stepper::mm(float _distance, bool _async)
+{
+ return step(abs(_distance)*Step_Per_MM, (_distance>0?HAUT:BAS), DELAY-0.001, _async);
+}
+
+bool Stepper::done()
+{
+ return number == 0;
+}
+
+void Stepper::tick()
+{
+ stepPin = 1;
+ wait_us(5);
+ stepPin = 0;
+
+ number--;
+
+ if(number <= 0 || (minEndStop.read() == 0 && dir == BAS))
+ {
+ ticker.detach();
+ number = 0;
}
}
-void Stepper::mm(int number, int dir)
-{
- step(number*Step_Per_MM, dir, DELAY-0.001);
-}
-
-void Stepper::mm(float distance)
-{
- step(abs(distance*Step_Per_MM), (distance>0?HAUT:BAS), DELAY-0.001);
-}
void Stepper::enable()
{
--- a/StepperMotor/Stepper.h Wed May 04 21:51:00 2016 +0000
+++ b/StepperMotor/Stepper.h Thu May 05 03:47:05 2016 +0000
@@ -7,20 +7,32 @@
{
public:
Stepper(PinName _en, PinName _stepPin, PinName dir, PinName _minEndStop, float step_per_mm);
- void step(int number, int dir, float speed);
- void mm(int number, int dir);
- void mm(float distance);
+ bool step(int _number, int _dir, float _speed, bool _async=false);
+ bool mm(int _number, int _dir, bool _async=false);
+ bool mm(float _distance, bool _async=false);
+
+ bool done();
+
void enable();
void disable();
int getEndStop() {return minEndStop.read();}
+ void tick();
+
float Step_Per_MM;
private:
DigitalOut en;
DigitalOut stepPin;
DigitalOut direction;
DigitalIn minEndStop;
+
+ int number;
+ int dir;
+ float speed;
+ bool async;
+ Ticker ticker;
+
};
--- a/main.cpp Wed May 04 21:51:00 2016 +0000
+++ b/main.cpp Thu May 05 03:47:05 2016 +0000
@@ -24,8 +24,8 @@
DigitalOut blanc(PC_6);
DigitalOut rouge(PC_8);
-//AX12 left_hand(PA_9, PA_10, 4, 250000);
-//AX12 right_hand(PA_9, PA_10, 1, 250000);
+AX12 left_hand(PA_9, PA_10, 3, 250000);
+AX12 right_hand(PA_9, PA_10, 2, 250000);
/* Sharp */
AnalogIn capt1(PA_4);
@@ -45,7 +45,7 @@
DigitalIn EnZ(PB_14);
DigitalIn EnL(PB_13);
-ControlleurPince controlleurPince(RMot, ZMot, LMot, EnR, EnZ, EnL);
+ControlleurPince controlleurPince(RMot, ZMot, LMot, EnR, EnZ, EnL, left_hand, right_hand);
Ticker ticker;
//Serial logger(USBTX, USBRX);
@@ -62,19 +62,45 @@
/* Debut du programme */
int main(void)
{
+ roboclaw.ForwardM1(0);
+ roboclaw.ForwardM2(0);
+
//logger.printf("Depart homologation !\n\r");
//homologation();
- logger.printf("Homming ...\n\r");
+
+ controlleurPince.init();
controlleurPince.home();
wait(1);
- controlleurPince.setPos(10.f,0.f,0.f);
+ controlleurPince.open();
+ logger.printf("z 10 \r\n");
+ controlleurPince.setPos(10,-1);
+ wait(1);
+ logger.printf("z 20 \r\n");
+ controlleurPince.setPos(20,-1);
+ wait(1);
+ controlleurPince.close();
+ logger.printf("d 30 \r\n");
+ controlleurPince.setPos(-1,30);
wait(1);
+ logger.printf("c 50 \r\n");
+ controlleurPince.setPos(-1,-1,50);
+ wait(1);
+ logger.printf("d 0 \r\n");
+ controlleurPince.setPos(-1,0);
+
+ while(1);
+
+
+ /*wait(1);
+ logger.printf("set pos 20 ...\n\r");
controlleurPince.setPos(20.f,0.f,0.f);
wait(1);
+ logger.printf("set pos 70 ...\n\r");
controlleurPince.setPos(70.f,0.f,0.f);
wait(1);
+ logger.printf("set pos 20 ...\n\r");
controlleurPince.setPos(20.f,0.f,0.f);
- logger.printf("Done ...\n\r");
+ logger.printf("Done ...\n\r");*/
/*drapeau = 0;
init();
