Sari la conținut
ELFORUM - Forumul electronistilor

Citire senzori forta cu arduino


lucian_v

Postări Recomandate

Va salut,

 

Din joaca am inceput sa lucrez in timpul liber la un mic proiect ce presupune citirea unui nr "n" de senzori de forta si achizitia datelor intr un pc.

Ma gandesc ca poate mai foloseste cuiva asa ca am decis sa il descriu aici.

Deasemenea doresc sa ii multumesc userului mars01 pentru ajutorul si sfaturile sale.

 

Hardware :

 

1 - Am ales o placa arduino mega datorita numarului de porturi.

2 - Pentru comunicatia cu pc-ul am ales varianta tcp. Cu un cablu bun poti merge la multi metri fara probleme. Dupa ce am incercat cateva shielduri cumparate de la chinezi, le am aruncat si am cumparat asta

3 - pc-ul...fiecare ce doreste, eu am folosit un intel nuc dar nu este relevant

4 - senzorul de forta folosit pentru teste a fost asta , in varianta de 2t

5 - adc pentru citire senzor am folosit asta

 

Am reusit sa citesc senzorul, sa il calibrez, sa ii fac tara. Pentru calibrare am folosit un brat amplificator de forta x10 si am masurat relativ ok greutati de 100/200/300/400/500 kg. Spun relativ pentru ca nu am facut o calibrare perfecta, se mai poate imbunatati, dar avand in vedere ca a fost primul test ma declar multumit.

 

Partea de transfer de date la pc o fac prin comenzi udp, practic din python cer la arduino date si el mi le da.

 

Pana sa termin de sortat tot ce am facut si sa pun poze , schite si codul folosit am cateva probleme unde sper sa gasesc ajutor aici pentru rezolvare:

 

1 - hx711 functioneaza la 5V. Senzorul meu de forta scrie in documentatie ca trebuie alimentat la minim 10V.

 

Am incercat sa il alimentez dintr o sursa externa, dar cu masa comuna cu arduino si hx711 nu a fost in stare sa il citeasca.

Am concluzionat ca hx711 trebuie sa vada si el ceva pe pinii de alimentare senzor asa ca am masurat rezistenta intre pinii de alimentare ai senzorului (360 ohmi) si am pus o rezistenta de 330 de ohmi intre pinii de alimentare ai senzorului de la hx711 dar tot fara succes

In final am alimentat senzorul din hx711 cu 5V

 

Doresc sa ma indrumati sa gasesc o solutie sa alimentez senzorul cu 10V daca se poate

 

Multumesc

Link spre comentariu
  • Răspunsuri 4
  • Creat
  • Ultimul Răspuns

Top autori în acest subiect

  • lucian_v

    3

  • mars01

    2

Top autori în acest subiect

Se pare ca nu am primit notificare de raspuns, am activat acum

 

Urmeaza sa fac cand mai am o zi libera un test mai amplu si o calibrare mai amanuntita si revin cu detalii, sa vad cum functioneaza pana la capat

 

Multumesc

Link spre comentariu
  • 3 săptămâni mai târziu...

Asa cum am promis revin cu detalii:

 

1 - Senzorii de forta (load cell)

 

Am legat 8 senzori la 8 module hx711, fiecare pe canalul A. 7 din ei sunt de 5 tone, unul este de 2t.

 

Posted Image

 

Posted Image

 

Posted Image

 

Posted Image

 

Posted Image

 

Posted Image

 

Posted Image

 

Primele 2 foto reprezinta arduino impreuna cu modulele hx711 si cu modulul ethernet. Alimentarea s a facut dintr o sursa de pc .

 

In urmatoarele 3 foto sunt senzorii de 5t

 

In ultimile 2 este un brat care amplifica forta de 10 ori si am incercat sa il folosesc pentru calibrare. Din nefericire l am construit dupa dimensiunile senzorului de 2t si abia cand i am luat pe cei de 5t am vazut ca sunt mai mari..deci in consecinta va trebuie sa construiesc la un moment dat unul pentru ei.

 

In continuare am legat si un senzor de presiune care functioneaza pe acelasi principiu ca si cei de forta. Am folosit 2 manometre si o butelie pentru a reusi sa il calibrez si sa vad ca functioneaza

 

Posted Image

 

Posted Image

 

Posted Image

 

 

