Sari la conținut
ELFORUM - Forumul electronistilor

Problema arduino


loleksibolek

Postări Recomandate

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
  • Răspunsuri 48
  • Creat
  • Ultimul Răspuns

Top autori în acest subiect

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

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 de mars01
Link spre comentariu

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
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 de aureliu67
Link spre comentariu

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

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 de aureliu67
Link spre comentariu

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

Ah, codul meu nu e complet, complet e codul lui mars01.

 

 

:rade: 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
Vizitator GeorgeTrisina

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

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 cont

Autentificare

Ai deja un cont? Autentifică-te aici.

Autentifică-te acum



×
×
  • Creează nouă...

Informații Importante

Am plasat cookie-uri pe dispozitivul tău pentru a îmbunătății navigarea pe acest site. Poți modifica setările cookie, altfel considerăm că ești de acord să continui.Termeni de Utilizare si Ghidări