/*DD-9602. programma per controllo motori utilizzando il radiocomando RC. by Damiano Derin*/ #define DirMotorA 12 #define PWMMotorA 3 #define DirMotorB 13 #define PWMMotorB 11 // collegamento rx. const int ch1 = 4; const int ch2 = 5; unsigned long duration1; unsigned long duration2; int ch1Value = 0; int ch11Value = 0; int ch2Value = 0; int ch22Value = 0; int go = 0; int back = 0; void setup() { pinMode(DirMotorA, OUTPUT); pinMode(PWMMotorA, OUTPUT); pinMode(DirMotorB, OUTPUT); pinMode(PWMMotorB, OUTPUT); pinMode(ch1, INPUT); pinMode(ch2, INPUT); } void loop() { // per lettura del segnale. duration1 = pulseIn(ch1, HIGH); duration2 = pulseIn(ch2, HIGH); // variare i valori se i pad del radiocomando non sono ben tarati. ch1Value = map(duration1, 1100, 1900, 0, 600); ch1Value = constrain(ch1Value, 0, 255); ch11Value = map(duration1, 1100, 1900, 510, 0); ch11Value = constrain(ch11Value, 0, 255); ch2Value = map(duration2, 1100, 1900, 510, 0); ch2Value = constrain(ch2Value, 0, 255); ch22Value = map(duration2, 1100, 1900, 0, 600); ch22Value = constrain(ch22Value, 0, 255); go = 255 - ch2Value; back = 255 - ch22Value; // primo quadrante. if (ch11Value < 255) { digitalWrite(DirMotorA, HIGH); analogWrite(PWMMotorA, go); digitalWrite(DirMotorB, HIGH); analogWrite(PWMMotorB, ch11Value); } // secondo quadrante. if (ch1Value < 255) { digitalWrite(DirMotorA, HIGH); analogWrite(PWMMotorA, ch1Value); digitalWrite(DirMotorB, HIGH); analogWrite(PWMMotorB, go); } // terzo quadrante. if (ch1Value < 255 && back > 0) { digitalWrite(DirMotorA, LOW); analogWrite(PWMMotorA, ch1Value); digitalWrite(DirMotorB, LOW); analogWrite(PWMMotorB, back); } // quarto quadrante. if (ch11Value < 255 && back > 0) { digitalWrite(DirMotorA, LOW); analogWrite(PWMMotorA, back); digitalWrite(DirMotorB, LOW); analogWrite(PWMMotorB, ch11Value); } // avanti. if (go > 0 && ch1Value == 255 && ch11Value == 255) { digitalWrite(DirMotorA, HIGH); analogWrite(PWMMotorA, go); digitalWrite(DirMotorB, HIGH); analogWrite(PWMMotorB, go); } // indietro. if (back > 0 && ch1Value == 255 && ch11Value == 255) { digitalWrite(DirMotorA, LOW); analogWrite(PWMMotorA, back); digitalWrite(DirMotorB, LOW); analogWrite(PWMMotorB, back); } // STOP. if (go == 0 && back == 0) { digitalWrite(DirMotorA, HIGH); analogWrite(PWMMotorA, 0); digitalWrite(DirMotorB, HIGH); analogWrite(PWMMotorB, 0); } // estremo destro in alto. if (go == 255 && ch11Value == 0) { digitalWrite(DirMotorA, HIGH); analogWrite(PWMMotorA, 255); digitalWrite(DirMotorB, LOW); analogWrite(PWMMotorB, 255); } // estremo sinistro in alto. if (go == 255 && ch1Value == 0) { digitalWrite(DirMotorA, LOW); analogWrite(PWMMotorA, 255); digitalWrite(DirMotorB, HIGH); analogWrite(PWMMotorB, 255); } // estremo destro in basso. if (back == 255 && ch11Value == 0) { digitalWrite(DirMotorA, LOW); analogWrite(PWMMotorA, 255); digitalWrite(DirMotorB, HIGH); analogWrite(PWMMotorB, 255); } // estremo sinistro in basso. if (back == 255 && ch1Value == 0) { digitalWrite(DirMotorA, HIGH); analogWrite(PWMMotorA, 255); digitalWrite(DirMotorB, LOW); analogWrite(PWMMotorB, 255); } }