commit 8a7c30ca8171b3315de283e40d35abd3500a2a64
parent e8cf90bd263022333d81e666d3b190f95a525d21
Author: thing1 <thing1@seacrossedlovers.xyz>
Date: Thu, 20 Nov 2025 09:09:13 +0000
robotics
Diffstat:
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