Sterownik FUCHS

Dział Do it yourself - Zrób to sam - prezentacja urządzeń wszelkiego rodzaju wykonanych we własnym zakresie
Awatar użytkownika
Sławek
Site Admin
Posty: 14530
Rejestracja: 21 gru 2011, 22:12
Has thanked: 15 times
Been thanked: 21 times

Sterownik FUCHS

Post autor: Sławek »

Dostałem dziś poważne zlecenie aby napisać program do obsługi takiego jednego FUCHSa, ale w skali 1:1 :szoki

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ń :
schemat.png
Pozdr
Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.

Awatar użytkownika
Pawloosw
Kierowca
Posty: 9750
Rejestracja: 01 sie 2013, 22:06
Has thanked: 15 times
Been thanked: 10 times

Re: Sterownik FUCHS

Post autor: Pawloosw »

Matko Bosko, ile kodu. :szoki
Dziekuję Sławek, zaraz biore się do roboty i testuje. :ok

Awatar użytkownika
borek
Traktorzysta
Posty: 5212
Rejestracja: 22 sty 2012, 10:28
Has thanked: 16 times
Been thanked: 47 times

Re: Sterownik FUCHS

Post autor: borek »

A czym to będzie sterowac? Jak on na hydro, coś z chwytakiem na elektryce?

Awatar użytkownika
Pawloosw
Kierowca
Posty: 9750
Rejestracja: 01 sie 2013, 22:06
Has thanked: 15 times
Been thanked: 10 times

Re: Sterownik FUCHS

Post autor: Pawloosw »

Borku, to będzie sterować mechanizmem wyłączania zapłonu na pompie wtryskowej (gaszenie silnika) z użyciem elektrycznego siłownika ryglowania drzwi z volvo V40. :he

Awatar użytkownika
Pawloosw
Kierowca
Posty: 9750
Rejestracja: 01 sie 2013, 22:06
Has thanked: 15 times
Been thanked: 10 times

Re: Sterownik FUCHS

Post autor: Pawloosw »

Sławku, przy kompilacji otrzymuję taki error:
This report would have more information with
"Show verbose output during compilation"
enabled in File > Preferences.
Arduino: 1.0.6 (Mac OS X), Board: "Arduino Uno"
sketch_apr04a.ino:17:20: error: eeprom.h: No such file or directory
sketch_apr04a.ino: In function 'void setup()':
sketch_apr04a:51: error: 'EEPROM' was not declared in this scope
sketch_apr04a:51: error: 'EEPROM' was not declared in this scope
sketch_apr04a.ino: In function 'void loop()':
sketch_apr04a:75: error: 'EEPROM' was not declared in this scope
sketch_apr04a:92: error: 'EEPROM' was not declared in this scope

Muszę jakieś dodatkowe biblioteki eeprom załadowac?

Awatar użytkownika
borek
Traktorzysta
Posty: 5212
Rejestracja: 22 sty 2012, 10:28
Has thanked: 16 times
Been thanked: 47 times

Re: Sterownik FUCHS

Post autor: borek »

A sprytne, bo elektrozarór brał prad i robił się gorący pewnie.

Awatar użytkownika
Sławek
Site Admin
Posty: 14530
Rejestracja: 21 gru 2011, 22:12
Has thanked: 15 times
Been thanked: 21 times

Re: Sterownik FUCHS

Post autor: Sławek »

Zobacz czy w katalogu domowym użytkownika Windows w podkatalagu Arduino\libraries masz EEPROM

Awatar użytkownika
Sławek
Site Admin
Posty: 14530
Rejestracja: 21 gru 2011, 22:12
Has thanked: 15 times
Been thanked: 21 times

Re: Sterownik FUCHS

Post autor: Sławek »

Rozpakuj i wrzuc do katalogu jak wyzej lub dodaj poprzez Arduino.
EEPROM.zip
Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.

Awatar użytkownika
Pawloosw
Kierowca
Posty: 9750
Rejestracja: 01 sie 2013, 22:06
Has thanked: 15 times
Been thanked: 10 times

Re: Sterownik FUCHS

Post autor: Pawloosw »

OK. Udało się skompilować i wgrać. Musiałem z poziomu paska narzędzi zaimportować najpierw bibliotekę EEPROM. :scratch
Czas powalczyć z kabelkami.

Awatar użytkownika
Sławek
Site Admin
Posty: 14530
Rejestracja: 21 gru 2011, 22:12
Has thanked: 15 times
Been thanked: 21 times

Re: Sterownik FUCHS

Post autor: Sławek »

:ok

ODPOWIEDZ