Browse Source

added productions

Toby Chui 9 months ago
parent
commit
29894624ff
24 changed files with 202 additions and 111 deletions
  1. 26 8
      firmware/cute_useless_robot/animation.ino
  2. 5 1
      firmware/cute_useless_robot/cute_useless_robot.ino
  3. 107 8
      firmware/cute_useless_robot/logics.ino
  4. 40 43
      firmware/cute_useless_robot/servo.ino
  5. 24 51
      firmware/cute_useless_robot/tasks.ino
  6. 0 0
      pcb/development/LED Matrix/Gerber_Kawaii-Useless-Machine_LED-Matrix_Kawaii-Useless-Machine_2024-04-22.zip
  7. 0 0
      pcb/development/LED Matrix/PCB_LED-Matrix_Kawaii-Useless-Machine_2024-04-22.json
  8. 0 0
      pcb/development/MCU/Gerber_Kawaii-Useless-Machine_MCU_main_Kawaii-Useless-Machine-v2_2024-05-13.zip
  9. 0 0
      pcb/development/MCU/PCB_MCU_main_Kawaii-Useless-Machine-v2_2024-05-13.json
  10. 0 0
      pcb/development/MCU/legacy/Gerber_Kawaii-Useless-Machine_MCU_main_Kawaii-Useless-Machine_2024-04-22.zip
  11. 0 0
      pcb/development/MCU/legacy/PCB_MCU_main_Kawaii-Useless-Machine_2024-05-13.json
  12. 0 0
      pcb/development/StepperDriver/Gerber_Kawaii-Useless-Machine_Display_Driver_Kawaii-Useless-Machine-v2_2024-05-14.zip
  13. 0 0
      pcb/development/StepperDriver/PCB_Display_Driver_Kawaii-Useless-Machine-v2_2024-05-14.json
  14. 0 0
      pcb/development/StepperDriver/legacy/Gerber_Kawaii-Useless-Machine_Display_Driver_Kawaii-Useless-Machine_2024-05-13.zip
  15. 0 0
      pcb/development/StepperDriver/legacy/PCB_Display_Driver_Kawaii-Useless-Machine_2024-05-13.json
  16. BIN
      pcb/productions/Driver/Gerber_Kawaii-Useless-Machine_Display_Driver_Kawaii-Useless-Machine-v3_2024-06-02.zip
  17. BIN
      pcb/productions/LED/BOM_Kawaii-Useless-Machine_2024-06-02.csv
  18. BIN
      pcb/productions/LED/Gerber_Kawaii-Useless-Machine_LED-Matrix_Kawaii-Useless-Machine-production_2024-06-02.zip
  19. BIN
      pcb/productions/LED/PickAndPlace_LED-Matrix_Kawaii-Useless-Machine-production_2024-06-02.csv
  20. BIN
      pcb/productions/MCU/BOM.csv
  21. BIN
      pcb/productions/MCU/PAP.csv
  22. BIN
      pcb/productions/MCU/gerber.zip
  23. 0 0
      sd_card/anime/g0.bin
  24. BIN
      sd_card/anime/g1.bin

+ 26 - 8
firmware/cute_useless_robot/animation.ino

@@ -3,9 +3,20 @@
 int frameCount = 0;
 char previousAnicode = 'a';
 
