123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221 |
- #include <Arduino.h>
- #include <TimerOne.h>
-
- #include "config.h"
- #include "config_pins.h"
- #include "common.h"
- #include "data.h"
- #include "encoder.h"
- #include "lcd.h"
- #include "steppers.h"
- #include "states.h"
-
- const static float hz = min(max(max(XY_MAX_HZ, Z_MAX_HZ), E_MAX_HZ), MAX_SAMPLE_FREQ);
- const static float us = (1000.0 * 1000.0) / hz;
-
- void print_data(void) {
- Serial.println(F("XY:"));
-
- Serial.print(F("\t X: "));
- Serial.print(X_AXIS_MIN);
- Serial.print(F(" mm - "));
- Serial.print(X_AXIS_MAX);
- Serial.println(F(" mm"));
-
- Serial.print(F("\t Y: "));
- Serial.print(Y_AXIS_MIN);
- Serial.print(F(" mm - "));
- Serial.print(Y_AXIS_MAX);
- Serial.println(F(" mm"));
-
- Serial.print(F("\t"));
- Serial.print(XY_STEPS_PER_MM);
- Serial.println(F(" steps/mm"));
-
- Serial.print(F("\t"));
- Serial.print(XY_MAX_SPEED);
- Serial.println(F(" mm/s"));
-
- Serial.print(F("\t"));
- Serial.print(XY_MAX_ACCEL);
- Serial.println(F(" mm/s^2"));
-
- Serial.println();
-
- // ----------------------------------
-
- Serial.println(F("Z:"));
-
- Serial.print(F("\t"));
- Serial.print(Z_AXIS_MIN);
- Serial.print(F(" mm - "));
- Serial.print(Z_AXIS_MAX);
- Serial.println(F(" mm"));
-
- Serial.print(F("\t"));
- Serial.print(Z_STEPS_PER_MM);
- Serial.println(F(" steps/mm"));
-
- Serial.print(F("\t"));
- Serial.print(Z_MAX_SPEED);
- Serial.println(F(" mm/s"));
-
- Serial.print(F("\t"));
- Serial.print(Z_MAX_ACCEL);
- Serial.println(F(" mm/s^2"));
-
- Serial.println();
-
- // ----------------------------------
-
- Serial.println(F("E:"));
-
- Serial.print(F("\t"));
- Serial.print(E_AXIS_MIN);
- Serial.print(F(" mm - "));
- Serial.print(E_AXIS_MAX);
- Serial.println(F(" mm"));
-
- Serial.print(F("\t"));
- Serial.print(E_STEPS_PER_PERCENT);
- Serial.println(F(" steps/percent"));
-
- Serial.print(F("\t"));
- Serial.print(E_MAX_SPEED);
- Serial.println(F(" percent/s"));
-
- Serial.print(F("\t"));
- Serial.print(E_MAX_ACCEL);
- Serial.println(F(" percent/s^2"));
-
- Serial.println();
-
- // ----------------------------------
-
- Serial.print(F("XY max move freq: "));
- Serial.print(XY_MAX_HZ);
- Serial.println(F("hz"));
- Serial.print(F("Z max move freq: "));
- Serial.print(Z_MAX_HZ);
- Serial.println(F("hz"));
- Serial.print(F("E max move freq: "));
- Serial.print(E_MAX_HZ);
- Serial.println(F("hz"));
-
- Serial.print(F("Sample Freq: "));
- Serial.print(hz);
- Serial.print(F("Hz = "));
- Serial.print(us);
- Serial.println(F("us"));
- }
-
- void fast_loop(void) {
- steppers_run();
- encoder_run_fast();
- }
-
- void setup() {
- pinMode(LED_PIN, OUTPUT);
- digitalWrite(LED_PIN, HIGH);
-
- pinMode(BEEPER, OUTPUT);
- blocking_beep(100, 1000);
-
- Serial.begin(115200);
- Serial.println(F("Initializing Fuellfix v2"));
- Serial.print(F("Version: "));
- Serial.println(FIRMWARE_VERSION);
-
- Serial.println(F("Init data"));
- data_init();
-
- Serial.println(F("Init encoder"));
- encoder_init();
-
- Serial.println(F("Init LCD"));
- lcd_init();
-
- Serial.println(F("Init stepper motors"));
- steppers_init();
-
- //print_data();
-
- Serial.println(F("ready, showing splash screen"));
- digitalWrite(LED_PIN, LOW);
- blocking_beep(100, 2000);
-
- // wait some time to show splash screen
- while (millis() < 1500) { }
-
- Serial.println(F("Init state machine"));
- states_init();
-
- blocking_beep(100, 2000);
- Serial.println(F("starting main loop"));
-
- Timer1.initialize(us);
- Timer1.attachInterrupt(fast_loop);
- }
-
- void loop() {
- common_run();
- encoder_run();
-
- bool click = encoder_click();
- bool kill = kill_switch();
-
- CLEAR_STORE_INTERRUPTS();
-
- int change = encoder_change();
- int rpm = encoder_rpm();
-
- bool motor_done[AXIS_COUNT];
- bool all_done = true;
- for (int i = 0; i < AXIS_COUNT; i++) {
- motor_done[i] = stepper_reached_target(i);
- if (!motor_done[i]) {
- all_done = false;
- }
- }
-
- RESTORE_INTERRUPTS();
-
- // allow rudimentary control over serial
- // with enter and w/s or arrow up/down for encoder
- // and q/k/space keys for kill
- static int ser_state = 0;
- while (Serial.available()) {
- int c = Serial.read();
- if (ser_state == 0) {
- if (c == '\n') {
- click = 1;
- } else if ((c == 'q') || (c == 'Q') || (c == 'k') || (c == 'K') || (c == ' ')) {
- kill = 1;
- } else if ((c == 'w') || (c == 'W')) {
- change = 1;
- } else if ((c == 's') || (c == 'S')) {
- change = -1;
- } else if (c == '\e') {
- ser_state = 1;
- }
- } else if (ser_state == 1) {
- if (c == '[') {
- ser_state = 2;
- } else {
- ser_state = 0;
- }
- } else if (ser_state == 2) {
- if (c == 'A') {
- change = 1;
- } else if (c == 'B') {
- change = -1;
- }
- ser_state = 0;
- }
- }
-
- struct StateMachineInput smi(click, change, rpm, kill, motor_done, all_done);
- states_run(smi);
-
- lcd_loop();
- }
|