Tastiera analogica con 7 tasti

Salve a tutti
ho pubblicato il mio primo articolo sul mio sito personale contenente le istruzioni passo passo per realizzare una tastiera analogica con 7 pulsanti (4 di movimento nelle relativa 4 direzioni + ok) + altri due pulsanti. Tale tastiera deve essere connessa utilizzando un solo ingresso analogico mediante una rete resistiva. L’obiettivo è quello di avere uno strumento general purpose per realizzare progetti che richiedono il settaggio di valori e scelte a partire da un menu gerarcho da visualizzare mediante un display.


Questo è l’indirizzo in attesa di postare tutto l’articolo sul sito ufficiale. Ecco l’indirizzo: http://www.acorrias.it/?Arduino:Tastiera_analogica

In un altro articolo spiego come realizzare connettori M-M a basso costo. Indirizzo: http://www.acorrias.it/?Arduino:Connettori_M-M_per_breadboard

Resto in attesa di suggerimenti da parte di chi voglia contribuire a migliorare questi argomenti e diffonderli nella rete.

saluti
Alessandro

ottimo lavoro

qualcuno si offre volontario per linkarlo dalla pagina italiana del playground? :)

m

Proprio bello! Non hai a disposizione un po' di codice, anche provvisorio? Mi interesserebbe capire come fai a leggere i valori, visto che non sono mai uguali al variare leggero del voltaggio o della temperatura... Sono davvero interessato! Fede

Ottimo! Ho linkato il progetto nella sezione "Progetti dal forum italiano" nel Plyground Italiano http://www.arduino.cc/playground/Italiano/HomePage.

Se acorrias è disposto a fornire uno stralcio di skatch, inseriamo anche quello. ;)

Ciao a tutti

Certo che sono disposto a fornire lo sketch: ho fatto solamente un mesh up del lavoro di altri e magari può essere utile a tutti. Per ora l’organizzazione di questo lavoro è molto primitiva, ma conto di raffinare l’articolo, realizzare la versione bilingue e postare i link alle versioni pdf e lo zip con il codice.

Per rispondere a Federico: i valori sono espressi in range (minimo massimo) quindi se anche ci fossero variazioni il tasto viene letto comunque. Ho fatto prove di lettura e le variazioni (con USB presumo stabile) erano di +1 e -1 (nel range da 0 a 1023). Non ho ancora fatto prove con un alimentazione differente e nemmeno con un una pila 9V.
la librereia implementa una classe button che richiede 3 parametri: il tasto il min e il max, ed opzionalmente il numero di secondi per cui per cui pil tasto si assume sia tenuto premuto (di default 1 sec, ma tu puoi specificare diversamente).

Riguardo la richiesta dello sketch eccolo. Potete notare che nel commento iniziale ci sono anche le istruzioni di come fare la rete resistiva (confesso di averle lette successivamente): anziche in serie sono in parallelo, ma è comunque la stessa cosa.

Riguardo la rete resistiva ho giocato parecchio con uno strumento splendido ed utile per tutti quelli che si avvicinano al mondo dell’elettronica e vogliono simulare circuiti analogici e digitali: il sito di Circuit Simulator Applet contiene un applet jave che segnalo e che si può scaricare anche localmente. Si possono disegnare circuiti anche complessi ed effettuare simulazioni. Io per esempio ho scoperto i valori delle mie 7 resistenze in modo da produrre tensioni equamente distribuite nei valori tra 0 e 5V.

Chi fosse interessato:

  1. scarichi l’applet sul pc (oppure lo usi online)
  2. feffettui il copy del circuito (in basso)
  3. dal menu File selezioni l’item Import
  4. incolli il testo copiato
  5. giochi con la rete resistiva ed i pulsanti
  6. andate in out (nello schema) e con tasto destro selezionate View in scope: in questo modo si può leggere il valore di tensione che produce la pressione degli switch.
    Ecco il circuito (copiare dal $ a -1):
    $ 1 5.0E-6 10.20027730826997 50 5.0 50
    r 304 112 304 160 0 220.0
    w 304 112 240 112 0
    w 304 160 240 160 0
    w 240 208 304 208 0
    w 240 256 304 256 0
    w 240 304 304 304 0
    w 240 352 304 352 0
    w 240 400 304 400 0
    r 304 160 304 208 0 330.0
    r 304 208 304 256 0 560.0
    r 304 256 304 304 0 820.0
    r 304 304 304 352 0 1200.0
    r 304 352 304 400 0 3300.0
    s 192 400 240 400 0 1 true
    s 192 352 240 352 0 1 true
    s 192 304 240 304 0 1 true
    s 192 256 240 256 0 1 true
    s 192 208 240 208 0 1 true
    s 192 160 240 160 0 1 true
    s 192 112 240 112 0 1 true
    w 192 160 192 112 0
    w 192 160 192 208 0
    w 192 208 192 256 0
    w 192 256 192 304 0
    w 192 304 192 352 0
    w 192 352 192 400 0
    w 304 80 304 112 0
    g 192 400 192 432 0
    R 352 48 352 16 0 0 40.0 5.0 0.0 0.0 0.5
    w 304 112 336 112 0
    w 336 112 336 224 0
    w 336 224 432 224 0
    O 432 224 464 224 0
    r 304 80 352 48 0 1200.0
    o 32 64 0 34 5.0 9.765625E-5 0 -1

