Tenhle kód by měl fungovat.
1. Po restartu motor stojí, teprve stiskem jednoho z tlačítek se rozběhne na jednu nebo druhou stranu
2. Tlačítka jsou zapojena proti zemi, tedy při stisku je detekována úroveň 0 respektive false.
Obojí lze pochopitelně snadno změnit.
Nezbytnou knihovnu Interval si musíš nainstalovat do Arduino IDE, přikládám ji sem ve formě zip.
Tato koncepce programu má tu výhodu, že není použita žádná funkce delay(), která by zbytečně blokovala procesor. Ten udělá jen to, co je nezbytné a pak lelkuje. Snažil jsem se prezentovat i efektivní využití paměti. Z toho plyne, že když hodlám program následně rozšiřovat a dělám to dobře, tak nemusím mít problém ani s operační pamětí a ani s výkonem. Všechny funkce "Serial" je možné zakomentovat, protože mi sloužily pouze pro odzkoušení programu. I direktivy #define dokáží ušetřit paměť a naprosto zadarmo zpřehlednit program a umožňují snadnou a přehlednou změnu parametrů. Jak vidno, celý program je vlastně jen snaha o poctivé ošetření tlačítek, jinak nic. Asi nejtěžší na programování je psaní komentářů k nim
Kód: Vybrat vše
#include <interval.h>
#define MOTOR1 2 // L298N
#define MOTOR2 3 // L298N
#define BUTTONP 4 // tlacitko predni - spinac proti zemi !!!!!!!!!
#define BUTTONZ 5 // tlacitko zadni - spinac proti zemi !!!!!!!!!
#define MOTORPWM 9 // pin rizeni vykonu motoru
#define POWER 200 // vykon/otacky motoru
#define BUTTONTIMER 50 // interval cteni tlacitek [ms]
//****************** Globalni promenne *******************************************
//bool MOTOR1State = false;
//bool Motor2State = false;
bool ButtonP = true; // tlacitko P - zapojeno proti zemi, stisknuto = false
bool ButtonZ = true; // tlacitko Z - zapojeno proti zemi, stisknuto = false
bool ReleaseP = false; // priznak uvolneni tlacitka P, uvolneno = true
bool ReleaseZ = false; // priznak uvolneni tlacitka Z, uvolneno = true
uint8_t ButtonPCount = 0; // citac doby stisku tlacitka P
uint8_t ButtonZCount = 0; // citac doby stisku tlacitka Z
//********************************************************************************
Interval ButtonsInterval;
void setup() {
/* nastaveni vstupu/vystupu */
Serial.begin(9600);
pinMode(MOTOR1, OUTPUT);
pinMode(MOTOR2, OUTPUT);
pinMode(BUTTONP, INPUT_PULLUP);
pinMode(BUTTONZ, INPUT_PULLUP);
pinMode(MOTORPWM, OUTPUT);
analogWrite(MOTORPWM, POWER);
}
void loop() {
if (ButtonsInterval.expired()) {
ButtonsInterval.set(BUTTONTIMER);
/* pokud je tlacitkoP drzeno vice jak dva casove intervaly
BUTTONTIMER, pak se přepne motor do pozadovaneho smeru. */
if (!digitalRead(BUTTONP) && ReleaseP) {
ButtonPCount++; // citani doby stisku tlacitka1
if (ButtonPCount > 1) {
// Motor dopředu
Serial.println("Motor dopredu");
digitalWrite(MOTOR1, HIGH);
digitalWrite(MOTOR2, LOW);
ButtonPCount = 0; // nuluj citac doby stisku tlacitkaP
ReleaseP = false; // nuluj priznak uvolneni tlacitkaP
}
}
/* ceka na uvolneni tlacitkaP vice jak po dobu tri period BUTTONTIMER */
if (digitalRead(BUTTONP)&& !ReleaseP) {
ButtonPCount++; // citani doby uvolneni tlacitkaP
if (ButtonPCount > 2) {
Serial.println("Uvolneno tlacitko dopredu");
ButtonPCount = 0;// nuluj citac doby uvolneni tlacitkaP
ReleaseP = true; // nastav priznak uvolneni tlacitkaP
}
}
/* pokud je tlacitkoZ drzeno vice jak dva casove intervaly
BUTTONTIMER, pak se přepne motor do pozadovaneho smeru. */
if (!digitalRead(BUTTONZ) && ReleaseZ) {
ButtonZCount++; // citani doby stisku tlacitkaZ
if (ButtonZCount > 1) {
// Motor dozadu
Serial.println("Motor dozadu");
digitalWrite(MOTOR1, LOW);
digitalWrite(MOTOR2, HIGH);
ButtonZCount = 0; // nuluj citac doby stisku tlacitkaZ
ReleaseZ = false; // nastav priznak uvolneni tlacitkaZ
}
}
/* ceka na uvolneni tlacitkaZ vice jak po dobu tri period BUTTONTIMER */
if (digitalRead(BUTTONZ)&& !ReleaseZ) {
ButtonZCount++; // citani doby uvolneni tlacitkaZ
if (ButtonZCount > 2) {
Serial.println("Uvolneno tlacitko dozadu");
ButtonZCount = 0;// nuluj citac doby uvolneni tlacitkaZ
ReleaseZ = true; // nastav priznak uvolneni tlacitkaZ
}
}
}
}
Tenhle kód by měl fungovat s tlačítky na Vcc.
Kód: Vybrat vše
#include <interval.h>
#define MOTOR1 2 // L298N
#define MOTOR2 3 // L298N
#define BUTTONP 4 // tlacitko predni - spinac proti Vcc !!!!!!!!!
#define BUTTONZ 5 // tlacitko zadni - spinac proti Vcc !!!!!!!!!
#define MOTORPWM 9 // pin rizeni vykonu motoru
#define POWER 200 // vykon/otacky motoru
#define BUTTONTIMER 50 // interval cteni tlacitek [ms]
//****************** Globalni promenne *******************************************
//bool MOTOR1State = false;
//bool Motor2State = false;
bool ButtonP = false; // tlacitko P - zapojeno proti Vcc, stisknuto = true
bool ButtonZ = false; // tlacitko Z - zapojeno proti Vcc, stisknuto = true
bool ReleaseP = false; // priznak uvolneni tlacitka P, uvolneno = true
bool ReleaseZ = false; // priznak uvolneni tlacitka Z, uvolneno = true
uint8_t ButtonPCount = 0; // citac doby stisku tlacitka P
uint8_t ButtonZCount = 0; // citac doby stisku tlacitka Z
//********************************************************************************
Interval ButtonsInterval;
void setup() {
/* nastaveni vstupu/vystupu */
Serial.begin(9600);
pinMode(MOTOR1, OUTPUT);
pinMode(MOTOR2, OUTPUT);
pinMode(BUTTONP, INPUT);
pinMode(BUTTONZ, INPUT);
pinMode(MOTORPWM, OUTPUT);
analogWrite(MOTORPWM, POWER);
}
void loop() {
if (ButtonsInterval.expired()) {
ButtonsInterval.set(BUTTONTIMER);
/* pokud je tlacitkoP drzeno vice jak dva casove intervaly
BUTTONTIMER, pak se přepne motor do pozadovaneho smeru. */
if (digitalRead(BUTTONP) && ReleaseP) {
ButtonPCount++; // citani doby stisku tlacitka1
if (ButtonPCount > 1) {
// Motor dopředu
Serial.println("Motor dopredu");
digitalWrite(MOTOR1, HIGH);
digitalWrite(MOTOR2, LOW);
ButtonPCount = 0; // nuluj citac doby stisku tlacitkaP
ReleaseP = false; // nuluj priznak uvolneni tlacitkaP
}
}
/* ceka na uvolneni tlacitkaP vice jak po dobu tri period BUTTONTIMER */
if (!digitalRead(BUTTONP)&& !ReleaseP) {
ButtonPCount++; // citani doby uvolneni tlacitkaP
if (ButtonPCount > 2) {
Serial.println("Uvolneno tlacitko dopredu");
ButtonPCount = 0;// nuluj citac doby uvolneni tlacitkaP
ReleaseP = true; // nastav priznak uvolneni tlacitkaP
}
}
/* pokud je tlacitkoZ drzeno vice jak dva casove intervaly
BUTTONTIMER, pak se přepne motor do pozadovaneho smeru. */
if (digitalRead(BUTTONZ) && ReleaseZ) {
ButtonZCount++; // citani doby stisku tlacitkaZ
if (ButtonZCount > 1) {
// Motor dozadu
Serial.println("Motor dozadu");
digitalWrite(MOTOR1, LOW);
digitalWrite(MOTOR2, HIGH);
ButtonZCount = 0; // nuluj citac doby stisku tlacitkaZ
ReleaseZ = false; // nastav priznak uvolneni tlacitkaZ
}
}
/* ceka na uvolneni tlacitkaZ vice jak po dobu tri period BUTTONTIMER */
if (!digitalRead(BUTTONZ)&& !ReleaseZ) {
ButtonZCount++; // citani doby uvolneni tlacitkaZ
if (ButtonZCount > 2) {
Serial.println("Uvolneno tlacitko dozadu");
ButtonZCount = 0;// nuluj citac doby uvolneni tlacitkaZ
ReleaseZ = true; // nastav priznak uvolneni tlacitkaZ
}
}
}
}