+//delay with early breakout if current animation code changed
+void delayWithEarlyBreakout(int delayDuration) {
+  delayDuration = delayDuration / 100;
+  for (int i = 0; i < delayDuration; i++) {
+    delay(100);
+    if (getAnimationCode() != previousAnicode) {
+      break;
+    }
+  }
+}
+
 //Handle animation rendering
 void handleAnimationRendering(char anicode) {
-  if (previousAnicode != anicode){
+  if (previousAnicode != anicode) {
     previousAnicode = anicode;
     frameCount = 0;
   }
@@ -14,7 +25,8 @@ void handleAnimationRendering(char anicode) {
   if (SD.exists(targetFrame)) {
     //This is a static frame. Load and render it
     loadFrameAndRender(targetFrame);
-    delay(getFrameDuration(anicode,0));
+    int delayDuration = getFrameDuration(anicode, 0);
+    delayWithEarlyBreakout(delayDuration);
     return;
   }
 
@@ -23,13 +35,15 @@ void handleAnimationRendering(char anicode) {
   if (SD.exists(targetFrame)) {
     loadFrameAndRender(targetFrame);
     frameCount++;
-    delay(getFrameDuration(anicode,frameCount));
+    int delayDuration = getFrameDuration(anicode, frameCount);
+    delayWithEarlyBreakout(delayDuration);
     return;
   } else {
     //Not found.
     if (frameCount != 0) {
       loadFrameAndRender("/" + String(anicode) + "0.bin");
-      delay(getFrameDuration(anicode,0));
+      int delayDuration = getFrameDuration(anicode, 0);
+      delayWithEarlyBreakout(delayDuration);
       frameCount = 1;
       return;
     } else {
@@ -41,11 +55,15 @@ void handleAnimationRendering(char anicode) {
   }
 }
 
-//Get how long the frame shd last. 
+//Get how long the frame shd last.
 //Default 500 unless specially programmed
-int getFrameDuration(char anicode, int framecount){
-  if ((anicode == 'a' || anicode == 'b') && framecount == 0){
-    return 2500;
+int getFrameDuration(char anicode, int framecount) {
+  if ((anicode == 'a' || anicode == 'b' || anicode == 'g')) {
+    //Blinking
+    if (framecount == 0) {
+      return 3000;
+    }
+    return 300;
   }
   return 500;
 }

+ 5 - 1
firmware/cute_useless_robot/cute_useless_robot.ino

@@ -35,6 +35,9 @@
 #define HARDWARE_TYPE MD_MAX72XX::DR1CR0RR0_HW
 #define MAX_DEVICES 8
 
+/* Calibrated offset for switch pusher servo, in degrees */
+#define SERVO_ALIGNMENT_OFFSET -1
+
 /* Hardware Type Definations */
 Servo servoSwitchPusher;
 Servo servoCoverPusher;
@@ -42,12 +45,12 @@ MD_MAX72XX mx = MD_MAX72XX(HARDWARE_TYPE, DP_DATA_PIN, DP_CLK_PIN, DP_CS_PIN, MA
 
 /* Global Variables */
 char animation = 'a';  //Animation ID to render
+bool SD_exists = true; //Keep track of the animation SD card exists
 
 void setup() {
   Serial.begin(115200);
 
   // Allow allocation of all timers
-
   ESP32PWM::allocateTimer(0);
   ESP32PWM::allocateTimer(1);
   ESP32PWM::allocateTimer(2);
@@ -71,6 +74,7 @@ void setup() {
   // Initialize SD card
   if (!SD.begin(SD_CS_PIN)) {
     Serial.println("[Error] Unable to mount SD card");
+    SD_exists = false;
   }
 
   /* Display Module */

+ 107 - 8
firmware/cute_useless_robot/logics.ino

@@ -1,8 +1,107 @@
-/*
-  Main logic handlers
-
-  This file store the behavior of the robot
-  when the switch is pressed
-
-*/
-
+/*
+  Main logic handlers
+
+  This file store the behavior of the robot
+  when the switch is pressed
+
+*/
+
+/* Pushing Sequences */
+void executePushAnimationSequence(int seqID) {
+  if (seqID < 3) {
+    //Default push back
+    setAnimationCode('a');
+    delay(4000);
+    pushSwitchDelayed(1000, 1000);
+  } else if (seqID < 4) {
+    //Hesitation push back
+    setAnimationCode('a');
+    delay(4000);
+    pushWithHesitation();
+  } else if (seqID < 5) {
+    //Hesitation push and walk back
+    setAnimationCode('a');
+    delay(4000);
+    servoCoverPusher.write(90);
+    delay(1000);
+    servoSwitchPusher.write(90 + SERVO_ALIGNMENT_OFFSET);
+    delay(2000);
+    backward(100);
+    delay(1000);
+    servoSwitchPusher.write(130 + SERVO_ALIGNMENT_OFFSET);
+    delay(1000);
+    servoCoverPusher.write(0);
+    servoSwitchPusher.write(0);
+  } else if (seqID < 8) {
+    //Annoy push back
+    setAnimationCode('b');
+    delay(2000);
+    pushSwitchDelayed(300, 300);
+    delay(3000);
+    //Do not return to clear-frames when annoyed
+    return;
+  } else if (seqID < 10) {
+    //Faster annoyed push back
+    setAnimationCode('b');
+    delay(500);
+    pushSwitchNow();
+    delay(1000);
+    //Do not return to clear-frames when annoyed
+    return;
+  } else if (seqID < 11) {
+    //Shake its head and push back
+    setAnimationCode('f');
+    delay(500);
+    rotateClockwise(50);
+    rotateAntiClockwise(100);
+    rotateClockwise(100);
+    rotateAntiClockwise(50);
+    pushSwitchDelayed(1000, 300);
+    delay(2000);
+    setAnimationCode('g');
+    return;
+  } else {
+    //fallback default push back
+    setAnimationCode('a');
+    delay(4000);
+    pushSwitchDelayed(1000, 1000);
+  }
+  clearFrame();
+  delay(3000);
+}
+
+//Debug sequence to test all movement functions
+void runDebugSequence() {
+  //setAnimationCode('a');
+  //delay(10000);
+
+  //Stepper test
+  forward(50);
+  delay(3000);
+  backward(50);
+  delay(3000);
+  rotateAntiClockwise(100);
+  delay(1000);
+  //rotate backward
+  rotateClockwise(100);
+  delay(3000);
+
+  //setAnimationCode('j');
+  //delay(10000);
+  //Servo test
+  servoCoverPusher.write(90 + SERVO_ALIGNMENT_OFFSET);
+  delay(1000);
+  servoSwitchPusher.write(130 + SERVO_ALIGNMENT_OFFSET);
+  delay(1000);
+  servoCoverPusher.write(0);
+  servoSwitchPusher.write(0);
+  delay(3000);
+
+  //Switch test
+  bool switchPushed = getSwitchState();
+  if (switchPushed) {
+    Serial.println("Switch pushed");
+  } else {
+    Serial.println("Switch idle");
+  }
+}

+ 40 - 43
firmware/cute_useless_robot/servo.ino

@@ -1,43 +1,40 @@
-/*
-
-  Servo Logic Code
-
-  This script handles logic related to servo operations
-
-*/
-
-//Calibrated offset to add or reduce for this particilar machine
-const int servoAlignmentOffset = 0;
-
-//Quickily push the switch back
-void pushSwitchNow() {
-  pushSwitchDelayed(1000, 1000);
-}
-
-//Push switch back with delay
-void pushSwitchDelayed(int coverDelay, int pusherDelay) {
-  servoCoverPusher.write(90);
-  delay(coverDelay);
-  servoSwitchPusher.write(130 + servoAlignmentOffset);
-  delay(pusherDelay);
-  servoCoverPusher.write(0);
-  servoSwitchPusher.write(0);
-}
-
-//Push with a pause before the switch is pushed
-void pushWithHesitation(){
-  servoCoverPusher.write(90);
-  delay(1000);
-  servoSwitchPusher.write(90 + servoAlignmentOffset);
-  delay(2000);
-  servoSwitchPusher.write(130 + servoAlignmentOffset);
-  delay(2500);
-  servoCoverPusher.write(0);
-  servoSwitchPusher.write(0);
-}
-
-
-//Set the pusher servo to arm installation position
-void setSwitchToInstallPosition(){
-  servoSwitchPusher.write(125 + servoAlignmentOffset);
-}
+/*
+
+  Servo Logic Code
+
+  This script handles logic related to servo operations
+
+*/
+
+//Quickily push the switch back
+void pushSwitchNow() {
+  pushSwitchDelayed(250, 250);
+}
+
+//Push switch back with delay
+void pushSwitchDelayed(int coverDelay, int pusherDelay) {
+  servoCoverPusher.write(90);
+  delay(coverDelay);
+  servoSwitchPusher.write(130 + SERVO_ALIGNMENT_OFFSET);
+  delay(pusherDelay);
+  servoCoverPusher.write(0);
+  servoSwitchPusher.write(0);
+}
+
+//Push with a pause before the switch is pushed
+void pushWithHesitation(){
+  servoCoverPusher.write(90);
+  delay(1000);
+  servoSwitchPusher.write(90 + SERVO_ALIGNMENT_OFFSET);
+  delay(2000);
+  servoSwitchPusher.write(130 + SERVO_ALIGNMENT_OFFSET);
+  delay(1000);
+  servoCoverPusher.write(0);
+  servoSwitchPusher.write(0);
+}
+
+
+//Set the pusher servo to arm installation position
+void setSwitchToInstallPosition(){
+  servoSwitchPusher.write(125 + SERVO_ALIGNMENT_OFFSET);
+}

+ 24 - 51
firmware/cute_useless_robot/tasks.ino

@@ -37,9 +37,9 @@ char getAnimationCode() {
 //Get the current state of the switch
 // true = After human pushed
 // false = After robot pushed
-bool getSwitchState(){
-    int switchState = digitalRead(TOGGLE_SWITCH);
-    return (switchState == 1);
+bool getSwitchState() {
+  int switchState = digitalRead(TOGGLE_SWITCH);
+  return (switchState == 1);
 }
 
 
@@ -73,66 +73,39 @@ void startCoreTasks() {
 void PrimaryController( void * pvParameters ) {
   Serial.println("Primary logic process started on core " + String(xPortGetCoreID()));
   clearFrame();
+  int seqCounter = 0; //Modify this value to change start state of seq
+  
   for (;;) {
-    //Loop of primary logics
-    //setAnimationCode('a');
-    //delay(10000);
-    
-    //Stepper test
-    /*
-    forward(50);
-    delay(3000);
-    backward(50);
-    delay(3000);
-    rotateAntiClockwise(100);
-    delay(1000);
-    //rotate backward
-    rotateClockwise(100);
-    delay(3000);
-    
-    //Servo test
-    //Push button angle: 140
-    //Servo arm vertical alignment angle: 125
-    
-    servoCoverPusher.write(90);
-    delay(1000);
-    servoSwitchPusher.write(130);
-    delay(1000);
-    servoCoverPusher.write(0);
-    servoSwitchPusher.write(0);
+    runDebugSequence();
+    Serial.println("Sequence ended, restart in 3 sec");
     delay(3000);
-    */
+  }
+
+  /*
+    for (;;) {
     bool switchPushed = getSwitchState();
     if (switchPushed){
-      //Human pushed
-      setAnimationCode('a');
-      delay(4000);
-      Serial.println("ON");
-      rotateAntiClockwise(50);
-      rotateClockwise(100);
-      rotateAntiClockwise(100);
-      rotateClockwise(50);
-      delay(2000);
-      pushWithHesitation();
-      clearFrame();
-      delay(3000);
+      //Switch pushed
+      executePushAnimationSequence(seqCounter);
+      seqCounter++;
     }else{
       delay(100);
     }
-
-    //Servo install position = 125 (vertical)
-    //servoSwitchPusher.write(125);
-    
-    //setAnimationCode('j');
-    //delay(10000);
-  }
+    }
+  */
 }
 
 //Core 1 code, for animation rendering
 void AnimationController( void * pvParameters ) {
   Serial.println("Animation render started on core " + String(xPortGetCoreID()));
   for (;;) {
-    char anicode = getAnimationCode();
-    handleAnimationRendering(anicode);
+    if (SD_exists){
+      char anicode = getAnimationCode();
+      handleAnimationRendering(anicode);
+    }else{
+      //SD card not exists. Lets this core idle
+      delay(1000);
+    }
+    
   }
 }

+ 0 - 0
pcb/LED Matrix/Gerber_Kawaii-Useless-Machine_LED-Matrix_Kawaii-Useless-Machine_2024-04-22.zip → pcb/development/LED Matrix/Gerber_Kawaii-Useless-Machine_LED-Matrix_Kawaii-Useless-Machine_2024-04-22.zip


+ 0 - 0
pcb/LED Matrix/PCB_LED-Matrix_Kawaii-Useless-Machine_2024-04-22.json → pcb/development/LED Matrix/PCB_LED-Matrix_Kawaii-Useless-Machine_2024-04-22.json


+ 0 - 0
pcb/MCU/Gerber_Kawaii-Useless-Machine_MCU_main_Kawaii-Useless-Machine-v2_2024-05-13.zip → pcb/development/MCU/Gerber_Kawaii-Useless-Machine_MCU_main_Kawaii-Useless-Machine-v2_2024-05-13.zip


+ 0 - 0
pcb/MCU/PCB_MCU_main_Kawaii-Useless-Machine-v2_2024-05-13.json → pcb/development/MCU/PCB_MCU_main_Kawaii-Useless-Machine-v2_2024-05-13.json


+ 0 - 0
pcb/MCU/legacy/Gerber_Kawaii-Useless-Machine_MCU_main_Kawaii-Useless-Machine_2024-04-22.zip → pcb/development/MCU/legacy/Gerber_Kawaii-Useless-Machine_MCU_main_Kawaii-Useless-Machine_2024-04-22.zip


+ 0 - 0
pcb/MCU/legacy/PCB_MCU_main_Kawaii-Useless-Machine_2024-05-13.json → pcb/development/MCU/legacy/PCB_MCU_main_Kawaii-Useless-Machine_2024-05-13.json


+ 0 - 0
pcb/StepperDriver/Gerber_Kawaii-Useless-Machine_Display_Driver_Kawaii-Useless-Machine-v2_2024-05-14.zip → pcb/development/StepperDriver/Gerber_Kawaii-Useless-Machine_Display_Driver_Kawaii-Useless-Machine-v2_2024-05-14.zip


+ 0 - 0
pcb/StepperDriver/PCB_Display_Driver_Kawaii-Useless-Machine-v2_2024-05-14.json → pcb/development/StepperDriver/PCB_Display_Driver_Kawaii-Useless-Machine-v2_2024-05-14.json


+ 0 - 0
pcb/StepperDriver/legacy/Gerber_Kawaii-Useless-Machine_Display_Driver_Kawaii-Useless-Machine_2024-05-13.zip → pcb/development/StepperDriver/legacy/Gerber_Kawaii-Useless-Machine_Display_Driver_Kawaii-Useless-Machine_2024-05-13.zip


+ 0 - 0
pcb/StepperDriver/legacy/PCB_Display_Driver_Kawaii-Useless-Machine_2024-05-13.json → pcb/development/StepperDriver/legacy/PCB_Display_Driver_Kawaii-Useless-Machine_2024-05-13.json


BIN
pcb/productions/Driver/Gerber_Kawaii-Useless-Machine_Display_Driver_Kawaii-Useless-Machine-v3_2024-06-02.zip


BIN
pcb/productions/LED/BOM_Kawaii-Useless-Machine_2024-06-02.csv


BIN
pcb/productions/LED/Gerber_Kawaii-Useless-Machine_LED-Matrix_Kawaii-Useless-Machine-production_2024-06-02.zip


BIN
pcb/productions/LED/PickAndPlace_LED-Matrix_Kawaii-Useless-Machine-production_2024-06-02.csv


BIN
pcb/productions/MCU/BOM.csv


BIN
pcb/productions/MCU/PAP.csv


BIN
pcb/productions/MCU/gerber.zip


+ 0 - 0
sd_card/anime/g.bin → sd_card/anime/g0.bin


BIN
sd_card/anime/g1.bin