Gokart snelheidsmeting

Als U een gezamenlijk project wil starten of aan projecten van anderen mee wilt werken.
Berichten: 16
Geregistreerd: 06 Apr 2014, 20:16

Re: Gokart snelheidsmeting

Berichtdoor fenrir » 10 Apr 2014, 08:40

nicoverduin schreef:En dat betekent?......
Dat je alles moet kopiëren en niet de helft......


ik heb de onderstaande code gebruikt , het schema opnieuw gemaakt maar der verschijnt niks op men lcd scherm en de seriele monitor toont enkel rare tekentjes :)

// Opent de bibliotheek voor de display.
#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 7, 6, 5, 4); // was 12,11,5,4,3,2

#define MEASURE_TIME 1000 // measure every second
#define WIEL_OMTREK 1000 // wiel omtrek in millimeter

unsigned long triggerTijd; // testen voor elke MEASURE_TIME
unsigned long snelheid = 0;
unsigned long maxsnelheid = 0;
volatile unsigned int puls = 0; //volatile wordt altijd gebruikt in combi met een interupt, het vertelt de compiler
// om gegevens direct uit RAM te halen en niet uit een tijdelijk register
unsigned long rpm = 0L;
unsigned long wielomtrek = 0L; // long is een variabele waar grote getallen in kunnen ook negatieve getallen.
unsigned long afstand = 0L;
unsigned long maxafstand = 0L;
/**
* @name setup()
*/
void setup() {
//
// we have no LCD so do serial
//
Serial.begin(115200); // Opent een seriële verbindingspoort.
// lcd.begin(16, 2); // Stelt de LCD in 16 kolommen en 2 rijen.
attachInterrupt(0, rpm_as, FALLING); // vallende puls als trigger
triggerTijd = millis() + MEASURE_TIME;// start de timer
}
/**
* @name loop()
*/
void loop() {

if (millis() > triggerTijd) {
//
// bereken het aaltal RPM per minuut
//
rpm = puls * 60;
snelheid = ((WIEL_OMTREK * rpm * 60) / (1000000)); // Reken de snelheid uit.
afstand = (WIEL_OMTREK * puls); // Reken de afgelegde afstand uit.
maxafstand= (afstand + maxafstand);

//Hieronder wordt de hoogste waarde van de variabele "maxsnelheid" onthouden.
if (snelheid > maxsnelheid)
maxsnelheid = snelheid;
if (snelheid < maxsnelheid)
maxsnelheid = maxsnelheid;

lcd.clear(); // Maak de display leeg.
lcd.setCursor(4, 0); // Zet de cursor op de gewenste plaats, kolom4(5) en rij1(0).
lcd.print("Km/h, Rpm"); // Schrijf de tekst tussen de "".
lcd.setCursor(0, 0);
lcd.print(snelheid); // Schrijf de variabele "snelheid".
lcd.setCursor(10, 0);
lcd.print(rpm);

lcd.setCursor(0, 1);
lcd.print("Snelste Km/h");
lcd.setCursor(8, 1);
lcd.print(maxsnelheid);

Serial.print("RPM = "); // print het woord "RPM".
Serial.print(rpm); // print de rpm waarde.
Serial.print(" Hz = "); // print het woord "Hz".
Serial.print(puls); // print omwentelingen per seconde of Hz.
Serial.print(" Snelheid = ");
Serial.print(snelheid);
Serial.print(" Maxsnelheid = ");
Serial.print(maxsnelheid);
Serial.print(" Afstand = ");
Serial.println(maxafstand / 1000000);
//
// reset de pulsteller
//
puls = 0;
triggerTijd = millis() + MEASURE_TIME;// start de timer
}
}
/**
* @name rpm_as
* wordt aangeroepen bij elke trigger van de hall sensor
*/
void rpm_as() {
puls++; // verhoog de teller
}

Advertisement

Berichten: 16
Geregistreerd: 06 Apr 2014, 20:16

Re: Gokart snelheidsmeting

Berichtdoor fenrir » 10 Apr 2014, 08:40

nicoverduin schreef:En dat betekent?......
Dat je alles moet kopiëren en niet de helft......


ik heb de onderstaande code gebruikt , het schema opnieuw gemaakt maar der verschijnt niks op men lcd scherm en de seriele monitor toont enkel rare tekentjes :)

// Opent de bibliotheek voor de display.
#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 7, 6, 5, 4); // was 12,11,5,4,3,2

#define MEASURE_TIME 1000 // measure every second
#define WIEL_OMTREK 1000 // wiel omtrek in millimeter

