Graphene

Da raspibo.
Jump to navigation Jump to search

Grafene

Al non-corso del 12 aprile 2016, Elia e Matteo ci hanno portato alcuni campioni di film plastico ricoperto in vari modi di grafene. Per chi lo conosce rimando direttamente alla pagina wikipedia sul grafene.

E' un materiale molto interessante con molte applicazioni possibili, è un materiale giovane di cui si stanno ancora studiando le applicazioni.

Ci sono varie tecnologie per la produzione e l'uso, quello che abbiamo provato è solubile in acqua e può essere "spalmato" su nastri di materiale plastico per produrre imballaggi oppure usato nelle normali stampanti a getto d'inchiostro (o macchine da stampa professionali) per produrre applicazioni personalizzate.

Caratteristiche elettriche

I fogli che abbiamo testato hanno una resistenza non trascurabile nell'ordine dei kilo ohm perciò non è facile usare un foglio stampato per produrre circuiti elettrici, sembrano più interessanti applicazioni di questo materiale per la produzione di sensori.

Non è possibile usare direttamente questo materiale a contatto con la pelle perchè, essendo solubile in acqua, dopo qualche manipolazione il materiale verrebbe rimoso dal film.

Bisogna pensare ad usi che non richiedano il contatto diretto con la pelle e l'umidità in generale.

Sensori tattili

Trattandosi di materiale conduttivo posato su una grande superficie una delle possibili applicazioni è rappresentata dai sensori tattili.

Questi pulsanti non hanno parti in movimento, ma sfruttano la varianzione di capacità quando vengono toccati da un dito, richiedono un dispositivo sempre attivo a misurare queste variazioni per funzionare e sono gli antenati dei moderni touchscreen.

Una libreria già pronta per Arduino fa al caso nostro: CapacitiveSensor , sulla pagina c'è anche una figura che ne illustra il principio di funzionamento.

Tipi di pellicola

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

Per questo test utilizzo 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).

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
}

void loop() {
  // put your main code here, to run repeatedly:
  Serial.println(touchRead(23));
  delay(100);
}

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/

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.

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);
}

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.

#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);        

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(20);      //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>5000) {                                   //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.println("");
    delay(100);                             
}

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:

#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(20);     //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 > 5000) {                                 //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.println("");



  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);


  delay(100);
}