uni

Thing1's amazing uni repo
Log | Files | Refs

commit 8a7c30ca8171b3315de283e40d35abd3500a2a64
parent e8cf90bd263022333d81e666d3b190f95a525d21
Author: thing1 <thing1@seacrossedlovers.xyz>
Date:   Thu, 20 Nov 2025 09:09:13 +0000

robotics

Diffstat:
ACS12020/robot/calibrate/calibrate.ino | 9+++++++++
MCS12020/robot/line/helper.h | 61+------------------------------------------------------------
MCS12020/robot/line/line.ino | 151+++++++++++++++++++++++++++++++++++++++++++++++++------------------------------
ACS18120/19.11.25.md | 3+++
AMP10610/18.11.25.md | 7+++++++
5 files changed, 113 insertions(+), 118 deletions(-)

diff --git a/CS12020/robot/calibrate/calibrate.ino b/CS12020/robot/calibrate/calibrate.ino @@ -0,0 +1,9 @@ + +void +setup() { + +} + +void +loop() { +} diff --git a/CS12020/robot/line/helper.h b/CS12020/robot/line/helper.h @@ -20,7 +20,7 @@ #define LDRA_SWITCH (ANALOG_MAX / 2) + 100 #define LDRB_SWITCH (ANALOG_MAX / 2) + 100 -#define LDRC_SWITCH (ANALOG_MAX / 2) - 50 +#define LDRC_SWITCH (ANALOG_MAX / 2) + 50 #define SIZE(arr) (sizeof(arr) / sizeof(arr[0])) @@ -79,34 +79,6 @@ waitButton(int pin, int state) { } void -debounce(int pin) { - waitButton(pin, LOW); - delay(20); - waitButton(pin, HIGH); - delay(20); -} - -void -SEprintf(const char *fmt, ...) { - static char sbuf[64] = { 0 }; - va_list ap; - - va_start(ap, fmt); - vsnprintf(sbuf, 64, fmt, ap); - va_end(ap); - - Serial.print(sbuf); -} - -int -readint() { - while (!Serial.available()) ; - int i = Serial.parseInt(); - SEprintf("\n"); - return i; -} - -void stepMove(int dir) { servoA.write(SERVOA_ZERO + (6 * dir)); servoB.write(SERVOB_ZERO - (6 * dir)); @@ -124,17 +96,6 @@ stepTurn(int dir) { servoB.write(SERVOB_ZERO); } -void -rotate(int x) { - int dir = (x < 0) ? -1 : 1; - x = (x < 0) ? -x : x; - - int y = (int)(1.666666 * (float)x); - - for (int i = 0; i < y; i++) - stepTurn(dir); -} - bool isButtonAPressed() { return !digitalRead(BUTTONA); @@ -144,23 +105,3 @@ bool isButtonBPressed() { return !digitalRead(BUTTONB); } - -void -moveFWD(void) { - stepMove(FWD); -} - -void -moveBWD(void) { - stepMove(BWD); -} - -void -stepLFT(void) { - stepTurn(LFT); -} - -void -stepRGT(void) { - stepTurn(RGT); -} diff --git a/CS12020/robot/line/line.ino b/CS12020/robot/line/line.ino @@ -1,83 +1,118 @@ #include "helper.h" -int prevDir = BWD; -long timeStamp = 0; +#define DEBUG -void -stepAvoidanceBehave() { - int left = analogRead(LDRA), - mid = analogRead(LDRB), - right = analogRead(LDRC); +#ifdef DEBUG +#define DBG(expr) expr; +#else +#define DBG(expr) +#endif - if (mid > left - 300 && mid > right - 300) - stepMove(BWD); - stepTurn((left > right) ? RGT : LFT); + +typedef struct state { + bool left, mid, right; + short prevDir; + long timeStamp; +} state; + +state * +getState() { + static state s = { + .left = !isLDRBright(LDRA), + .mid = !isLDRBright(LDRB), + .right = !isLDRBright(LDRC), + }; + + setLEDs(s.left, s.mid, s.right); + return &s; } void -stepAttractionBehave() { - int left = analogRead(LDRA), - mid = analogRead(LDRB), - right = analogRead(LDRC); +stepAvoidanceBehave(state *s) { + DBG({Serial.println("avoid");}); + if (s->mid > s->left - 300 && s->mid > s->right - 300) + stepMove(BWD); + stepTurn((s->left > s->right) ? RGT : LFT); + getState(); +} - if (mid > left - 300 && mid > right - 300) +void +stepAttractionBehave(state *s) { + if (s->mid > s->left - 300 && s->mid > s->right - 300) stepMove(FWD); + stepTurn((s->left < s->right) ? RGT : LFT); + getState(); +} + +void +runBehave(void (*stepBehave)(state *)) { + do { + state *s = getState(); + stepBehave(s); + } while (true); +} - stepTurn((left < right) ? RGT : LFT); +void +checkBarcode(state *s) { + long t = millis(); + if (s->timeStamp > 500) { + /* long barcode */ + if ((t - s->timeStamp) > 3000) + runBehave(&stepAvoidanceBehave); + + /* short barcode */ + else if ((t - s->timeStamp) > 800) + runBehave(&stepAttractionBehave); + } + s->timeStamp = t; } +void +move(state *s) { + /* small adjustments */ + if (s->right && s->mid) + stepTurn(LFT); + else if (s->left && s->mid) + stepTurn(RGT); + /* large adjustments */ + else if (s->right) { + s->prevDir = LFT; + stepTurn(RGT); + } else if (s->left) { + s->prevDir = RGT; + stepTurn(LFT); + /* drive straight, nominal */ + } else if (s->mid) { + for (int i = 0; i < 20; i++) + stepMove(FWD); + } else { + /* try to recover from not being on the line by moving in the prevDir */ + while (!s->mid) { + getState(); + stepTurn(s->prevDir); + } + } +} void setup() { delay(3000); setupRobot(); + /* because this is static, I can modify these values to set defaults */ + state *s = getState(); + s->prevDir = BWD; + s->timeStamp = 0; } void loop() { - setLEDs(LOW, LOW, LOW); - bool left = !isLDRBright(LDRA), - mid = !isLDRBright(LDRB), - right = !isLDRBright(LDRC); + state *s = getState(); - if (right && left && mid) { /* on barcode */ - if (timeStamp > 500) { - if ((millis() - timeStamp) > 3000) { /* long barcode */ - setLEDs(LOW, HIGH, LOW); - while (1) - stepAvoidanceBehave(); - } - else if ((millis() - timeStamp) > 800) { /* short barcode */ - setLEDs(HIGH, LOW, HIGH); - while (1) - stepAvoidanceBehave(); - } - } - timeStamp = millis(); + if (s->right && s->left && s->mid) { + checkBarcode(s); + /* run through the barcode */ for (int i = 0; i < 20; i++) stepMove(FWD); } - - if (right && mid) - stepLFT(); - else if (left && mid) - stepRGT(); - else if (right) { - prevDir = LFT; - stepRGT(); - } else if (left) { - prevDir = RGT; - stepLFT(); - } else if (mid) { - for (int i = 0; i < 100; i++) - stepMove(FWD); - } else if (!mid && !left && !right) - delay(30000); - else { - while (!mid) { - left = !isLDRBright(LDRA); - mid = !isLDRBright(LDRB); - right = !isLDRBright(LDRC); - stepTurn(prevDir); - } - } + /* don't do any turns when on a the barcode, go straight */ + else move(s); } diff --git a/CS18120/19.11.25.md b/CS18120/19.11.25.md @@ -0,0 +1,3 @@ +19/11/25 +======== + diff --git a/MP10610/18.11.25.md b/MP10610/18.11.25.md @@ -0,0 +1,7 @@ +18/11/25 +======== + +- see FIG1 for law of ln in calculus + - this can be seen in the chain rule +- see FIG2 for example with log instead of ln +- see FIG3 for another example