unsigned long triggerTijd; // testen voor elke MEASURE_TIME
unsigned long snelheid = 0;
unsigned long maxsnelheid = 0;
volatile unsigned int puls = 0; //volatile wordt altijd gebruikt in combi met een interupt, het vertelt de compiler
// om gegevens direct uit RAM te halen en niet uit een tijdelijk register
unsigned long rpm = 0L;
unsigned long wielomtrek = 0L; // long is een variabele waar grote getallen in kunnen ook negatieve getallen.
unsigned long afstand = 0L;
unsigned long maxafstand = 0L;
/**
* @name setup()
*/
void setup() {
//
// we have no LCD so do serial
//
Serial.begin(115200); // Opent een seriële verbindingspoort.
// lcd.begin(16, 2); // Stelt de LCD in 16 kolommen en 2 rijen.
attachInterrupt(0, rpm_as, FALLING); // vallende puls als trigger
triggerTijd = millis() + MEASURE_TIME;// start de timer
}
/**
* @name loop()
*/
void loop() {

if (millis() > triggerTijd) {
//
// bereken het aaltal RPM per minuut
//
rpm = puls * 60;
snelheid = ((WIEL_OMTREK * rpm * 60) / (1000000)); // Reken de snelheid uit.
afstand = (WIEL_OMTREK * puls); // Reken de afgelegde afstand uit.
maxafstand= (afstand + maxafstand);

//Hieronder wordt de hoogste waarde van de variabele "maxsnelheid" onthouden.
if (snelheid > maxsnelheid)
maxsnelheid = snelheid;
if (snelheid < maxsnelheid)
maxsnelheid = maxsnelheid;

lcd.clear(); // Maak de display leeg.
lcd.setCursor(4, 0); // Zet de cursor op de gewenste plaats, kolom4(5) en rij1(0).
lcd.print("Km/h, Rpm"); // Schrijf de tekst tussen de "".
lcd.setCursor(0, 0);
lcd.print(snelheid); // Schrijf de variabele "snelheid".
lcd.setCursor(10, 0);
lcd.print(rpm);

lcd.setCursor(0, 1);
lcd.print("Snelste Km/h");
lcd.setCursor(8, 1);
lcd.print(maxsnelheid);

Serial.print("RPM = "); // print het woord "RPM".
Serial.print(rpm); // print de rpm waarde.
Serial.print(" Hz = "); // print het woord "Hz".
Serial.print(puls); // print omwentelingen per seconde of Hz.
Serial.print(" Snelheid = ");
Serial.print(snelheid);
Serial.print(" Maxsnelheid = ");
Serial.print(maxsnelheid);
Serial.print(" Afstand = ");
Serial.println(maxafstand / 1000000);
//
// reset de pulsteller
//
puls = 0;
triggerTijd = millis() + MEASURE_TIME;// start de timer
}
}
/**
* @name rpm_as
* wordt aangeroepen bij elke trigger van de hall sensor
*/
void rpm_as() {
puls++; // verhoog de teller
}

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

Re: Gokart snelheidsmeting

Berichtdoor nicoverduin » 10 Apr 2014, 10:44

En op welke baud rate zit je kijken op de monitor? 9600? hij is nu ingesteld in het programma op 115200. Ik denk dat je er goed aan doet om de tutorials uit te voeren en vooral te kijken hoe die werkt en waarom. Bovenstaand programma werkt als een tiet (je bent namelijk niet de eerste).

En voor wat je LCD betreft........ moet je wel alles wat met LCD te maken heeft ont-commentarieren...
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Berichten: 16
Geregistreerd: 06 Apr 2014, 20:16

Re: Gokart snelheidsmeting

Berichtdoor fenrir » 10 Apr 2014, 11:33

nicoverduin schreef:En op welke baud rate zit je kijken op de monitor? 9600? hij is nu ingesteld in het programma op 115200. Ik denk dat je er goed aan doet om de tutorials uit te voeren en vooral te kijken hoe die werkt en waarom. Bovenstaand programma werkt als een tiet (je bent namelijk niet de eerste).

En voor wat je LCD betreft........ moet je wel alles wat met LCD te maken heeft ont-commentarieren...


wanneer ik onderstaande code gebruik komt er wel tekst in de seriele monitor maar de waarden blijven 0 wanneer ik met mijn magneet langs het reed contact passeer.
ik heb geschakeld zoals het schema dat in de post staat vanwaar deze code komt.
de lcd licht op en de lichtsterkte is te regelen met de potentiometer. er komt erchter geen tekst of waarden op.

ik heb de tutorials al gemaakt maar dit project is veel moeilijker.

#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 7, 6, 5, 4);

#define MEASURE_TIME 1000
#define WIEL_OMTREK 1000

