Stap 6: Wii_Nunchuck_Level Arduino schets belasting
Er zijn twee schetsen van de Arduino: 1) Wiichuck_range_test; en 2) Wii_Nunchuck_Level.Eerst en vooral, moet u weten wat de Nunchuck versnellingsmeter van elk gegevensbereik as zijn. Ik heb getest een paar van hen en alle van hen toont kleine verschillen. Maar meestal, de bereiken zijn 60-70 als minimum en 180-200 als maximum. Om de beste gevoeligheid van het niveau moet u eerst het Wiichuck_range_test laden en vinden deze waarden (minimum, centrum (op niveau) en maximum) voor elk zwaartepunt en pas de waarden in de belangrijkste schets indien nodig.
De reeks test schets is eenvoudig en ongecompliceerd, dus ik zal niet de details hier uitleggen.
Het hoofdprogramma, de Wii_Nunchuck_Level wordt getoond hieronder en ook aangesloten.
De functie getData() krijgen de waarden voor elk zwaartepunt en ze opslaan in byte matrix accl [] en vinden van de richting van het niveau en retourneert 'oriënteren.'
De functie orientation() de huidige waarden voor de as ophalen en vinden van de richting van het niveau. Elke geaardheid geeft twee assen als midden (geëgaliseerd, rond 120-130) en één as als minimum of maximum afhankelijk van de richting van de zwaartekracht. Met behulp van deze kenmerken, bepaalt het de oriëntatie.
De belangrijkste loop is heel simpel. Het bewaakt als de kalibratie-knop wordt gedrukt door het zien als de pin 10 hoog en anders is het huidige gegevens lezen en inschakelen van LEDs. Het programma de huidige data opgeslagen (in de EEPROM van de ATmega328P) vergelijkt ijkgegevens. Er zijn drie stadia weer te geven: 1) als de waarde binnen een bepaald bereik is, zal het weer op de centrale rode LED aangesloten op de digitale pin 7; 2) indien de waarde groter dan het bereik (sens in het programma is) en minder dan 2 keer van het bereik (sens), zal dit op de rode LED en een groene LED op het tegenovergestelde (om te simuleren de richting zeepbel) kant van de tilt; 3) als de waarde groter dan 2 keer van het bereik (sens), is dan alleen de groene LED is ingeschakeld.
De kalibratie-waarden zijn de neutrale waarde van elke as lezen wanneer het wordt herverdeeld op die as. Bijvoorbeeld, de Nunchuck gegevens lezen bedraagt tussen de 60-70 (deze waarden zijn verschillend van de sensor naar de andere sensor) -g (ondersteboven) op die as en is meer dan 170 g (boven rechts). Dus de neutrale (geëgaliseerd) waarde van elke as ongeveer is 120-130. De kalibratie begint wanneer de pin 10 hoog gaat door verbonden met V + met een kleine Drukknopschakelaar ingedrukt. Een het kalibratieproces begint, zodat de gebruiker enige tijd om het apparaat neer op een vlakke ondergrond, het wacht totdat de centrale rode LED een paar keer knippert. De werkelijke kalibratie is echt snel klaar en gevolgd door een paar sneller knippert.
/*
* Wii_Nunchuck_Level
* Feb-Mar 2012, Jinseok Jeon
* http://jeonlab.wordpress.com
*
* Wii Nunchuck gegevens lezen:
* nunchuck_funcs.h van WiiChuckDemo door Tod E. Kurt,
* http://todbot.com/blog/2008/02/18/wiichuck-wii-nunchuck-adapter-available/
*/
#include < Wire.h >
#include < EEPROM.h >
#include "nunchuck_funcs.h"
byte accl [3]; versnellingsmeter lezingen voor x, y, z-as
int calPin = 10; kalibratie pin
int sens = 1; gevoeligheid
int de Oriënt;
VOID Setup
{
nunchuck_init();
for (int i = 5; ik < 10; i ++) {}
pinMode (ik, OUTPUT);
} //9 verliet 8 omhoog, 7 center, 6 down, 5 recht
pinMode (calPin, INPUT);
delay(100);
}
void loop
{
Als de pin kalibratie wordt gedrukt, springen naar opstelplaats calibrate()
Als (digitalRead(calPin) == HIGH) calibrate();
getData();
Als (oriënteren == 1 || oriënteren == 2) {}
Als (abs (accl [0]-EEPROM.read (0 + orient * 10)) < = 2 * sens) digitalWrite (7, hoge);
Als (accl [0]-EEPROM.read (0 + orient * 10) > sens) digitalWrite (5, hoge);
Als (EEPROM.read(0 + orient*10)-accl [0] > sens) digitalWrite (9, hoge);
}
Als (oriënteren == 3 || oriënteren == 4) {}
Als (abs (accl [1]-EEPROM.read (1 + orient * 10)) < = 2 * sens) digitalWrite (7, hoge);
Als (accl [1]-EEPROM.read (1 + orient * 10) > sens) digitalWrite (8, hoge);
Als (EEPROM.read(1 + orient*10)-accl [1] > sens) digitalWrite (6, hoge);
}
Als (oriënteren == 5 || oriënteren == 6) {}
Als (abs (accl [0]-EEPROM.read (0 + orient * 10)) < = 2 * sens & & abs (accl [1]-EEPROM.read (1 + orient * 10)) < = 2 * sens) digitalWrite (7, hoge);
Als (accl [0]-EEPROM.read (0 + orient * 10) > sens) digitalWrite (5, hoge);
Als (EEPROM.read(0 + orient*10)-accl [0] > sens) digitalWrite (9, hoge);
Als (accl [1]-EEPROM.read (1 + orient * 10) > sens) digitalWrite (8, hoge);
Als (EEPROM.read(1 + orient*10)-accl [1] > sens) digitalWrite (6, hoge);
}
delay(50);
voor (int i = 5; ik < 10; i ++) {//turn uit alle LEDs
digitalWrite (i, laag);
}
}
VOID getData()
{
nunchuck_get_data();
accl [0] = nunchuck_accelx();
accl [1] = nunchuck_accely();
accl [2] = nunchuck_accelz();
oriënteren = orientation(); geaardheid krijgen
}
VOID calibrate()
{
for (int i = 0; ik < 3; i ++) {}
digitalWrite (7, hoge);
delay(500);
digitalWrite (7, laag);
delay(500);
}
getData();
for (int i = 0; ik < 3; i ++) {}
EEPROM.write (i + orient * 10, accl[i]);
}
for (int i = 0; ik < 3; i ++) {}
digitalWrite (7, hoge);
delay(200);
digitalWrite (7, laag);
delay(200);
}
}
int orientation()
{
Als (accl [0] > 125 & & accl [0] < 145 & & accl [2] > 110 & & accl [2] < 140) {}
Als (accl [1] > 170) oriënteren = 1; bodem op verdieping
anders als (accl [1] < 75) oriënteren = 2; Top op vloer
}
anders als (accl [1] > 110 & & accl [1] < 140 & & accl [2] > 110 & & accl [2] < 140) {}
Als (accl [0] > 180) oriënteren = 3; links op de vloer
anders als (accl [0] < 90) oriënteren = 4; recht op de vloer
}
anders als (accl [1] > 110 & & accl [1] < 140 & & accl [0] > 125 & & accl [0] < 145) {}
Als (accl [2] > 170) oriënteren = 5; terug op de vloer
anders als (accl [2] < 80) oriënteren = 6; Front op vloer
}
retourneren van de Oriënt;
}