3x Lineare meting tbv frees

Dat is een mooi machientje. De foto en de uitleg maakt (in ieder geval voor mij) duidelijk wat je met het project wil bereiken.

Ik wil nog even terugkomen op het commentaar.
Zoals MAS3 al aangaf lopen de meningen over het gebruik van commentaar nogal uiteen, van geen commentaar (degene die dit doen vinden dat code zelfverklarend is) tot heel uitgebreid.
Jij moet uiteindelijk moet de manier van commentaar kiezen die voor jou goed werkt.

Je geeft nu bij iedere regel een commentaar wat er in die regel gebeurt, maar je geeft niet aan wat de bedoeling van de regel of een blok regels is.

Ik zit zelf meer aan de 'weinig' commentaar kant.
Ik zet commentaar bij een aantal regels of bij een functie en geef niet bij alle regels kommentaar.
Ik probeer mijn commentaar zo te maken dat ik de bedoeling van de regels/functie weergeef, zodat als ik over 1 of 2 jaar de code weer zie ik deze bedoeling weer snap.

Ik zou bijvoorbeeld dit stukje zo van commentaar voorzien:

....
if (Xpulses != vorige_Xpulses) {                     // Als -Xpulsen- NIET gelijk is aan -vorige_Xpulses- 
               SchrijvenX();                              // - Xpulsen schrijven 
               vorige_Xpulses = Xpulses;              // - Gewijzigde waarde onthouden        
  }
}

/*
 *  Schrijf de Xpulsen naar de LCD
 *
 *  XPulsen staat op karakter 3, regel 0
*/
void SchrijvenX(){                                              
   lcd.setCursor(3,0);                                         
   lcd.print("              ");                                  //ruimte leegmaken
   lcd.setCursor(3,0);                                        
   lcd.print(Xpulses);                                         //aantal pulsen schrijven 
}
...

Nogmaal: jij moet de manier van commentaar kiezen die voor jou werkt.

Tot nu toe heb ik enkel wat beginners codes van andere op mijn arduino gedraaid, Blink, helloworld enz.
Omdat dit mijn eerste project is waar ik ook zelf wat moet gaan schrijven heb ik er voor gekozen elke regel te voorzien van kommentaar.
Ik zie mijn project ook als een leer/naslagwerk.

Op dit moment kan ik de code nog maar moeilijk "lezen" ik zit nog in het stadium dat ik de code echt regel voor regel moet analyseren om het te begrijpen.
Als ik straks de "taal" wat beter spreek dan gaat het vanzelf die kant op.

Ik moet wel toegeven dat het me "gepakt" heeft. Ik denk dat ik ook nadat de meting klaar is nog wel wat dingetjes kan bedenken die ik er mee wil doen.
Ik kom meer uit de PLC wereld, ik heb wel vaker wat kleine projectjes gemaakt voor huis-en-tuin maar de kosten van de PLC hardware waren vaak een probleem.
Probleem opgelost XD

C/C++ is moeilijk te lezen. (Dat vind ik toch na jaren ervaring)
Wat ik doe om dat probleem op te lossen is goede variabele namen en functie namen verzinnen.
VB

void loop()
{
if (digitalread(5)==HIGH)
{
digitalwrite(6,HIGH);
delay(10);
digitalwrite(6,LOW);
}
}

dat zegt me niks
dit is al beter omdat er goede variabele namen zijn

#define XasLiniaalResetKnop 6
#define XasLiniaalReset 5
void loop()
{
if (digitalread(XasLiniaalResetKnop)==HIGH)
{
digitalwrite(XasLiniaalReset,HIGH);
delay(10);
digitalwrite(XasLiniaalResetKnop,LOW);
}
}

en zo is het nog leesbaarder

#define XasLiniaalResetKnop 6
#define XasLiniaalReset 5
void loop()
{
if (isButtonPressed(XasLiniaalResetKnop))
{
 resetLiniaal(XasLiniaalReset);
}
}

bool isButtonPressed(int ButtonPin)
{
return digitalread(ButtonPin)==HIGH
}
void resetLiniaal(int liniaalresetPin)
{
digitalwrite(liniaalresetPin,HIGH);
delay(10);
digitalwrite(liniaalresetPin,LOW);
}

Merk op dat dit een voorbeeld is met nog veel haken en ogen (vb engels en nederlands door elkaar; formattering ...). Het is gewoon bedoeld om een punt te maken.
Deze manier van werken vraagt wel om te weten waar je mee bezig bent. Met andere woorden zoek de belangrijke functies (setup en loop in arduino) en lees van daar. Dus niet beginnen bovenaan.
Met vriendelijke groet
Jantje

