Salve a tutti, mi chiamo Mirko, seguo il forum già da tempo ma non ho mai scritto nulla. Non sono nuovo dell'elettronica ma comunque ho molto da imparare. Scrivo qui perchè vorrei alcuni consigli per un piccolo progetto. Vorrei costruire un piccolo inclinometro, penso si chiami così, per misurare un inclinazione orizzontale nell'arco dei 15 gradi. Ho a disposizione i due controller della Nintendo Wii da cui ho già smontato attentamente i sensori accelerometro/giroscopio e dei display a 7 segmenti. L'idea è quella di non utilizzare arduino per non far diventare eccessiva la spesa, ma da quello che so posso utilizzare solo un processore atmega. Quindi ho un sensore ( 3 assi ma a me ne basta 1 da sfruttare), il processore dovrebbe semplicemente processare i dati e inviare un risultato numerico al display che indicherebbe l'inclinazione del piano. Secondo voi è fattibile come cosa oppure ho detto cavolate? Se è possibile utilizzare solo il processore potete indicarmi quale comprare ed eventuali altri componenti da utilizzare? Grazie del supporto!
Ciao e benvenuto.
Ti invito a leggere il regolamento.
Ciò che vuoi fare si chiama comunemente "Arduino in standalone", ossia replichi l'Arduino solo nel suo componente principale, che è il microcontrollore Atmega328P. Devi quindi acquistare questo microcontrollore, meglio se senza bootloader: te lo fanno pagare di più ma non serve e poi lo puoi mettere anche tu, eventualmente.
Poi ti scarichi questa guida: http://www.michelemenniti.it/arduino_burn_bootloader.php
Che ti illustra come realizzare il circuito in standalone e come programmare il microcontrollore. Sull'uso dei display e dei sensori della Wii c'è tanto materiale sul forum e su internet, non devi fare altro che cercare.
Grazie della risposta. Si la guida gia' l'avevo scaricata. Volevo piu' che altro essere sicuro di non fare l'acquisto sbagliato. Ho un arduino Uno che quindi posso sfruttare per programmare l'atmega singolarmente. MI scuso inoltre per il fatto che probabilmente ho sbagliato sezione, forse andava in Hardware. Procedo quindi con l'acquisto.
Dopo tanto lavoro e ricerca sono riuscito a fare un primo programma quasi funzionante. Utilizzando quindi l'accelerometro del nunchuk della Wii, arduino UNO e due display a 7 segmenti. Ho utilizzato una libreria per far funzionare i due display, e con if ed else funzionavano dando i numeri da visualizzare da monitor seriale. Poi ho modificato uno sketch trovato online per visualizzare il valore dell'accelerometro nel monitor seriale, che visualizzavi assi x, y e z ma ho tolto tutto il codice superfluo e lasciato solo la visualizzazione dell'asse y. Bene poi ho unito i due sketch manualmente ma ho dei problemi. Vi posto il codice per capire. Allora arrivati nella parte dove c'è scritto
che è solo uno dei tanti tentativi, vorrei che visualizzasse il valore dell'accelerometro sul display ma non ci riesco, basterebbe dallo 0 al 15. Ecco il codice completo.
#include <stdio.h>
#include <Wire.h>
#include <string.h>
#include "SevSeg.h"
#undef int
SevSeg myDisplay;
//Create global variables
unsigned long timer;
int deciSecond = 0;
char tempString[10];
uint8_t outbuf[6];
int accel_y_axis = outbuf[3] ;
int cnt = 0;
void setup()
{
Serial.begin (19200);
Serial.print ("Finished setup\n");
Wire.begin (); // join i2c bus with address 0x52
nunchuck_init (); // send the initilization handshake
int displayType = COMMON_ANODE; //Your display is either common cathode or common anode
//This pinout is for a regular display
//Declare what pins are connected to the digits
int digit1 = 2; //Pin 12 on my 4 digit display
int digit2 = 3; //Pin 9 on my 4 digit display
int digit3 = 4; //Pin 8 on my 4 digit display
int digit4 = 5; //Pin 6 on my 4 digit display
//Declare what pins are connected to the segments
int segA = 6; //Pin 11 on my 4 digit display
int segB = 7; //Pin 7 on my 4 digit display
int segC = 8; //Pin 4 on my 4 digit display
int segD = 9; //Pin 2 on my 4 digit display
int segE = 10; //Pin 1 on my 4 digit display
int segF = 11; //Pin 10 on my 4 digit display
int segG = 12; //Pin 5 on my 4 digit display
int segDP= 13; //Pin 3 on my 4 digit display
int numberOfDigits = 2; //Do you have a 1, 2 or 4 digit display?
myDisplay.Begin(displayType, numberOfDigits, digit1, digit2, digit3, digit4, segA, segB, segC, segD, segE, segF, segG, segDP);
myDisplay.SetBrightness(100); //Set the display to 100% brightness level
timer = millis();
}
void
nunchuck_init ()
{
Wire.beginTransmission (0x52); // transmit to device 0x52
Wire.write (0x40); // sends memory address
Wire.write (0x00); // sends sent a zero.
Wire.endTransmission (); // stop transmitting
}
void
send_zero ()
{
Wire.beginTransmission (0x52); // transmit to device 0x52
Wire.write (0x00); // sends one byte
Wire.endTransmission (); // stop transmitting
}
void loop()
{
Wire.requestFrom (0x52, 6); // request data from nunchuck
while (Wire.available ())
{
outbuf[cnt] = nunchuk_decode_byte (Wire.read ()); // receive byte as an integer
// sets the LED on
cnt++;
}
// If we recieved the 6 bytes, then go print them
if (cnt >= 5)
{
print ();
}
cnt = 0;
send_zero (); // send the request for next bytes
int accel_y_axis = outbuf[3] ;
if(accel_y_axis=='1'){
sprintf(tempString, "01", deciSecond); }
myDisplay.DisplayString(tempString, 3); //(numberToDisplay, decimal point location)
if (millis() - timer >= 100)
{
timer = millis();
deciSecond++;
}
delay(5);
}
void
print ()
{
int accel_y_axis = outbuf[3] ;
Serial.print (accel_y_axis );
Serial.print ("\t");
Serial.print ("\r\n");
}
char
nunchuk_decode_byte (char x)
{
x = (x ^ 0x17) + 0x17;
return x;
}