Generalnie jest to dwukierunkowy sterownik silnika DC
Zatem program poniżej
Kod: Zaznacz cały
/*
STEROWANIE ZMIANA BIEGUNOWOSCI SILNIKA
Tabela prawdy :
LOW = 0V, HIGH = 5V
PRZEKAZNIK1 = LOW, PRZEKAZNIK2 = HIGH - obroty w jedna strone
PRZEKAZNIK1 = HIGH, PRZEKAZNIK2 = LOW - obroty w przeciwna strone
PRZEKAZNIK1 = HIGH, PRZEKAZNIK2 = HIGH - hamulec, na wyjsciu silnika oba bieguny ujemne
PRZEKAZNIK1 = LOW, PRZEKAZNIK2 = LOW - stan niezalecany, dodatnie bieguny na wyjsciu, w przypadku dotkniecia obudowy silnika do masy moze nastapic zwarcie
*/
#include <Arduino.h>
#include "eeprom.h"
#define PRZEKAZNIK1 2
#define PRZEKAZNIK2 3
#define PRZYCISK 4
#define CZAS_ON 500 // czas dzialania silownika w ms - 1s = 1000ms
#define LOGIKA LOW // gdy przekazniki sa zalaczane stanem niskim nalezy ustawic LOW, w przypadky gdy wysokim - HIGH
#define PRZYCISK_CZAS 50 // dlugosc wcisniecia przycisku w ms aby zadzialala zmiana kierunku, im krótszy tym mogą powstawac drgania styku i krotkie przelaczanie przekaznika
// zmienne
byte stan;
int przyciskStatus;
int ostatniPrzyciskStatus = HIGH;
long ostatniPrzyciskCzas = 0;
void setup() {
pinMode(PRZEKAZNIK1, OUTPUT); // ustawienia pinu jako wyjscie
pinMode(PRZEKAZNIK2, OUTPUT); // ustawienia pinu jako wyjscie
pinMode(PRZYCISK, INPUT_PULLUP); // ustawienia pinu jako wejscie podciagniete do VCC
if(LOGIKA == HIGH) { // ustawienie stanow rozlaczonych na przekaznikach przy uruchomieniu arduino
digitalWrite(PRZEKAZNIK1, LOW);
digitalWrite(PRZEKAZNIK2, LOW);
} else if(LOGIKA == LOW) {
digitalWrite(PRZEKAZNIK1, LOW);
digitalWrite(PRZEKAZNIK2, LOW);
}
if(EEPROM.read(0) > 1); EEPROM.write(0,0); // sprawdzenie wartosci zmiennej stan w eeprom, w przypadku gdy wartosc jest inna niz dozwolona, ustawiana jest 0
stan = EEPROM.read(0); // odczyt otstanio zapamietanego stanu do zmiennej
}
void loop() {
boolean wcisniety = przycisk();
if (wcisniety) {
if(stan == 0) {
if(LOGIKA == LOW) {
digitalWrite(PRZEKAZNIK2, HIGH); // przekaznik 2 wylaczony
delay(10);
digitalWrite(PRZEKAZNIK1, LOW); // przekaznik 1 wlaczony
delay(CZAS_ON);
stop();
} else if(LOGIKA == HIGH) {
digitalWrite(PRZEKAZNIK2, LOW); // przekaznik 2 wylaczony
delay(10);
digitalWrite(PRZEKAZNIK1, HIGH); // przekaznik 1 wlaczony
delay(CZAS_ON);
stop();
}
EEPROM.write(0, 1); // zapamietanie stanu do pamieci eeprom
stan = 1;
} else if(stan == 1) {
if(LOGIKA == LOW) {
digitalWrite(PRZEKAZNIK1, HIGH); // przekaznik 1 wylaczony
delay(10);
digitalWrite(PRZEKAZNIK2, LOW); // przekaznik 2 wlaczony
delay(CZAS_ON);
stop();
} else if(LOGIKA == HIGH) {
digitalWrite(PRZEKAZNIK1, LOW); // przekaznik 1 wylaczony
delay(10);
digitalWrite(PRZEKAZNIK2, HIGH); // przekaznik 2 wlaczony
delay(CZAS_ON);
stop();
}
EEPROM.write(0, 0); // zapamietanie stanu do pamieci eeprom
stan = 0;
}
}
bezpiecznik();
}
// procedura wylaczenia przekaznikow
void stop() {
if(LOGIKA == LOW) {
digitalWrite(PRZEKAZNIK1, HIGH);
digitalWrite(PRZEKAZNIK2, HIGH);
} else if(LOGIKA == HIGH) {
digitalWrite(PRZEKAZNIK1, LOW);
digitalWrite(PRZEKAZNIK2, LOW);
}
}
// procedura wylaczenia przekaznikow w przypadku wykrycia takich samych stanow wlaczajacych na obu przekaznikach
void bezpiecznik() {
if(LOGIKA == LOW) {
if(digitalRead(PRZEKAZNIK1) == LOW && PRZEKAZNIK2 == LOW ) {
digitalWrite(PRZEKAZNIK1, HIGH);
digitalWrite(PRZEKAZNIK2, HIGH);
}
} else if(LOGIKA == HIGH) {
if(digitalRead(PRZEKAZNIK1) == HIGH && PRZEKAZNIK2 == HIGH ) {
digitalWrite(PRZEKAZNIK1, LOW);
digitalWrite(PRZEKAZNIK2, LOW);
}
}
}
// procedura obslugi przycisku
boolean przycisk() {
boolean zwrot = false;
int reading = digitalRead(PRZYCISK);
if (reading != ostatniPrzyciskStatus) {
ostatniPrzyciskStatus = millis();
}
if ((millis() - ostatniPrzyciskCzas) > PRZYCISK_CZAS) {
if (reading != przyciskStatus) {
przyciskStatus = reading;
if (przyciskStatus == LOW) {
zwrot = true;
}
}
}
ostatniPrzyciskStatus = reading;
return zwrot;
}
Schemat połączeń :
Pozdr