ARDUINO ultimo aggiornamento 20 aprile 2013 |
|
Quello presentato in questa pagina è una nuova versione di uno shield d'interfaccia, che sostituisce quello precedentemente costruito utilizzando una basetta mille fori.
è 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.
|
Il filmato
mostra il test di un dispositivo Pan & Tilt
azionato dal controller Nunchuck
|
|
|||
Dettaglio connettore
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 |