reel2reel teller

Arduino specifieke Software
Berichten: 12
Geregistreerd: 05 Dec 2016, 15:07

reel2reel teller

Berichtdoor dyk » 13 Dec 2016, 01:24

Hallo,

Ik ben nieuw op het forum en ben ook aangestoken met het arduino virus. Ik heb in het verleden wel eens een poging ondernomen me te verdiepen in c code maar daar is niet zoveel van blijven hangen, herinner me wel veel gehannes zonder goede info van google zoals tegenwoordig.
Ik heb met de arduino al wat projectjes gedaan voornamelijk met code die ik van het www afgeplukt heb, o.a. een stofmeter (uit een klimacontrol), en een dauwpuntmeter.
Nu ben ik al een tijdje bezig met het opknappen van een oude bandrecorder ( reel2reel, het nieuwe vinyl :P ) en wil daar een real time bandtellertje met een 4- of 6- cijferig display inbouwen. In de recorder zit een encoderwieltje met een lichtsluisje wat dient voor de bandloopcontrole, dat laat ik verder met rust maar er is plaats zat om daar 2 lichtsluisjes (tcst2103) bij te pielen zodat ik 2 signaaltjes met verschoven fase kan tellen in een arduino, vooruit en achteruit met een nulafslag dmv een relaisje oid. Dat wieltje heeft 8 sleufjes en maakt per seconden +/- 2 omwentelingen, dan zouden er 64 pulsen per seconden uitrollen als ik me niet vergis. Het preciese aantal ga ik nog opmeten met een logic sniffer als ik de lichtsluisjes heb ingebouwd.
Ik heb al wat code bij elkaar geharkt (oa hier van het forum en een encoder library) en dat ging tot een paar dagen geleden eigenlijk best voorspoedig maar hoe meer ik er aan vastplak hoe minder ik er uitkom als beginner..
Ik heb een testopstelling met een incrementele encoder uit een zaagmachine om te kijken of het werkt, de code ziet er uit als een draak natuurlijk maar daarom plaats ik dit bericht, kan iemand mij een beetje op weg helpen, ik loop vast en zonder hulp word ik niet wijzer, van fouten moet je leren maar dat leer je het snelst van iemand die je uit kan leggen hoe het wel moet dacht ik zo.
Zoals het nu staat werkt het, alleen niet in real time en onder de nul telt ie alleen de seconden. Haal ik de pulsen erbij telt ie alleen vooruit.
Hier de code:


cpp code
/* Uit: Encoder Library - Basic Example
http://www.pjrc.com/teensy/td_libs_Encoder.html
This example code is in the public domain.
*/

// Tellercode//////////

#include <Encoder.h>

Encoder myEnc(2, 3); //interruptpinnen arduino uno
//int puls; // 64 pulsen is 1 seconde
int seco;
int minu;
int uren;
//int minpuls;
int minseco;
int minminu;
int minuren;

void setup() {
Serial.begin(9600);
Serial.println("TellerTest:");
}
long oldPosition = 0;
long firstPosition = 0; //voor een nulpunt