Mi scuso con tutti ma poichè ritengo utile questo argomento posterò un nuovo topic tra qualche ora solo su questo : spero che vi sia utile, vista la presenza di tantissimi appassionati che non hanno profonde conoscenze dell’elettronica e vogliono capire nel dettaglio i circuiti che si realizzano.

Lo sketch è basato sulla libreria AnalogButton creata da Neil DUdman, trovata nel playground e su un esempio di lcd driving (forse Hello word).

salve a tutti

/*
  AnalogButtons,
  
  created 02 Jan 2009 V 0.1
 
 Connect more than one button to a single analog pin, 
 register a call-back function.which gets called when a button
 is pressed or held down for the defined number of seconds. Includes
 software key debouncing which may need to be adjusted, the the second 
 argument to AnalogButtons class. Define the ANALOG_PIN in the constructor
 of AnalogButtons.
 
 The circuit:

 * 5 buttons, 1 side of all buttons connected together to +5V. 
   The other side of each button is connected via a different value
   resister (tested with) 1k, 2k5, 5k8, 10k, 18k to one side of a
   100k resister which is in turn connected to GND. At the point
   where all the different resisters are joined you make a connection
   to your analog input. Basicly a different voltage divider is setup 
   depending upon which button is pressed. You have to configure the 
   Buttons Hi/Low values, see the comments in example code below and the
   AnalogButtons::configure(ANALOG_PIN) function.
   
   More or less than 5 buttons could be added, just pick different values
   of the resister sot hat all buttons have different values which arn't too
   close in size.
   
   I'm not sure what happens when Arduino is powered from batteries and Power V
   drops below V5.
 
 by Neil DUdman and everyone who's ever used Arduino
 
 */
#include "AnalogButtons.h"

#define ANALOG_PIN 4
// include the library code:
#include <LiquidCrystal.h>

// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);


// A call back function that you pass into the constructor of AnalogButtons, see example
// below. Alternitivly you could extend the Button class and re-define the methods pressed() 
// or held() which are called 
void handleButtons(int id, boolean held)
{  
lcd.clear();

  if (held) {
    lcd.print(id);lcd.print(" ^-^");
   // Serial.print("button id="); Serial.print(id); Serial.println(" was pressed and held"); 
  } else{
    lcd.print(id);lcd.print(" ^");
    //Serial.print("button id="); Serial.print(id); Serial.println(" was pressed only");
  }
}

AnalogButtons analogButtons(ANALOG_PIN, 30, &handleButtons);
Button b1 = Button(1, 0,5);
Button b2 = Button(2, 129, 130);
Button b3 = Button(3, 272, 273);
Button b4 = Button(4, 574, 575);
// Default hold duration is 1 second, lets make it 5 seconds for button5
Button b5 = Button(5, 433, 434, 5);
Button b6 = Button(6, 835, 838);
Button b7 = Button(7, 710, 714);

void setup() 
{
  Serial.begin(9600); 
  Serial.println("Testing your Analog buttons");
  // set up the LCD's number of rows and columns: 
  lcd.begin(16, 2);
  analogButtons.addButton(b1);
  analogButtons.addButton(b2);
  analogButtons.addButton(b3);
  analogButtons.addButton(b4);
  analogButtons.addButton(b5);  
  analogButtons.addButton(b6);  
  analogButtons.addButton(b7);  
 }
 
void loop() 
{  
  // To check values when button are pressed
  analogButtons.checkButtons();
  
  // To configure the MAX/Min values for each 
  // Button, uncomment this line, make sure you've called Serial.begin(9600); 
  // Then in turn hold town each botton, noting the max/min values
  //AnalogButtons::configure(ANALOG_PIN); //delay(1000);
}