De reset button zit erin, en ook deze werkt :D,

if (digitalRead(ZeroXbutton) == HIGH)
{
Xpulses = 0;
}

Ga nu eens kijken hoe ik een vermenigvuldigings factor kan in bouwen zodat ik van Pulses naar mm's kom, ook nog afronden op 2 cijfers na de comma.

// *************************************************************************************
// *************--------------Sjuul's Digital Read out system------------***************
// *************************************************************************************


// ------- Aanroep & Aanmaak diverse  -------------
#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 Xpulses;                                                     //Aanmaken van -Xpulses- als integer
int vorige_Xpulses;                                              //Aanmaken van -vorige_Xpulses- als integer
int A_SIG=0;                                                     //Aanmaken van -A_SIG=0- als integer
int B_SIG=1;                                                     //Aanmaken van -B_SIG=1- als integer
int ZeroXbutton = 53;                                            //Aanmaken van -ZeroXbutton- als integer en toekennen aan Pin53

float Xmm;                                                       //Aanmaken van -Xmm- als float
float Ymm;                                                       //Aanmaken van -Ymm- als float
float Zmm;                                                       //Aanmaken van -Zmm- als float

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
  pinMode(ZeroXbutton, INPUT);                                   //Aangeven dat ZeroXbutton een ingang is
  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(4000);                                                   //4000ms 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

  //-------- Hoofdprogramma ------------------

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

if (Xpulses != vorige_Xpulses)                                   //ALS -Xpulsen- NIET gelijk is aan -vorige_Xpulses- DAN...
              {
               SchrijvenX();                                     //... uitvoeren van de functie schrijven 
               vorige_Xpulses = Xpulses;                         //Gewijzigde waarde onthouden        
              }
              
              {
if (digitalRead(ZeroXbutton) == HIGH)                            //ALS ZeroXbutton word gedrukt DAN... 
                 {
                  Xpulses = 0;                                   //... waarde van Xpulses nul geven 
                 }
              }
}

  //-------- Diverse functies  --------------

void SchrijvenX(){                                               //Functie met de naam SchrijvenX
   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(Xpulses);                                           //aantal pulsen schrijven 
}

void A_RISE(){                                                   //Functie met de naam A_Rise
 detachInterrupt(0);                                             
 A_SIG=1;
 
 if(B_SIG==0)
 Xpulses++;//moving forward
 if(B_SIG==1)
 Xpulses--;//moving reverse
 Serial.println(Xpulses);
 attachInterrupt(0, A_FALL, FALLING);
}

void A_FALL(){                                                   //Functie met de naam A_FALL
  detachInterrupt(0);
 A_SIG=0;
 
 if(B_SIG==1)
 Xpulses++;//moving forward
 if(B_SIG==0)
 Xpulses--;//moving reverse
 Serial.println(Xpulses);
 attachInterrupt(0, A_RISE, RISING);  
}

void B_RISE(){                                                   //Functie met de naam B_Rise
 detachInterrupt(1);
 B_SIG=1;
 
 if(A_SIG==1)
 Xpulses++;//moving forward
 if(A_SIG==0)
 Xpulses--;//moving reverse
 Serial.println(Xpulses);
 attachInterrupt(1, B_FALL, FALLING);
}

void B_FALL(){                                                   //Functie met de naam B_FALL            
 detachInterrupt(1);
 B_SIG=0;
 
 if(A_SIG==0)
 Xpulses++;//moving forward
 if(A_SIG==1)
 Xpulses--;//moving reverse
 Serial.println(Xpulses);
 
 attachInterrupt(1, B_RISE, RISING);
}

Aangezien ik niet de baas ben over de TV heb ik dus genoeg tijd om aan mijn code te werken :stuck_out_tongue:

Ik heb de vermenigvuldigings factor ingebouwd en het werkt ook nog, enige vraag/opmerking die ik heb is dat hij me standaard 2 cijfers na de komma geeft en ik wil er 3.
(Niet dat ik tot op een duizendste kan frezen maar de profs hebben ook 3 cijfers na de komma en dus wil ik die ook)

Dit is hoe ik het voor elkaar heb gekregen:

Xmm = Xpulses * 0.12468;                                         //Vermenigvuldigen om van pulzen naar mm te komen 
  
  
if (Xmm != vorige_Xmm)                                           //ALS -Xmm- NIET gelijk is aan -vorige_Xmm- DAN...
              {
               SchrijvenX();                                     //... uitvoeren van de functie schrijven 
               vorige_Xmm = Xmm;                                 //Gewijzigde waarde onthouden        
              }
              
              {
if (digitalRead(ZeroXbutton) == HIGH)                            //ALS ZeroXbutton word gedrukt DAN... 
                 {
                  Xpulses = 0;                                   //... waarde van Xpulses nul geven 
                 
              }
}