void loop() {

long newPosition = myEnc.read();

if (newPosition > oldPosition && newPosition > firstPosition) {
oldPosition = newPosition;
// puls++;
// if (puls == 64) {
// puls = 0;
seco++;
if (seco == 60) {
seco = 0;
minu++;
if (minu == 60) {
minu = 0;
uren++;
if (uren == 24) {
uren = 0;
// }
}
}
}

Serial.print(uren);
Serial.print(':');
if (minu < 10) {
Serial.print('0');
}
Serial.print(minu);
Serial.print(':');
if (seco < 10) {
Serial.print('0');
}
Serial.println(seco);
}


else if (newPosition < oldPosition && newPosition > firstPosition) {
oldPosition = newPosition;
// puls--;
// if (puls == 0) {
// puls = 64;
seco--;
if (seco == 0) {
seco = 60;
minu--;
if (minu == 60) {
minu = 0;
uren--;
if (uren == 0) {
uren = 0;
// }
}
}
}

Serial.print(uren);
Serial.print(':');
if (minu < 10) {
Serial.print('0');
}
Serial.print(minu);
Serial.print(':');
if (seco < 10) {
Serial.print('0');
}
Serial.println(seco);
}

// code voor de minkant###################################################%%%%%%%%%%%%%%


if (newPosition > oldPosition && newPosition < firstPosition) {
oldPosition = newPosition;
// minpuls--;
// if (minpuls == -64) {
// minpuls = 0;
minseco--;
if (minseco == -60) {
minseco = 0;
minminu--;
if (minminu == -60) {
minminu = 0;
minuren--;
if (minuren == -24) {
minuren = 0;
// }
}
}
}

Serial.print('-');
Serial.print(minuren);
Serial.print(':');
if (minminu < 10) {
Serial.print('0');
}
Serial.print(minminu);
Serial.print(':');
if (minseco < 10) {
Serial.print('0');
}
Serial.println(minseco);
}


else if (newPosition < oldPosition && newPosition < firstPosition) {
oldPosition = newPosition;
// minpuls++;
// if (minpuls == 0) {
// minpuls = -64;
minseco++;
if (minseco == 0) {
minseco = -60;
minminu++;
if (minminu == 0) {
minminu = -60;
minuren++;
if (minuren == 0) {
minuren = 0;
// }
}
}
}

Serial.print('-');
Serial.print(minuren);
Serial.print(':');
if (minminu < 10) {
Serial.print('0');
}
Serial.print(minminu);
Serial.print(':');
if (minseco < 10) {
Serial.print('0');
}
Serial.println(minseco);
}

if (newPosition > oldPosition && newPosition == firstPosition) {
oldPosition = newPosition;

Serial.print("0:00:00");
Serial.println();
}
if (newPosition < oldPosition && newPosition == firstPosition) {
oldPosition = newPosition;

Serial.print("0:00:00");
Serial.println();
}
}


Groet,
Marcel

Advertisement

Gebruikers-avatar
Berichten: 5043
Geregistreerd: 13 Mei 2013, 20:57
Woonplaats: Heemskerk

Re: reel2reel teller

Berichtdoor nicoverduin » 13 Dec 2016, 08:56

Er is niets mis mee om voort te bouwen op het werk van anderen. En als het past (bijv. een library) moet je dat zeker gebruiken. Ga je echter het wiel kopiëren maar deze past niet kun je beter het ontwerp van het wiel doorgronden en dan een eigen wiel ontwerpen en daar mee doorgaan. Daar leer je van en ga je het inhoudelijk begrijpen. Nu loop je stuk omdat je continu stukjes aan dat wiel moet bijplakken of afhakken. En dan is de basis gedachte van de oorspronkelijke ontwerper volledig verdampt en loop je vanzelf vast.
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Berichten: 12
Geregistreerd: 05 Dec 2016, 15:07

Re: reel2reel teller

Berichtdoor dyk » 13 Dec 2016, 11:08

Bedankt voor de snelle reactie nico, ik moet dus het wiel opnieuw uit gaan vinden. Maar ff serieus , mijn gedachte was om bij mensen met echt verstand van zaken een reactie los te peuteren, is me dus al vrij snel gelukt ;)
Ik vond deze encoder library, en het is zonder meer gebruikelijk om library's van anderen in te passen, daar gaat het uiteindelijk een beetje om bij open source nietwaar, en dacht, daar kan ik wel wat mee, telt netjes op voor de nul en telt achter de nul netjes achteruit.
Vergarend naar kennis op t www vond ik een topic hier op het forum om pulsen te implementeren naar tijd en dacht daarmee een eind op de goede weg te zijn. Het heen en terug tellen (spoelen) in seconden ging namelijk goed tot op zekere hoogte maar uit jouw reactie maak ik op dat ik een denkfout maak en het allemaal een beetje te simpel zie, het wiel past niet en zal ook nooit passen, kan wél vragen waarom het niet past maar dan vraag ik naar de bekende weg, toch..? (Terug naar de tekentafel dan maar)

Groet, Marcel

Gebruikers-avatar
Berichten: 5043
Geregistreerd: 13 Mei 2013, 20:57
Woonplaats: Heemskerk

Re: reel2reel teller

Berichtdoor nicoverduin » 13 Dec 2016, 11:27

