3x Lineare meting tbv frees

Hallo,

Voor mijn freesmachinetje wil ik graag een digitale uitlezing maken.
Ik heb al een mooie set digitale linialen, deze hebben als uitgang een A en B puls.
Nu is mijn bedoeling om drie van deze linialen in te lezen en weer te geven op een klein display,
Ook wil ik elke meting apart kunnen nullen met een drukkertje.
Als er ook nog eens plaats is voor een toerental sensor en weergave dan ben ik helemaal blij.

Kan iemand me een display adviseren en vertellen of dat met mijn standaard Arduino uno smd kan of dat ik een ander type nodig heb.

Ik dacht zelf aan een 4 lijnen display

lijn 1: X: 000.000mm
lijn 2: Y: 000.000mm
lijn 3: Z: 000.000mm
lijn 4: n: 000.000rpm

dit zijn de linealen die ik heb:
http://www.mgscale.com/mgs/language/english/product/PL81_PL82.html

Alvast bedankt
Sjuul CNC

Aangezien het mijn eerste post is:
Ik ben Sjuul en hou me in mijn hobby wat bezig met het zelf bouwen van cnc machientjes.
Ik heb een gezonde kennis basis electronika.
op youtube vinden jullie mijn laatste projecten: Sjuul CNC - YouTube

Dag Sjuul CNC
Ik wil men freesmachientje ook ooit eens ombouwen tot een cnc machiene 8)
Maar goed nu jouw project :wink:
Ik heb effe naar de specs gekeken van de PL81 en PL82. Als ik het goed begrijp is de pulse waar je het over hebt het output circuit op mgscale.com
Als ik dat juist begrepen heb is het toch wel van belang of je eenn PL81 of 82 hebt.
De 81 geeft 40 volt dat zal via een spanningsdeler naar beneden moeten. De 82 begrijp ik geen snars van :fearful:

Denkend aan pinnen is de uno aan de kleine kant. Daarom zou ik je een LCD aanraden die via I2C of SPI. Zelf ben ik geen grote kenner maar ik heb hier een LCD projectje van een UNO naar Mega moeten opgraden wegens veel pinnen weg voor de lcd.

Met vriendelijke groet
Jantje

Ik heb ze zelf ooit in en uitgebouwd.
de puls is meen ik iets van 4,7V, komt ook uit de module zelf. voeding van de module is 5V.
Op het werk werd deze door een tellerkaart ingelezen in de PLC.

Ik zat zelf ook al te denken dat de I/O's wel eens het probleem zouden kunnen worden.
3 metingen zijn er al 6 DI en dan nog 3 nul-knoppjes en nog een rpm sensor zijn 10 DI dan heb je het scherm nog niet mee gerekend.

Bij arduino stel ik dat je 0, 1 en 13 pinnen pas gebruikt als je echt weet waar je over spreekt. Dat geeft dus 17 pinnen voor "normaal gebruik".
De 3 knopjes kan je aan 1 analoge ingang hangen. Dat geeft dan 8 pinnen in gebruik of 9 pinnen over. Daar kan je ook een gewone LCD mee aanspreken. Maar het wordt krapjes.

Voor het lezen van pulsen kan je best met een interrupted pin werken. De uno geeft je dat hardware matig enkel op pin 2 en 3.
Als je een uno wilt zal je voor software serial moeten gaan.
De mega kan dat op 6 pinnen hardware matig.
Als je rpm sensor ook een pulse DI is moet je naar software serial of avontuurlijk doen en de due nemen.
De due werkt wel op 3.3Volt en heeft bescherming nodig voor 4.7V pulsen.

Met vriendelijke groet
Jantje

Krijg ik net deze lnk binnen voor een cnc shield op de uno

Ik kan je adviseren om een arduino mega 2560 te gebruiken deze heeft 6 interrupt en is een stuk sneller en heeft 60 ingangen /UItgangen

De mega sneller? Het zijn allemaal 8 bitters aan 16Mhz.
Kan jij uitleggen waarom de mega dan sneller is?
Met vriendelijke groet
Jantje

Ik heb me een mega en een 20x4 LCD Display met I2C interface gekocht hier moet het zeker mee gaan lukken.
ook een extra RPM meting mag nu geen probleem meer zijn.

