Industriële fabricage
Industrieel internet der dingen | Industriële materialen | Onderhoud en reparatie van apparatuur | Industriële programmering |
home  MfgRobots >> Industriële fabricage >  >> Manufacturing Technology >> Productieproces

Boordiepteweergave met gyrosensor

Componenten en benodigdheden

Arduino Nano R3
× 1

Benodigde gereedschappen en machines

3D-printer (algemeen)

Apps en online services

Arduino IDE

Over dit project

Als je voor een project een bepaalde diepte moet boren, heb je een tafelboormachine met diepteweergave nodig. De meeste bankoefeningen hebben een liniaal met een pijl om af te lezen. Het succes van het boren hangt af van hoe nauwkeurig u de gewenste positie kunt aflezen. In dit Arduino-project presenteer ik een alternatief voorstel:een boordiepte-display met een gyrosensor en 7-segments display met Arduino-ondersteuning.

De machine die ik het meest gebruik in mijn werkplaats is geen zaag- of slijpmachine. Het is verreweg de bankoefening. Ongeacht het project wordt het eigenlijk altijd gebruikt. Als ik een bepaalde boordiepte nodig heb, kan ik de ingebouwde liniaal op de machine gebruiken. En onthoud de diepte tot waar ik moet boren. Het werkt eigenlijk goed.

Maar met het ouder worden - ja, ja, ja - wordt het voor mij steeds moeilijker om de diepte tot op de millimeter nauwkeurig te lezen. En als het licht niet fel genoeg is, is het bijna onmogelijk om het te lezen. Maar daarvoor gewoon een bril opzetten? En waar bewaar je de bril na het boren? Ik ben nog niet zo ver.

Trouw aan het motto van Paul Akers van "2 Secon Lean":

Er moet een betere oplossing zijn, je hoeft alleen maar na te denken en het te maken.

Meetmogelijkheden

Ik zou natuurlijk een vergrootglas voor de schaal kunnen plaatsen om de liniaal beter leesbaar te maken. Het zou de meting verbeteren, maar het zou niet helpen dat ik de meting in elk geval moet onthouden. En als je aan het knutselen bent, moet het ook leuk zijn.

Daarom is een elektronische oplossing veel beter. Liefst in een kleine ruimte zodat alles naast de aan/uit schakelaar van de boormachine past. Voor zulke gevallen gebruik ik graag een Arduino Nano. Het heeft genoeg pinnen om vrijwel alles te bedienen en is dienovereenkomstig klein.

Maar hoe meet je de boordiepte? Er zijn verschillende mogelijkheden voor een lengtemeting. Een ultrasone meting installeren? Zou kunnen werken, maar alleen met een beetje mechanica, die als een reflectieoppervlak met de boor meebewegen. Of een draadaangedreven encoder gebruiken? Zou kunnen, maar zeer complex, als je het zelf bouwt:met een draaiplateau, vorklichtschermen en veerretour. Is het beter om meteen een roterende encoder te nemen? Dat zou veel minder componenten betekenen - ja, maar het zou te grof zijn, je zou tandwielen moeten installeren voor een vertaling.

Oké, dus denk er meer over na.

Mijn boormachine heeft, zoals de meeste, een handwiel aan de zijkant om de diepte aan te passen. Hij kan ca. 270°. Dus niet eens een volledige beurt.

Dit is perfect voor een hoekmeting met een gyrosensor. De kabelverbinding kan niet draaien en er is slechts één goedkoop onderdeel nodig. De gyrosensor kan ook heel eenvoudig direct op de draaias van het handwiel worden bevestigd.

Concept

Ik ga altijd op dezelfde manier te werk bij het opgeven van een boordiepte:kras het oppervlak met de boor, noteer de coördinaat, voeg vervolgens de gewenste boordiepte toe en boor tot slot tot de diepte is bereikt.

Ik wil het basisproces behouden. Om niet te diep te boren, ontvang ik graag informatie over wanneer de boordiepte is bereikt.

Een knop neemt deze functie over. Als je erop drukt, slaat de Arduino de huidige boorpositie op als een stopwaarde en kan me er altijd aan herinneren wanneer deze later wordt bereikt.

