|
|
Riga 23: |
Riga 23: |
| La conduttività del materiale aumenta in base alla quantità di grafene deposto sul materiale, questo modifica anche l'opacità del materiale, ne consegue che più il materiale è scuro e più conduce, ma applicazioni che richiedono molta trasparenza ne risentono. | | La conduttività del materiale aumenta in base alla quantità di grafene deposto sul materiale, questo modifica anche l'opacità del materiale, ne consegue che più il materiale è scuro e più conduce, ma applicazioni che richiedono molta trasparenza ne risentono. |
| | | |
− | = Test touch sensor = | + | == Progetti == |
− | Per questo test utilizzo [https://www.pjrc.com/teensy/ Teensy] versione 3.1, questa versione ha la possibilità di gestire ingressi touch (non ho trovato molto a riguardo, ma qui c'è qualche informazione in più https://blog.adafruit.com/2012/10/19/teensy-3-0-software-update/ sezione Touch Sensing), purtoppo funziona solo con la pellicola più scura, ma va poi valutato meglio se ci siano altre possibilità.
| |
| | | |
− | Il codice di seguito permette di visualizzare i valori letti e attivando la funzione Serial Plotter dell'IDE di Arduino (presente nelle ultime versioni).
| + | *[[Graphene/TTP223_touch_detector]] |
− | | + | *[[Graphene/Test_touch_sensor]] |
− | <source lang=c>
| + | *[[Graphene/Mediaplayer_controller]] |
− | void setup() {
| + | *[[Graphene/Semplice touchpad]] |
− | // put your setup code here, to run once:
| + | *[[Graphene/Piano_touch]] |
− | Serial.begin(9600);
| + | *[[Grapene/Fine_corsa_resistivo]] |
− | }
| |
− | | |
− | void loop() {
| |
− | // put your main code here, to run repeatedly:
| |
− | Serial.println(touchRead(23));
| |
− | delay(100);
| |
− | }
| |
− | </source>
| |
− | | |
− | Mi sembra di capire che non sia possibile settare la sensibilità perciò l'uso è limitato alla sola pellicola più conduttiva.
| |
− | | |
− | La realizzazione è molto semplice perchè basta collegare un pin di Teensy alla pellicola, magari usando una graffetta.
| |
− | | |
− | https://blog.adafruit.com/2012/10/19/teensy-3-0-software-update/
| |
− | <gallery caption="Teensy touchread">
| |
− | File:Graph01.png|touchRead con teensy (serial Plot)
| |
− | File:IMG 20160417 172438.jpg|touchRead con teensy
| |
− | File:IMG_20160417_192503.jpg|Test con led RGB e due pulsanti
| |
− | </gallery>
| |
− | | |
− | Un programma un pò più completo per dimostare con un led RGB che le pellicole possono essere usate come pulsanti per aumentare o diminuire un valore.
| |
− | | |
− | <source lang=c>
| |
− | int val;
| |
− | long calc;
| |
− | long tasto_piu;
| |
− | long tasto_meno;
| |
− | const int ledPin_r=21;
| |
− | const int ledPin_g=5;
| |
− | const int ledPin_b=6;
| |
− | const long soglia_tasto_piu=2400;
| |
− | const long soglia_tasto_meno=2400;
| |
− | const int inc=20;
| |
− | | |
− | void setup() {
| |
− | Serial.begin(9600);
| |
− | }
| |
− | | |
− | void loop() {
| |
− | tasto_piu=touchRead(22);
| |
− | Serial.print(val);
| |
− | Serial.print("\t");
| |
− | Serial.print(tasto_piu);
| |
− | Serial.print("\t");
| |
− | tasto_meno=touchRead(23);
| |
− | Serial.println(tasto_meno);
| |
− | if (tasto_piu>soglia_tasto_piu && val<=3072) {
| |
− | val=val+inc;
| |
− | }
| |
− | if (tasto_meno>soglia_tasto_meno && val>=0) {
| |
− | val=val-inc;
| |
− | }
| |
− | if (val>2048) {
| |
− | analogWrite(ledPin_g, val-2048);
| |
− | } else {
| |
− | analogWrite(ledPin_g, 0);
| |
− | }
| |
− | if (val>1024) {
| |
− | analogWrite(ledPin_b, val-1024);
| |
− | } else {
| |
− | analogWrite(ledPin_b, 0);
| |
− | }
| |
− | analogWrite(ledPin_r, val);
| |
− | delay(50);
| |
− | }
| |
− | </source>
| |
− | | |
− | = Media player controller =
| |
− | Altra applicazione sempre mediante l'uso di Teensy che può essere visto oltre che come terminale seriale anche come dispositivo HID e quindi simulare mouse, tastiera e joystick.
| |
− | | |
− | In questo caso il test sfrutta la libreia capsense di Arduino che ha il vantaggio di poter essere calibrata settando alcuni valori.
| |
− | | |
− | <source lang=c>
| |
− | #include <CapacitiveSensor.h>
| |
− |
| |
− | /*
| |
− | Simple example of interaction between Teens 3.1 and graphene film used as capacitive touch sensor
| |
− | set uotput as serial+keyboard+mouse+joystick
| |
− | Based on CapacitiveSensor library: http://playground.arduino.cc/Main/CapacitiveSensor
| |
− | Set the correct number of samples to measure time
| |
− | */ | |
− |
| |
− |
| |
− | CapacitiveSensor Play_Pause = CapacitiveSensor(20, 15);
| |
− | CapacitiveSensor Inc_Volume = CapacitiveSensor(20, 16);
| |
− | CapacitiveSensor Dec_Volume = CapacitiveSensor(20, 17);
| |
− |
| |
− | int val;
| |
− | long calc;
| |
− | long tasto_piu;
| |
− | long tasto_meno;
| |
− | const int ledPin_r = 21;
| |
− | const int ledPin_g = 5;
| |
− | const int ledPin_b = 6;
| |
− | const long soglia_tasto_piu = 1800;
| |
− | const long soglia_tasto_meno = 1800;
| |
− | const int inc = 100;
| |
− |
| |
− |
| |
− | void setup()
| |
− | {
| |
− | Serial.begin(9600);
| |
− | }
| |
− |
| |
− | void loop()
| |
− | {
| |
− | long start = millis();
| |
− | long time1 = Play_Pause.capacitiveSensor(250); //Tune with correct values
| |
− | long time2 = Inc_Volume.capacitiveSensor(100); //Tune with correct values
| |
− | long time3 = Dec_Volume.capacitiveSensor(250); //Tune with correct values
| |
− |
| |
− | Serial.print((millis() - start) / 10);
| |
− | Serial.print("\t");
| |
− | Serial.print(time1);
| |
− | Serial.print("\t");
| |
− | Serial.print(time2);
| |
− | Serial.print("\t");
| |
− | Serial.print(time3);
| |
− | Serial.print("\t");
| |
− | if (time1 > 3000) { //Change to detect best values
| |
− | Serial.print("p1");
| |
− | Keyboard.set_media(KEY_MEDIA_VOLUME_DEC);
| |
− | Keyboard.send_now();
| |
− | Keyboard.set_media(0);
| |
− | Keyboard.send_now();
| |
− | }
| |
− | Serial.print("\t");
| |
− | if (time2 > 11000) { //Change to detect best values
| |
− | Serial.print("p2");
| |
− | Keyboard.set_media(KEY_MEDIA_PLAY_PAUSE);
| |
− | Keyboard.send_now();
| |
− | Keyboard.set_media(0);
| |
− | Keyboard.send_now();
| |
− | }
| |
− | Serial.print("\t");
| |
− | if (time3 > 5000) { //Change to detect best values
| |
− | Serial.print("p3");
| |
− | Keyboard.set_media(KEY_MEDIA_VOLUME_INC);
| |
− | Keyboard.send_now();
| |
− | Keyboard.set_media(0);
| |
− | Keyboard.send_now();
| |
− | }
| |
− | Serial.print("\t");
| |
− |
| |
− | tasto_piu = touchRead(22);
| |
− | tasto_meno = touchRead(23);
| |
− | | |
− | if (tasto_piu > soglia_tasto_piu && val <= 3072) {
| |
− | val = val + inc;
| |
− | //Serial.print("tasto +");
| |
− | }
| |
− | Serial.print("\t");
| |
− | if (tasto_meno > soglia_tasto_meno && val >= 0) {
| |
− | val = val - inc;
| |
− | //Serial.print("tasto -");
| |
− | }
| |
− | Serial.print("\t");
| |
− | if (val > 2048) {
| |
− | analogWrite(ledPin_g, val - 2048);
| |
− | } else {
| |
− | analogWrite(ledPin_g, 0);
| |
− | }
| |
− | if (val > 1024) {
| |
− | analogWrite(ledPin_b, val - 1024);
| |
− | } else {
| |
− | analogWrite(ledPin_b, 0);
| |
− | }
| |
− | analogWrite(ledPin_r, val);
| |
− | Serial.print(val);
| |
− | Serial.print("\t");
| |
− | Serial.print(tasto_piu);
| |
− | Serial.print("\t");
| |
− | Serial.print(tasto_meno);
| |
− | Serial.println("");
| |
− | delay(100);
| |
− | }
| |
− | </source>
| |
− | | |
− | Con questo esempio possiamo controllare un media player come Vlc pilotando i tasti play e pause con un sensore ed alzando ed abbassando il volume con altri due sensori.
| |
− | | |
− | Per questa applicazione può essere usata anche la pellicola più trasparente variando i valori in capacitiveSensor() e settando oppurtunamente i tempi.
| |
− | | |
− | = Codice per entrambi gli esperimenti =
| |
− | Questo semplicemente il codice che comprende entrambi gli esperimenti precedenti con qualche aggiustamento:
| |
− | | |
− | <source lang=c>
| |
− | #include <CapacitiveSensor.h>
| |
− | | |
− | /*
| |
− | Simple example of interaction between Teens 3.1 and graphene film used as capacitive touch sensor
| |
− | set uotput as serial+keyboard+mouse+joystick
| |
− | Based on CapacitiveSensor library: http://playground.arduino.cc/Main/CapacitiveSensor
| |
− | Set the correct number of samples to measure time
| |
− | */ | |
− | | |
− | | |
− | CapacitiveSensor Play_Pause = CapacitiveSensor(20, 15);
| |
− | CapacitiveSensor Inc_Volume = CapacitiveSensor(20, 16);
| |
− | CapacitiveSensor Dec_Volume = CapacitiveSensor(20, 17);
| |
− | | |
− | int val;
| |
− | long calc;
| |
− | long tasto_piu;
| |
− | long tasto_meno;
| |
− | const int ledPin_r = 21;
| |
− | const int ledPin_g = 5;
| |
− | const int ledPin_b = 6;
| |
− | const long soglia_tasto_piu = 2400;
| |
− | const long soglia_tasto_meno = 2400;
| |
− | const int inc = 100;
| |
− | | |
− | | |
− | void setup()
| |
− | {
| |
− | Serial.begin(9600);
| |
− | }
| |
− | | |
− | void loop()
| |
− | {
| |
− | long start = millis();
| |
− | long time1 = Play_Pause.capacitiveSensor(250); //Tune with correct values
| |
− | long time2 = Inc_Volume.capacitiveSensor(100); //Tune with correct values
| |
− | long time3 = Dec_Volume.capacitiveSensor(250); //Tune with correct values
| |
− | | |
− | Serial.print((millis() - start) / 10);
| |
− | Serial.print("\t");
| |
− | Serial.print(time1);
| |
− | Serial.print("\t");
| |
− | Serial.print(time2);
| |
− | Serial.print("\t");
| |
− | Serial.print(time3);
| |
− | Serial.print("\t");
| |
− | if (time1 > 3000) { //Change to detect best values
| |
− | Serial.print("p1");
| |
− | Keyboard.set_media(KEY_MEDIA_VOLUME_DEC);
| |
− | Keyboard.send_now();
| |
− | Keyboard.set_media(0);
| |
− | Keyboard.send_now();
| |
− | }
| |
− | Serial.print("\t");
| |
− | if (time2 > 11000) { //Change to detect best values
| |
− | Serial.print("p2");
| |
− | Keyboard.set_media(KEY_MEDIA_PLAY_PAUSE);
| |
− | Keyboard.send_now();
| |
− | Keyboard.set_media(0);
| |
− | Keyboard.send_now();
| |
− | }
| |
− | Serial.print("\t");
| |
− | if (time3 > 3000) { //Change to detect best values
| |
− | Serial.print("p3");
| |
− | Keyboard.set_media(KEY_MEDIA_VOLUME_INC);
| |
− | Keyboard.send_now();
| |
− | Keyboard.set_media(0);
| |
− | Keyboard.send_now();
| |
− | }
| |
− | Serial.print("\t");
| |
− | | |
− | tasto_piu = touchRead(22);
| |
− | //Serial.print(val);
| |
− | //Serial.print("\t");
| |
− | //Serial.print(tasto_piu);
| |
− | //Serial.print("\t");
| |
− | tasto_meno = touchRead(23);
| |
− | //Serial.println(tasto_meno);
| |
− | if (tasto_piu > soglia_tasto_piu && val <= 3072) {
| |
− | val = val + inc;
| |
− | }
| |
− | if (tasto_meno > soglia_tasto_meno && val >= 0) {
| |
− | val = val - inc;
| |
− | }
| |
− | if (val > 2048) {
| |
− | analogWrite(ledPin_g, val - 2048);
| |
− | } else {
| |
− | analogWrite(ledPin_g, 0);
| |
− | }
| |
− | if (val > 1024) {
| |
− | analogWrite(ledPin_b, val - 1024);
| |
− | } else {
| |
− | analogWrite(ledPin_b, 0);
| |
− | }
| |
− | analogWrite(ledPin_r, val);
| |
− | Serial.println("");
| |
− | delay(100);
| |
− | }
| |
− | </source>
| |
− | = Un semplice.... touchpad =
| |
− | Semplice perchè il principio di funzionamento è abbastanza intuitivo. Per costruirlo ci vuole un pò di impegno.
| |
− | | |
− | Lo schema è semplice e si vede [http://www.microchip.com/_images/flexlayer_large.jpg su questa immagine di Microchip] o in alternativa [https://it.wikipedia.org/wiki/Schermo_resistivo su wikipedia]
| |
− | | |
− | Per la gestione si può usare la libreria di Adafruit che usa due pin analogici.
| |
− | https://github.com/adafruit/Touch-Screen-Library
| |
− | | |
− | <gallery caption="Touchpad">
| |
− | File:Touchpad msystem.jpg|Test di touchpad con cornice rigida
| |
− | </gallery>
| |
− | | |
− | = Pianoforte touch =
| |
− | | |
− | <gallery caption="Capsense Piano">
| |
− | File:CapsensePiano board.jpg|Capsense piano, microduino, connettore e cavo flat
| |
− | </gallery>
| |
− | | |
− | Il codice del progetto lo abbiamo preso già pronto sul sito instructables è un progetto di Tyler Crumpton and Nicholas Jones ([http://www.instructables.com/id/Capacitive-Touch-Arduino-Keyboard-Piano/]) , abbiamo semplicemente adattato la parte dei sensori di ingresso utilizzando pellicola in grafene e stampando un foglio con i tasti disegnati.
| |
− | | |
− | Per l'hardware abbiamo utilizzato una board microduino a cui abbiamo saldato le 8 resistenze per le note mettendo un pin comune sul pin D2 che il microcontrollore usa per la carica.
| |
− | Abbiamo utilizzato un buzzer piezo come attuatore audio.
| |
− | | |
− | La connessione con il foglio in grafene avviene tramite cavo flat e connettore per floppy disk che è in grado di aggrappare un foglio incastrato al suo interno aveno contatti a pressione.
| |
− | | |
− | | |
− | File capsense_piano.c
| |
− | | |
− | <source lang=c>
| |
− | /*
| |
− | Capacitive-Touch Arduino Keyboard Piano
| |
− |
| |
− | Plays piano tones through a buzzer when the user taps touch-sensitive piano "keys"
| |
− |
| |
− | Created 18 May 2013
| |
− | Modified 23 May 2013
| |
− | by Tyler Crumpton and Nicholas Jones
| |
− |
| |
− | This code is released to the public domain. For information about the circuit,
| |
− | visit the Instructable tutorial at http://www.instructables.com/id/Capacitive-Touch-Arduino-Keyboard-Piano/
| |
− | */
| |
− | | |
− | #include <CapacitiveSensor.h>
| |
− | #include "pitches.h"
| |
− | | |
− | #define COMMON_PIN 2 // The common 'send' pin for all keys
| |
− | #define BUZZER_PIN A4 // The output pin for the piezo buzzer
| |
− | #define NUM_OF_SAMPLES 10 // Higher number whens more delay but more consistent readings
| |
− | #define CAP_THRESHOLD 60 // Capactive reading that triggers a note (adjust to fit your needs)
| |
− | #define NUM_OF_KEYS 8 // Number of keys that are on the keyboard
| |
− | | |
− | // This macro creates a capacitance "key" sensor object for each key on the piano keyboard:
| |
− | #define CS(Y) CapacitiveSensor(2, Y)
| |
− | | |
− | // Each key corresponds to a note, which are defined here. Uncomment the scale that you want to use:
| |
− | int notes[]={NOTE_C4,NOTE_D4,NOTE_E4,NOTE_F4,NOTE_G4,NOTE_A4,NOTE_B4,NOTE_C5}; // C-Major scale // E' possibile cambiare la scala decommentando queste righe.
| |
− | //int notes[]={NOTE_A4,NOTE_B4,NOTE_C5,NOTE_D5,NOTE_E5,NOTE_F5,NOTE_G5,NOTE_A5}; // A-Minor scale
| |
− | //int notes[]={NOTE_C4,NOTE_DS4,NOTE_F4,NOTE_FS4,NOTE_G4,NOTE_AS4,NOTE_C5,NOTE_DS5}; // C Blues scale
| |
− | | |
− | // Defines the pins that the keys are connected to:
| |
− | CapacitiveSensor keys[] = {CS(3), CS(4), CS(5), CS(6), CS(7), CS(8), CS(9), CS(10)};
| |
− | | |
− | void setup() {
| |
− | // Turn off autocalibrate on all channels:
| |
− | for(int i=0; i<8; ++i) {
| |
− | keys[i].set_CS_AutocaL_Millis(0xFFFFFFFF);
| |
− | }
| |
− | // Set the buzzer as an output:
| |
− | pinMode(BUZZER_PIN, OUTPUT);
| |
− | }
| |
− | | |
− | void loop() {
| |
− | // Loop through each key:
| |
− | for (int i = 0; i < 8; ++i) {
| |
− | // If the capacitance reading is greater than the threshold, play a note:
| |
− | if(keys[i].capacitiveSensor(NUM_OF_SAMPLES) > CAP_THRESHOLD) {
| |
− | tone(BUZZER_PIN, notes[i],20); // Plays the note corresponding to the key pressed // L'ultimo parametro è la durata della nota, aggiunto al codice originale altrimenti le note continuano a suonare
| |
− | }
| |
− | }
| |
− | }
| |
− | </source>
| |
− | | |
− | File pitches.s, questo file indica la frequenza a cui va suonata ogni nota e va agguinto al progetto salvandolo nella cartella dello sketch capsense_piano
| |
− | | |
− | <source lang=c>
| |
− | // This file contains a list of 8 octaves worth of pitches
| |
− | // that correspond to notes on the piano.
| |
− | #define NOTE_B0 31
| |
− | #define NOTE_C1 33
| |
− | #define NOTE_CS1 35
| |
− | #define NOTE_D1 37
| |
− | #define NOTE_DS1 39
| |
− | #define NOTE_E1 41
| |
− | #define NOTE_F1 44
| |
− | #define NOTE_FS1 46
| |
− | #define NOTE_G1 49
| |
− | #define NOTE_GS1 52
| |
− | #define NOTE_A1 55
| |
− | #define NOTE_AS1 58
| |
− | #define NOTE_B1 62
| |
− | #define NOTE_C2 65
| |
− | #define NOTE_CS2 69
| |
− | #define NOTE_D2 73
| |
− | #define NOTE_DS2 78
| |
− | #define NOTE_E2 82
| |
− | #define NOTE_F2 87
| |
− | #define NOTE_FS2 93
| |
− | #define NOTE_G2 98
| |
− | #define NOTE_GS2 104
| |
− | #define NOTE_A2 110
| |
− | #define NOTE_AS2 117
| |
− | #define NOTE_B2 123
| |
− | #define NOTE_C3 131
| |
− | #define NOTE_CS3 139
| |
− | #define NOTE_D3 147
| |
− | #define NOTE_DS3 156
| |
− | #define NOTE_E3 165
| |
− | #define NOTE_F3 175
| |
− | #define NOTE_FS3 185
| |
− | #define NOTE_G3 196
| |
− | #define NOTE_GS3 208
| |
− | #define NOTE_A3 220
| |
− | #define NOTE_AS3 233
| |
− | #define NOTE_B3 247
| |
− | #define NOTE_C4 262
| |
− | #define NOTE_CS4 277
| |
− | #define NOTE_D4 294
| |
− | #define NOTE_DS4 311
| |
− | #define NOTE_E4 330
| |
− | #define NOTE_F4 349
| |
− | #define NOTE_FS4 370
| |
− | #define NOTE_G4 392
| |
− | #define NOTE_GS4 415
| |
− | #define NOTE_A4 440
| |
− | #define NOTE_AS4 466
| |
− | #define NOTE_B4 494
| |
− | #define NOTE_C5 523
| |
− | #define NOTE_CS5 554
| |
− | #define NOTE_D5 587
| |
− | #define NOTE_DS5 622
| |
− | #define NOTE_E5 659
| |
− | #define NOTE_F5 698
| |
− | #define NOTE_FS5 740
| |
− | #define NOTE_G5 784
| |
− | #define NOTE_GS5 831
| |
− | #define NOTE_A5 880
| |
− | #define NOTE_AS5 932
| |
− | #define NOTE_B5 988
| |
− | #define NOTE_C6 1047
| |
− | #define NOTE_CS6 1109
| |
− | #define NOTE_D6 1175
| |
− | #define NOTE_DS6 1245
| |
− | #define NOTE_E6 1319
| |
− | #define NOTE_F6 1397
| |
− | #define NOTE_FS6 1480
| |
− | #define NOTE_G6 1568
| |
− | #define NOTE_GS6 1661
| |
− | #define NOTE_A6 1760
| |
− | #define NOTE_AS6 1865
| |
− | #define NOTE_B6 1976
| |
− | #define NOTE_C7 2093
| |
− | #define NOTE_CS7 2217
| |
− | #define NOTE_D7 2349
| |
− | #define NOTE_DS7 2489
| |
− | #define NOTE_E7 2637
| |
− | #define NOTE_F7 2794
| |
− | #define NOTE_FS7 2960
| |
− | #define NOTE_G7 3136
| |
− | #define NOTE_GS7 3322
| |
− | #define NOTE_A7 3520
| |
− | #define NOTE_AS7 3729
| |
− | #define NOTE_B7 3951
| |
− | #define NOTE_C8 4186
| |
− | #define NOTE_CS8 4435
| |
− | #define NOTE_D8 4699
| |
− | #define NOTE_DS8 4978
| |
− | </source>
| |