uni

Thing1's amazing uni repo
Log | Files | Refs

commit 9bc80e9d4b28dad3460d3a577619ab0248083bd8
parent 5aed5d6e4e377e1a93b021e72b7575b32167a895
Author: thing1 <thing1@seacrossedlovers.xyz>
Date:   Wed,  3 Dec 2025 13:44:34 +0000

finalized LED flashing

Diffstat:
MCS12020/robot/line/Makefile | 4++--
MCS12020/robot/line/helper.h | 48++++++++++++++++--------------------------------
MCS12020/robot/line/line.ino | 115++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++---------------
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);