Meting met licht sensor

Arduino specifieke Software
Berichten: 19
Geregistreerd: 11 Nov 2016, 19:08
Woonplaats: 's Gravenmoer

Re: Meting met licht sensor

Berichtdoor jansterenborg » 12 Nov 2016, 19:45

Eerste meetresultaten met pulseIn() niet eens met de beste sensor!
100 millseconden wit veld werd aangeboden
http://devrijecultureleruimte.nl/Meting.html

Afbeelding

Advertisement

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

Re: Meting met licht sensor

Berichtdoor Koepel » 12 Nov 2016, 20:44

Dan is het nu tijd om je Velleman eens aan te sluiten op de lichtsensor. Om te kijken of die ook op 108 ms komt. Misschien is die 8% afwijking door de sensor en niet door PulseIn() of door de mechanische constructie.

Ik heb helaas geen pulse generator, dus ik kan niet testen hoe nauwkeurig de pulseIn() is.

De Arduino libraries worden steeds verbeterd en soms wijzigt er iets. Dus oude informatie is soms achterhaald. Dat de pulseIn() niet naar de timeout zou kijken als de pulse bezig is, dat is volgens mij niet waar.
De timeout loopt gewoon door terwijl de pulse bezig is:
https://github.com/arduino/Arduino/blob/master/hardware/arduino/avr/cores/arduino/wiring_pulse.c
https://github.com/arduino/Arduino/blob/master/hardware/arduino/avr/cores/arduino/wiring_pulse.S

Als de pulseIn() teveel variatie geeft, dan kun je volgens mij de interrupts uitschakelen.
Code: Alles selecteren
...
noInterrupts();
pulseIn(...);
interrupts();
...

Als je gewoon pulseIn() gebruikt, terwijl de interrupts door gaan, dan zou de Seriele poort van invloed kunnen zijn. Dus je kunt ook een delay toevoegen, zodat de berichten naar de seriële poort helemaal verstuurd zijn. Reken op ongeveer 1ms per karakter bij 9600 baud.
Code: Alles selecteren
Serial.println("Hello");
delay( 10);    // wait until "Hello" is transmitted
pulseIn(...);

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

Re: Meting met licht sensor

Berichtdoor shooter » 12 Nov 2016, 23:09

8% afwijking is eigenlijk prima hoor, zal mechanisch zijn, want een relais heeft ook wel 10 ms nodig om dicht te gaan.
ik sta te kijken van de precisie die is met 100 us heel erg klein.
pulsein is een locking code, ofwel de code stopt er tot de puls binnen is.
wat mij opvalt is dat de tijd steeds korter wordt, dus temperatuur en smering zal ook invloed hebben.
paul deelen
shooter@home.nl

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

Re: Meting met licht sensor

Berichtdoor Koepel » 13 Nov 2016, 00:02

Test met twee Arduino Uno boards, Arduino.cc IDE 1.6.12 en een logic analyzer.
Ik heb bewust wat random aangebracht.

Puls gever Uno:
Code: Alles selecteren
void setup()
{
  pinMode( 8, OUTPUT);
}

void loop()
{
  int rnd = random( 90, 110);
 
  digitalWrite( 8, HIGH);
  delay( rnd);
  digitalWrite( 8, LOW);
 
  delay( 10000);    // 10 seconds delay
}


Puls ontvanger Uno:
Code: Alles selecteren
void setup()
{
  Serial.begin( 9600);
  Serial.println( "Started");

  pinMode( 8, INPUT);
}

void loop()
{
//  noInterrupts();
  unsigned long t = pulseIn( 8, HIGH, 11000000UL);    // 11 seconds timeout
//  interrupts();

  Serial.println( t);
  delay( 50);           // wait until serial has finished
}


Met de delay van 50ms, maar interrupts enabled:
logic analyzer = 103.1, pulseIn = 102.420
logic analyzer = 102.1, pulseIn = 101.426
logic analyzer = 106.1, pulseIn = 105401
logic analyzer = 90.494, pulseIn = 91.05

Met de delay van 50ms, maar nu ook noInterrupts() tijdens pulseIn():
logic analyzer = 96.06, pulseIn = 96.047
logic analyzer = 103.1, pulseIn = 103.047
logic analyzer = 108.1, pulseIn = 108.045
logic analyzer = 95.06, pulseIn = 95.055

