loleksibolek Postat Septembrie 16, 2017 Partajează Postat Septembrie 16, 2017 (editat) Am mesterit o incuietoare actionata cu un servomotor si comandata de un arduino plus un RC522.Partea de soft e luata de pe site-ul d-lui Nicu Florica si de pe instructables .Problema care o am si caruia nu reusesc sa-i dau de cap e urmatoarea: acum,la citirea tag-ului rfid servomotorul trage boltul in interior(Servo1.write(0)) iar dupa temporizare il aduce in pozitia de blocare usa(Servo1write(180)).Nu reusesc sa ii adaug un contact(in sketch) pe unul din pini in asa fel incat cu contactul acela facut sa pot da comanda (servo1.write(0)) contactul sa-l desfac(adica sa deschid fizic usa) si apoi cand fac iar contactul(usa inchisa ) sa-i dea comanda (servo1.write(180)) dupa 1-2 secunde.Practic vreau un contact magnetic care sa sesizeze cand usa e inchisa si sa o incuie . Multumesc. #include <Wire.h> #include "Servo.h" int servoPin = 3; Servo Servo1; #include <SPI.h> #include <RFID.h> #define SS_PIN 10 #define RST_PIN 9 RFID rfid(SS_PIN,RST_PIN); int serNum[5]; int ics = 0; const int led3= A3; void setup(){ Serial.begin(9600); SPI.begin(); rfid.init(); pinMode(led3, OUTPUT); Servo1.attach(servoPin); Servo1.write(180); } void loop(){ if(rfid.isCard()){ ics = ics + 1; if(rfid.readCardSerial()){ Serial.print("secventa "); Serial.print(ics); Serial.print(" si cod card = "); Serial.print(rfid.serNum[0],DEC); Serial.print(" "); Serial.print(rfid.serNum[1],DEC); Serial.print(" "); Serial.print(rfid.serNum[2],DEC); Serial.print(" "); Serial.print(rfid.serNum[3],DEC); Serial.print(" "); Serial.print(rfid.serNum[4],DEC); Serial.println(""); Serial.println("---------"); } if ((rfid.serNum[0]==198) && (rfid.serNum[1]==166) && (rfid.serNum[2]==101) && (rfid.serNum[3]==84) && (rfid.serNum[4]==81)) {Serial.println("xxxxx"); Serial.println("---------"); digitalWrite(led3, HIGH); Servo1.write(0); delay(4000); } if ((rfid.serNum[0]==0) && (rfid.serNum[1]==146) && (rfid.serNum[2]==154) && (rfid.serNum[3]==124) && (rfid.serNum[4]==116)) {Serial.println("Acces permis"); Serial.println("---------"); digitalWrite(led3, HIGH); Servo1.write(0); delay(4000); } rfid.halt(); delay(500); Servo1.write(180); digitalWrite(led3, LOW); } } Editat Septembrie 16, 2017 de loleksibolek Link spre comentariu
validae Postat Septembrie 16, 2017 Partajează Postat Septembrie 16, 2017 Poți folosi un releu tip Reed, sau un senzor magnetic tip Hall. Ambele pot fi comandate printr-un mic magnet care le schimbă starea contactelor, respectiv a ieșirii. Link spre comentariu
loleksibolek Postat Septembrie 16, 2017 Autor Partajează Postat Septembrie 16, 2017 (editat) Nu contactul magnetic ma incurca ci adaugarea lui in soft in asa fel incat sa functioneze cum vreau.Am modificat postul anterior,intr-adevar asa se intelegea din postare. Editat Septembrie 16, 2017 de loleksibolek Link spre comentariu
Amaf Postat Septembrie 17, 2017 Partajează Postat Septembrie 17, 2017 (editat) Daca am inteles bine ce vrei codul ar trebui sa arate cam asa: #include <Wire.h> #include "Servo.h" #include <SPI.h> #include <RFID.h> int servoPin = 3; int contact = 4; //usa inchisa = contact inchis Servo Servo1; #define SS_PIN 10 #define RST_PIN 9 RFID rfid(SS_PIN, RST_PIN); int serNum[5]; int ics = 0; const int led3 = A3; bool stare = true; void setup() { Serial.begin(9600); SPI.begin(); rfid.init(); pinMode(led3, OUTPUT); pinMode(contact, INPUT); Servo1.attach(servoPin); Servo1.write(180); } void loop() { if (digitalRead(contact) = HIGH) {//folosim rfid doar daca este inchisa if (rfid.isCard()) { ics = ics + 1; if (rfid.readCardSerial()) { Serial.print("secventa "); Serial.print(ics); Serial.print(" si cod card = "); Serial.print(rfid.serNum[0], DEC); Serial.print(" "); Serial.print(rfid.serNum[1], DEC); Serial.print(" "); Serial.print(rfid.serNum[2], DEC); Serial.print(" "); Serial.print(rfid.serNum[3], DEC); Serial.print(" "); Serial.print(rfid.serNum[4], DEC); Serial.println(""); Serial.println("---------"); } if ((rfid.serNum[0] == 198) && (rfid.serNum[1] == 166) && (rfid.serNum[2] == 101) && (rfid.serNum[3] == 84) && (rfid.serNum[4] == 81)) { Serial.println("xxxxx"); Serial.println("---------"); digitalWrite(led3, HIGH); stare = false; } if ((rfid.serNum[0] == 0) && (rfid.serNum[1] == 146) && (rfid.serNum[2] == 154) && (rfid.serNum[3] == 124) && (rfid.serNum[4] == 116)) { Serial.println("Acces permis"); Serial.println("---------"); digitalWrite(led3, HIGH); stare = false; } rfid.halt(); delay(500); } if (!stare) { Servo1.write(0); delay(4000); Servo1.write(180); digitalWrite(led3, LOW); stare = true; } } else {//usa deschisa while (1) {// se asteapta pana se inchide if (digitalRead(contact) == HIGH) { delay(2000); Servo1.write(180); stare = true; break; } } /*while(digitalRead(contact) == LOW) { } delay(2000); Servo1.write(180); stare = true; */ } } Editat Septembrie 17, 2017 de Amaf Link spre comentariu
nico_2010 Postat Septembrie 17, 2017 Partajează Postat Septembrie 17, 2017 Amaf formateaza codul cu butonul<> din bara editorului Link spre comentariu
loleksibolek Postat Septembrie 17, 2017 Autor Partajează Postat Septembrie 17, 2017 (editat) Am probat, nu citeste tag-ul decat cu contactul facut si pinul 4(HIGH) dar indiferent de starea contactului se activeaza servo1.write(180) dupa cele 4 secunde.Ceea ce mie nu-mi iese nicicum(cunostintele mele de programare sunt f limitate) e ca dupa ce s-a activat servo si trece in (0) sa nu treaca in (180) decat dupa ce pinul 4 a trecut iar in (HIGH).Deci: contact facut -pinul 4 (HIGH) -servo(180)-citeste tag-ul---servo(0)-contactul se desface-pin4(LOW)--asteapta pana cand pinul 4 trece din nou (HIGH)-temporizare 2-3 sec-servo (180) si se reia ciclul cand se citeste un tag bun. Multumesc. L.e. Am rezolvat,cred ca destul de empiric dar... aici if (!stare) { Servo1.write(0); delay(4000); Servo1.write(180); digitalWrite(led3, LOW); stare = true; } am inlocuit pe linia 4 Servo1.Write (180) cu Servo1.write(0).Acum dupa citirea tag-ului si desfacerea contactului asteapta inchiderea contactului (contact HIGH) ,temporizeaza si da comanda Servo1.write(180) sau daca contactul nu se inchide ramane Servo1write(0). Multumesc Amaf. Editat Septembrie 17, 2017 de loleksibolek Link spre comentariu
Amaf Postat Septembrie 17, 2017 Partajează Postat Septembrie 17, 2017 Am considerat ca nu este necesar sa citeasca daca usa este deschisa, iar referitor la cealalta problema trebuie sa mai analizez ca am scris la repezeala codul. Link spre comentariu
loleksibolek Postat Octombrie 14, 2017 Autor Partajează Postat Octombrie 14, 2017 Alta belea.Am nevoie de un servomotor ceva mai maricel comandat de un arduino,in functie de nivelul unui pin.Adica pinul are 5v,servomotorul se duce la 180 grade .Pinul trece in 0 volti,servomotorul vine la 0.Atat.Problema care o intampin e ca atunci cand servomotorul se duce la cate grade ii comand,el nu se opreste complet,ramane un fel de barait ca si cum ar incerca sa-si regleze pozitia fin.Asta e normal,servomotorul fiind costruit pt asa ceva,sa-si pastreze pozitia comandata,dar eu n-am nevoie de asta,dupa ce trece in una din cele doua pozitii vreau sa-i tai comanda.Am incercat cu detach() dar nu reusesc,m-am gandit sa comand un pin ca iesire si sa-l programez ca la orice comanda data servomotorului sa se activeze cateva secunde apoi sa se opreasca si sa comand un releu care sa-i taie comada la servo dar nici asa n-am reusit. #include <Servo.h> int servoPin = 3; int ledPin= 4; int comanda = 5; int buttonState = 0; Servo ServoT; void setup() { pinMode(comanda,INPUT); pinMode(ledPin,OUTPUT); digitalWrite(ledPin,LOW); for(int x=0; x<2; x++) { pinMode(comanda, INPUT); } } void loop() { for(int x=0; x<2; x++) { buttonState = digitalRead(comanda); } if (buttonState == LOW) { ServoT.attach(servoPin); ServoT.write(18); } if (buttonState == HIGH) { ServoT.attach(servoPin); ServoT.write(120) } Cu codul asta merge dar servomotorul ramane alimentat ca sa-si mentina pozitia,daca ii pun comanda unul led nu trece de delay.Am incercat asa if (buttonState == High) { servoT.write(18); digitalWrite (ledPin,HIGH); delay(1000); digitalWrite(ledPin,LOW); } servomotorul se duce in 18 grade,ledul se aprinde dar ramane aprins. Ca sa intelegeti mai bine,servomotorul roteste sfera unui robinet,n-am nevoie sa mentina pozitia,doar ca atunci cand primeste comanda sa deschida sau sa inchida robinetul iar apoi sa ,,muteasca" pana la comanda urmatoare.Multumesc. Link spre comentariu
Postări Recomandate
Creează un cont sau autentifică-te pentru a adăuga comentariu
Trebuie să fi un membru pentru a putea lăsa un comentariu.
Creează un cont
Înregistrează-te pentru un nou cont în comunitatea nostră. Este simplu!
Înregistrează un nou contAutentificare
Ai deja un cont? Autentifică-te aici.
Autentifică-te acum