ARDUINO
New shield per
controller nunchuck

ultimo aggiornamento 20 aprile 2013


JLCPCB - 2$ per prototipi di PCB, di qualsiasi colore. Produzione in 24 ore!
L'Azienda di prototipi PCB più popolare, con oltre 700.000 clienti in tutto il mondo!
Recati presso la JLCPCB, riceverai regali e coupon gratuiti
presso Maker Faire Rome il 18-20 ottobre


Quello presentato in questa pagina è una nuova versione di uno shield d'interfaccia, che sostituisce quello precedentemente costruito utilizzando una basetta mille fori.

Old shield New shield

è estremamente semplice limitandosi ad alcuni connettori, oltre al collegamento di un controller Nunchuck permette il collegamento di un Joystick analogico.
L'alimentazione del controller Nunchuck che richiede 3V3 viene prelevato direttamente dalla scheda Arduino.

 
Elenco componenti

JP1-2

PIN strip maschio 1x6

JP3

PIN strip maschio 1x8

S VERT; S HORZ

PIN strip femmina 1x3

JOYSTICK

PIN strip maschio 1x5

WIICHUCK

PIN strip femmina 1x4

 

OurPCB, your most reliable PCB and PCBA supplier.

Focusing on PCB Prototype and PCB Assembly Turnkey Services.

One-Stop Wire Harness & Cable Assemblies Solution

Il filmato mostra il test di un dispositivo Pan & Tilt
azionato dal controller Nunchuck

 

Utilizzo dello shield per pilotare un dispositivo Pan & Tilt con un Joystick

Utilizzo dello shield per pilotare un dispositivo Pan & Tilt con un controller Nunchuck

Dettaglio connettore

Codice DEV-09281

WiiChuck Adapter, codice DEV-09281
Descrizione: L'adattatore WiiChuck è un piccolo circuito stampato che è progettato per essere inserito nel connettore di un Nintendo Wii Nunchuck per fornire l'accesso a tutti i 4 fili del telecomando: alimentazione e i due fili del Nunchuck su un pin headr con passo 2,5mm

Foto della schedina per l'adattatore (Fonte SparkFun)

Fasi di montaggio del connettore

 

Costruzione della scheda

La costruzione inizierà dalla realizzazione del circuito stampato si scaricare il PDF che riporta la traccia in scala 1:1. Per la sua realizzazione si utilizzerà una basetta in vetronite (monofaccia) di dimensioni 35x53mm circa, il metodo potrà essere quello della fotoincisione o del trasferimento termico utilizzando i cosiddetti fogli blu (PRESS-N-PELL).  

Fasi di montaggio dello Shield per Nunchuk/Joystick

Una volta inciso il rame, si verificherà in controluce o mediante l’utilizzo di un multimetro, che non vi siano cortocircuiti soprattutto tra le piste più vicine. Si passerà quindi alla foratura della stessa, utilizzando principalmente una punta da 0,8-1 mm.  Quindi si posizioneranno e salderanno i connettori e i due ponticelli seguendo lo schema riportato sotto.  Per la saldatura si utilizzerà un piccolo saldatore a punta fine, della potenza di circa 25 – 30 W.

 

Foto delle fasi di montaggio della scheda

Alcuni dettagli dello Shield per Nunchuk

Programma di gestione

     

 

Il programma qui presentato permette di azionare un dispositivo Pan & Tilt che può essere auto costruito seguendo le indicazioni riportate in questa pagina

/*
Programma:new_Comando_telecamera_Nunchuk.ino
 Versione: 1.0
 Comando dispositivo Pan & Tilt tramite Nunchuk
 
 Porte utilizzate
 Pin +5V         -> Alimentazione servo
 Pin +3V3        -> Alimentazione Nunchuk
 Pin GND         -> Alimentazione
 Porta D5 servo Rotazione telecamera
 Porta D6 servo Rotazione base
 Porta A4 SDA porta P18
 Porta A5 SCK porta P19
 
 Lettura dei valeurI min e max
 Joystick X: mini=26 maxi=219 ==> a riposo  = 123
 Joystick Y: mini=31 maxi=229 ==> a riposo = 129
 Bottone C=1 a riposo C=0 premuto
 Bottone Z=1 a riposo Z=0 premuto
 
 Creato il 27/06/2012
 da Adriano Gandolfo <https://www.adrirobot.it>
 This example code is in the public domain.
 */
 
#include <Wire.h>
#include <string.h>
#include <stdio.h>

uint8_t outbuf[6];

int cnt = 0;
int ledPin = 13;

int servoPin2 = 5; // Pin servo Rotazione telecamera
int servoPin  = 6; // Pin servo Rotazione base

int pulseWidth = 0;
int pulseWidth2 = 0;

long lastPulse = 0;
long lastPulse2 = 0;

int z_button = 0;
int c_button = 0;

int refreshTime = 20;

int minPulse   = 200; //
int minPulse2  = 200;
int zeroPulse  = 400; // Azzeramento posizione servo Rotazione bas
int zeroPulse2 = 350; // Azzeramento posizione Rotazione telecamera


