control for robotic arm that can play chess using a granular gripper

Dependencies:   Encoder mbed HIDScope Servo MODSERIAL

Fork of chessRobot by a steenbeek

Committer:
annesteenbeek
Date:
Mon Oct 12 11:46:47 2015 +0200
Revision:
57:43f707648f2b
Parent:
54:c14c3bc48b8a
Child:
59:fe00be2cf8fd
PID tuning

Who changed what in which revision?

UserRevisionLine numberNew contents of line
annesteenbeek 14:0c0d1bfd94ea 1 #include "buttons.h"
annesteenbeek 14:0c0d1bfd94ea 2 #include "mbed.h"
annesteenbeek 17:872fcf85116d 3 #include "config.h"
annesteenbeek 25:874675516927 4 #include "actuators.h"
annesteenbeek 57:43f707648f2b 5 #include "PID.h"
annesteenbeek 57:43f707648f2b 6
annesteenbeek 0:525558a26464 7 // functions for reading all the buttons and switches
annesteenbeek 27:5eb5ec295ab2 8 AnalogIn pot2(pot2Pin);
annesteenbeek 30:a20f16bf8dda 9 AnalogIn pot1(pot1Pin);
annesteenbeek 0:525558a26464 10
annesteenbeek 32:2006977785f5 11 // Led states:
annesteenbeek 32:2006977785f5 12 // 0 leds: motors disabled
annesteenbeek 35:e26a573e3e9f 13 // redLed: control X speed
annesteenbeek 35:e26a573e3e9f 14 // greenLed: control Y speed
annesteenbeek 35:e26a573e3e9f 15 // blueLed: control Servo pos
annesteenbeek 36:6f9670eb9168 16 DigitalOut redLed(LED_RED);
annesteenbeek 36:6f9670eb9168 17 DigitalOut greenLed(LED_GREEN);
annesteenbeek 36:6f9670eb9168 18 DigitalOut blueLed(LED_BLUE);
annesteenbeek 32:2006977785f5 19
annesteenbeek 41:d5c3055a7bc7 20 DigitalIn button1(button1Pin);
annesteenbeek 41:d5c3055a7bc7 21 DigitalIn button2(button2Pin);
annesteenbeek 42:d36d216457c4 22 bool button1Pressed = false;
annesteenbeek 42:d36d216457c4 23 bool button2Pressed = false;
annesteenbeek 32:2006977785f5 24 int actuatorState = 0;
annesteenbeek 57:43f707648f2b 25 int PIDparam = 0;
annesteenbeek 32:2006977785f5 26
annesteenbeek 34:f315b2b38555 27 float pot1Val = 0;
annesteenbeek 34:f315b2b38555 28 float pot2Val = 0;
annesteenbeek 34:f315b2b38555 29
annesteenbeek 32:2006977785f5 30
annesteenbeek 0:525558a26464 31 void checkSwitches(){
annesteenbeek 32:2006977785f5 32
annesteenbeek 57:43f707648f2b 33 // read potmeter values
annesteenbeek 57:43f707648f2b 34 pot1Val = pot1.read();
annesteenbeek 57:43f707648f2b 35 pot2Val = pot2.read();
annesteenbeek 32:2006977785f5 36
annesteenbeek 57:43f707648f2b 37 // button 1 pressed
annesteenbeek 57:43f707648f2b 38 if(button1.read() == 0){
annesteenbeek 40:0d88aa25a57d 39 if (button1Pressed != true){
annesteenbeek 40:0d88aa25a57d 40 motorsEnable = !motorsEnable;
annesteenbeek 40:0d88aa25a57d 41 button1Pressed = true;
annesteenbeek 40:0d88aa25a57d 42 }
annesteenbeek 40:0d88aa25a57d 43 }else{
annesteenbeek 40:0d88aa25a57d 44 button1Pressed = false;
annesteenbeek 32:2006977785f5 45 }
annesteenbeek 57:43f707648f2b 46
annesteenbeek 57:43f707648f2b 47 #ifdef TUNEPID
annesteenbeek 57:43f707648f2b 48 setForPID(); // if TUNEPID is defined, use potmeters for PID tuning
annesteenbeek 57:43f707648f2b 49 #elif
annesteenbeek 57:43f707648f2b 50 setForPositions(); // else use it for motor control
annesteenbeek 57:43f707648f2b 51 #endif
annesteenbeek 57:43f707648f2b 52 }
annesteenbeek 57:43f707648f2b 53
annesteenbeek 57:43f707648f2b 54 void setForPID(){
annesteenbeek 57:43f707648f2b 55 if(button2.read() == 0){
annesteenbeek 57:43f707648f2b 56 if(button2Pressed != true){
annesteenbeek 57:43f707648f2b 57 PIDparam++;
annesteenbeek 57:43f707648f2b 58 if(PIDparam==3){
annesteenbeek 57:43f707648f2b 59 PIDparam = 0;
annesteenbeek 57:43f707648f2b 60 }
annesteenbeek 57:43f707648f2b 61 button2Pressed = true;
annesteenbeek 57:43f707648f2b 62 }
annesteenbeek 57:43f707648f2b 63 }else{
annesteenbeek 57:43f707648f2b 64 button2Pressed = false;
annesteenbeek 57:43f707648f2b 65 }
annesteenbeek 57:43f707648f2b 66
annesteenbeek 57:43f707648f2b 67 if(motorsEnable){
annesteenbeek 57:43f707648f2b 68 motor2SetSpeed = 300*pot2.read();
annesteenbeek 57:43f707648f2b 69 switch (PIDparam){
annesteenbeek 57:43f707648f2b 70 case 0: // potmeters control P gain
annesteenbeek 57:43f707648f2b 71 redLed.write(0); greenLed.write(1); blueLed.write(1);
annesteenbeek 57:43f707648f2b 72 float Kp = pot2.read();
annesteenbeek 57:43f707648f2b 73 break;
annesteenbeek 57:43f707648f2b 74 case 1: // potmeters control I gain
annesteenbeek 57:43f707648f2b 75 redLed.write(1); greenLed.write(0); blueLed.write(1);
annesteenbeek 57:43f707648f2b 76 float Ki = pot2.read();
annesteenbeek 57:43f707648f2b 77 break;
annesteenbeek 57:43f707648f2b 78 case 2: // potmeters control D gain
annesteenbeek 57:43f707648f2b 79 redLed.write(1); greenLed.write(1); blueLed.write(0);
annesteenbeek 57:43f707648f2b 80 float Kd = pot2.read();
annesteenbeek 57:43f707648f2b 81 break;
annesteenbeek 57:43f707648f2b 82 }
annesteenbeek 57:43f707648f2b 83 motor2PID.SetTunings(Kp, Ki, Kd);
annesteenbeek 57:43f707648f2b 84 }else{
annesteenbeek 57:43f707648f2b 85 redLed.write(1); greenLed.write(1); blueLed.write(1);
annesteenbeek 57:43f707648f2b 86 }
annesteenbeek 57:43f707648f2b 87 }
annesteenbeek 57:43f707648f2b 88
annesteenbeek 57:43f707648f2b 89 void setForPositions(){
annesteenbeek 57:43f707648f2b 90 // 3 states: X control, Y control en Servo control
annesteenbeek 57:43f707648f2b 91 // button 1 to enable/disable actuators
annesteenbeek 57:43f707648f2b 92 // button 2 to switch between states
annesteenbeek 57:43f707648f2b 93
annesteenbeek 57:43f707648f2b 94
annesteenbeek 44:a947bc232d84 95 if(button2.read() == 0){
annesteenbeek 40:0d88aa25a57d 96 if(button2Pressed != true){
annesteenbeek 40:0d88aa25a57d 97 actuatorState++;
annesteenbeek 40:0d88aa25a57d 98 if(actuatorState==3){
annesteenbeek 40:0d88aa25a57d 99 actuatorState = 0;
annesteenbeek 40:0d88aa25a57d 100 }
annesteenbeek 40:0d88aa25a57d 101 button2Pressed = true;
annesteenbeek 34:f315b2b38555 102 }
annesteenbeek 40:0d88aa25a57d 103 }else{
annesteenbeek 40:0d88aa25a57d 104 button2Pressed = false;
annesteenbeek 32:2006977785f5 105 }
annesteenbeek 32:2006977785f5 106
annesteenbeek 57:43f707648f2b 107
annesteenbeek 32:2006977785f5 108
annesteenbeek 32:2006977785f5 109 if(motorsEnable){
annesteenbeek 32:2006977785f5 110 switch (actuatorState){
annesteenbeek 32:2006977785f5 111 case 0: // potmeters control X speed
annesteenbeek 36:6f9670eb9168 112 redLed.write(0); greenLed.write(1); blueLed.write(1);
annesteenbeek 54:c14c3bc48b8a 113 motor1SetSpeed = 300*(pot2.read()-pot1.read());
annesteenbeek 32:2006977785f5 114 break;
annesteenbeek 32:2006977785f5 115 case 1: // potmeters control Y speed
annesteenbeek 36:6f9670eb9168 116 redLed.write(1); greenLed.write(0); blueLed.write(1);
annesteenbeek 54:c14c3bc48b8a 117 motor2SetSpeed = 300*(pot2.read()-pot1.read());
annesteenbeek 32:2006977785f5 118 break;
annesteenbeek 32:2006977785f5 119 case 2: // potmeters control Servo pos
annesteenbeek 36:6f9670eb9168 120 redLed.write(1); greenLed.write(1); blueLed.write(0);
annesteenbeek 32:2006977785f5 121 servoPos = pot2.read();
annesteenbeek 32:2006977785f5 122 break;
annesteenbeek 32:2006977785f5 123 }
annesteenbeek 32:2006977785f5 124 }else{
annesteenbeek 36:6f9670eb9168 125 redLed.write(1); greenLed.write(1); blueLed.write(1);
annesteenbeek 32:2006977785f5 126 }
annesteenbeek 57:43f707648f2b 127 }