A kód elvileg helyes, gyakorlatilag inkább egy rotary encoder könyvtárat keresnék, ami működik rendesen. Plusz enkódert illik inkább megszakításból kezelni, nem pedig ezzel a módszerrel. Google arduino rotary encoder with interrupt.
Nos, iltt megtalálod a kiválasztott motor működését. Van ugye 1 közös vezeték, ez plusz 5 voltot kap, és 4 darab a 4 tekercshez.
Ha egyetlen tekercset táplálsz be (küldesz ki rá GND-t, testet a végfok IC-n keresztül, akkor a toro mágnese "odaforog" és beáll a tekecs irányába (több póluspárja van, de ez mot mindegy).
Ha most a következő tekercs re IS ráteszed a testet, akkor beáll a kettő közé. Most leveszed az elsőről a testet, továbblép fél osztást.... stb stb.
Vagyis tulajdonképpen 4 bit 8 féle kombinációját küldöd ki rá. Ez annyit jelent, hogy valamelyik portra 4 bitet erre használsz, és egymás után írod ki a kombinációkat. Ha ezt gyorsabban teszed, akkor gyorsabban forog. ha túl gyorsan, akkor "leszakad", nme tudja követni.
Viszontha eegáns megoldást akarsz, a végállásokra kapcsolókat teszel.
Amúgy ha felültközik, nem lesz baja, már ha a meghajtott ajtó zsanérja kibírja a motor + hajtómű nyomatékát. Csak zümmögni fog.,
Azt találtam ki, hogy ezzel a motorral oldanám meg a leendő lézer gravírozóm burkalat ajtajának a nyitását. Az lenne a cél, hogy az arduino (UNO vagy nano) a 2 végpont közelében lassabban mozduljon. Egyfajta finom mozgást lehetne létrehozni. Be kellene azt is állítani hogy mennyi idejig működjön a motor (vagy hogy hány lépést tegyen meg?) így elkerülendő a túlnyitás.
ű
Hogy kellene ezt megvalósítani? Hogy kezdjek hozzá? (Sose volt még dolgom arduinoval, szóval nagyon-nagyon kezdő vagyok) Tudnátok segíteni?
Most ismerkedem az Arduinokkal és már meg is akadtam. Van egy Mega 2560-as amivel egy inkrementális enkódert szeretnék számoltatni, de sajnos olyan mintha lassú lenne a jelfeldolgozás.Minél gyorsabban forgatom az encodert, annál kevesebb lépést számol 1 körre. Az enkóder piros +5, fekete gnd, a két jel kábel meg a 20,21 es lábon egy-egy 10k ellenállással a pozitívra húzva. Nagyon megköszönném, ha rávilágítanátok, hol a gond. Itt a kód, amivel próbálkozom:
int a=20; int b=21; int szamlalo; int state; int laststate;
void setup() { int laststate=digitalRead(a); Serial.begin(9600);
}
void loop() { // put your main code here, to run repeatedly: int state=digitalRead(a); if (state!=laststate) { if (digitalRead(b)!=state) { szamlalo++; } else { szamlalo--; } laststate=state; kiir(); } }
A DS3231 RTC eepromját (AT24C32) szeretném használni, de még soha nem volt dolgom semmiféle eeprommal, így elég láma vagyok.
A feladat az volna, hogy 50-60db uint32_t változót (Nextion HMI miatt a number-eket így kell deklarálni - ezért van ez a pazarlás) kellene elmentenem gombnyomásra az eepromba (akár egyszerre az összeset vagy külön címenként - nem tudom mi a célravezetőbb). A változók értékei egyébként csak 0-255 közötti egész számok lehetnek (tehát elméletben elég egy byte egy változónak, ha jól értem) . Egy-egy változónak fix helyen!? kellene lennie, hogy esetleges újraindítást követően visszaolvasásakor megtalálja és felül tudja írni az elmentett értékkel a deklarált változó tartalmát. Mivel viszonylagosan ritkán (max napi 1-2 felülírási ciklus lenne, így az eeprom élettartama (100.000 ciklus) nem meghatározó.
Így leírva nem is hangzik bonyolultnak, de mégis....
Hogy álljak neki?
Elgondolkodtam esetleg külső külön eeprom (24LC256) használatán is. A címzésnél lehet ütközés ebben az esetben (RTC 0x68 ; 24LC256 0x50)?
//****************************************Define I2C LCD Display ********************************* #define I2C_ADDR 0x27 // Define I2C Address for the PCF8574T //---(Following are the PCF8574 pin assignments to LCD connections )---- // This are different than earlier/different I2C LCD displays
//**************************LCD Setup******************************** lcd.begin (16,2); // initialize the lcd // Switch on the backlight lcd.setBacklightPin(BACKLIGHT_PIN,POSITIVE); lcd.setBacklight(LED_ON); //***************************END LCD Setup********************************
Serial.println("Setting time"); setTheTime("304022129022016"); // ssmmhhWDDMMYYYY set time once in the given format
}
void loop() { char tempF[6]; float temperature; char buff[BUFF_MAX]; unsigned long now = millis(); struct ts t; // show time once in a while if (now - prev > interval){ DS3231_get(&t); //Get time temperature = DS3231_get_treg(); //Get temperature dtostrf(temperature, 5, 1, tempF);
lcd.clear(); lcd.setCursor(0,0);
lcd.print(t.mday);
printMonth(t.mon);
lcd.print(t.year);
lcd.setCursor(0,1); //Go to second line of the LCD Screen lcd.print(t.hour); lcd.print(":"); if(t.min<10) { lcd.print("0"); } lcd.print(t.min); lcd.print(":"); if(t.sec<10) { lcd.print("0"); } lcd.print(t.sec);
void printMonth(int month) { switch(month) { case 1: lcd.print(" January ");break; case 2: lcd.print(" February ");break; case 3: lcd.print(" March ");break; case 4: lcd.print(" April ");break; case 5: lcd.print(" May ");break; case 6: lcd.print(" June ");break; case 7: lcd.print(" July ");break; case 8: lcd.print(" August ");break; case 9: lcd.print(" September ");break; case 10: lcd.print(" October ");break; case 11: lcd.print(" November ");break; case 12: lcd.print(" December ");break; default: lcd.print(" Error ");break; } }
int Relay0 = 13; int Relay1 = 5; int Relay2 = 6; int Relay3 = 10;
DS3231 rtc(SDA, SCL); Time t;
const int OnHour0 = 17; const int OnMin0 = 30; const int OffHour0 = 17; const int OffMin0 = 31; const int OnHour1 = 12; const int OnMin1 = 26; const int OffHour1 = 12; const int OffMin1 = 27;
A hiba oka: A DS3231 osztálynak nincs olyan konstruktora, ami 2 paramétert kérne. Honnan vetted a példát, ami szerint meg kell neki adni az SDA és az SCL lábakat?
Jól megválasztott időalat, és reset a buli végén, vagy ha valami elhúzódik.
Szerintem menni fog.
A tápre teszek majd a végső nyák-on szűrés, a bementekre nem hiszem, hogy nagygon kellene. Optokapu van, az úgy előtétezve, hogy van még tartalék, ha megszaladna (kicsit) a bemeneti feszültség, ha elpukkantja a gazdája, akkor foglalatos; csere és mehet tovább.
Kifagyás esetén jó lenne a kimeneteket tartani, - kiindulva abból, hogy talán nem történik nagy változás a bementeken az alatt a néhány másodperc alatt, amíg a rendszer újraindul, - de attól tartok, hogy watchdog reset esetén törlődnek a kimenetek.... Persze vissza alehet állítani az utolsó állapotot, de akkor is lesz benne a rövid kiesés... Lehet, hogy a kimenetre tárolót kellene tenni, és ha kiesik alóla a Nano, akkor is marad minden vezérelve, ahogy volt.
A beépített watchdogot nagyon okosan kell paraméterezni, hogy ideálisan működjön, de nyilván megoldás. Én a külsők híve vagyok. Zavarszűrés mindennek az alkalmazási körülmények föggvényében: táp mindenképp, bemenetek, ha arra szükség van (szűrés, védelem). Az áramszünetes dologra Vargham írt jó megoldást, de még ha nem is akarod pontosan ugyanonnan folytati, akkor is lehet egy állapot, amit az aktuális bemenetek vagy az idő vagy valamely más paraméterek alapján beállít.
> Ezt folyamatosan tárolni kellene EEPROM területen, hogy ne vesszen el, ezzel viszont hamar elérném az EEPROM véges írási ciklusát, szóval ez sem jó...
Erre való az EERAM. Folyamatosan írsz bele, nem kopik, mert SRAM. Amikor elmegy a táp, azt érzékeli, és egy kondiban tárolt energia segítségével beírja a SRAM tartalmát a tokon belüli EEPROM-ba.
A 7805 nem melegszik, csak a Nano megy róla, a kimeneti driver IC nem sokat húz a kimeneteken. Persze a step-down a szép megoldás, de most így tesztre; jó lesz így.
Zavarszűrés a tápnak? Vagy zavarszűrés a bemenetekre? Melyikre gondolsz?
Nem terveztem bele watchdog-ot, mivel azt egy külső aktív elemnek kellene vinnie, pld. egy másik Ardu. És ha az fagy le?
Ha van erre valamilyen konkrét megoldásod; mindenképp érdekelne!
Áramszünet után a program az elejétől indul el. Ha onnan szeretném folytatni, ahol épp volt, akkor le kellene tárolnom EEPROM-ba egyrészt az összes kimenet értékét minden változáskor, valamint kellene egy programmutató, amit szintén. Ezt folyamatosan tárolni kellene EEPROM területen, hogy ne vesszen el, ezzel viszont hamar elérném az EEPROM véges írási ciklusát, szóval ez sem jó...
24V-->5V egy step-down nem lett volna jobb? Esélyes, hogy a 7805 durván melegedni fog. PLC-t zavarszűrés nélkül elég meredek dolog csinálni, pláne, ha kapcsolószekrénybe kerül.
Kis kínai Nano, nagy olasz Nano, nagy brit arm is le fog fagyni, ha úgy tartja kedve. És akkor lehet felmászni a létrán és resetet nyomkodni.
Az áramszüneti protokoll az, hogy áramkimaradás esetén hogyan tér vissza aktív állapotba, mit indít, ha programját honnan kezdi (ha kezdi egyáltalán).
Egyik sem "must have", de ettől függetlenül én hasznosnak találom ezeket a funkciókat, és felügyelet nélküli rendszerekbe integrálom is.