#ifdef F_CPU
#undef F_CPU
#define F_CPU 8000000L
#endif
#define MAX_D_IMPL 9000
#define MAX_A 9000
#define LED_MRUG 500UL
#define X_GND_PIN 10
#define Y_GND_PIN 9
#define POT_VCC_PIN 3
#define LED_PIN 4
#define PRZYC_PIN 2
#define X_STEP_PIN 13
#define X_EN_PIN 12
#define X_DIR_PIN 11
#define X_OS A6
#define X_OGR_V A1
#define X_OGR_A A2
#define Y_STEP_PIN 6
#define Y_EN_PIN 7
#define Y_DIR_PIN 8
#define Y_OS A7
#define Y_OGR_V A4
#define Y_OGR_A A5
#define POZ_HIST_JOY_ZERO MAX_D_IMPL/40
#define SPAC 300000UL //5 min
#include <avr/sleep.h>
uint64_t cMicr, teraz, czas_bater, czas_led;
uint64_t XprMicr, Xd_Micr, YprMicr, Yd_Micr;
int16_t Xv, Xa, Yv, Ya;
bool Xp, Yp;
void wakeUpNow()
digitalWrite(LED_PIN, HIGH);
digitalWrite(POT_VCC_PIN, HIGH);
}
void setup()
{
pinMode(X_GND_PIN, OUTPUT);
digitalWrite(X_GND_PIN, LOW);
pinMode(Y_GND_PIN, OUTPUT);
digitalWrite(Y_GND_PIN, LOW);
pinMode(POT_VCC_PIN, OUTPUT);
digitalWrite(POT_VCC_PIN, HIGH);
pinMode(LED_PIN, OUTPUT);
pinMode(PRZYC_PIN, INPUT_PULLUP);
pinMode(X_STEP_PIN, OUTPUT);
pinMode(X_EN_PIN, OUTPUT);
pinMode(X_DIR_PIN, OUTPUT);
digitalWrite(X_STEP_PIN, LOW);
digitalWrite(X_EN_PIN, LOW);
digitalWrite(X_DIR_PIN, LOW);
pinMode(X_OS, INPUT);
pinMode(X_OGR_V, INPUT);
pinMode(X_OGR_A, INPUT);
pinMode(Y_STEP_PIN, OUTPUT);
pinMode(Y_EN_PIN, OUTPUT);
pinMode(Y_DIR_PIN, OUTPUT);
digitalWrite(Y_STEP_PIN, LOW);
digitalWrite(Y_EN_PIN, LOW);
digitalWrite(Y_DIR_PIN, LOW);
pinMode(Y_OS, INPUT);
pinMode(Y_OGR_V, INPUT);
pinMode(Y_OGR_A, INPUT);
}
void sleepNow()
{
digitalWrite(LED_PIN, LOW);
digitalWrite(POT_VCC_PIN, LOW);
set_sleep_mode(SLEEP_MODE_PWR_DOWN);
sleep_enable();
attachInterrupt(0, wakeUpNow, LOW);
sleep_mode();
sleep_disable();
detachInterrupt(0);
}
void loop()
{
cMicr = micros();
teraz = millis();
// oś X
Xv = map(analogRead(X_OS), 0, 1023, -MAX_D_IMPL, MAX_D_IMPL);
if (Xv > POZ_HIST_JOY_ZERO)
{
Xv = MAX_D_IMPL - Xv + map(analogRead(X_OGR_V), 0, 1023, MAX_D_IMPL, 1);
}
else if(Xv < 0-POZ_HIST_JOY_ZERO)
{
digitalWrite(X_DIR_PIN, HIGH);
Xv += MAX_D_IMPL + map(analogRead(X_OGR_V), 0, 1023, MAX_D_IMPL, 1);
}
else
{
digitalWrite(X_EN_PIN, HIGH);
digitalWrite(X_DIR_PIN, LOW);
digitalWrite(X_STEP_PIN, LOW);
Xv=0;
Xa = map(analogRead(X_OGR_A), 0, 1023, MAX_A, 0);
digitalWrite(LED_PIN, LOW);
}
if(Xv)
{
digitalWrite(X_EN_PIN, LOW);
Xd_Micr = long(Xv + (Xa?Xa--:0));
if(cMicr - XprMicr > Xd_Micr)
{
XprMicr = cMicr;
Xp = !Xp;
digitalWrite(X_STEP_PIN, Xp);
digitalWrite(LED_PIN, Xp);
czas_bater = teraz;
}
}
// oś Y
Yv= map(analogRead(Y_OS), 0, 1023, -MAX_D_IMPL, MAX_D_IMPL);
if (Yv > POZ_HIST_JOY_ZERO)
{
Yv = MAX_D_IMPL - Yv + map(analogRead(Y_OGR_V), 0, 1023, MAX_D_IMPL, 1);
}
else if (Yv < 0-POZ_HIST_JOY_ZERO)
{
digitalWrite(Y_DIR_PIN, HIGH);
Yv += MAX_D_IMPL + map(analogRead(Y_OGR_V), 0, 1023, MAX_D_IMPL, 1);
}
else
{
digitalWrite(Y_EN_PIN, HIGH);
digitalWrite(Y_DIR_PIN, LOW);
digitalWrite(Y_STEP_PIN, LOW);
Yv=0;
Ya = map(analogRead(Y_OGR_A), 0, 1023, 0, MAX_A);
}
if(Yv)
{
digitalWrite(Y_EN_PIN, LOW);
Yd_Micr = long(Yv + (Ya?Ya--:0));
if(cMicr - YprMicr > Yd_Micr)
{
YprMicr = cMicr;
Yp = !Yp;
digitalWrite(Y_STEP_PIN, Yp);
digitalWrite(LED_PIN, Yp);
czas_bater = teraz;
}
}
if((teraz - czas_led > LED_MRUG) && !Xv && !Yv)
{
czas_led = teraz;
digitalWrite(LED_PIN, HIGH);
delay(55);
}
if(teraz - czas_bater > SPAC) sleepNow();
}