Zit nog te denken over de praktische uitvoering, een weergave van de voedingssnelheid is natuurlijk ook handig.

Wel jammer dat ik uiteindelijk de mega moet offeren aan het project, maar dat mag de pret niet drukken

Op een 20x4 LCD kan je al heel wat informatie tonen.
Gisteren zag ik deze post Water level alarm that uses a pressure sensor, sends SMS - Exhibition / Gallery - Arduino Forum
Die heeft een Atemega8 (hij zegt dat ze minder dan 1 $ kosten) gebruikt voor de LCD. Dat scheelt natuurlijk een hoop pinnen.
Dat is ook zeker een alternatief voor een mega.
Met vriendelijke groet
Jantje

Met arduino projectjes ben je zelden de eerste :slight_smile: :slight_smile:

ik zit nog te bedenken of het ook mogelijk is om met iets diy achtigs een lineare meting te maken, ik heb dan wel een mooie set linialen maar die heeft natuurlijk niet iedereen
ook zijn de linialen die ik heb nog al kostbaar +/- €1500.
Ik ga eens zoeken of ik iets kan vinden

Afgelopen tijd niet stil gezeten.

Inmiddels heb ik al een tijdje een Mega R3 2560 en een I2C 4x20lcd
Om makkelijk te kunnen testen heb ik wat losse encoder-pots gekocht zodat ik de code kan testen zonder de hele installatie op te bouwen.

Op internet (via youtube filmpje) een code gevonden die de pulsen leest, telt en via de serial monitor zichtbaar maakt.
Ook het LCD schermpje heb ik al aan de gang mbv wan een "Hello World" sketch.

Ik kan de code goed lezen en begrijpen maar schrijven is toch nog moeilijk.
Ik heb de Encoder sketch dusdanig aangepast dat deze ook het display opstart met een welkoms tekst en vervolgens een soort van template op het scherm zet.

Het lukt me alleen nog niet om de waarde die op de serial monitor wordt geprint ook op het scherm te krijgen.
Wellicht kan iemand me helpen?

#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);

int pulses, A_SIG=0, B_SIG=1;

