mars01 Postat Februarie 14, 2017 Partajează Postat Februarie 14, 2017 Nu prea inteleg ce vrei sa spui prin comenzi pe port digital: te referi cumva la port manipulation folosind direct registrii Atmega (PORTx, DDRx)? Functia digitalWrite(x,y) scrie pe pinul x o valoare de LOW sau HIGH. Exista si o functie analogWrite(x,y) dar acea functioneaza doar pe pinii care au PWM si pe acei pini se va genera o forma de unda cu frecventa de 980Hz si cu un factor de umplere corespunzator valorii y. Din cate inteleg tu ai nevoie sa scrii LOW sau HIGH pe pini deci ai nevoie sa folosesti functia digitalWrite(x,y). Sau port manipulation. Link spre comentariu
aureliu67 Postat Februarie 15, 2017 Partajează Postat Februarie 15, 2017 Am fost atentionat ca nu am specificat ca postarile cu arduino Uno si arduino nano nu aveau legatura intre ele. Si colegii au inteles ca ma refeream la acelasi dispozitiv. Imi cer scuze pentru confuzia produsa. Cu ajutorul va_cristi am reusit sa aprind ledurile unde doream iar un prieten m-a ajutat sa finalizez proiectul pentru parcare. Insa am o problema. Senzorii sunt bruiati de multe ori de nu stiu ce factori. As dori sa introduc o bucla la citire sensori de 10 ori, sa fac media, si in functie de rezultat sa se apronda ledul rosu (ocupat) sau verde (liber) As dori sa -l transfer acest program in flowcode dar nu stiu cum sa-l "sectionez" in partile salae separate. Cand o masina parcheaza, sensorul ultrasonic masoara distanta si daca este sub 120 cm arata ocupat. Daca nu se detectreaza obstacol pana in 120 cm atunci arata liber parking_sensor_v0.3.rar Link spre comentariu
mars01 Postat Februarie 15, 2017 Partajează Postat Februarie 15, 2017 (editat) Salut! Atunci cand ceri ajutor legat de cod, este un lucru bun sa il postezi astfel incat cei care te ajuta sa poata vedea despre ce este vorba mai usor. Adica asa: //sensor pins (all digital)const int s1_echo = 2;const int s1_trigger = 3;const int s2_echo = 4;const int s2_trigger = 5;const int s3_echo = 6;const int s3_trigger = 7;const int s4_echo = 8;const int s4_trigger = 9;const int s5_echo = 10;const int s5_trigger = 11;//light pinsconst int s1_green_light = 12;const int s1_red_light = 13;const int s2_green_light = A1;const int s2_red_light = A0;const int s3_green_light = A3;const int s3_red_light = A2;const int s4_green_light = A5;const int s4_red_light = A4;const int s5_green_light = A7;const int s5_red_light = A6;//distances in cmconst int s1_threshold = 120;const int s2_threshold = 120;const int s3_threshold = 120;const int s4_threshold = 120;const int s5_threshold = 120;void setup() { // initializing all pins pinMode(s1_red_light, OUTPUT); pinMode(s1_green_light, OUTPUT); pinMode(s2_red_light, OUTPUT); pinMode(s2_green_light, OUTPUT); pinMode(s3_red_light, OUTPUT); pinMode(s3_green_light, OUTPUT); pinMode(s4_red_light, OUTPUT); pinMode(s4_green_light, OUTPUT); pinMode(s5_red_light, OUTPUT); pinMode(s5_green_light, OUTPUT); pinMode(s1_trigger, OUTPUT); pinMode(s1_echo, INPUT); pinMode(s2_trigger, OUTPUT); pinMode(s2_echo, INPUT); pinMode(s3_trigger, OUTPUT); pinMode(s3_echo, INPUT); pinMode(s4_trigger, OUTPUT); pinMode(s4_echo, INPUT); pinMode(s5_trigger, OUTPUT); pinMode(s5_echo, INPUT);}void loop() { sensor_check (s1_echo, s1_trigger, s1_red_light, s1_green_light, s1_threshold); sensor_check (s2_echo, s2_trigger, s2_red_light, s2_green_light, s2_threshold); sensor_check (s3_echo, s3_trigger, s3_red_light, s3_green_light, s3_threshold); sensor_check (s4_echo, s4_trigger, s4_red_light, s4_green_light, s4_threshold); sensor_check (s5_echo, s5_trigger, s5_red_light, s5_green_light, s5_threshold); delay(50); // and let's make it fast}//function to run - echo pin, trigger pin, red light pin, green light pin, threshold for light change, and are light pins digitalvoid sensor_check (int echo, int trigger, int red_light, int green_light, int threshold){ long duration=0; // milliseconds long distance=0; // cantimeters digitalWrite(trigger, LOW); // making sure trigger is off delay(2); digitalWrite(trigger, HIGH); // let's tell the sensor it should work delay(10); digitalWrite(trigger, LOW); // and let's stop pressing the trigger duration = pulseIn(echo, HIGH); // reading data distance = (duration/2)/29.1; // converting echo milliseconds into distance if (distance<=threshold) // if something's closer than the threshold { digitalWrite(red_light, HIGH); // switch on the stop light digitalWrite(green_light, LOW); // switch off the ok light } else { digitalWrite(red_light, LOW); // switch off the stop light digitalWrite(green_light, HIGH); // switch on the ok light }} 1. daca vrei sa portezi codul pentru a fi folosit in Flowcode (varianta AVR) atunci trebuie sa identifici implementarea functiei pulseIn() din Arduino pentru a o putea replica in FC. Restul ar trebui sa fie usor de translatat. Acelasi lucru (dar mai dificil de portat pulseIn() )daca vrei sa portezi codul pentru uC PIC. 2. pentru a imuniza codul la zgomot, intr-adevar se poate folosi metoda simpla de citire multipla. Adica inlocuirea liniei: duration = pulseIn(echo, HIGH); // reading data cu ceva de genul: for (int cc = 0; cc < 10; cc++) { duration += pulseIn(echo, HIGH); // reading data delay(1); //un mic delay optional cu rol in a stabiliza citirile }duration /= 10; LE: Pentru portarea functiei pulseIn() te poti inspira de aici: http://www.avrfreaks.net/forum/porting-arduino-pulseln-function-general-avrs Editat Februarie 15, 2017 de mars01 Link spre comentariu
Liviu M Postat Februarie 15, 2017 Partajează Postat Februarie 15, 2017 Adica asa: //sensor pins (all digital)const int s1_echo = 2;const int s1_trigger = 3;const int s2_echo = 4;... Sau asa :#define NR_PARCARI//sensor pins (all digital)const int s_echo[] = {2, 4, 6, 8, 10];const int s_trigger[] = {3, 5, 7, 9, 11};//light pinsconst int s_green_light[] = {12, A1, A3, A5, A7};const int s_red_light[] = {13, A0, A2, A4, A6};//distances in cmconst int s_threshold[] = {120, 120, 120, 120, 120};void setup() { // initializing all pins for(uint8_t i = 0; i < NR_PARCARI; i++){ pinMode(s_red_light[i], OUTPUT); pinMode(s_green_light[i], OUTPUT); pinMode(s_trigger[i], OUTPUT); pinMode(s_echo[i], INPUT); }}void loop() { for(uint8_t i = 0; i < NR_PARCARI; i++){ sensor_check (s_echo[i], s_trigger[i], s_red_light[i], s_green_light[i], s_threshold[i]); } delay(50); // and let's make it fast}Functional, daca n-am transcris cu erori, nu e nici o diferenta, numai ca e mai usor de adaptat in cazul in care se modifica cerintele - numarul de "locatii".Ar mai fi si varianta cu structuri, da' cred ca ajunge asta deocamdata. O postez daca se arata cineva interesat. Link spre comentariu
Liviu M Postat Februarie 16, 2017 Partajează Postat Februarie 16, 2017 Am fost atentionat ca in programul de mai sus e o problema. Asa este, prima linie trebuie inlocuita cu #define NR_PARCARI 5 /*numarul de parcari*/ Link spre comentariu
Liviu M Postat Februarie 16, 2017 Partajează Postat Februarie 16, 2017 Inca una - la sfarsit trebuie }, nu ]. const int s_echo[] = {2, 4, 6, 8, 10}; Sa ma invat minte sa mai postez fara sa testez. Link spre comentariu
aureliu67 Postat Februarie 16, 2017 Partajează Postat Februarie 16, 2017 (editat) A a parut ceva la ultima linie :( Arduino: 1.6.5 (Windows 7), Board: "Arduino Nano, ATmega328" C:Program Files (x86)Arduinohardwaretoolsavr/bin/avr-g++ -c -g -Os -w -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -MMD -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10605 -DARDUINO_AVR_NANO -DARDUINO_ARCH_AVR -IC:Program Files (x86)Arduinohardwarearduinoavrcoresarduino -IC:Program Files (x86)Arduinohardwarearduinoavrvariantseightanaloginputs C:UsersAurelAppDataLocalTempbuild7012792551958410616.tmpParcare5.cpp -o C:UsersAurelAppDataLocalTempbuild7012792551958410616.tmpLiviuM.cpp.o Parcare5.ino: In function 'void loop()': Parcare5.ino:24:92: error: 'sensor_check' was not declared in this scope 'sensor_check' was not declared in this scope Editat Februarie 16, 2017 de aureliu67 Link spre comentariu
Liviu M Postat Februarie 16, 2017 Partajează Postat Februarie 16, 2017 Ah, codul meu nu e complet, complet e codul lui mars01. Eu doar am "comprimat" partea cu definitiile. Codul complet ar fi: #define NR_PARCARI 5//sensor pins (all digital)const int s_echo[] = {2, 4, 6, 8, 10};const int s_trigger[] = {3, 5, 7, 9, 11};//light pinsconst int s_green_light[] = {12, A1, A3, A5, A7};const int s_red_light[] = {13, A0, A2, A4, A6};//distances in cmconst int s_threshold[] = {120, 120, 120, 120, 120};void setup() { // initializing all pins for(uint8_t i = 0; i < NR_PARCARI; i++){ pinMode(s_red_light[i], OUTPUT); pinMode(s_green_light[i], OUTPUT); pinMode(s_trigger[i], OUTPUT); pinMode(s_echo[i], INPUT); }}void loop() { for(uint8_t i = 0; i < NR_PARCARI; i++){ sensor_check (s_echo[i], s_trigger[i], s_red_light[i], s_green_light[i], s_threshold[i]); } delay(50); // and let's make it fast}//function to run - echo pin, trigger pin, red light pin, green light pin, threshold for light change, and are light pins digitalvoid sensor_check (int echo, int trigger, int red_light, int green_light, int threshold){ long duration=0; // milliseconds long distance=0; // cantimeters digitalWrite(trigger, LOW); // making sure trigger is off delay(2); digitalWrite(trigger, HIGH); // let's tell the sensor it should work delay(10); digitalWrite(trigger, LOW); // and let's stop pressing the trigger duration = pulseIn(echo, HIGH); // reading data distance = (duration/2)/29.1; // converting echo milliseconds into distance if (distance<=threshold) // if something's closer than the threshold { digitalWrite(red_light, HIGH); // switch on the stop light digitalWrite(green_light, LOW); // switch off the ok light } else { digitalWrite(red_light, LOW); // switch off the stop light digitalWrite(green_light, HIGH); // switch on the ok light }}Citeste inca o data (sau de mai multe ori) postul lui mars01, ca mai sunt niste idei interesante acolo. Link spre comentariu
aureliu67 Postat Februarie 16, 2017 Partajează Postat Februarie 16, 2017 (editat) Daca as intelege despre ce vorbiti... af citi si as reciti cu multa placere.. Vorbesc 3 limbi si jumatate dar limbajul C nu e limbajul meu matern :( Acum a mers fara erori. Multumesc foarte foarte mult celor implicati in rezolvarea problemei. O sa incerc sa rumeg programul linie cu linie. Sper sa inteleg macar cum functioneaza ca daca nu... fac indigestie.. ) Editat Februarie 16, 2017 de aureliu67 Link spre comentariu
Liviu M Postat Februarie 16, 2017 Partajează Postat Februarie 16, 2017 Atunci, fara suparare, sectiune potrivita pentru tine ar fi mai degraba "ElectroJob". Link spre comentariu
aureliu67 Postat Februarie 16, 2017 Partajează Postat Februarie 16, 2017 Nu ma supar dar nu cred e o solutie sa trimiti colete la 2500 km. Link spre comentariu
Liviu M Postat Februarie 16, 2017 Partajează Postat Februarie 16, 2017 Ce colete? Softul nu cantareste mai nimic, se poate trimite prin sarme. Adica pana si programele pentru Arduino, atunci cand nu ne pricepem sa le scriem singuri, se pot cumpara. Ideea era ca sectiunea asta e pentru ajutorarea celor care au pe ici pe colo cate o problema, dar codul in general si-l scriu singuri. Pentru cei care vor proiecte complete, sectiunea "cumparari" mie mi se pare mai potrivita. Link spre comentariu
mars01 Postat Februarie 17, 2017 Partajează Postat Februarie 17, 2017 Ah, codul meu nu e complet, complet e codul lui mars01. Ala nu este codul meu. Nu am facut decat sa dau copy-paste la ce era in fiserul .ino ca sa nu trebuiasca fiecare sa se uite in fisier. Intotdeauna am fost de parere ca atunci cand codul nu este kilometric, mai bine sa fie postat in topic, evident folosind tag-ul CODE. Singura mea contributie este partea de imunizare zgomot si ce am scris legat de portare. Link spre comentariu
Liviu M Postat Februarie 17, 2017 Partajează Postat Februarie 17, 2017 Ah, iar am citit cu lipsuri... Sorry. Acum vad, l-ai copiat probabil din arhiva. Link spre comentariu
Vizitator GeorgeTrisina Postat Februarie 23, 2017 Partajează Postat Februarie 23, 2017 Salut. O problema ciudata. Cand cuplez Arduino Mega 2560 cu Ethernet shield W5100 imi blocheaza toate comenzile la placa de Arduino. Oare nu sunt compatibile? sau trebuie sa pun sketch-ul in SD-card ca sa programeze placa? 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