unsigned long triggerTijd;
unsigned long snelheid = 0;
unsigned long maxsnelheid = 0;
volatile unsigned int puls = 0;

unsigned long rpm = 0L;
unsigned long wielomtrek = 0L;
unsigned long afstand = 0L;
unsigned long maxafstand = 0L;

void setup() {

Serial.begin(9600);
lcd.begin(16, 2);
attachInterrupt(0, rpm_as, FALLING);
triggerTijd = millis() + MEASURE_TIME;
}

void loop() {

if (millis() > triggerTijd) {

rpm = puls * 60;
snelheid = ((WIEL_OMTREK * rpm * 60) / (1000000));
afstand = (WIEL_OMTREK * puls);
maxafstand= (afstand + maxafstand);


if (snelheid > maxsnelheid)
maxsnelheid = snelheid;
if (snelheid < maxsnelheid)
maxsnelheid = maxsnelheid;

lcd.clear();
lcd.setCursor(4, 0);
lcd.print("Km/h, Rpm");
lcd.setCursor(0, 0);
lcd.print(snelheid);
lcd.setCursor(10, 0);
lcd.print(rpm);

lcd.setCursor(0, 1);
lcd.print("Snelste Km/h");
lcd.setCursor(8, 1);
lcd.print(maxsnelheid);

Serial.print("RPM = ");
Serial.print(rpm);
Serial.print(" Hz = ");
Serial.print(puls);
Serial.print(" Snelheid = ");
Serial.print(snelheid);
Serial.print(" Maxsnelheid = ");
Serial.print(maxsnelheid);
Serial.print(" Afstand = ");
Serial.println(maxafstand / 1000000);

puls = 0;
triggerTijd = millis() + MEASURE_TIME;
}
}

void rpm_as() {
}

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

Re: Gokart snelheidsmeting

Berichtdoor nicoverduin » 10 Apr 2014, 11:37

Op welke pin heb je de schakelaar op aangesloten? En hoe heb je het aangesloten?
Wat is de baudrate van je seriële monitor?
Heb je nu wel de lcd.begin() in de setup al uit het commentaar gehaald?
Heb je de LCD goed aangesloten?
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Berichten: 16
Geregistreerd: 06 Apr 2014, 20:16

Re: Gokart snelheidsmeting

Berichtdoor fenrir » 11 Apr 2014, 16:05

nicoverduin schreef:Op welke pin heb je de schakelaar op aangesloten? En hoe heb je het aangesloten?
Wat is de baudrate van je seriële monitor?
Heb je nu wel de lcd.begin() in de setup al uit het commentaar gehaald?
Heb je de LCD goed aangesloten?


ik heb alles aangesloten volgens dit schema:
http://forum.arduino.cc/index.php?actio ... 5798;image
de baudrate is 9600, ik krijg nu ook de teks in de monitor maar de waarde blijft steeds 0.
ja alle commentaar is weg.
de lcd is normaal gezien correct aangesloten.

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

Re: Gokart snelheidsmeting

Berichtdoor nicoverduin » 11 Apr 2014, 17:29

Ik mis de pullup van de data ingang op de interrupt 0. Je moet er een weerstandje verbinden van iets van 4.7K tot 10K naar de 5V. Nu zweeft die ingang. En heb je de schakelaar goed aangesloten? Als je hem verkeerd aansluit blijft de schakelaar altijd aan GND hangen en gebeurt er weinig.
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Berichten: 139
Geregistreerd: 28 Jul 2013, 13:30

Re: Gokart snelheidsmeting

Berichtdoor ercmrj » 12 Apr 2014, 08:51

Ik heb je code ook ff getest omdat ik toevallig ook met zo'n project bezig ben en zo werkt ie bij mij wel ipv display gebruik ik de serieële monitor

Code: Alles selecteren
#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 7, 6, 5, 4);

#define MEASURE_TIME 1000
#define WIEL_OMTREK 1000

unsigned long triggerTijd;
unsigned long snelheid = 0;
unsigned long maxsnelheid = 0;
volatile unsigned int puls = 0;

unsigned long rpm = 0L;
unsigned long wielomtrek = 0L;
unsigned long afstand = 0L;
unsigned long maxafstand = 0L;

void setup() {

Serial.begin(9600);
lcd.begin(16, 2);
attachInterrupt(0, rpm_as, FALLING);
triggerTijd = millis() + MEASURE_TIME;
}