void setup()
{
{
attachInterrupt(0, A_RISE, RISING);
attachInterrupt(1, B_RISE, RISING);
Serial.begin(115200);
lcd.begin(20,4);
}
{
// ------- 3x knipperen backlight -------------
for(int i = 0; i< 3; i++)
{
lcd.backlight();
delay(500);
lcd.noBacklight();
delay(500);
}
lcd.backlight();

//-------- Welkomst boodschap ------------------
lcd.setCursor(0,0);
lcd.print("");
lcd.setCursor(0,1);
lcd.print("* ");
lcd.setCursor(0,2);
lcd.print("
*");
lcd.setCursor(0,3);
lcd.print("
");
delay(500);
lcd.setCursor(4,1);
lcd.print("Sjuul's DRO");
lcd.setCursor(2,2);
lcd.print("Mini Mill ZX7016");
delay(3000);

//-------- Template ------------------

lcd.clear();
lcd.setCursor(0,0);
lcd.print("X: mm ");
delay(500);
lcd.setCursor(0,1);
lcd.print("Y: mm ");
delay(500);
lcd.setCursor(0,2);
lcd.print("Z: mm ");
delay(500);
lcd.setCursor(0,3);
lcd.print("n: RPM");

}
} //einde setup

void loop(){

}

void A_RISE(){
detachInterrupt(0);
A_SIG=1;

if(B_SIG==0)
pulses++;//moving forward
if(B_SIG==1)
pulses--;//moving reverse
Serial.println(pulses);
attachInterrupt(0, A_FALL, FALLING);
}

void A_FALL(){
detachInterrupt(0);
A_SIG=0;

if(B_SIG==1)
pulses++;//moving forward
if(B_SIG==0)
pulses--;//moving reverse
Serial.println(pulses);
attachInterrupt(0, A_RISE, RISING);
}

void B_RISE(){
detachInterrupt(1);
B_SIG=1;

if(A_SIG==1)
pulses++;//moving forward
if(A_SIG==0)
pulses--;//moving reverse
Serial.println(pulses);
attachInterrupt(1, B_FALL, FALLING);
}

void B_FALL(){
detachInterrupt(1);
B_SIG=0;

if(A_SIG==0)
pulses++;//moving forward
if(A_SIG==1)
pulses--;//moving reverse
Serial.println(pulses);

attachInterrupt(1, B_RISE, RISING);
}

Alvast bedankt,

dit is het filmpje waar ik de code van heb

Hoi.

Je hebt uitgevogeld hoe je je welkomstscherm kunt maken
Na je welkomstscherm maak je een template zodat de vaste tekst alvast op je scherm komt, zonder de variabelen dus.
Maar vervolgens doe je er niets mee.
Je kunt de plaats waar je de waardes wil zetten op dezelfde manier besturen als het opbouwen van je template, met lcd.setCursor
Vervolgens doe je lcd.print(pulses).
Als je dit vooraf laat gaan door lcd.setcursor naar dezelfde plaats en een lcd.print gevolgd door de juiste hoeveelheid spaties (" "), wis je netjes de oude waarde voor je de volgende plaatst.
Pulses staat hier niet tussen aanhalingstekens, en is dus geen tekst, maar een variabele die geprint moet worden.
Dat is dus exact hetzelfde als wat je via Serial.println doet.

Eventueel verander je de tekst die je print naar de display alleen als ie ook veranderd is, wat zal leiden tot een stabieler beeld op je schermpje en als je het goed doet ook tot een iets sneller programmaverloop.

Als je even in het distilleer topic (klik!) kijkt, kun je zien hoe ik een menuutje heb uitgewerkt, en dat wellicht als voorbeeld kan dienen.

Succes hiermee.

Overigens zou ik je template in een aparte functie zetten (maar alleen als je meerdere schermen / templates wil gebruiken), die dan naar believen kan worden opgeroepen.

Bedankt voor de reactie,

Ik had al zoiets geprobeerd maar omdat het niet werkte heb ik mijn wijzigen en probeersels uit de code gehaald die ik heb gepost.
Ik ben nog erg groen in het arduino programmeren, dus ik volg een beetje de chineese methode van kopiëren, aanpassen en proberen.

Het schrijven naar de lcd is nu me wel duidelijk maar weet niet goed waar ik de coderegels moet inpassen, zodat ze ook elke cylusperiode (heet dit zo?) worden herschreven.
Mij lijkt dat ik dit ergens in de void loop moet staan omdat dit tot het eigenlijke programma loopt.
In mijn voorbeeld staat pas een encoder maar als die eenmaal werkt is het kwestie kopie-paste.

Volgende stapjes worden herschalen van de pulzen naar echte milimeters en toerenmeting.
Bedankt voor de info, ik ga er mee aan de slag

Sjuul

Het volgende stukje code toegevoegd waardoor ik had gehoopt dat hij "pulses" zou schrijven:

void schrijven(){ //Sub programma met de naam schrijven
lcd.setCursor(3,0); //Plaats cursor op karakter 3 op regel 0
lcd.print(" "); //ruimte leegmaken (vanaf karakter 0 op regel 3) dmv deze met spaties te overschrijven
lcd.setCursor(3,0); //Plaats cursor op karakter 3 op regel 0
lcd.print(pulses); //aantal pulsen schrijven
}

Helaas geeft dit geen resultaat.
Hij compileert en upload wel geeft geen foutmelding, maar doet er praktisch niks mee.
Ik heb het stukje aan het einde erbij geplakt, misschien niet de juiste plaats?
Ook ben ik begonnen met het bijvoegen van commentaar, het verwerken van de pulzen en of hij nu vooruit of achteruit gaat moet ik nog.
Ik begrijp het wel maar vindt het nogal lastig dit kort te beschrijven, maar dat lukt me nog wel.

Ik zal ook nog even de complete code posten, past hier niet meer bij

Wat ik ook niet begrijp is dat als ik de serialmonitor opstart ik eerst iets moet invullen in het invulveldje en moet verzenden voordat ik een waarde krijg te zien.
Is dit normaal?

Groetjes Sjuul

Past niet in één keer, eerst dus maar de Void setup

#include <Wire.h> //Toevoegen van I2C bibliotheek
#include <LiquidCrystal_I2C.h> //Toevoegen van LCD bibliotheek
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE); //Instellen LCD adres voor de bus

int pulses, A_SIG=0, B_SIG=1; //Aanmaken van -pulses- -A_SIG=0- -B_SIG=1- als integer

void setup() //Begin van initialisatie en opstart (eenmalige doorloop bij opstart)
{
{
attachInterrupt(0, A_RISE, RISING); //Aangeven dat op pin0 een ineruptpin is en dat deze A_RISE heet en moet schakelen op stijgende flank
attachInterrupt(1, B_RISE, RISING); //Aangeven dat op pin1 een ineruptpin is en dat deze B_RISE heet en moet schakelen op stijgende flank
Serial.begin(115200); //instellen baudrate
lcd.begin(20,4); //aantal karakters en regels declareren van het LCD scherm
}
{
// ------- 3x knipperen backlight -------------
for(int i = 0; i< 3; i++) //Het volgende stukje code i keer doorlopen, tot i gelijk is aan 3, beginnen bij o en na elke doorloop één bij i optellen
{
lcd.backlight(); //lcd backlight aan
delay(100); //100ms wachten
lcd.noBacklight(); //lcd backlight uit
delay(100); //100ms wachten
}
lcd.backlight(); //lcd backlight aan

//-------- Welkomst boodschap ------------------

lcd.setCursor(0,0); //Plaats cursor op karakter 0 op regel 0
lcd.print(""); //Schrijf (vanaf karakter 0 op regel 0) ********************
lcd.setCursor(0,1); //Plaats cursor op karakter 0 op regel 1
lcd.print("* "); //Schrijf (vanaf karakter 0 op regel 1) * *
lcd.setCursor(0,2); //Plaats cursor op karakter 0 op regel 2
lcd.print("
*"); //Schrijf (vanaf karakter 0 op regel 2) * *
lcd.setCursor(0,3); //Plaats cursor op karakter 0 op regel 3
lcd.print("
"); //Schrijf (vanaf karakter 0 op regel 3) ********************
delay(500); //500ms wachten
lcd.setCursor(4,1); //Plaats cursor op karakter 4 op regel 1
lcd.print("Sjuul's DRO"); //Schrijf (vanaf karakter 4 op regel 1) Sjuul's DRO
lcd.setCursor(2,2); //Plaats cursor op karakter 2 op regel 2
lcd.print("Mini Mill ZX7016"); //Schrijf (vanaf karakter 2 op regel 2) Mini Mill ZX7016
delay(1000); //1000ms wachten

//-------- Template ------------------

lcd.clear(); //Wis scherm
lcd.setCursor(0,0); //Plaats cursor op karakter 0 op regel 0
lcd.print("X: mm "); //Schrijf (vanaf karakter 0 op regel 0) X: mm
delay(100); //100ms wachten
lcd.setCursor(0,1); //Plaats cursor op karakter 0 op regel 1
lcd.print("Y: mm "); //Schrijf (vanaf karakter 0 op regel 1) Y: mm
delay(100); //100ms wachten
lcd.setCursor(0,2); //Plaats cursor op karakter 0 op regel 2
lcd.print("Z: mm "); //Schrijf (vanaf karakter 0 op regel 2) Z: mm
delay(100); //100ms wachten
lcd.setCursor(0,3); //Plaats cursor op karakter 0 op regel 3
lcd.print("n: RPM"); //Schrijf (vanaf karakter 0 op regel 3) n: RPM

}
} //einde setup

en de rest...

void loop(){ //Hoofd programma, wordt elke cyclus doorlopen is leeg maar moet wel aanwezig zijn

}

void A_RISE(){ //Sub programma met de naam A_Rise
detachInterrupt(0);
A_SIG=1;

if(B_SIG==0)
pulses++;//moving forward
if(B_SIG==1)
pulses--;//moving reverse
Serial.println(pulses);
attachInterrupt(0, A_FALL, FALLING);
}

void A_FALL(){ //Sub programma met de naam A_FALL
detachInterrupt(0);
A_SIG=0;

if(B_SIG==1)
pulses++;//moving forward
if(B_SIG==0)
pulses--;//moving reverse
Serial.println(pulses);
attachInterrupt(0, A_RISE, RISING);
}

void B_RISE(){ //Sub programma met de naam B_Rise
detachInterrupt(1);
B_SIG=1;

if(A_SIG==1)
pulses++;//moving forward
if(A_SIG==0)
pulses--;//moving reverse
Serial.println(pulses);
attachInterrupt(1, B_FALL, FALLING);
}

void B_FALL(){ //Sub programma met de naam B_FALL
detachInterrupt(1);
B_SIG=0;

if(A_SIG==0)
pulses++;//moving forward
if(A_SIG==1)
pulses--;//moving reverse
Serial.println(pulses);

attachInterrupt(1, B_RISE, RISING);
}
void schrijven(){ //Sub programma met de naam schrijven
lcd.setCursor(3,0); //Plaats cursor op karakter 3 op regel 0
lcd.print(" "); //ruimte leegmaken (vanaf karakter 0 op regel 3) dmv deze met spaties te overschrijven
lcd.setCursor(3,0); //Plaats cursor op karakter 3 op regel 0
lcd.print(pulses); //aantal pulsen schrijven
}

Hoi Sjuul.

Ik ben ook nog maar een jaartje bezig (maar heb wel al heel lang geleden eens naar basic en machinetaal programmeren gekeken en wat later ook eens naar Delphi, een Pascal variant).
Omdat ik nog niet zo lang bezig ben voel ik me ook nog redelijk groen.
En daar is helemaal niets mis mee.
Deze week mocht ik mezelf nog betrappen op een "groen" stukje code dat maar niet wilde werken.
Dit was dat stukje:

      if (currentMillis - LastFlash > FlashOn && ledState = 1) {

Dat is fout, omdat hier ledState niet gecontroleerd word op de waarde 1 (want dat moet met == ), maar dat die hier de waarde 1 krijgt toegewezen.
En dat heeft veel gevolgen, want verderop in je code gaat dan ineens ook nog van alles fout.

Eerder haalde ik het gebruik van functies aan, maar ik denk dat je daar nog even niet aan toe bent dus daar ga ik verder even niet op in.

Inderdaad als je wil dat er iets "de hele tijd" word herhaald, dan zet je dat in je loop want die loop doet niets anders dan herhalen.
Wat je in het voorbeeld dat ik hierboven aanhaalde zult vinden, is dat er keuzes worden gemaakt om te bepalen of een stukje code wel of niet word uitgevoerd.
Dat is waarom ik zei dat je programma sneller kan verlopen, omdat als er aan een voorwaarde niet word voldaan, je dan dat stukje kunt overslaan en dus meer tijd hebt om iets anders te doen.

Ik zie dat je inmiddels wat code hebt geplaatst, daar ga ik zo naar kijken om te zien of ik er iets uit kan pikken.

Okee ik heb er een blik op geworpen (ging sneller dan ik verwachtte).

Je hebt allerlei functies aangemaakt.
Die functies gaan verschillende dingen doen als je ze aanroept.
Dat zijn de RISE en FALL toestanden, maar ook "schrijven", waarin je naar je LCD wil schrijven.
Maar je roept ze dus nooit aan in je loop.
Alles wat je in je sketch hebt staan, word hooguit 1 maal uitgevoerd.
Dan begint je loop, waar je nooit meer uitkomt.
Maar omdat die loop leeg is, gebeurt er dus helemaal niets meer en breng je je Arduino dus in een kunstmatige coma.

Ik vraag me ook af of je geen foutmeldingen krijgt.
Want je gebruikt functies en variabelen met dezelfde naam (A_RISE en B_RISE).
Behalve dat het programma zich hierin zou kunnen verslikken (weet ik niet zeker), zit het er wel dik in dat jij je er in zult gaan verslikken.

Ok, functies lijken een beetje op funtiebouwstenen die op een bepaald moment wel of niet oproept naar gelang de programma afloop.
ik ga me hier eens even wat beter in verdiepen.

op het schrijven naar het display na werkt ie gewoon perfect en zie ik de pulsen op de serial monitor stijgen of dalen naargelang de ringting ik opdraai met de encoder.

de code van de encoder heb ik uit dit filmpje en via de link vind je de code zelf.
de code wordt regel per regel uitgelegd, ik ga deze nog eens bestuderen

http://www.kevindarrah.com/download/arduino_code/Encoder.pde

Ik kan weer aan de bak :slight_smile:

Wat doet de backlight van je LCD tijdens de uitvoering van jouw sketch ?

En lees nog even je eigen commentaren en vergelijk dat met mijn vorige berichtje.