Acties:
  • 0 Henk 'm!

  • LogLeg
  • Registratie: Januari 2015
  • Laatst online: 09-09 10:24
Hallo mede-tweakers. Ik ben een tijdje geleden een projectje begonnen waarbij ik een arduino pro micro kloon wil aansluiten op 5 capacitive touch sensoren die ik zelf heb gemaakt. Ik heb een glazen bureau waar mijn PC op staat en ik wil graag de sensoren onder de glazen plaat plakken, zodat ik alleen het glas aan hoef te raken om een bepaalde knop te activeren. Het idee is dan dat de pro micro een toetsencombinatie naar mijn PC stuurt. 5 externe hotkeys als het ware. Als extraatje heb ik in elke toets ook een mat wit LEDje gemaakt, zodat de toetsen kunnen oplichten als ik erop druk bijvoorbeeld.

Hieronder wat foto's en een klein filmpje van hoe het tot nu toe werkt. Ik gebruik aluminiumfolie voor de touchpads en een papieren behuizing voor de LEDs, waar de aluminiumfolie op is geplakt.

Afbeeldingslocatie: http://i64.tinypic.com/mhyjxt.jpg

Afbeeldingslocatie: http://i63.tinypic.com/v3k8l5.jpg

Afbeeldingslocatie: http://i65.tinypic.com/2le4bp5.jpg


In het filmpje is te zien hoe ik 2 van de 5 knoppen al onder mijn desk heb geplakt en die ook indruk. Bij elke geregistreerde aanraking toggled er een LEDje. Ik heb het systeem hier tijdelijk draaien op een Arduino Uno en ik heb deze zo geprogrammeerd dat hij alle knoppen ontdenderd en dat hij vervolgens bij meerdere aanrakingen tegelijk alleen de knop toggled die het meeste wordt aangeraakt.

[YouTube: https://www.youtube.com/watch?v=AMPTw-TWkOE]

Zoals jullie kunnen zien ben ik al een aardig eind. Echter heb ik nog wel wat problemen en dat is de rede dat ik hier nu een post aanmaak.

Ik maak in mijn C++ programma op de Arduino gebruik van de CapacitiveSensor library en heb eigenlijk klakkeloos het voorbeeld wat ze bij die library geven overgenomen en geimplementeerd in mijn programma >:) . Nu is het volgende aan de hand. Ik moet doordat ik door glas capaciteitsverschillen moet meten, een flink gevoelige sensor hebben. Dat is gelukt, zoals te zien in het filmpje. Maar het programma werkt alleen in de eerste paar minuten van het runnen. Als ik de waardes uitlees die de CapacitiveSensor library mij geeft (aantal milliseconden tussen een uitgaande en binnenkomende puls van de Arduino) dan zijn die normaliter tussen de 90 en 150 en bij aanraking boven de 180. Over tijd stijgen de waardes langzaam naar 300. En of ik de knoppen dan aanraak of niet, de waarde past zich niet meer aan.

Hier een afbeelding van hoe één sensor is aangesloten. Alle andere sensoren zitten op dezelfde manier op andere poorten aangesloten. Als er verbeterpunten zijn hoor ik het graag, ik heb weinig ervaring met elektrotechniek.

Afbeeldingslocatie: http://i68.tinypic.com/2r7aa9u.png


Hebben jullie enig idee wat dit kan veroorzaken? Zou het kunnen dat de sensoren zich langzaam "opladen" en vervolgens onbruikbaar worden?

Acties:
  • 0 Henk 'm!

  • Tom-Z
  • Registratie: Augustus 2010
  • Laatst online: 11:20
Ik heb nog niet eerder met CapacitiveSensor gewerkt, maar wel met iets vergelijkbaars.

Kijkend naar de code van CapacitiveSensor zie ik dat hij de "baseline" (leastTotal) instelt op de laagst gemeten waarde ooit. Zou het kunnen zijn dat de gemeten waarde toeneemt, omdat de baseline zakt? De baseline kan in principe niet meer omhoog gaan (de baseline wordt alleen bijgesteld als de gemeten waarde veel kleiner is dan de baseline).

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
long CapacitiveSensor::capacitiveSensor(uint8_t samples)
{
    total = 0;

    for (uint8_t i = 0; i < samples; i++) {    // loop for samples parameter - simple lowpass filter
        if (SenseOneCycle() < 0)  return -2;   // variable over timeout
    }

    // only calibrate if time is greater than CS_AutocaL_Millis (NB dit is 20 000ms) and total is less than 10% of baseline
    // this is an attempt to keep from calibrating when the sensor is seeing a "touched" signal
    if ( (millis() - lastCal > CS_AutocaL_Millis) && abs(total  - leastTotal) < (int)(.10 * (float)leastTotal) ) {
        leastTotal = 0x0FFFFFFFL;          // reset for "autocalibrate"
        lastCal = millis();
    }

    // routine to subtract baseline (non-sensed capacitance) from sensor return
    if (total < leastTotal) leastTotal = total;                 // set floor value to subtract from sensed value
    return(total - leastTotal);
}


