#include <SPI.h>
#define debug //comment this line if you´re not gonna use the serial data with the arduino ide
#define CS 10 //chipselect
#define accelerometerX A0//analogpins for the accelerometer
#define accelerometerY A1
#define accelerometerZ A2
#define RED 6 //rgb pins
#define GREEN 3
#define BLUE 5
//MCP41010 chip´s connection
// 39ohms per step of the
//CS 10 U vcc
//SCK 13 serial clock PBO--UPRESISTOR
//SI 11 serial imput PWO INRESISTOR
//gnd PAO--BOTTOMRESISTOR
int datarray[18]={0,0,0,0,0,0,1023,1023,1023,0,0,0,0,0,0};
int smoothingarray[15]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
int rgb[3];
int i=0,chipvalue=0;
int ResistorValue=0;
void setup() {
//
//pinMode (GREEN, OUTPUT);//GREEN RGB (PWM)
//pinMode (BLUE, OUTPUT);//BLUE
//pinMode (RED, OUTPUT);//RED
//digitalWrite(GREEN, HIGH);//setting the led off at the begining
//digitalWrite (BLUE, HIGH);//
//digitalWrite (RED, HIGH);//
pinMode (CS, OUTPUT);//chipselect for the MCP41010 chip
pinMode (13, OUTPUT);//things are happening led
pinMode (accelerometerX, INPUT);//acelerometer´s inputs
pinMode (accelerometerY, INPUT);//
pinMode (accelerometerZ, INPUT);//
SPI.begin();
MCP41010Write(0);//init value horizontal foot
#ifdef debug
Serial.begin(9600);
#endif
}
void loop() {
datarray[0]=analogRead(accelerometerX);
datarray[1]=analogRead(accelerometerY);
datarray[2]=analogRead(accelerometerZ);
comparemaxmin(datarray);
detectRange(datarray);
ResistorValue=map(datarray[datarray[15]],datarray[datarray[15]+6]+20,datarray[datarray[15]+3]-10,0,255);//+20 to the min and -10 to the max for preventing unreachable edges
chipvalue =constrain(ResistorValue,0,255);
MCP41010Write(smoothing(chipvalue));
// //map(value, fromLow, fromHigh, toLow, toHigh)
// for(i=0;i<=2;i++){
// rgb[i]=map(datarray[i],datarray[i+6],datarray[i+3],0,255);
// }
////analogWrite(GREEN, rgb[0]);//EL LED DA PROBLEMAS DE LECTURA ruido/////////////////////7
////analogWrite (BLUE, rgb[1]);//
////analogWrite (RED, rgb[2]);//
#ifdef debug
Serial.print("//RawReadings: ");
Serial.print(datarray[0]);
Serial.print(" ");
Serial.print(datarray[1]);
Serial.print(" ");
Serial.print(datarray[2]);
Serial.print(" /max ");
Serial.print(datarray[3]);
Serial.print(" ");
Serial.print(datarray[4]);
Serial.print(" ");
Serial.print(datarray[5]);
Serial.print(" /min ");
Serial.print(datarray[6]);
Serial.print(" ");
Serial.print(datarray[7]);
Serial.print(" ");
Serial.print(datarray[8]);
Serial.print(" //GAP :");
Serial.print(datarray[9]);
Serial.print(" ");
Serial.print(datarray[10]);
Serial.print(" ");
Serial.print(datarray[11]);
// Serial.print("/?? ");
// Serial.print(datarray[12]);
// Serial.print(" ");
// Serial.print(datarray[13]);
// Serial.print(" ");
// Serial.print(datarray[14]);
Serial.print(" //axis choose ");
Serial.print(datarray[15]);
Serial.print(" //chip value ");
Serial.print(chipvalue);
Serial.println();
#endif
delay(100);//delay for stability
}
void comparemaxmin(int datarray[])
{
for(i=0;i<=2;i++)
datarray[i+3]=max(datarray[i],datarray[i+3]);
for(i=0;i<=2;i++)
datarray[i+6]=min(datarray[i],datarray[i+6]);
}
void detectRange(int datarray[18])
{
for(i=0;i<=2;i++)
{
datarray[i+9]=abs(abs(datarray[i+3])-abs(datarray[i+6]));
}
if(datarray[9]>=datarray[10]&&datarray[9]>=datarray[11])//choosing the axis with the wider range
datarray[15]=0;
if(datarray[10]>=datarray[9]&&datarray[10]>=datarray[11])
datarray[15]=1;
if(datarray[11]>=datarray[9]&&datarray[11]>=datarray[10])
datarray[15]=2;
}
void MCP41010Write(byte value) //speaking protocol with the mcp chip
{
// Note that the integer value passed to this subroutine
// is cast to a byte
digitalWrite(CS,LOW);
SPI.transfer(B00010001); // This tells the chip to set the pot
SPI.transfer(value); // This tells it the pot position
digitalWrite(CS,HIGH);
}
int smoothing(int data){
int result,j;
for(j=0;j<=14;j++){
smoothingarray[j] = smoothingarray[j+1];
}
smoothingarray[14]= data;
result=(smoothingarray[0]+smoothingarray[1]+smoothingarray[2]+smoothingarray[3]+smoothingarray[4])/5;
constrain(result,0,255);
return result;
}
Comments