Consigli Arduino Fio V3

Salve a tutti,

Ho già un Arduino Fio e adesso vorrei comprare un Fio V3 (quello rosso). Qualcuno l'ha mai usato? Ci sono problemi per l'utilizzo con l'IDE di Arduino? Il Fio e il Fio V3 montano due microcontrollori diversi quello del V3 dovrebbe essere uguale a quello dell'Arduino Micro, solo che va a 8MHz e ha una tensione di lavoro di 3.3v

Grazie anticipatamente.

Si tratta di usare la giusta board per programmarlo, e semmai non ci fosse la puoi sempre creare tu. Prendilo pure, se hai problemi siamo qui ;)

Io dovrei usare il Fio V3 con la touch shield della sparkfun —> https://www.sparkfun.com/products/10508
Con il Fio l’ho provata e funziona, ma ieri l’ho provata anche con un Arduino micro e non funziona affatto.

Vi posto il codice che ho usato che ho trovato su google

/* 
 Touch Sense Shield Example using the MPR121 touch sensor IC 
 
 SparkFun Electronics
 created on: February 25, 2013
 license: Beerware. Feel free to use, reuse, modify and do
 anything with this code. If you find it useful, you can buy me a
 beer next time we meet!
 
 This is a simple example sketch to show of the functionality of
 the MPR121 capacitive touch sensor. Pressing a pad will print the
 corresponding number onto the Serial Monitor at 9600 bps.
 
 Hardware: Any Arduino.
*/

// MPR121 Register Defines
#define MHD_R	0x2B
#define NHD_R	0x2C
#define	NCL_R 	0x2D
#define	FDL_R	0x2E
#define	MHD_F	0x2F
#define	NHD_F	0x30
#define	NCL_F	0x31
#define	FDL_F	0x32
#define	ELE0_T	0x41
#define	ELE0_R	0x42
#define	ELE1_T	0x43
#define	ELE1_R	0x44
#define	ELE2_T	0x45
#define	ELE2_R	0x46
#define	ELE3_T	0x47
#define	ELE3_R	0x48
#define	ELE4_T	0x49
#define	ELE4_R	0x4A
#define	ELE5_T	0x4B
#define	ELE5_R	0x4C
#define	ELE6_T	0x4D
#define	ELE6_R	0x4E
#define	ELE7_T	0x4F
#define	ELE7_R	0x50
#define	ELE8_T	0x51
#define	ELE8_R	0x52
#define	ELE9_T	0x53
#define	ELE9_R	0x54
#define	ELE10_T	0x55
#define	ELE10_R	0x56
#define	ELE11_T	0x57
#define	ELE11_R	0x58
#define	FIL_CFG	0x5D
#define	ELE_CFG	0x5E
#define GPIO_CTRL0	0x73
#define	GPIO_CTRL1	0x74
#define GPIO_DATA	0x75
#define	GPIO_DIR	0x76
#define	GPIO_EN		0x77
#define	GPIO_SET	0x78
#define	GPIO_CLEAR	0x79
#define	GPIO_TOGGLE	0x7A
#define	ATO_CFG0	0x7B
#define	ATO_CFGU	0x7D
#define	ATO_CFGL	0x7E
#define	ATO_CFGT	0x7F


// Global Constants
#define TOU_THRESH	0x0F
#define	REL_THRESH	0x0A

#include <Wire.h>

const byte MPR121_ADDRESS = 0x5A;

// Match key inputs with electrode numbers
// The defined numbers match up to key labels on the touch shield
#define ELE1 8
#define ELE2 5
#define ELE3 2
#define ELE4 7
#define ELE5 4
#define ELE6 1
#define ELE7 6
#define ELE8 3
#define ELE9 0

//extras (not connected to buttons on the shield)
#define ELE9 9
#define ELE10 10
#define ELE11 11

//interupt pin
const byte irqPin = 2;  // D2

void setup()
{
  //make sure the interrupt pin is an input and pulled high
  pinMode(irqPin, INPUT);
  digitalWrite(irqPin, HIGH);
  
  Serial.begin(9600); //configure serial out
  
  Wire.begin(); // initalize I2C bus
  
  mpr121QuickConfig(); // initialize mpr121
  
  Serial.println("MPR121 Initialized. Press buttons!");
}