De overige componenten nemen meer ruimte in beslag en wegen aanzienlijk meer. Gelukkig is de behuizing van mijn machine van metaal. Daarom gebruik ik een neodymiummagneet om het te repareren.

De vraag blijft, hoe moet de sensor aan de machine worden bevestigd?

De as van de boor heeft een SW17 zeskantmoer. Ik heb dus alleen een 3D-geprint onderdeel nodig dat de sensor accepteert en op de zeskantmoer kan worden gestoken.

Vereiste componenten

  • Arduino Nano
  • Gyrosensor GY-521
  • 7-segment module met 8 cijfers (SPI-versie met MAX7219 IC)
  • Drukknop
  • Aan/uit-schakelaar
  • Voeding:batterijclips voor AA- of AAA-batterijen of powerbank
  • 3D-geprinte behuizing
  • Neodymium magneet

Aansluiting van gyrosensor

De gyrosensor wordt aangesloten via de I2C. We moeten dus A5 en A4 gebruiken voor de Nano.

  • VCC -> 5V
  • GND -> GND
  • SCL -> A5
  • SDA -> A4
  • XDA -> niet verbonden
  • XCL -> niet verbonden
  • ADO -> niet verbonden
  • INT -> niet verbonden

7-segmentmodule

Elke digitale pin kan worden gebruikt bij het aansluiten van de 7-segmentmodule. De pinnen worden ingesteld met behulp van de Arduino-schets.

  • VCC -> 3.3V
  • GND -> GND
  • DIN -> D12
  • CS -> D10
  • CLK -> D11

Knop

De ingangspin van de knop kan ook vrij worden gekozen. Ik gebruik pin D9.

Voeding

Voor de voeding gebruik ik 6 AA batterijen. Na de aan/uit schakelaar voorzien ze het hele systeem van stroom.

Behuizing

Ik heb de behuizing ontworpen met Autodesk Fusion 360. Ik heb de 3D-print gemaakt met een Anycubic i3 Mega.

De neodymium-magneet voor bevestiging aan de machine is vastgelijmd. Als de hele boordiepte-aanduiding in de weg zit, is alles snel verwijderd.

Arduino-schets

Ik gebruikte de LedControl.h bibliotheek om het 7-segments display te bedienen. Als je deze nog niet hebt geïnstalleerd, moet je ze eerst installeren met behulp van de bibliotheekmanager.

De gyrosensor wordt aangesloten via de I2C-bus. Bij het zoeken naar mogelijke bibliotheken voor de sensor, heb ik toen besloten er geen te gebruiken. Communicatie is via Wire.h .

Aan het einde van het artikel vindt u enkele links die mij hebben geholpen het te begrijpen.

De bediening van het 7 segment display werkt erg goed met LedControl .

Na de initialisatie met de pinnen, heeft de setup-procedure slechts een paar voorbereidingen nodig om het display te activeren en de intensiteit aan te passen.

In het lusgedeelte toont het display alleen de huidige boordiepte en, indien ingesteld, de stoppositie, ook in cijfers.

Het display verwacht elk cijfer als een tekentype. Ik zou een decimaal als nauwkeurigheid willen gebruiken. De functie dtostrf zet een float om in een karakterarray. Vervolgens in een string om het karaktergewijs op het scherm weer te geven.

dtostrf ( currentPos, 4,1, txt );
s ='' + String (txt );
lc. setChar ( 0,4, zie charAt ( zie lengte () -1 ), false );
lc. setChar ( 0.5, zie charAt ( zie lengte () -3) , true );
lc. setChar ( 0.6, zie charAt ( zie lengte () -4 ), false );
lc. setChar ( 0.7, zie charAt ( zie lengte () -5 ), false );

Wanneer de stoppositie is bereikt, verschijnt "StOP" op het display. De kleine "t" kan worden gegenereerd met behulp van de setRow procedure en het juiste bitpatroon B00001111.

Het uitlezen van de gyrosensor werkt via functies van de draadbibliotheek. Ik gebruik alleen de versnellingsmeter om de hoekpositie te bepalen.