Nu moet ik nog wat gaan kopieren om ook de Y en Z as te kunnen schrijven... en de snelheidsmeting moet er nog in

Hoe heb je Xmm gedefinieerd ?
Je moet er voor zorgen dat die variabele wel de gewenste precisie kan hebben.

Als float

float Xmm;
float vorige_Xmm;

Nadat ik mijn ene meeting werken had leek het slechts een kwestie van kopieren en plakken om de meting te drie-voudigen.
De zero- en schrijf- funtie lieten zich makkelijk kopieren.
Echter nadat ik de pulsafwerking ging kopieren ging het fout, als ik de sketch laat controleren geeft ie geen foutmelding en als ik hem download ook niet.
Meteen na het downloaden gaat mijn LCD op zwart, ook zie ik geen LED meer knipperen op het bord als de encoder draait en dus pulzen na de arduino stuurt.

Ik heb de code eerst uniek gemaakt voor de X pulzen telling, vervolgens heb ik hem gekopieerd en uniek gemaakt voor de Y as. als ik de unieke code voor de X test werkt hij gewoon, zet ik de Y erbij dan gaat ie op zwart.

Ergens gaat er iets fout, het lijkt erop alsof de arduino zich ophangt, ook een reset met knopje help niet.
Aan de hardware kan het niet liggen die hangt er nog niet aan.

Omdat de code inmiddels wat te groot is voor het forum heb ik het maar even zo opgelost.

Arduino DRO - Wordpad

Arduino DRO - Sketch

Sjuul

Sjuuls:
Ik heb de code eerst uniek gemaakt voor de X pulzen telling, vervolgens heb ik hem gekopieerd en uniek gemaakt voor de Y as. als ik de unieke code voor de X test werkt hij gewoon, zet ik de Y erbij dan gaat ie op zwart.

Ik neem aan dat je met "zet ik de Y erbij" de interrupthandlers voor de Y-as bedoeld ?

Wat gebeurt er als je de X interrupthandlers uitcommentarieerd en alleen de Y interrupthandlers gebruikt ?

Deze werkt niet:

