Accelerometro, atmega e display

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!

Mirko

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 :stuck_out_tongue: 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

 if(accel_y_axis=='1'){
      sprintf(tempString, "01", deciSecond); }

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;
}

Grazie dell'aiuto