Zou het kunnen zijn dat het door deze auto-calibrate komt?

Alternatief is direct de waardes van de sensor uitlezen (met capacitiveSensorRaw) en vervolgens zelf logica voor de baseline schrijven. Wat ik zou doen is kijken of de touch getriggered is (waarde een bepaalde treshold groter dan baseline) en anders (als niet getriggered) en de gemeten waarde is groter dan baseline de baseline een beetje verhogen en anders de baseline een beetje verlagen. Hierdoor volgt de baseline de capaciteit als die van nature verandert (bijvoorbeeld door vochtigheid of wat dan ook).

Ik gebruik trouwens ADCTouch - die heeft maar 1 pin nodig en geen externe componenten!

[ Voor 13% gewijzigd door Tom-Z op 05-11-2016 23:35 ]


Acties:
  • 0 Henk 'm!

  • LogLeg
  • Registratie: Januari 2015
  • Laatst online: 09-09 10:24
Ahaa autocalibrate, ja die heb ik wel gebruikt volgens mij. (stond ook in het voorbeeld en heb me er niet heel erg in verdiept.

Ik heb nu niet heel veel tijd om dingen te gaan proberen i.v.m. toetsweek, maar dit ga ik binnenkort proberen, thanks!

Acties:
  • 0 Henk 'm!

  • LogLeg
  • Registratie: Januari 2015
  • Laatst online: 09-09 10:24
Ik heb laatst de code aangepast en maak nu gebruik van de auto-calibrate (ik had deze juist uit staan), nu werkt het best goed. Ik heb nu al enkele dagen het programma meerdere uren draaien en ik heb slechts één keer meegemaakt dat hij een valse aanraking registreerde.
Ik gebruik trouwens ADCTouch - die heeft maar 1 pin nodig en geen externe componenten!
Ik heb er niet heel veel naar gekeken, maar kan je met die library wel een gevoelige sensor maken? Zoals in mijn geval, ik moet door een glaslaag van +/- 5 tot 7 millimeter een aanraking registreren. Is dat wel mogelijk met de interne componenten van een Arduino?

Acties:
  • 0 Henk 'm!

  • Boudemaniak
  • Registratie: Februari 2003
  • Laatst online: 18-06-2023
LogLeg schreef op dinsdag 22 november 2016 @ 22:05:
Ik heb er niet heel veel naar gekeken, maar kan je met die library wel een gevoelige sensor maken? Zoals in mijn geval, ik moet door een glaslaag van +/- 5 tot 7 millimeter een aanraking registreren. Is dat wel mogelijk met de interne componenten van een Arduino?
Ik weet niet precies hoe goed een Arduino is, maar uit ervaring weet ik dat 5 tot 7 mm erg hoog is. Zo te zien heb je de knoppen geïmplementeerd as "self-capacitance" knoppen. Met 7mm glas als diëlectricum zal je toegevoegde capaciteit erg klein zijn.

Bij mijn projecten (touchscreens, mutual capacitance) ligt de grens bij 4mm wat nog aanvaardbaar is. Wat je misschien kan doen is een versterker en een hogere spanning gebruiken. Je meet namelijk letterlijk gewoon capaciteit.

...


Acties:
  • 0 Henk 'm!

  • LED-Maniak
  • Registratie: Oktober 2003
  • Nu online
Ik weet niet hoe die arduino lib werkt maar wellicht heb je wat aan mijn ervaring. Ik heb touch knoppen werkend op een afstand van ~4 tot 5 centimeter in de lucht.

- Baseline pas je elke x meetcycles met 1 tick omhoog aan. Zakt hij er onder dan middel je de baseline met de meetwaarde(dan corrigeert hij snel).
- Gebruik de input capture pin om zoveel mogelijk ticks te krijgen(dus pin hoog/laag ipv ADC waarde)
- Middel 50/100/200 metingen met een IIR filter.
- Gebruik de twee pinnen: een met een weerstand naar de probe en een ander als input pin. Dan meet je zowel het opladen als ontladen van de condensator en is je signaal stabieler.

Mitsubishi externe temperatuur sensor (Home Assistant compatible): V&A - ClimaControl - Ook voor Panasonic & LG.

Pagina: 1