Bij het werken met een USB-verbinding met de Arduino IDE werkte alles perfect. Na het loskoppelen en aansluiten op de externe voedingsbron, leverde de sensor geen gegevens. Het werkte pas weer na een reset van de Arduino.

Dat bezorgde me de meeste hoofdpijn van het hele project. Je zou kunnen zeggen dat de boordiepte-indicator mijn ogen zou hebben gered, maar daarom heb ik bijna al mijn haar uitgetrokken!

Na lang zoeken was het installeren van een wachttijd na het ontwaken van de sensor de oplossing. Dit maakt de vertraging (1000) het belangrijkste commando in de hele broncode.

//prepare GY-521-sensor
//we gebruiken alleen versnellergegevens
Wire.begin();
Wire.beginTransmission(MPU);
Wire .write(0x6B);
Wire.write(0x00); // maak MPU wakker
Wire.endTransmission(true);

//deze vertraging was in mijn geval zeer noodzakelijk!
delay(1000);

Wire.beginTransmission(MPU);
Wire.write(0x1C); //register ACCEL_CONFIG
Wire.write (0x10); //Instellen als 00010000 voor +/- 8g volledig schaalbereik
Wire.endTransmission(true);

Voor de sensor moeten in het begin offsetwaarden worden bepaald, anders gaan de waarden fluctueren. In het setup-gedeelte worden 100 waarden gemeten en worden de afwijkingen gemiddeld.

Het berekenen van de hoek uit de sensorgegevens is niet zo eenvoudig. Maar er zijn veel instructies voor het uitvoeren van de berekeningen.

De X-hoek in graden wordt berekend met behulp van deze formule:

AccAngleX =(atan ((AccY) / sqrt (pow ((AccX), 2) + pow ((AccZ), 2))) * rad_to_deg); 

De waarden van de versnellingssensor fluctueren echter sterk. Daarom wordt de momenteel berekende waarde gemiddeld met de vorige waarde op elk 50%.

TotalAngleX =0,5 * TotalAngleX + 0,5 * AccAngleX; 

De hoekwaarden worden door de sensor uitgevoerd van -90 ° tot + 90 °. Maar ik heb een hoek van 0° tot 360° nodig voor de omrekening naar een boordiepte.

Ik heb hier nog geen simpele oplossing voor gevonden. Voor mijn toepassing is het echter voldoende om te zien of de sensorgegevens Z en Y positief of negatief zijn. En converteer de hoek dienovereenkomstig.

delta=0;
if ((AccZ<0)) {
delta=180.0-TotalAngleX*2.0;
}
if ((AccZ>0 )&&(AccY<0)) {
delta=360.0;
}
DrillingMachineAngle=TotalAngleX+delta;

//bij 360° beter weergeven 0 °
if (DrillingMachineAngle>350) {DrillingMachineAngle=0;}

Wat nog ontbreekt is de maximaal mogelijke draaihoek die het handwiel mogelijk maakt. De eenvoudigste manier om dit te doen is om de vastgestelde hoek uit te laten voeren via een Serial.print en de maximale waarde te noteren.

Voor mij is het 316°. Bij een maximale boordiepte van 50 mm wordt de actuele positie als volgt berekend:

currentPos=50.0/316.0*DrillingMachineAngle; 

Als de knop wordt ingedrukt, slaat de Arduino de huidige boorpositie op. 8888 wordt weergegeven op het display en er is een korte wachttijd van 1 seconde.

Als een stoppositie is ingesteld, wordt de resterende boordiepte tot de stop op het rechterdisplay weergegeven.

Montage en testen

De gyrosensor kan het beste worden vastgezet met een punt hete lijm. Leid de aansluitkabels door het deksel. Dat was het voor dit deel.

Bij de eerste test moet eerst de gyrosensor worden uitgelijnd. Ik heb hem horizontaal gemonteerd. Omdat de houder is ontworpen om roteerbaar te zijn, kan deze eenvoudig worden aangepast totdat 0,0 op het display wordt weergegeven.

Dan kan de eerste test beginnen.

Al met al ben ik erg blij met de oplossing. De sensor reageert zeer snel en de berekende waarden komen exact overeen met de boordiepte.