void loop() {

if (millis() > triggerTijd) {

rpm = puls * 60;
snelheid = ((WIEL_OMTREK * rpm * 60) / (1000000));
afstand = (WIEL_OMTREK * puls);
maxafstand= (afstand + maxafstand);


if (snelheid > maxsnelheid)
maxsnelheid = snelheid;
if (snelheid < maxsnelheid)
maxsnelheid = maxsnelheid;

Serial.print("Km/h: ");
Serial.println(snelheid);
Serial.print("Rpm: ");
Serial.println(rpm);

Serial.print("Snelste Km/h");
Serial.println(maxsnelheid);

puls = 0;
triggerTijd = millis() + MEASURE_TIME;
}
}

void rpm_as() {
  puls++;
}


Wat ik wel zie is dat de snelheid iedere keer toeneemt met een factor van 4, resp.: 10-14-18-21-25 krijg ik op mijn monitor te zien als ik de snelheid verhoog. Dus je kunt niet zien of je bv. 12km/u rijdt.
Ik weet niet of dit is wat je wil?

Ik doe het zo:

ipv puls++;

Code: Alles selecteren
{
  interval = millis()-tijdoud;
  tijdoud = millis();
  kmu=(1000/tijd)*((WIELOMTREK*60*60)/1000);;
 
}

Berichten: 16
Geregistreerd: 06 Apr 2014, 20:16

Re: Gokart snelheidsmeting

Berichtdoor fenrir » 12 Apr 2014, 09:23

ercmrj schreef:Ik heb je code ook ff getest omdat ik toevallig ook met zo'n project bezig ben en zo werkt ie bij mij wel ipv display gebruik ik de serieële monitor

Code: Alles selecteren
#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 7, 6, 5, 4);

#define MEASURE_TIME 1000
#define WIEL_OMTREK 1000

unsigned long triggerTijd;
unsigned long snelheid = 0;
unsigned long maxsnelheid = 0;
volatile unsigned int puls = 0;

unsigned long rpm = 0L;
unsigned long wielomtrek = 0L;
unsigned long afstand = 0L;
unsigned long maxafstand = 0L;

void setup() {

Serial.begin(9600);
lcd.begin(16, 2);
attachInterrupt(0, rpm_as, FALLING);
triggerTijd = millis() + MEASURE_TIME;
}

void loop() {

if (millis() > triggerTijd) {

rpm = puls * 60;
snelheid = ((WIEL_OMTREK * rpm * 60) / (1000000));
afstand = (WIEL_OMTREK * puls);
maxafstand= (afstand + maxafstand);


if (snelheid > maxsnelheid)
maxsnelheid = snelheid;
if (snelheid < maxsnelheid)
maxsnelheid = maxsnelheid;

Serial.print("Km/h: ");
Serial.println(snelheid);
Serial.print("Rpm: ");
Serial.println(rpm);

Serial.print("Snelste Km/h");
Serial.println(maxsnelheid);

puls = 0;
triggerTijd = millis() + MEASURE_TIME;
}
}

void rpm_as() {
  puls++;
}


Wat ik wel zie is dat de snelheid iedere keer toeneemt met een factor van 4, resp.: 10-14-18-21-25 krijg ik op mijn monitor te zien als ik de snelheid verhoog. Dus je kunt niet zien of je bv. 12km/u rijdt.
Ik weet niet of dit is wat je wil?

Ik doe het zo:

ipv puls++;

Code: Alles selecteren
{
  interval = millis()-tijdoud;
  tijdoud = millis();
  kmu=(1000/tijd)*((WIELOMTREK*60*60)/1000);;
 
}

bij mij zou het nauwkeurig moeten zijn tot op 1km/h
wat zou ik dan moeten veranderen aan de code ? als ik serial print vervang door lcd.print zou ik de monitor in principe moeten kunnen vervangen door een lcd ?

op welke manier heb je dit gestest ? ik beweeg mijn magneet voorbij mijn switch

Berichten: 139
Geregistreerd: 28 Jul 2013, 13:30

Re: Gokart snelheidsmeting

Berichtdoor ercmrj » 12 Apr 2014, 09:47

als ik serial print vervang door lcd.print zou ik de monitor in principe moeten kunnen vervangen door een lcd ?

Dat denk ik wel.

Ik zou eerst alles uitproberen met de serieële monitor en misschien ook ff een simpel programma maken om je lcd-scherm te testen als je dat nog niet gedaan hebt.

Daarna proberen het komplete programma te testen.

En kijk anders ff naar deze post: viewtopic.php?f=4&t=716

Daar probeer ik een soortgelijk programma in een attiny te laden, maar ik heb nogal wat verkeerd gedaan voordat het lukte, mede omdat ik niet goed wist hoe attachInterrupt werkte. Misschien kan je er iets van opsteken.

VorigeVolgende

Terug naar Gezamenlijke projecten

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 10 gasten