De tekentafel is altijd de beste basis. Eerst denken dan doen..... Nu wordt er heel veel 'doen' gedaan en dan gaan we later vragen omdat we er niet uitkomen. Er is vermoedelijk niets mis met de library en ik zie PRJC als auteur en dat geeft veel vertrouwen.
Maar trek het probleem uit elkaar, documenteer je source en bespaar niet op naamgeving... De tijd dat je moest betalen voor een extra ponskaart letter is voorbij.... Het vergroot de leesbaarheid en je eigen inzicht.
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Gebruikers-avatar
Berichten: 2655
Geregistreerd: 06 Aug 2016, 01:03

Re: reel2reel teller

Berichtdoor Koepel » 13 Dec 2016, 18:44

Je kunt eenvoudig beginnen, door de encoder library op nul te zetten met: myEnc.write( 0);
Dan hoef je alleen nog maar naar 'newPosition' te kijken.
Die 'newPosition' wordt dan de belangrijkste variabele van de sketch, daar wordt alles op gebaseerd.
Als je later een offset wilt, dan kun je dat later toevoegen. Op dit moment wordt het daardoor wat onoverzichtelijk.

Ik zou in de sketch maar één keer het aantal pulsen omzetten naar ±hh:mm:ss, en dan ook het liefst in een functie.
Stel dat de pulsen niet lineair gaat met de seconden, dan is het misschien nodig om een curve toe te voegen aan die functie.

Zo uit mijn hoofd zou ik dit doen:
Code: Alles selecteren
void ShowHHMMSS( long pulses)
{
  if( pulses < 0)
  {
    Serial.print('-');
    pulses = -pulses;   // make it positive
  }

  // Calculate the total seconds, this could be linear or a curve ! ?
  long totalseconds = pulses / 2;

  // split the totalseconds into hh:mm:ss
  // The 'L' indicates a long number, the result is converted into an integer.
  int hours = int( (totalseconds / (60L * 60L)) % 24L);
  int minutes = int( (totalseconds / 60L) % 60L);
  int seconds = int( totalseconds % 60L);

  // print them
  ...
}


Als je wilt stoppen op een bepaalde tijd, dan zou ik de HH:MM:SS eerst omzetten naar het aantal pulsen, en in de sketch met de pulsen van de encoder werken.

De pjrc.com is van Paul Stoffregen, hij draagt veel bij aan Arduino code. Ik vraag me nog wel af jouw encoder zich ook echt als een encoder gedraagt, met de pulsen in de juiste fase.

Wanneer je de nieuwe positie op nul wilt zetten, dat begrijp ik niet. Kun je daar een knop voor gebruiken ?

Berichten: 12
Geregistreerd: 05 Dec 2016, 15:07

Re: reel2reel teller

Berichtdoor dyk » 13 Dec 2016, 21:20

@Nico

De tijd dat je moest betalen voor een extra ponskaart letter is voorbij....Gmpfff
nou,nou, zo oud ben ik ook weer niet hahaha maar dat terzijde, ben er ook echt mee bezig maar wil de leercurve zo stijl mogelijk houden.
Was ook al in wat leerboeken begonnen, maar daar slaat de verveling al snel toe.
Om op mijn code terug te komen, ik vermoed dat er n fout zit in de dataopslag met pulsen sec, min en uren heb al unsigned geprobeerd om het probleem met negatieve waarden te tackelen maar toen sloeg de verwarring toe omdat ik daar verder niks over kan vinden. mmkay zal proberen de source te documenteren al snap ik niet helemaal wat je ermee bedoeld, ga er mee aan de slag.

@koepel

Aahhhh, daar viel volgens mij net 'n kwartje : myEnc.write(0) , ik dacht al dat er een denkfout fout zat in firstPosition en oldPosition, de eerste had ik later toegevoegd om een stabiel nulpunt in de sketch te maken (if (newPosition < oldPosition && newPosition == firstPosition) ),
dit omdat (antwoord op jouw vraag) er op de originele analoge teller behalve een resetknop ook een afslag op nul zit. Dat is wel een mooie gimmick, ga dat maar hergruiken dmv een relaisje oid.
Het is misschien wel handig om alles wat overzichtelijker te maken, dmv een functie?, ga ik mee aan de slag.
Het aantal pulsen p/sec blijft altijd gelijk, komen van een omlooprol vlak voor de koppen dus de bandsnelheid veranderd niet.
De encoder is een optische encoder en geeft een faseverschuiving van 180 gr, een Baumer BDK06, die geeft nog een derde signaal maar die gebruiken we maar niet.

