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.
Diff: main.cpp
- Revision:
- 12:ee175985ef09
- Parent:
- 11:6bbe8da4b16a
- Child:
- 13:205002e3c176
--- a/main.cpp Fri May 22 13:27:01 2020 +0000
+++ b/main.cpp Sat May 23 15:24:09 2020 +0000
@@ -3,6 +3,7 @@
#define M_PI 3.14159265358979323846f
#define smoothingNumber 6
+
#define STATE_ERROR 0
#define STATE_INIT 1
#define STATE_GOTO_START 2
@@ -18,26 +19,30 @@
#define DIR_LEFT 0
#define DIR_RIGHT 1
+#define timer_period_us 10
+
+
DigitalOut RCout(D10);
DigitalOut dir(D9);
InterruptIn leftSwitch(D2);
InterruptIn rightSwitch(D3);
Ticker tick;
-Ticker speedTicker;
+//Ticker speedTicker;
Ticker swingTicker;
-Ticker sendDataTicker;
-DigitalOut myled(LED2);
RawSerial rpc(D1,D0,9600);
-
+DigitalOut led(D4);
-int period_us = 22;//300 26
+int period_us = 1;//300 26
int posCounter = 0;
+int timerCounter = 0;
long pos=0;
long railLength = 0;
uint8_t state=STATE_INIT;
+uint8_t data[2] = {0, 0};
+uint8_t cmdIndex = 0;
Timer t;
SPI spi(D11,D12,D13);// mosi, miso, sclk
@@ -76,11 +81,6 @@
bool calibrated = false;
bool dirUpdated = false;
-
-DigitalOut led(LED1);
-Timeout flipper;
-
-
typedef union {
float number[6];
uint8_t numberCh[24];
@@ -88,9 +88,9 @@
my_union myUnion;
-bool isPendulumSwinging() {
+/*bool isPendulumSwinging() {
return state == STATE_SWING_RIGHT || state == STATE_SWING_LEFT;
-}
+}*/
float getPosMM() {
//return (pos-railLength/2) * 550.0f/railLength;
@@ -167,7 +167,7 @@
SPEED CALC
*/
-void calcSpeed() {
+/*void calcSpeed() {
/*posMap[posCounter] = getPosMM() / 1000;
if (posCounter == 3) {
posCounter = 0;
@@ -184,17 +184,8 @@
} else {
posCounter += 1;
}*/
- xPosNew = (getPosMM() - posOffset) / 1000;
- speed = xPosNew - xPosOld;
- if (dir == DIR_LEFT) {
- speed = -speed;
- }
- //speed = -speed;
-
- xPosOld = xPosNew;
-}
-void calcControl() {
+/*void calcControl() {
//float frequency = 1000000 / (period_us / 2);
//float rates = frequency / 6400;
//control = rates * PIPI * radius;
@@ -203,31 +194,36 @@
} else {
control = period_us;
}
-}
+}*/
void stepperFlip() {
- if (state != STATE_WAITING && state != STATE_ERROR && state != STATE_INIT && state){
- RCout = !RCout;
- pos += (dir.read() * 2 - 1);
+ if (timerCounter * timer_period_us > period_us) {
+ timerCounter = 0;
+ if (state != STATE_WAITING && state != STATE_ERROR && state != STATE_INIT && state){
+ RCout = !RCout;
+ pos += (dir.read() * 2 - 1);
+ }
+ if (state == STATE_GOTO_MIDDLE && pos == railLength / 2) {
+ posOffset = 40;
+ state = STATE_WAITING;
+ }
+ if (state == STATE_SWING_LEFT && state==STATE_SWING_RIGHT) {
+ pos += (dir.read() * 2 - 1);
+ RCout = !RCout;
+ }
+ } else {
+ timerCounter += 1;
}
- if (state == STATE_GOTO_MIDDLE && pos == railLength / 2) {
- posOffset = 40;
- state = STATE_WAITING;
- }
- if (state == STATE_SWING_LEFT && state==STATE_SWING_RIGHT) {
- pos += (dir.read() * 2 - 1);
- RCout = !RCout;
- }
- flipper.attach_us(stepperFlip, period_us/2);
}
-void updatePeriod(){
- //tick.detach();
+/*void updatePeriod(){
+ tick.detach();
tick.attach_us (&stepperFlip, period_us / 2.0f);
-}
+ wait_ms(20);
+}*/
void leftEnd() {
dir = DIR_RIGHT;
@@ -235,11 +231,11 @@
state = STATE_GOTO_END_COUNTING;
pos = 0;
}
- else if (isPendulumSwinging()) {
+/* else if (isPendulumSwinging()) {
//state = STATE_GOTO_MIDDLE;
//angleOffset -= 0.006191;
state = STATE_ERROR;
- }
+ }*/
if (state == STATE_GOTO_SWING) {
state = STATE_ERROR;
}
@@ -251,31 +247,16 @@
railLength=pos;
state = STATE_GOTO_MIDDLE;
}
- else if (isPendulumSwinging()) {
+/* else if (isPendulumSwinging()) {
//state = STATE_GOTO_MIDDLE;
//angleOffset += 0.006191;
state = STATE_ERROR;
- }
+ }*/
if (state == STATE_GOTO_SWING) {
state = STATE_ERROR;
}
}
-int swingCounter = 0;
-void getSwingDirectory() {
- swingCounter += 1;
- control = -control;
- if (dir == DIR_RIGHT) {
- state = STATE_SWING_RIGHT;
- dir = DIR_LEFT;
- return;
- }
- if (dir == DIR_LEFT) {
- state = STATE_SWING_LEFT;
- dir = DIR_RIGHT;
- return;
- }
-}
void sendData() {
myUnion.number[0] = t.read();
@@ -290,52 +271,75 @@
}
}
-int dirCounter = 0;
-int perCounter = 0;
+void changeDir() {
+ if (dir == DIR_LEFT) {
+ dir = DIR_RIGHT;
+ } else {
+ dir = DIR_LEFT;
+ }
+}
+
+int command[2] = {0, 0};
+bool newData = false;
void Rx_interrupt() {
- int command = rpc.getc();
- switch (command) {
+ data[cmdIndex] = rpc.getc();
+ if (cmdIndex == 1) {
+ newData = true;
+ }
+ cmdIndex = !cmdIndex;
+ /*command[0] = rpc.getc();
+ if (command[0] == 50) {
+ canSend = true;
+ }*/
+/* command[1] = rpc.getc();
+ switch (command[0]) {
case 50:
canSend = true;
break;
case 60:
+ swingTicker.attach(changeDir, 2);
state = STATE_GOTO_SWING;
- speedTicker.attach(calcSpeed, 1);
- break;
- case 65:
- int direction = rpc.getc();
- if (direction <= 0) {
- if (dir != DIR_RIGHT) {
- dir = DIR_RIGHT;
- }
- } else if (direction > 0) {
- if (dir != DIR_LEFT) {
- dir = DIR_LEFT;
- }
- }
break;
case 70:
- /*int newPeriod = rpc.getc();
- if (newPeriod < 22) {
- flipper.detach();
- } else if (period_us != newPeriod) {
- period_us = newPeriod;
- periodUpdated = true;
- }*/
+ period_us = command[1];
break;
default:
- break;
- }
- return;
+ break;
+ } */
}
-/*void flipLed()
-{
- flipper.attach_us(stepperFlip, period_us);
+void proceedCommands() {
+ newData = false;
+ switch (data[0]) {
+ case 50:
+ canSend = true;
+ break;
+ case 60:
+ /*swingTicker.attach(changeDir, 2);
+ state = STATE_GOTO_SWING;*/
+ break;
+ case 70:
+ period_us = data[1];
+ control = period_us;
+ break;
+ default:
+ break;
+ }
+}
+
+/*void govnina() {
+ if (timerCounter * timer_period_us > period_us) {
+ led = !led;
+ timerCounter = 0;
+ } else {
+ timerCounter += 1;
+ }
}*/
+
+
int main() {
RCout = 1;
wait_ms(500);
@@ -352,23 +356,26 @@
angleOffset= 3.14 - angle;
calibrated = true;
//wait(12);
- wait(7);
+ //wait(3);
//updatePeriod();
- calcControl();
+ //calcControl();
+ tick.attach_us(stepperFlip, timer_period_us);
state=STATE_GOTO_START;
dir=DIR_LEFT;
- flipper.attach_us(stepperFlip, period_us/2);
+ swingTicker.attach(changeDir, 2);
while(1) {
getAngularSpeed();
if (canSend) {
sendData();
}
- if (periodUpdated) {
+ if (newData) {
+ proceedCommands();
+ }
+ /*if (periodUpdated) {
calcControl();
- // updatePeriod();
- //flipper.attach_us(stepperFlip, period_us/2);
+ updatePeriod();
periodUpdated = false;
- }
+ }*/
switch(state) {
case STATE_WAITING:
//state = STATE_GOTO_SWING;
@@ -399,6 +406,5 @@
default:
break;
}
- //wait_ms(100);
}
}
\ No newline at end of file