//Boutons du contrôleur vers Arduino
const uint8_t leftIN = 2;
const uint8_t rightIN = 4;
const uint8_t upIN = 5;
const uint8_t downIN = 3;
const uint8_t switchIN = 7;
//Arduino vers PCB
const uint8_t leftOUT = 11;
const uint8_t rightOUT = 12;
const uint8_t upOUT = 10;
const uint8_t downOUT = 9;
// état des boutons
uint8_t leftRead = LOW;
uint8_t rightRead = LOW;
// état précédent
uint8_t leftReadPrec = LOW;
uint8_t rightReadPrec = LOW;
bool etatLedLeft = LOW;
bool etatLedRight = LOW;
uint8_t downRead;
uint8_t upRead;
uint8_t switchRead;
void setup() {
Serial.begin(9600);
pinMode(leftIN, INPUT_PULLUP);
pinMode(rightIN, INPUT_PULLUP);
pinMode(upIN, INPUT_PULLUP);
pinMode(downIN, INPUT_PULLUP);
pinMode(leftOUT, OUTPUT);
pinMode(rightOUT, OUTPUT);
pinMode(downOUT, OUTPUT);
pinMode(upOUT, OUTPUT);
pinMode(switchIN, INPUT_PULLUP);
}
void loop() {
leftRead = digitalRead(leftIN);
rightRead = digitalRead(rightIN);
upRead = digitalRead(upIN);
downRead = digitalRead(downIN);
switchRead = digitalRead(switchIN);
if (switchRead == LOW) // shoto mode
{
//Horizontal inputs block shoto mode
if (leftRead == LOW)
{
if (rightRead == HIGH) //Left only
{
digitalWrite(rightOUT, HIGH);
digitalWrite(leftOUT, LOW);
}
else //Right+Left = Neutral
{
digitalWrite(rightOUT, HIGH);
digitalWrite(leftOUT, HIGH);
}
}
else if (rightRead == LOW) //Right only
{
digitalWrite(leftOUT, HIGH);
digitalWrite(rightOUT, LOW);
}
else // No horizontal inputs
{
digitalWrite(rightOUT, HIGH);
digitalWrite(leftOUT, HIGH);
}
}
//CHARGE MODE***
else
{
// 0 quand la gauche et droite ne sont pas enfoncées
if (leftRead == HIGH && rightRead == HIGH) {
etatLedLeft = HIGH;
etatLedRight = HIGH;
}
// 1 quand la gauche est la seule enfoncée, la sortie gauche est active
if (leftRead == LOW && rightRead == HIGH) {
etatLedLeft = LOW;
etatLedRight = HIGH;
}
// 2 quand la droite est la seule enfoncée, la sortie droite est active
if (leftRead == HIGH && rightRead == LOW) {
etatLedLeft = HIGH;
etatLedRight = LOW;
}
// 3 quand la gauche est enfoncée et que j’appuie sur la droite (la touche gauche reste enfoncée), seule la sortie droite est active.
if (leftRead == LOW && rightRead == LOW && rightReadPrec == HIGH) {
etatLedLeft = HIGH;
etatLedRight = LOW;
}
// 4 quand la droite est enfoncée et que j’appuie sur la gauche (la touche droite reste enfoncée), seule la touche gauche est active.
if (rightRead == LOW && leftRead == LOW && leftReadPrec == HIGH) {
etatLedLeft = LOW;
etatLedRight = HIGH;
}
}
//Vertical inputs block
if (upRead == LOW) // Up overrides down inputs
{
digitalWrite(downOUT, HIGH);
digitalWrite(upOUT, LOW);
}
else if (downRead == LOW) // Down only
{
{
digitalWrite(downOUT, LOW);
digitalWrite(upOUT, HIGH);
}
}
else // No vertical inputs
{
digitalWrite(upOUT, HIGH);
digitalWrite(downOUT, HIGH);
}
leftReadPrec = leftRead;
rightReadPrec = rightRead;
digitalWrite(leftOUT, etatLedLeft);
digitalWrite(rightOUT, etatLedRight);
}