Berichten: 12
Geregistreerd: 05 Dec 2016, 15:07

Re: reel2reel teller

Berichtdoor dyk » 14 Dec 2016, 00:21

pfff bedoel 90 graden

Gebruikers-avatar
Berichten: 2655
Geregistreerd: 06 Aug 2016, 01:03

Re: reel2reel teller

Berichtdoor Koepel » 14 Dec 2016, 01:09

Okay, dat is mooi, er is een direct verband tussen de pulsen en de seconden.
Je kunt je hele sketch op pulsen baseren of op seconden. Voor beide is wat te zeggen. Als ik denk aan afronding van de berekening, dat heeft het mijn voorkeur om dicht bij de hardware van de echte wereld te blijven en de pulsen als basis te kiezen. Ik wou dat ik het beter kon uitleggen, het is meer gevoelsmatig :o

Wat je beter niet kunt doen, is de pulsen gebruiken om tijdens je sketch de minuten en de uren te gaan tellen. Dan wordt het een draak met drie koppen.

Probeer klein te beginnen. Vraag de teller op en zet dat om en laat het zien.
Ik wil in je sketch maar één keer de omzetting zien van pulsen naar hh:mm:ss, en alleen op het moment dat het afgedrukt wordt (naar de seriële monitor of een schermpje). Ook al wordt je sketch vele malen groter, die omzetting hoort er maar één keer in te zitten.
Die omzetting is alleen maar om het voor ons mensen wat beter leesbaar te maken. Dat is dus alleen maar een omzetting voor de uitvoer. Het staat los van de pulsen of seconden die de basis van de sketch vormen.

Berichten: 4067
Geregistreerd: 16 Okt 2013, 14:31
Woonplaats: s hertogenbosch

Re: reel2reel teller

Berichtdoor shooter » 14 Dec 2016, 22:58

dat tellen doet de encoder lib wel voor je, die gebruikt trouwens wel een interupt, het omzetten naar tijd doe je simpel met een factor bijvoorbeeld 10000 pulsen is een tijd van 1 uur 23 minuten en 45 seconden,
paul deelen
shooter@home.nl

Berichten: 12
Geregistreerd: 05 Dec 2016, 15:07

Re: reel2reel teller

Berichtdoor dyk » 15 Dec 2016, 01:12

Ben er al even mee aan de slag geweest maar het gebruik van een functie is nieuw voor me, heb de sketch leeg gemaakt en heb wat dingen onder elkaar gezet waaronder de functie, denk ik?? De pulsen gaan tellen en dan koppelen aan ShowHHMMSS is de volgende stap , void loop klopt niks van, morgenavond verder.. :roll:

Code: Alles selecteren
 /* Uit: Encoder Library - Basic Example
   http://www.pjrc.com/teensy/td_libs_Encoder.html
   This example code is in the public domain.

*/

// Tellercode//////////

#include <Encoder.h>

Encoder myEnc(2, 3);   //interruptpinnen arduino uno

long pulses = 64;    // ?????????????? als ik dit zo hier neerzet dan werkt de functie ShowHHMMSS
long totalseconds = pulses / 2;  // ????????????   iig seriële monitor geeft 0:00:32 aan

int hours = int( (totalseconds / (60L * 60L)) % 24L);
int minutes = int( (totalseconds / 60L) % 60L);
int seconds = int( totalseconds % 60L);

void setup() {
  Serial.begin(9600);
  Serial.println("TellerTest:");

  ShowHHMMSS ;      //functie van wat er geprint moet worden
  Serial.print(hours);
  Serial.print(':');
  if (minutes < 10) {
    Serial.print('0');
  }
  Serial.print(minutes);
  Serial.print(':');
  if (seconds < 10) {
    Serial.print('0');
  }
  Serial.println(seconds);    // moet dit binnen de functie?
  if ( pulses < 0) {
    pulses = -pulses;   // make it positive
    Serial.print('-');
  }

}
void loop() {

  myEnc.write(0);    // startpunt van telling = 0
  long newPosition = myEnc.read();    // tel de pulses
  long oldPosition = 0;

  if (newPosition != oldPosition) {    //  oldPosition is de vorige puls
    oldPosition = newPosition;

  }
}
void ShowHHMMSS() {
  Serial.println("hours, minutes, seconds");
}
 

Volgende

Terug naar Arduino software

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 34 gasten