void loop()
{
  if (!digitalRead(irqPin))
  {
    getNumber();
  }
}

void getNumber()
{
  int touchNumber = 0;
  uint16_t touchstatus;
  char digits;
  
  touchstatus = getTouchStatus();
  
  for (int j=0; j<12; j++)  // Check how many electrodes were pressed
  {
    if ((touchstatus & (1<<j)))
      touchNumber++;
  }
  
  if (touchNumber == 1)
  {
    if (touchstatus & (1<<ELE7))
    {
      digits = '7';
    }
    else if (touchstatus & (1<<ELE4))
    {
      digits = '4';
    }
    else if (touchstatus & (1<<ELE1))
    {
      digits = '1';
    }
    else if (touchstatus & (1<<ELE8))
    {
      digits = '8';
    }
    else if (touchstatus & (1<<ELE5))
    {
      digits = '5';
    }
    else if (touchstatus & (1<<ELE2))
    {
      digits = '2';
    }
    else if (touchstatus & (1<<ELE9))
    {
      digits = '9';
    }
    else if (touchstatus & (1<<ELE6))
    {
      digits = '6';
    }
    else if (touchstatus & (1<<ELE3))
    {
      digits = '3';
    }
    Serial.println(digits);
  }
  //do nothing if more than one button is pressed, or if all are released
  else if (touchNumber == 0)
    ;
  else
    ;
}

/* getTouchStatus() will return a 16-bit value that relates the
current touched status of each button. The LSB represents electrodes
0-7 (bit 0 = electrode 0), and the lowest 4 bits of the MSB
represent electrods 8-11. A 1 means a button is being touched.*/
unsigned int getTouchStatus()
{
  Wire.beginTransmission(MPR121_ADDRESS); // Transmit I2C address
  Wire.write(0x00);  // Write register address of touch status byte
  Wire.endTransmission(false);  // Transmit bytes, and send restart message
  
  Wire.requestFrom(MPR121_ADDRESS, (byte) 2);
  byte lsb = Wire.read();
  byte msb = Wire.read();
  unsigned int touch = ((msb << 8) | lsb);
  
  return touch;
}

/* mpr121Read(byte) will read a byte from the register at location
address. */
byte mpr121Read(byte address)
{
  Wire.beginTransmission(MPR121_ADDRESS); // Transmit I2C address
  Wire.write(address);  // Write register address
  Wire.endTransmission(false);  // Transmit bytes, and send restart message
  
  Wire.requestFrom(MPR121_ADDRESS, (byte) 1);
  byte value = Wire.read();
  
  return value;
}

/* mpr121Write(byte, byte) will write a byte (data) to a register
(at address). */
void mpr121Write(byte address, byte data)
{
  Wire.beginTransmission(MPR121_ADDRESS);
  Wire.write(address);
  Wire.write(data);
  Wire.endTransmission();
}