int dtime=10;

#define pwbuffsize 10
long pwbuff[pwbuffsize];
long pwbuffpos = 0;
long pwbuff2[pwbuffsize];
long pwbuffpos2 = 0;

void setup()
{
  Serial.begin (9600);
  Wire.begin ();
  nunchuck_init ();
  pinMode(servoPin, OUTPUT);
  pinMode(servoPin2, OUTPUT);

  pulseWidth = minPulse;
  pulseWidth2 = minPulse2;
  Serial.print ("Impostazione terminata");
}

void nunchuck_init()
{
  Wire.beginTransmission (0x52);
  Wire.write (0x40);
  Wire.write (0x00);  
  Wire.endTransmission ();
}

void send_zero()
{
  Wire.beginTransmission (0x52);
  Wire.write (0x00);
  Wire.endTransmission ();
}

int t = 0;

void loop()
{
  t++;
  long last = millis();

  if( t == 1) {

    t = 0;

    Wire.requestFrom (0x52, 6);

    while (Wire.available ()) {
      outbuf[cnt] = nunchuk_decode_byte (Wire.read ());
      digitalWrite (ledPin, HIGH);
      cnt++;
    }

    if (cnt >= 5) {

      printNunchuckData();

      int z_button = 0;
      int c_button = 0;

      if ((outbuf[5] >> 0) & 1) 
        z_button = 1;
      if ((outbuf[5] >> 1) & 1)
        c_button = 1;

      switch (c_button) {
      case 1:
        switch (z_button) {
        case 0:
          break;
        case 1:
          muovi();
          break;
        }
        break;
      case 0:
        switch (z_button) {
        case 0:
          delay(10000);
          break;
        case 1:
          delay(3000);
          break;
        }
        break;
      }
    }

    cnt = 0;
    send_zero();

  } // if(t==)

  updateServo();

  delay(dtime);
}


void updateServo() {

  if (millis() - lastPulse >= refreshTime) {

    digitalWrite(servoPin, HIGH);
    delayMicroseconds(pulseWidth);
    digitalWrite(servoPin, LOW);

    digitalWrite(servoPin2, HIGH);
    delayMicroseconds(pulseWidth2);
    digitalWrite(servoPin2, LOW);

    lastPulse = millis();
  }
}

int i=0;
void printNunchuckData()
{
  int joy_x_axis = outbuf[0];
  int joy_y_axis = outbuf[1];
  int accel_x_axis = outbuf[2]; // * 2 * 2; 
  int accel_y_axis = outbuf[3]; // * 2 * 2;
  int accel_z_axis = outbuf[4]; // * 2 * 2;

  int z_button = 0;
  int c_button = 0;

  if ((outbuf[5] >> 0) & 1) 
    z_button = 1;
  if ((outbuf[5] >> 1) & 1)
    c_button = 1;
  if ((outbuf[5] >> 2) & 1) 
    accel_x_axis += 2;
  if ((outbuf[5] >> 3) & 1)
    accel_x_axis += 1;

  if ((outbuf[5] >> 4) & 1)
    accel_y_axis += 2;
  if ((outbuf[5] >> 5) & 1)
    accel_y_axis += 1;

  if ((outbuf[5] >> 6) & 1)
    accel_z_axis += 2;
  if ((outbuf[5] >> 7) & 1)
    accel_z_axis += 1;

  Serial.print (i,DEC);
  Serial.print ("\t");

  Serial.print ("X: ");
  Serial.print (joy_x_axis, DEC);
  Serial.print ("\t");

  Serial.print ("Y: ");
  Serial.print (joy_y_axis, DEC);
  Serial.print ("\t");

  Serial.print ("Tasto Z: ");
  Serial.print (z_button, DEC);
  Serial.print (" ");
  Serial.print ("Tasto C: ");
  Serial.print (c_button, DEC);
  Serial.println ("");
  i++;
}

char nunchuk_decode_byte (char x)
{
  x = (x ^ 0x17) + 0x17;
  return x;
}

void muovi (){
  float tilt  = (zeroPulse - outbuf[0]);
  float tilt2 = (zeroPulse2 - outbuf[1]);

  tilt = (tilt);
  pulseWidth = (tilt * 5) + minPulse;

  tilt2 = (tilt2);
  pulseWidth2 = (tilt2 * 5) + minPulse2;

  pwbuff [pwbuffpos]  = pulseWidth;
  pwbuff2[pwbuffpos2] = pulseWidth2;

  if( ++pwbuffpos == pwbuffsize ) pwbuffpos = 0;
  if( ++pwbuffpos2 == pwbuffsize ) pwbuffpos2 = 0;


  pulseWidth=0;
  pulseWidth2=0;

  for( int p=0; p<pwbuffsize; p++ ){
    pulseWidth += pwbuff[p];
    pulseWidth2 += pwbuff2[p];
  }

  pulseWidth /= pwbuffsize;
  pulseWidth2 /= pwbuffsize;

}

 

Elenco revisioni
29/03/2013 Emissione preliminare