#include Wire.h
#include utility/twi.h
#include EEPROM.h
#include "Nunchuk.h"
Nunchuk chuk;
int VM1 = 10; //viteza motor 1
int VM2 = 11; //viteza motor 2
int DM1 = 12; //directie motor 1
int DM2 = 13; //directie motor 2
int x = 0; //axa x joystick
int y = 0; //axa y joystick
int stare_buton_Z = 1; // variabila pentru citirea starii butonului Z
int stare_led1 = 0; // variabila aratand starea led-ului
int schimbare1 = 0;
int stare_buton_C = 1; // variabila pentru citirea starii butonului C
int stare_led2 = 0; // variabila aratand starea led-ului
int schimbare2 = 0;
int SenS = 8; // senzor stanga
int SenD = 9; // senzor dreapta
int Directie = 0;
int viteza = 0;
int VitezaSpate = 0;
int VitezaStanga = 0;
int VitezaDreapta = 0;
void setup()
{
pinMode(10, OUTPUT); //viteza motor 1
pinMode(11, OUTPUT); //viteza motor 2
pinMode(12, OUTPUT); //directie motor 1
pinMode(13, OUTPUT); //directie motor 2
pinMode(6, OUTPUT); //pin led 1
pinMode(7, OUTPUT); //pin led 2
pinMode(SenS, INPUT); //intrare senzor stanga
pinMode(SenD, INPUT); //intrare senzor dreapta
Serial.begin(115200);
Wire.begin();
// use 400 kHz for the nunchuck, because it doesn't work reliable with 100 kHz
TWBR = ((CPU_FREQ / 400000L) - 16) / 2;
delay(100);
}
void loop()
{
if(!chuk.ok())
{
//Serial.println("Initing nunchuk, it's broken!");
chuk.init();
}
if(chuk.read())
{
//Serial.print(chuk.joyX(), DEC);
//Serial.write(' ');
//Serial.print(chuk.joyY(), DEC);
//Serial.write(' ');
//Serial.print(chuk.buttonZ(), DEC);
//Serial.write(' ');
//Serial.print(chuk.buttonC(), DEC);
//Serial.write(' ');
//Serial.print(chuk.accX(), DEC);
//Serial.write(' ');
//Serial.print(chuk.accY(), DEC);
//Serial.write(' ');
//Serial.print(chuk.accZ(), DEC);
//Serial.println();
}
else
{
//Serial.println("chuck.read() failed");
}
stare_buton_Z = chuk.buttonZ();
if (stare_buton_Z == 0) { // Verifica daca butonul Z este apasat
// Yes, input is 0
// If LED is on, turn it off
// If LED is off, turn it on
if ((stare_led1 == 0) && (schimbare1 == 0)){
digitalWrite(6, HIGH); // "Aprinde" led-ul, control din joystick
stare_led1 = 1;
schimbare1 = 1; // Set change, prevent new change
}
if ((stare_led1 == 1) && (schimbare1 == 0)){
digitalWrite(6, LOW); // "Stinge" led-ul, control din accelerometru
stare_led1 = 0;
schimbare1 = 1; // Set change, prevent new change
}
}
else { // Butonul Z nu este apasat,
schimbare1 = 0; // intrarea este HIGH din nou, reseteaza "schimbare",
}
stare_buton_C = chuk.buttonC();
if (stare_buton_C == 0) { // Verifica daca butonul C este apasat
// Yes, input is 0
// If LED is on, turn it off
// If LED is off, turn it on
if ((stare_led2 == 0) && (schimbare2 == 0)){
digitalWrite(7, HIGH); // "Aprinde" led-ul, control manual
stare_led2 = 1;
schimbare2 = 1; // Set change, prevent new change
}
if ((stare_led2 == 1) && (schimbare2 == 0)){
digitalWrite(7, LOW); // "Stinge" led-ul, control automat
stare_led2 = 0;
schimbare2 = 1; // Set change, prevent new change
}
}
else { // Butonul C nu este apasat,
schimbare2 = 0; // intrarea este HIGH din nou, reseteaza "schimbare",
}
if(stare_led1 == 0){ // Control din accelerometru
x = (chuk.accX());
y = (chuk.accY());
x = constrain(x, 300, 700); //restrângem valorile pe axa x
//if (x >= 573)
if (x >= 550)
{
//x = map(x, 573, 700, 0, 127);
x = map(x, 550, 700, 30, 127);
}
//else if (x <= 427)
else if (x <= 450)
{
// x = map(x, 300, 427, -127, 0);
x = map(x, 300, 450, -127, 30);
}
else
{
x = 0;
}
y = constrain(y, 300, 700);
//if (y >= 573)
if (y >= 550)
{
//y = map(y, 573, 700, 0, 127);
y = map(y, 550, 700, 30, 127);
}
//else if (y <= 427)
else if (y <= 450)
{
//y = map(y, 300, 427, -127, 0);
y = map(y, 300, 450, -127, 30);
}
else
{
y = 0;
}
}
if(stare_led1 == 1){ // Control din joystick
x = ((chuk.joyX()) - 1); // Aducere la 0 a axei x
y = (chuk.joyY());
}
Serial.print("X = ");
Serial.print(x, DEC);
Serial.write(' ');
Serial.print("Y = ");
Serial.print(y, DEC);
Serial.println();
if(stare_led2 == 1){ // daca led-ul 2 este "aprins" control manual
viteza = 0; //resetam viteza automata la 0
VitezaSpate = 0;
VitezaStanga = 0;
VitezaDreapta = 0;
if ( x == 0 && y == 0) // daca x si y = 0
{
digitalWrite(VM1, LOW); // opreste motoarele
digitalWrite(VM2, LOW);
}
else if (y >= 0) //daca y >= 0
{
int sf = ((2 * y) + x); //stanga fata
sf = constrain(sf, -255, 255);
int df = ((2 * y) - x); //dreapta fata
df = constrain(df, -255, 255);
Serial.print("SF = ");
Serial.print(sf, DEC);
Serial.write(' ');
Serial.print("DF = ");
Serial.print(df, DEC);
Serial.println();
if (sf > 0) // daca stanga fata > 0
{
digitalWrite(DM1, LOW); // porneste motorul 1 in fata
analogWrite(VM1, sf); // viteza motor 1
}
else if (sf < 0) // daca stanga fata < 0
{
digitalWrite(DM1, HIGH); // porneste motorul 1 in spate
analogWrite(VM1, (map(sf, 0, -255, 0, 255))); // viteza motor 1
}
if (df > 0) // daca dreapta fata > 0
{
digitalWrite(DM2, LOW); // porneste motorul 2 in fata
analogWrite(VM2, df); // viteza motor 2
}
else if (df < 0) // daca dreapta fata < 0
{
digitalWrite(DM2, HIGH); // porneste motorul 2 in spate
analogWrite(VM2, (map(df, 0, -255, 0, 255))); // viteza motor 2
}
}
else if (y < 0) //daca < 0
{
int ss = (-y + x); //stanga spate
ss = constrain(ss, -255, 255);
int ds = (-y - x); //dreapta spate
ss = constrain(ss, -255, 255);
Serial.print("SS = ");
Serial.print(ss, DEC);
Serial.write(' ');
Serial.print("DS = ");
Serial.print(ds, DEC);
Serial.println();
if (ss > 0) // daca stanga spate > 0
{
digitalWrite(DM1, HIGH); // porneste motorul 1 in spate
analogWrite(VM1, ss); // viteza motor 1
}
else if (ss < 0) // daca stanga spate < 0
{
digitalWrite(DM1, LOW); // porneste motorul 1 in fata
analogWrite(VM1, (map(ss, 0, -255, 0, 255))); // viteza motor 1
}
if (ds > 0) // daca dreapta spate > 0
{
digitalWrite(DM2, HIGH); // porneste motorul 2 in spate
analogWrite(VM2, ds); // viteza motor 2
}
else if (ds < 0) // daca dreapta spate < 0
{
digitalWrite(DM2, LOW); // porneste motorul 2 in fata
analogWrite(VM2, (map(ds, 0, -255, 0, 255))); // viteza motor 2
}
}
}
else if(stare_led2 == 0){ //daca led-ul 2 este "stins" control automat
if ( digitalRead(SenS) == 1 && digitalRead(SenD) == 1 && Directie == 0) { //mers in fata
VitezaSpate = 0; //resetam viteza spate la 0
VitezaStanga = 0; //resetam stanga spate la 0
VitezaDreapta = 0; //resetam dreapta spate la 0
digitalWrite(DM1, LOW); // porneste motorul 1 in fata
digitalWrite(DM2, LOW); // porneste motorul 2 in fata
viteza += 1;
viteza = min(viteza, 200); // viteza nu va depasi 200
analogWrite(VM1, viteza); // viteza motor 1
analogWrite(VM2, viteza); // viteza motor 2
Serial.print("Viteza 1 = ");
Serial.print(viteza, DEC);
Serial.write(' ');
Serial.print("Viteza 2 = ");
Serial.print(viteza, DEC);
Serial.println();
delay(5);
}
else if ( digitalRead(SenS) == 0 && digitalRead(SenD) == 0) {//daca este un obstacol in fata
viteza = 0; //setam viteza automata la 0
VitezaStanga = 0; //resetam stanga spate la 0
VitezaDreapta = 0; //resetam dreapta spate la 0
Directie = 1;
}
else if ( digitalRead(SenS) == 0 && digitalRead(SenD) == 1) {//daca este un obstacol in stanga
viteza = 0; //setam viteza automata la 0
VitezaSpate = 0; //resetam viteza spate la 0
VitezaDreapta = 0; //resetam dreapta spate la 0
Directie = 2;
}
else if ( digitalRead(SenS) == 1 && digitalRead(SenD) == 0) {//daca este un obstacol in dreapta
viteza = 0; //setam viteza automata la 0
VitezaStanga = 0; //resetam stanga spate la 0
VitezaSpate = 0; //resetam viteza spate la 0
Directie = 3;
}
if (Directie == 1) //mers in spate
{
digitalWrite(DM1, HIGH); // porneste motorul 1 in spate
digitalWrite(DM2, HIGH); // porneste motorul 2 in spate
VitezaSpate += 1;
VitezaSpate = min(VitezaSpate, 200); // viteza nu va depasi 200
analogWrite(VM1, VitezaSpate); // viteza motor 1
analogWrite(VM2, VitezaSpate / 2); // viteza motor 2
if (VitezaSpate == 200) {
Directie = 0;
}
//delay(5);
//Serial.print("Viteza 1 = ");
//Serial.print(VitezaSpate, DEC);
//Serial.write(' ');
//Serial.print("Viteza 2 = ");
//Serial.print(VitezaSpate / 2, DEC);
//Serial.println();
}
else if (Directie == 2) //
{
//digitalWrite(DM1, LOW); // porneste motorul 1 in fata
digitalWrite(DM1, HIGH); // porneste motorul 1 in spate
digitalWrite(DM2, HIGH); // porneste motorul 2 in spate
VitezaStanga += 1;
VitezaStanga = min(VitezaStanga, 200); // viteza nu va depasi 200
analogWrite(VM1, VitezaStanga); // viteza motor 1
analogWrite(VM2, VitezaStanga / 2); // viteza motor 2
if (VitezaStanga == 200) {
Directie = 0;
}
//delay(5);
}
else if (Directie == 3) //
{
digitalWrite(DM1, HIGH); // porneste motorul 1 in spate
digitalWrite(DM2, HIGH); // porneste motorul 2 in spate
//digitalWrite(DM2, LOW); // porneste motorul 2 in fata
VitezaDreapta += 1;
VitezaDreapta = min(VitezaDreapta, 200); // viteza nu va depasi 200
analogWrite(VM1, VitezaDreapta / 2); // viteza motor 1
analogWrite(VM2, VitezaDreapta); // viteza motor 2
if (VitezaDreapta == 200) {
Directie = 0;
}
//delay(5);
//Serial.print("Viteza 1 = ");
//Serial.print(VitezaDreapta, DEC);
//Serial.write(' ');
//Serial.print("Viteza 2 = ");
//Serial.print(VitezaDreapta / 2, DEC);
//Serial.println();
}
}
Serial.print("Directie = ");
Serial.print(Directie, DEC);
Serial.println();
delay(5);
}
Nunchuk remote operated car
Subscribe to:
Comments
(
Atom
)
No comments :
Post a Comment