void mpr121QuickConfig(void)
{
  // Section A
  // This group controls filtering when data is > baseline.
  mpr121Write(MHD_R, 0x01);
  mpr121Write(NHD_R, 0x01);
  mpr121Write(NCL_R, 0x00);
  mpr121Write(FDL_R, 0x00);

  // Section B
  // This group controls filtering when data is < baseline.
  mpr121Write(MHD_F, 0x01);
  mpr121Write(NHD_F, 0x01);
  mpr121Write(NCL_F, 0xFF);
  mpr121Write(FDL_F, 0x02);
  
  // Section C
  // This group sets touch and release thresholds for each electrode
  mpr121Write(ELE0_T, TOU_THRESH);
  mpr121Write(ELE0_R, REL_THRESH);
  mpr121Write(ELE1_T, TOU_THRESH);
  mpr121Write(ELE1_R, REL_THRESH);
  mpr121Write(ELE2_T, TOU_THRESH);
  mpr121Write(ELE2_R, REL_THRESH);
  mpr121Write(ELE3_T, TOU_THRESH);
  mpr121Write(ELE3_R, REL_THRESH);
  mpr121Write(ELE4_T, TOU_THRESH);
  mpr121Write(ELE4_R, REL_THRESH);
  mpr121Write(ELE5_T, TOU_THRESH);
  mpr121Write(ELE5_R, REL_THRESH);
  mpr121Write(ELE6_T, TOU_THRESH);
  mpr121Write(ELE6_R, REL_THRESH);
  mpr121Write(ELE7_T, TOU_THRESH);
  mpr121Write(ELE7_R, REL_THRESH);
  mpr121Write(ELE8_T, TOU_THRESH);
  mpr121Write(ELE8_R, REL_THRESH);
  mpr121Write(ELE9_T, TOU_THRESH);
  mpr121Write(ELE9_R, REL_THRESH);
  mpr121Write(ELE10_T, TOU_THRESH);
  mpr121Write(ELE10_R, REL_THRESH);
  mpr121Write(ELE11_T, TOU_THRESH);
  mpr121Write(ELE11_R, REL_THRESH);
  
  // Section D
  // Set the Filter Configuration
  // Set ESI2
  mpr121Write(FIL_CFG, 0x04);
  
  // Section E
  // Electrode Configuration
  // Enable 6 Electrodes and set to run mode
  // Set ELE_CFG to 0x00 to return to standby mode
  mpr121Write(ELE_CFG, 0x0C);	// Enables all 12 Electrodes
  //mpr121Write(ELE_CFG, 0x06);		// Enable first 6 electrodes
  
  // Section F
  // Enable Auto Config and auto Reconfig
  /*mpr121Write(ATO_CFG0, 0x0B);
  mpr121Write(ATO_CFGU, 0xC9);	// USL = (Vdd-0.7)/vdd*256 = 0xC9 @3.3V   mpr121Write(ATO_CFGL, 0x82);	// LSL = 0.65*USL = 0x82 @3.3V
  mpr121Write(ATO_CFGT, 0xB5);*/	// Target = 0.9*USL = 0xB5 @3.3V
}

Aggiungo anche che ho provato a lasciare il setup così:

void setup()
{
  Serial.begin(9600);
  
  Serial.println("Prova seriale");
}

e il loop vuoto, senza codici e poi ho fatto il contrario, setup vuoto e loop con il codice per la seriale.

Il risultato è che con l’arduino micro se uso Serial.println nel setup non mi esce niente nel monitor seriale e funziona solo se lo metto nel loop.

Questa cosa è normale? Con tutte le altre board funziona tutto a meraviglia. Ho usato la touch shield con Arduino Uno e Fio senza problemi, ma se devo comprare il Fio V3, con lo stesso microcontrollore del Micro, avrò problemi?

Aggiungo un’altra cosa…

Ho provato ad utilizzare l’esempio al link in basso nella pagina del prodotto che vi ho scritto nel precedente post, ma addirittura l’Arduino Micro smette di funzionare e non viene più riconosciuto dal computer e devo ricaricare il bootloader con l’Arduino Uno. Secondo voi è normale questo problema?

La gestione della seriale della micro e di tutte le altre schede che non necessitano di chip USB/seriale ha un funzionamento diverso rispetto alle board tipo la uno.
Leggiti la pagina di presentazione della Leonardo.
Con poche modifiche ti funzionerà tutto

Testato: La gestione della seriale della micro e di tutte le altre schede che non necessitano di chip USB/seriale ha un funzionamento diverso rispetto alle board tipo la uno.

Grazie, ho risolto il problema della seriale.

Per quanto riguarda la touch shield il non funzionamento è dovuto alla diversità dei microcontrollori. La scheda è disegnata per lavorare con Arduino Uno e utilizza, oltre ai pin per l'alimentazione, i pin D2, A5 e A4. Il D2 è un pin di iterrupt, ma gli altri due non so a cosa servono. Guardando lo schema dell'Arduino Uno si vede che A4 e A5 corrispondono rispettivamente a SDA e SCL (non so cosa significano) che nel Micro si trovano a D2 e D3. Quindi, facendo questo cambiamento e impostando il pin di interrupt su D5, nel mio caso, tutto funziona correttamente.

Qualcuno mi può spiegare cosa sono SDA e SCL?

Sono i due pin dove si assesta il bus i2c, infatti il tuo touch è i2c ,SDA è la linea dati, scl è il clock bravo ha i risolto tutto :)

Testato: Sono i due pin dove si assesta il bus i2c, infatti il tuo touch è i2c ,SDA è la linea dati, scl è il clock bravo ha i risolto tutto :)