Dat is een duidelijk verschil. Als de interrupts gewoon door gaan, dan is er minder dan 1% afwijking. En met de interrupts uitgezet is het heel precies (ik weet nog niet hoe ik de logic analyzer meer decimalen achter de komma kan laten zien :( dus ik weet niet hoe precies de getallen gelijk zijn).

In jouw project weet je zelf wanneer je de lens open zet, dus kun je de timeout beperkt houden. Als je de interrupts uit zet, en de timeout beperkt tot 20 or 50ms, dan blijven de gevolgen voor de rest van de sketch nog redelijk beperkt (hoop ik).

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

Re: Meting met licht sensor

Berichtdoor Koepel » 13 Nov 2016, 06:08

Het wordt pas echt interessant rond de 1ms.
Dit is de wijziging in de puls gever sketch:
Code: Alles selecteren
  int rnd = random( 900, 1100);
 
  digitalWrite( 8, HIGH);
  delayMicroseconds( rnd);
  digitalWrite( 8, LOW);


Mijn logic analyzer sampled op 24 MHz.

Met de delay van 50ms, maar interrupts enabled:
logic analyzer = 981.5, pulseIn = 976
logic analyzer = 1021, pulseIn = 1015
logic analyzer = 1093, pulseIn = 1088
logic analyzer = 1148, pulseIn = 1143

Met de delay van 50ms, maar nu ook noInterrupts() tijdens pulseIn():
logic analyzer = 1017, pulseIn = 1017
logic analyzer = 1144, pulseIn = 1145
logic analyzer = 972.3, pulseIn = 972
logic analyzer = 976.4, pulseIn = 977

Dit valt me reuze mee, ik had meer onnauwkeurigheid verwacht. Als de interrupts door gaan, kan het 0.5% afwijken (maar misschien heb ik geluk gehad). Met de interrupts uit gezet, is het weer heel precies hetzelfde.
Thumbs up for pulseIn().

Berichten: 19
Geregistreerd: 11 Nov 2016, 19:08
Woonplaats: 's Gravenmoer

Re: Meting met licht sensor

Berichtdoor jansterenborg » 13 Nov 2016, 16:01

Hallo Shooter,
dank voor je reactie
ik gebruik een SSR relais up en down time 100 microseconds
http://www.crydom.com/en/products/catalog/1_dc.pdf
het is een Solid State Relay Crydom D1D20
die schakelt op de puls en heeft mi. geen mechanische onderdelen.

Berichten: 19
Geregistreerd: 11 Nov 2016, 19:08
Woonplaats: 's Gravenmoer

Re: Meting met licht sensor

Berichtdoor jansterenborg » 13 Nov 2016, 16:07

Hallo Koepel
dank voor je reacties en metingen!
als ik het goed begrijp is het goed de interrupt uit te zetten voor de aanroep van pulseIn() scheelt toch weer een paar milliseconden
de timeout had ik gezet op 1 seconden (default waarde) maar die zal ik eens wat oprekken, in mijn aanbiedingen zit er 2 seconden tussen
zodra ik de snellere transistor heb geef ik weer nieuwe meetgegevens door.

Berichten: 19
Geregistreerd: 11 Nov 2016, 19:08
Woonplaats: 's Gravenmoer

Re: Meting met licht sensor

Berichtdoor jansterenborg » 13 Nov 2016, 16:13

sketch gebruikt voor de meting met pulseIn()
ook worden de gegevens weggeschreven naar een SD kaart
misschien toch een pauze inlassen

/******************************************
PURPOSE: Tutorial on using the Catalex MicroSD card adapter with the Arduino Uno
Created by Rudy Schlaf for www.makecourse.com
Inspired by: "SD card datalogger" by Tom Igoe which is suppied as 'Example' with the Arduino IDE
DATE: 5/2014
*******************************************/
/*
This sketch shows how to use a Catalex MicroSD card adapter for datalogging
using the Arduino standard SD.h library.
The circuit:
* 1k (or higher) potentiometer as 'data input device': swiper connected to analog pin 0, other two pins: connect to 5V and GND

* Catalex MicroSD card adapter attached to SPI bus as follows:
** MOSI - pin 11
** MISO - pin 12
** SCK - pin 13
** CS - pin 10
** GND - GND
** Vcc - 5V

*/

#include <SD.h> //this includes the SD card libary that comes with the Arduino
#define chipSelect 10//we are using pin#10 as chip select pin for the SD card

int k = 0;
int state = 1;
long int tijdUp = 0;
long int tijdDo = 0;
long int tijd = 0;
int pin = 7;

unsigned long duration;


int photocellPin = 0; // the cell and 10K pulldown are connected to a0
int photocellReading; // the analog reading from the sensor divider


void setup()
{
Serial.begin(9600); //start setial port at 9600 baud
Serial.print("Initializing SD card...");

pinMode(chipSelect, OUTPUT); //set chip select PIN as output. If you use another pin, apparently #10 needs to be an


if (!SD.begin(chipSelect)) { // see if the card is present and can be initialized:
Serial.println("Card failed, or not present");
delay(4000);
return; //exit the setup function. This quits the setup() and the program counter jumps to the loop().
}
Serial.println("card initialized."); //otherwise, tell us that the card was successfully initialized.

if (SD.exists("datalog.txt")) //if the datalog.txt file is already on the disk
{
SD.remove("datalog.txt"); //delete it. This prevents that the data is appended to an already existing file.
}

pinMode(pin, INPUT);
digitalWrite(pin, LOW);
}

void loop() {

duration = pulseIn(pin, HIGH,500);
if (duration != 0) {
Serial.println(duration); // toegevoegd
File dataFile = SD.open("datalog.txt", FILE_WRITE);
dataFile.println(duration);
dataFile.close();
}
}

Berichten: 19
Geregistreerd: 11 Nov 2016, 19:08
Woonplaats: 's Gravenmoer

Re: Meting met licht sensor

Berichtdoor jansterenborg » 14 Nov 2016, 01:21

Zie ineens een raar statement in vorige post

duration = pulseIn(pin, HIGH,500);

die 500 is onzin dus ga de metingen opnieuw doen met

duration = pulseIn(pin, HIGH);

en dan een tweede meting met de interrupts uit

Berichten: 19
Geregistreerd: 11 Nov 2016, 19:08
Woonplaats: 's Gravenmoer

Re: Meting met licht sensor

Berichtdoor jansterenborg » 14 Nov 2016, 14:05

Hallo Koepel
hierbij de tweede meting met interrupt off and on en andere sensor
Afbeelding
http://devrijecultureleruimte.nl/Meting.html

sensor is: Lichtsensor ALS-PT19 analoog - Adafruit 2748
krijg nog een snellere dan derde meting
dank!

void loop() {
noInterrupts();
duration = pulseIn(pin, HIGH); // default timeout is 1 second
interrupts();
if (duration != 0) {
Serial.println(duration); // toegevoegd
delay(500); // halve seconde wachten

}
}

VorigeVolgende

Terug naar Arduino software

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 105 gasten