commit 9bc80e9d4b28dad3460d3a577619ab0248083bd8
parent 5aed5d6e4e377e1a93b021e72b7575b32167a895
Author: thing1 <thing1@seacrossedlovers.xyz>
Date: Wed, 3 Dec 2025 13:44:34 +0000
finalized LED flashing
Diffstat:
3 files changed, 112 insertions(+), 55 deletions(-)
diff --git a/CS12020/robot/line/Makefile b/CS12020/robot/line/Makefile
@@ -3,8 +3,8 @@ all: compile upload
upload: compile
arduino-cli upload --fqbn arduino:avr:uno . -p /dev/ttyACM0
-compile: line.ino
+compile: line.ino
arduino-cli compile --fqbn arduino:avr:uno .
monitor:
- arduino-cli monitor -p /dev/ttyACM0
+ arduino-cli monitor -p /dev/ttyACM0 --fqbn arduino:avr:uno
diff --git a/CS12020/robot/line/helper.h b/CS12020/robot/line/helper.h
@@ -16,9 +16,9 @@
#define LDRB A1
#define LDRC A0
-#define SERVOA_ZERO 96
-#define SERVOB_ZERO 96
-#define SPEED 5
+#define SERVOA_ZERO 84
+#define SERVOB_ZERO 85
+#define SPEED 10
#define ANALOG_MAX 1023
@@ -43,32 +43,33 @@ enum DIRECTIONS {
Servo servoA;
Servo servoB;
-void
+void
setupRobot() {
- Serial.begin(9600);
- pinMode(GREEN_LED, OUTPUT);
- pinMode(YELLOW_LED, OUTPUT);
- pinMode(RED_LED, OUTPUT);
- pinMode(BUTTONA, INPUT);
+ Serial.begin(9600);
+ pinMode(GREEN_LED, OUTPUT);
+ pinMode(YELLOW_LED, OUTPUT);
+ pinMode(RED_LED, OUTPUT);
+ pinMode(BUTTONA, INPUT);
pinMode(BUTTONB, INPUT);
- pinMode(SERVOA_PIN, OUTPUT);
+ pinMode(SERVOA_PIN, OUTPUT);
pinMode(SERVOB_PIN, OUTPUT);
pinMode(LDRA, INPUT);
pinMode(LDRB, INPUT);
pinMode(LDRC, INPUT);
pinMode(IRTRANSMITTER, OUTPUT);
pinMode(IRRECEVIER, INPUT);
- servoA.attach(SERVOA_PIN);
- servoB.attach(SERVOB_PIN);
+ servoA.attach(SERVOA_PIN);
+ servoB.attach(SERVOB_PIN);
servoA.write(SERVOA_ZERO);
servoB.write(SERVOB_ZERO);
}
+
void
writeuint16(uint16_t num, int start) {
uint8_t n[2] = {0};
memcpy(n, &num, 2);
-
+
EEPROM.update(start, n[0]);
EEPROM.update(start + 1, n[1]);
}
@@ -80,7 +81,7 @@ readuint16(int start) {
n[0] = EEPROM.read(start);
n[1] = EEPROM.read(start + 1);
-
+
memcpy(&num, n, 2);
return num;
}
@@ -101,6 +102,7 @@ SEprintf(const char *fmt, ...) {
bool
isObstacle() {
tone(IRTRANSMITTER, IRFREQ);
+ delay(5);
bool ret = (digitalRead(IRRECEVIER) == LOW);
noTone(IRTRANSMITTER);
return ret;
@@ -131,24 +133,6 @@ waitButton(int pin, int state) {
while (digitalRead(pin) == state) ;
}
-void
-stepMove(int dir) {
- servoA.write(SERVOA_ZERO + (SPEED * dir));
- servoB.write(SERVOB_ZERO - (SPEED * dir));
- delay(10);
- servoA.write(SERVOA_ZERO);
- servoB.write(SERVOB_ZERO);
-}
-
-void
-stepTurn(int dir) {
- servoA.write(SERVOA_ZERO + (SPEED * dir));
- servoB.write(SERVOB_ZERO - (SPEED * -dir));
- delay(10);
- servoA.write(SERVOA_ZERO);
- servoB.write(SERVOB_ZERO);
-}
-
bool
isButtonAPressed() {
return !digitalRead(BUTTONA);
diff --git a/CS12020/robot/line/line.ino b/CS12020/robot/line/line.ino
@@ -8,13 +8,81 @@
#define DBG(expr)
#endif
+#define FLASHTIME 256 / 2
+
typedef struct state {
bool left, mid, right;
int rawleft, rawmid, rawright;
- short prevDir;
+ enum DIRECTIONS prevDir;
long timeStamp;
+ long lastmove, lastturn;
+ long gstate, ystate, rstate;
} state;
+uint8_t flashCount = 0;
+
+void
+flash(int pin, state *s) {
+ switch (pin) {
+ case GREEN_LED: s->gstate = millis(); break;
+ case YELLOW_LED: s->ystate = millis(); break;
+ case RED_LED: s->rstate = millis(); break;
+ }
+}
+
+void
+stepFlash(int pin) {
+ DBG({
+ SEprintf("Flashcount: %d\n", flashCount);
+ });
+
+ if (flashCount < FLASHTIME)
+ digitalWrite(pin, HIGH);
+ else if (flashCount > FLASHTIME / 2)
+ digitalWrite(pin, LOW);
+ flashCount += 5;
+}
+
+void
+updateFlash(state *s) {
+ if (millis() - s->gstate > FLASHTIME) {
+ s->gstate = 0;
+ digitalWrite(GREEN_LED, LOW);
+ } if (millis() - s->ystate > FLASHTIME) {
+ s->ystate = 0;
+ digitalWrite(YELLOW_LED, LOW);
+ } if (millis() - s->rstate > FLASHTIME) {
+ s->rstate = 0;
+ digitalWrite(RED_LED, LOW);
+ }
+
+ if (s->gstate) stepFlash(GREEN_LED);
+ if (s->ystate) stepFlash(YELLOW_LED);
+ if (s->rstate) stepFlash(RED_LED);
+}
+
+void
+stepMove(int dir, state *s) {
+ servoA.write(SERVOA_ZERO + (SPEED * dir));
+ servoB.write(SERVOB_ZERO - (SPEED * dir));
+ s->lastmove = millis();
+}
+
+void
+stepTurn(int dir, state *s) {
+ servoA.write(SERVOA_ZERO + (SPEED * dir));
+ servoB.write(SERVOB_ZERO - (SPEED * -dir));
+ s->lastturn = millis();
+}
+
+void
+updateMotor(state *s) {
+ if (millis() - s->lastmove > 10 && millis() - s->lastturn) {
+ servoA.write(SERVOA_ZERO);
+ servoB.write(SERVOB_ZERO);
+ }
+}
+
state *
getState() {
static state s;
@@ -25,7 +93,9 @@ getState() {
s.rawmid = analogRead(LDRB);
s.rawright = analogRead(LDRC);
- setLEDs(s.left, s.mid, s.right);
+ updateFlash(&s);
+ updateMotor(&s);
+
return &s;
}
@@ -33,19 +103,19 @@ void
stepAvoidanceBehave(state *s) {
/* should flash red */
DBG({
- /* WARNING this causes the program to stutter when left on,
+ /* WARNING this causes the program to stutter when left on,
not too bad for debugging but very bad for general use! */
SEprintf("Avoid: %d, %d, %d\n", s->rawleft, s->rawmid, s->rawright);
});
/* left is noticably larger */
- if (s->rawleft > s->rawright + 300)
- stepTurn(RGT);
+ if (s->rawleft > s->rawright + 50)
+ stepTurn(RGT,s);
/* right is noticably larger */
- else if (s->rawright > s->rawleft + 300)
- stepTurn(LFT);
+ else if (s->rawright > s->rawleft + 50)
+ stepTurn(LFT,s);
else
- stepMove(FWD);
+ stepMove(FWD, s);
}
@@ -57,13 +127,13 @@ stepAttractionBehave(state *s) {
});
/* left is noticably larger */
- if (s->rawleft > s->rawright + 60)
- stepTurn(LFT);
+ if (s->rawleft > s->rawright + 50)
+ stepTurn(LFT,s);
/* right is noticably larger */
- else if (s->rawright > s->rawleft + 60)
- stepTurn(RGT);
+ else if (s->rawright > s->rawleft +50)
+ stepTurn(RGT,s);
else
- stepMove(FWD);
+ stepMove(FWD, s);
}
void
@@ -93,28 +163,28 @@ void
move(state *s) {
/* small adjustments */
if (s->right && s->mid)
- stepTurn(LFT);
+ stepTurn(RGT,s);
else if (s->left && s->mid)
- stepTurn(RGT);
+ stepTurn(LFT,s);
/* large adjustments */
else if (s->right) {
s->prevDir = LFT;
- stepTurn(RGT);
+ stepTurn(RGT,s);
} else if (s->left) {
s->prevDir = RGT;
- stepTurn(LFT);
+ stepTurn(LFT,s);
/* drive straight, nominal */
} else if (s->mid) {
for (int i = 0; i < 20; i++)
- stepMove(FWD);
+ stepMove(FWD, s);
} else {
/* try to recover from not being on the line by moving in the prevDir
only updated on large turns */
while (!s->mid) {
getState();
- stepTurn(s->prevDir);
+ stepTurn(s->prevDir,s);
}
}
}
@@ -139,14 +209,17 @@ loop() {
state *s = getState();
/* do nothing while there is an obstacle, should flash orange */
- while (isObstacle())
+ while (isObstacle()) {
+ flash(YELLOW_LED, s);
return;
+ }
+
if (s->right && s->left && s->mid) {
checkBarcode(s);
/* run through the barcode */
for (int i = 0; i < 20; i++)
- stepMove(FWD);
+ stepMove(FWD, s);
}
/* don't do any turns when on a the barcode, go straight */
else move(s);