Grazie! Adesso sono pronto per comprare il Fio V3

Ne stavo per prenderne uno anche io, dove lo compri ? Tempi di consegna ?

Lo prendo da qui ---> http://www.robot-italy.com/it/fio-v3-atmega32u4.html

Se non lo sai, spediscono da Roma con Bartolini. Io sono della provincia di Lecce e mi è sempre arrivato tutto nel giro di 24h

A 60.000 lire, spese escluse, almeno dovrebbero metterci la batteria :)

Testato: A 60.000 lire, spese escluse, almeno dovrebbero metterci la batteria :)

Tu hai trovato qualcosa di meglio?

Le soluzioni sono due, una non la dico, l altra è farsi da se la scheda, con il 32u4 è proibitivo, ma cambiando processore si può fare.

Ma i microcontrollori del Micro e del Fio V3 sono proprio identici? O c'è quanche piccola differenza?

Sugli schemi http://arduino.cc/en/uploads/Main/arduino-micro-schematic.pdf http://dlnmh9ip6v2uc.cloudfront.net/datasheets/Dev/Arduino/Boards/Fio-v30.pdf

uno viene chiamato ATMEGA32U4-XUMU e l'altro semplicemente ATMEGA32U4

Adesso che ho capito come collegare la touch shield al Micro volevo collegare anche l'mp3 shield ---> https://www.sparkfun.com/products/10628 Questa scheda utilizza il pin D2 che è occupato dalla touch shield, così l'ho cambiato con un pin libero modificando la riga corrispondente a MP3_DREQ e impostando il pin D4. Questa è la sezione della libreria dove si modificano i pin:

// if SEEDUINO use the following pin outs
#if ( SEEEDUINO == 1 )
  #define MP3_XCS             A3 //Control Chip Select Pin (for accessing SPI Control/Status registers)
  #define MP3_XDCS            A2 //Data Chip Select / BSYNC Pin
  #define MP3_DREQ            A1 //Data Request Pin: Player asks for more data
  //#define MP3_DREQINT        0 // There is no IRQ used on Seeduino
  #define MP3_RESET           A0 //Reset is active low
  #define SD_SEL              10 //select pin for SD card
#else // otherwise use pinout of typical Sparkfun MP3 Player Shield.
  #define MP3_XCS              6 //Control Chip Select Pin (for accessing SPI Control/Status registers)
  #define MP3_XDCS             7 //Data Chip Select / BSYNC Pin
  #define MP3_DREQ             2 //Data Request Pin: Player asks for more data
  #if defined(__AVR_ATmega32U4__)
    #define MP3_DREQINT          1 //Corresponding INTx for DREQ pin
  #else // swapped between Uno and Leonardo.
    #define MP3_DREQINT          0 //Corresponding INTx for DREQ pin
  #endif
  #define MP3_RESET            8 //Reset is active low
  #if ( GRAVITECH == 1 )
    #define SD_SEL               4 //select pin for SD card
  #else
    #define SD_SEL               9 //select pin for SD card
  #endif // GRAVITECH
#endif // none SEEEDUINO

Provando a modificare il pin MP3_DREQ sull'Arduino Uno va tutto bene ma con il Micro non funziona. Se con l'Arduino Micro imposto MP3_DREQ su 3 e MP3_DREQINT su 0 in #if defined(AVR_ATmega32U4) torna tutto alla normalità.

Mi potete dire come devo impostare MP3_DREQINT se uso il pin D4 per MP3_DREQ in particolare? E più in geberale come faccio a capire come impostare MP3_DREQINT?

Grazie in anticipo.

Ho scoperto in questa pagina http://arduino.cc/en/Reference/AttachInterrupt che il Leonardo e, di conseguenza, anche il Micro ha il pin D7 corrispondente a int4

Quindi cambiando il codice di prima in questo modo e collegando opportunamente i pin, tutto funziona di nuovo :)

// if SEEDUINO use the following pin outs
#if ( SEEEDUINO == 1 )
  #define MP3_XCS             A3 //Control Chip Select Pin (for accessing SPI Control/Status registers)
  #define MP3_XDCS            A2 //Data Chip Select / BSYNC Pin
  #define MP3_DREQ            A1 //Data Request Pin: Player asks for more data
  //#define MP3_DREQINT        0 // There is no IRQ used on Seeduino
  #define MP3_RESET           A0 //Reset is active low
  #define SD_SEL              10 //select pin for SD card