void setup() 
 {  
  attachInterrupt(0, XA_RISE, RISING);
  attachInterrupt(1, XB_RISE, RISING);
  attachInterrupt(2, YA_RISE, RISING);
  attachInterrupt(3, YB_RISE, RISING);

Deze wel:

void setup() 
 {  
  attachInterrupt(0, XA_RISE, RISING);
  attachInterrupt(1, XB_RISE, RISING);
  //attachInterrupt(2, YA_RISE, RISING);
  //attachInterrupt(3, YB_RISE, RISING);

Deze niet: :blush:

void setup() 
 {  
  //attachInterrupt(0, XA_RISE, RISING);
  //attachInterrupt(1, XB_RISE, RISING);
  attachInterrupt(2, YA_RISE, RISING);
  attachInterrupt(3, YB_RISE, RISING);

Ik weet wat me te doen staat, bedankt

Probleem gevonden, of eigenlijk interguild voor een ander :stuck_out_tongue: :stuck_out_tongue:

Probleem zit in de Interrupts 2 en 3 deze zitten op pin 22 & 23 en de I2C-bus (SDA & SCL) ook.
Zit nu toch met een probleempje zeker omdat ik alle 6 Interrupts nodig heb...

Zal het LCD schermpje dus toch conventioneel moeten aansluiten.

Sjuul

Hallo mannen,

Ik heb een set digirulers welke ik met een arduino wil uitlezen en zichtbaar maken.

Ik heb 3 sony magnerulers PL82b en uit de manual haal ik dat deze een A en B puls uitsturen zoals bij elke encoder (3-2 pagina 15)
De software voor de arduino is klaar en met een simpele draai-encoder getest, nadat ik de pulzen aangesloten had op de arduino gebeurde er niks, Lineaal werkt op 5v voeding, de minnen mooi samen met die van de voeding van de arduino aan elkaar gelegd maar nog steeds niks.
Uiteindelijk met de scoop de A en B pulzen gemeten en wat me opvalt is dat het niet echt blokjes zijn maar trapjes, ook zijn ze niet 90* verschoven maar liggen ze mijn inziens gewoon in fase.

Ik heb 3 sets en alle drie doen ze hetzelfde ook als ik de kables en opnemers met elkaar mix
Ik heb de lineaalen werkend uitgebouwd, afhandeling gebeurde door een tellerkaart op een S5

Ik denk dat het probleem bij mezelf ligt :roll: ergens mis ik iets aan kennis of informatie.
Ik doe er een plaatje bij van de scoop, misschien dat ik het verkeerd intrepeteer

Ik heb het nog een keer nagemeten met een ouderwetse analoge scoop, maar het beeld is exact hetzelfde
Sjuul

Heb je de juiste aansluitingen ?
Ik zie dat die 82 een symmetrische uitgang heeft en bedoeld is om met een twisted pair aangesloten te worden; heb je dat ook gedaan ?
Waar heb je je probes op aangesloten ?
Ik zie zo gauw niets staan over het gebruik van afsluitweerstanden maar dat is wel vaak van toepassing bij zulke symmetrische signalen (denk aan RS 485).
Daarmee zouden die pieken wel een kunnen verdwijnen of een stuk kleiner worden.

Kun je ook een enkele (of hooguit 2 ) stappen met je scope oppikken ?

Vandaag met electronica-pro gepraat en hem de modules en manual laten zien.
Deze vertelde me dat het om een RS422 protocol gaat en dat het A en B signaal dat ik nodig zit verborgen in het verschil tussen PCA*/PCA en PCB*/PCB.

Om van de lineaal na een bruikbaar signaal te komen voor de arduino heb twee SN75176 nodig

SN75176 nummer 1 voor de A-puls:

pin 1: gaat naar Arduino; is je 'A' data.
pin 2: moet aan GND
pin 3: moet aan GND
pin 4: moet aan GND
pin 5: moet aan GND
pin 6: gaat naar PL82 PCA
pin 7: gaat naar PL82 PCA*
pin 8: gaat naar +5V
Verder plaats je nog een condensator van 10-220nF tussen pin 5 en 8

SN75176 nummer 2 voor de B-Puls:

pin 1: gaat naar Arduino; is je 'B' data.
pin 2: moet aan GND
pin 3: moet aan GND
pin 4: moet aan GND
pin 5: moet aan GND
pin 6: gaat naar PL82 PCB
pin 7: gaat naar PL82 PCB*
pin 8: gaat naar +5V
Verder plaats je nog een condensator van 10-220nF tussen pin 5 en 8

Dat kun je ook doen met een 485 transceivertje zoals de MAX485.
En volgens mij is die ook pincompatible met jouw beschrijving van de SN75176.
Heb zojuist ff de datasheet bekeken en zie dat ze inderdaad hetzelfde doen en aangesloten worden.

RS422 en RS485 zijn vergelijkbare elektrische signalen, maar 485 is duplex en 422 niet (heb je dus 2 aderparen voor nodig voor tweerichtingverkeer).

Dus ff kijken wat je kunt krijgen en als allebei kan, welke dan het goedkoopst is.
Ik heb voor een paar euro (€ 3,60) een printje uit China laten komen (inclusief verzenden) waarmee ik RS485 signalen binnenhaal en verwerk.

Spulletjes zijn al onderweg hopelijk krijg ik hem nu aan de gang.
Heb voor de verandering eens bij dickbest besteld hopelijk zijn die wat sneller, conrad heeft altijd een paar dagen nodig om het doosje te vullen en vervolgens duurt het nog eens drie dagen voor dat ik het thuis heb.

Al het eenmaal werkt kijk ik wel of het nog beter kan, ik wil hem nu gewoon aan de gang hebben.

Ik ken dickbest niet maar conrad is traag; heel traag; Niks voor als je al aan je project begonnen bent en nog snel wat nodig hebt.

Jammer dat je elders een gelijke thread hebt geopend.
De antwoorden en vragen op jouw vragen daar zijn niet anders dan hier, maar wellicht iets sneller gekomen.
Nu krijg je mogelijk 2 verschillende threads over het gelijke onderwerp, waarbij degenen die je willen helpen met je vragen beide threads moeten gaan volgen om te kijken wat er al allemaal de revue gepasseerd is.
En dat doet niemand.
Dat is de reden waarom dit crosspoten niet op prijs gesteld word, deelnemen aan zulke threads word dan nogal ondankbaar.

Klopt, heb ik gedaan. :blush:
Ik zat behoorlijk in de rats, ik heb slechts wat basis kennis electronica.
Ik had een goed afloop eigenlijk al opgegeven, en heb toen ook maar een threat gestart in het Engelstalige deel van het forum, onder het moto van “waarom op één paard wedden…”

Dat het niet netjes is ben ik met je eens, ben er ook niet trots op.
Op het moment van plaatsen heb ik me dan ook niet gerealiseerd wat jij nu schets, en waar ik het overigens helemaal mee eens ben.

Voor nu is het misschien beste om de thread verder te zetten in het engelstalige deel om zo het onderwerp puur te houden.

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

Sjuul