Apoi am incercat sa ma joc cu 2 senzori de viteza. Am improvizat un simulator dintr o filetanta care nu o mai foloseam. Cei 2 senzori de viteza sunt legati direct la arduino si sunt alimentati la 12v din sursa, nu au mers la 5v. Dintr un motiv anume, chiar daca am prins cu un soricel butonul de actionare a filetantei, tot nu am reusit sa tin o turatie constanta, Era sesizabila variatia de turatie...probabil are vreo pb filetanta, eu am fost multumit ca a mers.

 

 

 

Posted Image

 

 

Posted Image

 

Posted Image

 

Posted Image

 

Posted Image

 

Posted Image

 

Posted Image

 

Posted Image

 

Posted Image

Codul folosit

 

1 - Arduino pt citire senzori forta si presiune

#include <SPI.h>#include <Ethernet2.h>#include <HX711.h>byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };IPAddress ip(192,168,1, 177);IPAddress gateway(192,168,1, 1);IPAddress subnet(255, 255, 255, 0);unsigned int localPort = 5000; char packetBuffer[UDP_TX_PACKET_MAX_SIZE];String datReq; int packetSize; EthernetUDP Udp; HX711 s01(23, 22);    //senz pres 01    // parameter "gain" is ommited; the default value 128 is used by the libraryHX711 s02(25, 24);      // senz forta 2t testHX711 s03(27, 26);HX711 s04(29, 28);HX711 s05(31, 30);HX711 s06(33, 32);HX711 s07(35, 34);HX711 s08(37, 36);HX711 s09(39, 38);HX711 s10(41, 40);void setup() { Serial.begin(9600); //Turn on Serial PortEthernet.begin(mac, ip); //Initialize EthernetUdp.begin(localPort); //Initialize Udpdelay(1500); //delays01.set_scale(68300);       //calibrare s01 - presiune 1s01.tare();s02.set_scale(2920);       //calibrare s02 - forta 2t tests02.tare();s03.set_scale(2920);       //calibrare s03 - forta 2t tests03.tare();s04.set_scale(2920);       //calibrare s04 - forta 2t tests04.tare();s05.set_scale(2920);       //calibrare s05 - forta 2t tests05.tare();s06.set_scale(2920);       //calibrare s06 - forta 2t tests06.tare();s07.set_scale(2920);       //calibrare s07 - forta 2t tests07.tare();s08.set_scale(2920);       //calibrare s08 - forta 2t tests08.tare();s09.set_scale(2920);       //calibrare s09 - forta 2t tests09.tare();       }void loop() {   packetSize = Udp.parsePacket(); //Read theh packetSize   if(packetSize>0){                   Udp.read(packetBuffer, UDP_TX_PACKET_MAX_SIZE);                   String datReq(packetBuffer);                   if (datReq =="s01") {                                       Udp.beginPacket(Udp.remoteIP(), Udp.remotePort());                                        Udp.print(s01.get_units());                                      Udp.print(" | ");                                      Udp.print(s02.get_units());                                      Udp.print(" | ");                                      Udp.print(s03.get_units());                                      Udp.print(" | ");                                      Udp.print(s04.get_units());                                      Udp.print(" | ");                                      Udp.print(s05.get_units());                                      Udp.print(" | ");                                      Udp.print(s06.get_units());                                      Udp.print(" | ");                                      Udp.print(s07.get_units());                                      Udp.print(" | ");                                      Udp.print(s08.get_units());                                      Udp.print(" | ");                                      Udp.print(s09.get_units());                                      Udp.print(" | ");                                      Udp.print(s10.get_units());                                      Udp.print(" | ");                                                                           Udp.endPacket();                   }     }  memset(packetBuffer, 0, UDP_TX_PACKET_MAX_SIZE);}

2 - python pt pc

from socket import *import timeaddress = ( '192.168.1.177', 5000) #Defind who you are talking to (must match arduino IP and port)client_socket = socket(AF_INET, SOCK_DGRAM) #Set Up the Socketclient_socket.settimeout(1) #only wait 1 second for a resonsewhile(1): #Main Loopdata = "s01" client_socket.sendto(data, address) #send command to arduinotry:rec_data, addr = client_socket.recvfrom(2048) #Read response from arduinoprint rec_data #Print the response from Arduinotext_file = open("Output.txt", "a")text_file.write(rec_data + "n")text_file.close()except:passtime.sleep(0.1) 

