reel2reel teller
22 berichten
• Pagina 1 van 3 • 1, 2, 3
reel2reel teller
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 ) 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
Groet,
Marcel
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 ) 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
- nicoverduin
- Berichten: 5043
- Geregistreerd: 13 Mei 2013, 20:57
- Woonplaats: Heemskerk
Re: reel2reel teller
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.
Re: reel2reel teller
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
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
- nicoverduin
- Berichten: 5043
- Geregistreerd: 13 Mei 2013, 20:57
- Woonplaats: Heemskerk
Re: reel2reel teller
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.
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.
Re: reel2reel teller
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:
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 ?
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 ?
Re: reel2reel teller
@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.
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.
Re: reel2reel teller
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
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.
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
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.
Re: reel2reel teller
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
shooter@home.nl
Re: reel2reel teller
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..
- 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");
}
22 berichten
• Pagina 1 van 3 • 1, 2, 3
Wie is er online?
Gebruikers in dit forum: Geen geregistreerde gebruikers en 34 gasten