En dankzij het grote LED-display hoef ik me geen zorgen te maken over een bril tot 85 jaar oud om een ​​exacte boordiepte af te lezen.

Onthoud dus altijd wat Paul zegt:Repareer wat je irriteert!

Veel plezier met het bouwen!

____________________________________________________________

Enkele misschien nuttige links:

https://medium.com/@kavindugimhanzoysa/lets-work-with-mpu6050-gy-521-part1-6db0d47a35e6

of https://playground.arduino.cc/Main/MPU-6050/

of ook https://circuitdigest.com/microcontroller-projects/mpu6050-gyro-sensor-interfacing-with-arduino/

Bibliotheek van GY-521 door Rob Tilaart:https://github.com/RobTillaart/GY521

En bekijk het boek van Paul Akers op https://paulakers.net/books/2-second-lean

Das Projekt is auch auf Deutsch onder:https://techpluscode.de/bohrtiefenanzeige-mit-gyro-sensor/

Code

  • drilling-depth.ino
drilling-depth.inoArduino
/* programma:drill-depth.ino * auteur:Thomas Angielsky * versie:2021-03-20 * * https://techpluscode.de/ * https://techpluscode.de/bohrtiefenanzeige-mit-gyro- sensor/ * * deze schets meet de boordiepte van een tafelboormachine * met behulp van gegevens van de GY-521 gyrosensor * diepte wordt bekeken door een 7-segments display * * idee van calcfoutcompensatie van elektronoobs.com - bedankt! * */#include #include #include "LedControl.h"#define MPU 0x68char txt[8];String s;float currentPos,stopPos;float rad_to_deg;float AccX, AccY, AccZ; zweven AccAngleX, AccAngleY; float AccAngleErrorX, AccAngleErrorY; float TotalAngleX, TotalAngleY;float DrillingMachineAngle, delta;//init LED's:pin D12, pin D11, pin D10, 1 moduleLedControl lc=LedControl (12,11,10,1);void setup() { // bereid seriële verbinding voor / /Serial.begin(9600); //startwaarden stopPos=0.0; stroomPos=0.0; rad_to_deg =180/PI; //bereid GY-521-sensor voor // we gebruiken alleen versnellergegevens Wire.begin(); Wire.beginTransmission (MPU); Draad.schrijven (0x6B); Draad.schrijven (0x00); // wakker MPU Wire.endTransmission (true); // deze vertraging was in mijn geval zeer noodzakelijk! vertraging (1000); Wire.beginTransmission (MPU); Draad.schrijven (0x1C); //register ACCEL_CONFIG Wire.write (0x10); //Instellen als 00010000 voor +/- 8g volledig schaalbereik Wire.endTransmission (true); // bereken de accelleratorgegevensfout // voer 100 metingen uit voor (int a =0; a <100; a ++) { Wire.beginTransmission (MPU); Draad.schrijven (0x3B); Wire.endTransmission (false); Wire.requestFrom(MPU,6,true); AccX=(Wire.read()<<8|Wire.read())/4096.0; AccY=(Wire.read()<<8|Wire.read())/4096.0; AccZ=(Wire.read()<<8|Wire.read())/4096.0; AccAngleErrorX=AccAngleErrorX+((atan((AccY)/sqrt(pow((AccX),2)+pow((AccZ),2)))*rad_to_deg)); //AccAngleErrorY=AccAngleErrorY+((atan(-1*(AccX)/sqrt(pow((AccY),2)+pow((AccZ),2)))*rad_to_deg)); } AccAngleErrorX=AccAngleErrorX/100; //AccAngleErrorY=AccAngleErrorY/100; //voorbereidingsknop:pin D9 pinMode (9, INPUT_PULLUP); //voorbereiden 7 segment display lc.shutdown(0,false); lc.setIntensity(0,8); lc.clearDisplay(0);}void loop() { Wire.beginTransmission(MPU); Draad.schrijven (0x3B); Wire.endTransmission (false); Wire.requestFrom(MPU,6,true); AccX=(Wire.read()<<8|Wire.read())/4096.0; AccY=(Wire.read()<<8|Wire.read())/4096.0; AccZ=(Wire.read()<<8|Wire.read())/4096.0; AccAngleX=(atan((AccY)/sqrt(pow((AccX),2)+pow((AccZ),2)))*rad_to_deg)-AccAngleErrorX; //AccAngleY=(atan(-1*(AccX)/sqrt(pow((AccY),2)+pow((AccZ),2)))*rad_to_deg)-AccAngleErrorY; // vloeiende waarden TotalAngleX=0.5*(TotalAngleX)+0.5*AccAngleX; //TotalAngleY=0.5*(TotalAngleY)+0.5*AccAngleY; // bereken x-hoek tot 360 met behulp van +/- van X,Y,Z delta=0; if ((AccZ<0)) { delta=180.0-TotalAngleX*2.0; } if ((AccZ>0)&&(AccY<0)) { delta=360.0; } DrillingMachineAngle=TotalAngleX+delta; //bij 360, beter weergeven 0 if (DrillingMachineAngle>350) {DrillingMachineAngle=0;} //boordiepte berekenen //max. boordiepte:50 mm (gemeten op machine) //max. hoek handwiel:316 (gemeten met Serial.print data) currentPos=50.0/316,0*DrillingMachineAngle; /* Serial.print ("X / X / Y / Z / E:BOHRTIEFE"); Serial.print(TotalAngleX); Serieel.print(" "); Seriële.afdruk (AccX); Serieel.print(" "); Seriële.afdruk (AccY); Serieel.print(" "); Seriële.afdruk (AccZ); Serial.print(">> "); Serial.print (DrillingMachineAngle); Serial.print(">> "); Serial.print(currentPos); Serial.println(" ");*/ //knop ingedrukt? if (digitalRead (9) ==LAAG) {// stop positie stopPos =currentPos; lc.setChar(0,3,'8',false); lc.setChar(0,2,'8',false); lc.setChar(0,1,'8',false); lc.setChar(0,0,'8',false); //Serial.println ("Knop ingedrukt"); vertraging (1000); } if (stopPos>0) { //stoppositie bereikt? if (currentPos>=stopPos) {//yes:toon STOP (5t0P) aan de rechterkant lc.setChar (0,3,'5',false); lc.setRow(0,2,B00001111); lc.setChar(0,1,'0',false); lc.setChar(0,0,'P',false); } else { //no:toon afstand tot stoppositie dtostrf(stopPos-currentPos,4,1,txt); s=' '+String(txt); lc.setChar(0,0,s.charAt(s.length()-1),false); lc.setChar(0,1,s.charAt(s.length()-3),true); lc.setChar(0,2,s.charAt(s.length()-4),false); lc.setChar(0,3,s.charAt(s.length()-5),false); } } else { // laat niets zien lc.setChar(0,3,' ',false); lc.setChar(0,2,'',false); lc.setChar(0,1,'',false); lc.setChar(0,0,' ',false); } //toon huidige boordiepte aan de linkerkant //format als string dtostrf(currentPos,4,1,txt); s=' '+String(txt); lc.setChar(0,4,s.charAt(s.length()-1),false); lc.setChar(0,5,s.charAt(s.length()-3),true); lc.setChar(0,6,s.charAt(s.length()-4),false); lc.setChar(0,7,s.charAt(s.length()-5),false); vertraging(200);}

Aangepaste onderdelen en behuizingen

boordiepte-3d-model_Yn2q0MSNa4.zip

Schema's


Productieproces

  1. De integratie van sensorgegevens met Raspberry Pi-microprocessor
  2. Lijnvolgsensor met RPi
  3. Milieusensor-API met een RPi
  4. Aerocultuur met Raspberry Pi en vochtigheidssensor
  5. Raspberry Pi GPIO met PIR-bewegingssensor:beste tutorial
  6. De A111 gepulseerde radarsensor gebruiken met een Raspberry Pi
  7. Interfacing HC-SR501 PIR-bewegingssensor met Raspberry Pi
  8. Python/MicroPython Sensor Logger met Google Spreadsheets
  9. Portenta- en thermokoppelsensor (met MAX6675)
  10. Drukluchtstroommeetapparaat met analoge sensor
  11. CO2-monitoring met K30-sensor