#else // otherwise use pinout of typical Sparkfun MP3 Player Shield.
  #define MP3_XCS              6 //Control Chip Select Pin (for accessing SPI Control/Status registers)
  #define MP3_XDCS             5 //Data Chip Select / BSYNC Pin
  #define MP3_DREQ             7 //Data Request Pin: Player asks for more data
  #if defined(__AVR_ATmega32U4__)
    #define MP3_DREQINT          4 //Corresponding INTx for DREQ pin
  #else // swapped between Uno and Leonardo.
    #define MP3_DREQINT          0 //Corresponding INTx for DREQ pin
  #endif
  #define MP3_RESET            8 //Reset is active low
  #if ( GRAVITECH == 1 )
    #define SD_SEL               4 //select pin for SD card
  #else
    #define SD_SEL               9 //select pin for SD card
  #endif // GRAVITECH
#endif // none SEEEDUINO

Un'altra cosa... Io sapevo che la tensione minima di alimentazione dell'Arduino Micro è 6v, però adesso ho provato a collegarlo ad una lipo da 3.7v e funziona! Non si comporta in modo strano, sembra stabile, solo che la tensione di lavoro scende a 3.1v

Funziona perche il micro digerisce anche tensioni inferiori, ma non vi è stabilizzazione sulla tensione, se ad esempio vuoi usare un ingresso analogico i valori rilevati saranno sbagliati, e man mano che si scarica la batteria si alterano. Inoltre si alterano i livelli di riconoscimento 1 0. Quindi se comunichi con altri componenti potresti avere problemi.

Testato: Funziona perche il micro digerisce anche tensioni inferiori, ma non vi è stabilizzazione sulla tensione, se ad esempio vuoi usare un ingresso analogico i valori rilevati saranno sbagliati, e man mano che si scarica la batteria si alterano. Inoltre si alterano i livelli di riconoscimento 1 0. Quindi se comunichi con altri componenti potresti avere problemi.

Grazie... Immaginavo. La mia era giusto una curiosità.

Mi è arrivato il Fio V3, lo installato, ho caricato qualche programma di prova ed è andato tutto bene. Dopo aver caricato un programma un po' più complesso, la scheda non era più riconosciuta =( Così ho provato a ricaricare il bootloader seguendo questa guida: http://arduino.cc/en/Tutorial/ArduinoISP che con l'Arduino Micro aveva funzionato, ma quando seleziono il Fio V3 dall'elenco delle schede e clicco su "scrivi il bootloader" dopo qualche secondo mi esce questo messaggio di errore:

 ***failed;  avrdude.exe: verification error, first mismatch at byte
0x0000              0xfe != 0xceavrdude.exe: verification error; 
content mismatch

se provo a caricare il bootloader dell'Arduino Micro sul Fio V3 non mi esce nessun errore e l'operazione va a buon fine (ovviamente il Fio comunque non viene riconosciuto perchè è caricato il bootloader sbagliato)

Cos'è che non va? Qui ci sono le informazioni sulla scheda ---> https://www.sparkfun.com/products/11520

UPDATE: Ho appena provato con il vecchio bootloader che ho preso da qui ---> https://www.sparkfun.com/products/11017 e funziona. Mi spiegate perchè il vecchio funziona e il nuovo no e come fare per caricarlo?

Ho anche scoperto che Il Fio V3 da spento, con la batteria collegata, consuma 2.3mA A cosa è dovuto?

Sta cosa che carichi bootloader a titolo di sblocco micro non ha senso. Il bootloader via IDE non può essere corrotto ed in genere quando non ti risponde la scheda è per problemi alle USB (una volta fallito il riconoscimento per riprovare si deve riavviare il PC) oppure problemi di sprint su seriale, se carichi un sw che a palla spara stampe sulla seriale può succedere. È buona norma mettere un delay di un paio di secondi prima di far partire stampe continue.
Sul resto non riesco a risponderti via cellulare, sono in vacanza, è un casino guardare schemi etc.