3 - Arduino rpm.

Aici am avut ceva probleme si anume:

 

a - nu am reusit sa inteleg foarte bine acest cod, dar a fost unul care a mers

 

b - nu stiu de ce pe serial arata valori doar cand rpm este diferit de 0

 

c - nu am reusit sa il inglobez in primul cod, cel cu senzorii de forta

 

daca cineva poate raspunde la a/b/ sau c v as fi recunoscator

/*void setup() {  // initialize serial communication at 9600 bits per second:  Serial.begin(9600);} // the loop routine runs over and over again forever:void loop() {  // read the input on analog pin 0:  int sensorValue = analogRead(A2);  // Convert the analog reading (which goes from 0 - 1023) to a voltage (0 - 5V):  float voltage = sensorValue * (5.0 / 1023.0);  // print out the value you read:  Serial.println(voltage);}*/int pin0 = A0;int pin1 = A1;float rpm0;float rpm1;float duration0;float duration1;float y;unsigned long val0;unsigned long val1;float rps0;float rps1;float read_rpm0;float read_rpm1;//int pin_out=10;void setup(){  Serial.begin(9600);  pinMode(pin0, INPUT);  pinMode(pin1, INPUT);  //pinMode(pin_out,OUTPUT);}void loop(){  Serial.print("RPM0=");  val0 =  pulseIn(pin0, LOW,70000000); val1 =  pulseIn(pin1, LOW,70000000); duration0=(float)val0/1000000.00; duration1=(float)val1/1000000.00; rps0= 1.00/duration0; rps1= 1.00/duration1; rpm0=60.00*rps0/2; rpm1=60.00*rps1/2;//analogWrite(pin_out,(int)rpm);Serial.print("RPM0=");Serial.print(rpm0);Serial.print(" | ");Serial.print("RPM1=");Serial.println(rpm1);
Link spre comentariu

Raspuns la punctul b.

 

Cand

val0 = 0 

in expresia de mai jos:

duration0=(float)val0/1000000.00;

duration0 ia valoarea 0.

 

Si atunci ai un caz clar de impartire la 0 in expresia:

rps0= 1.00/duration0;

Probabil ca acest caz este tratat de Arduino desi in postul acesta se spune ca nu:

http://forum.arduino.cc/index.php?topic=42391.0

 

As face codul ceva de genul:

unsigned char pin0 = A0;unsigned char pin1 = A1;float rpm0;float rpm1;float duration0;float duration1;float y;unsigned long val0;unsigned long val1;float rps0;float rps1;float read_rpm0;float read_rpm1;//int pin_out=10;void setup(){  Serial.begin(9600);  pinMode(pin0, INPUT);  pinMode(pin1, INPUT);  //pinMode(pin_out,OUTPUT);}void loop(){  Serial.print("RPM0=");  val0 =  pulseIn(pin0, LOW,70000000); val1 =  pulseIn(pin1, LOW,70000000);  if (val0 == 0)  {   rpm0 = 0; }else {   duration0=(float)val0/1000000.00;   rps0= 1.00/duration0;   rpm0=60.00*rps0/2; }  if (val1 == 0)  {   rpm1 = 0; } else {   duration1=(float)val1/1000000.00;   rps1= 1.00/duration1;   rpm1=60.00*rps1/2; }//analogWrite(pin_out,(int)rpm);Serial.print("RPM0=");Serial.print(rpm0);Serial.print(" | ");Serial.print("RPM1=");Serial.println(rpm1);

Raspuns la punctul a.

 

Functia pulseIn: https://www.arduino.cc/en/Reference/pulseIn

 

In linia:

 val0 =  pulseIn(pin0, LOW,70000000);

Functia pulseIn numara pulsuri LOW-HIGH; asteapta ca din starea default a pin0 (care trebuie sa fie HIGH) sa treaca in LOW si incepe sa numere microsecunde pana cand pin0 devine LOW.

Daca el numara si numara si ajunge la valoarea de timeout care este 70000000 atunci functia returneaza 0.

duration0=(float)val0/1000000.00;

In duration0, durata pulsului este transformata in secunde.

 

In:

rps0= 1.00/duration0;

valoarea rps0 este numar de rotatii pe secunda.

 

Iar in:

rpm0=60.00*rps0/2;

valoarea rpm0 contine numar de rotatii pe minut.

Editat de mars01
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