Étape 3: Electronique
Voici le code arduino que j’ai utilisé :
WiiChuck.h et ServoTimer1.h sont tous deux disponibles en ligne. Déposer un message si vous le souhaitez et ne peut pas les trouver.
******************
#include « Wire.h »
#include « WiiChuck.h »
#include « ServoTimer1.h »
#define TILL_POWER_PIN 8
#define TILL_STBD_PIN 10
#define TILL_PORT_PIN 9
#define THROTT_DIFF_PIN 12
#define THROTT_MAIN_PIN 11
#define MINTILLPULSE 1100 / / position du servo de Minimum
#define MAXTILLPULSE 1900 / / position du servo de Minimum
#define MINTHROTTPULSE 1000 / / position du servo de Minimum
#define MAXTHROTTPULSE 1965 / / position du servo de Maximum
Motobineuse ServoTimer1 = ServoTimer1() ;
WiiChuck chuck = WiiChuck() ;
int tillerPulse = 1500 ; Montant pour le servo d’impulsion
int throttlePulse = 1500 ; Montant pour le servo d’impulsion
int throttleDiffPulse = 1500 ; Montant pour le servo d’impulsion
int lastTillerPulse = 1500 ;
int baseTillerPulse = 1500 ;
int déplacer = 10 ;
long lastPulse = 0 ; le temps en millisecondes de la dernière impulsion
int refreshTime = 20 ; le temps nécessaire entre impulsions
int analogValue = 0 ; la valeur retournée par le capteur analogique
int analogPin = 0 ; la broche analogique c’est le capteur sur
sillage boolean = true ;
long arrêt programmé = 0 ;
Boolean dothrottle = true ;
void setup() {}
Serial.Begin(9600) ;
Chuck.Begin() ;
Chuck.Update() ;
tiller.setMaximumPulse(2500) ;
tiller.setMinimumPulse(500) ;
pour (int i = 8; i < 13; i ++) {}
pinMode (i, sortie) ; Axe servo ensemble comme une broche de sortie
}
}
angle int ;
void loop() {}
Chuck.Update() ;
lastTillerPulse = tillerPulse ;
Si {(chuck.buttonC)
Tiller.Attach(9) ;
Tiller.Write(angle) ;
Tiller.Attach(10) ;
Tiller.Write(angle) ;
baseTillerPulse = (int) (1500.0 - chuck.readRoll() * 3) ;
throttleDiffPulse = (int) (1500.0 + chuck.readJoyX() * 5) ;
tillerPulse = baseTillerPulse ;
}
else {}
Si {(abs(chuck.readJoyX()) > 10)
tillerPulse = baseTillerPulse - chuck.readJoyX() ;
}
else {}
tillerPulse = baseTillerPulse ;
}
}
Si {(chuck.buttonZ)
throttlePulse = (int) (1500.0 + chuck.readJoyY() * 5) ;
}
Si (throttlePulse < MINTHROTTPULSE) {}
throttlePulse = MINTHROTTPULSE ;
}
Si (throttlePulse > MAXTHROTTPULSE) {}
throttlePulse = MAXTHROTTPULSE ;
}
Si (throttleDiffPulse < MINTHROTTPULSE) {}
throttleDiffPulse = MINTHROTTPULSE ;
}
Si (throttleDiffPulse > MAXTHROTTPULSE) {}
throttleDiffPulse = MAXTHROTTPULSE ;
}
Si (tillerPulse < MINTILLPULSE) {}
tillerPulse = MINTILLPULSE ;
}
Si (tillerPulse > MAXTILLPULSE) {}
tillerPulse = MAXTILLPULSE ;
}
Serial.Print(tillerPulse) ;
Serial.Print (",") ;
Serial.println(throttlePulse) ;
Si (tillerPulse! = lastTillerPulse) {}
se réveiller = true ;
arrêt programmé = 0 ;
}
else {}
arrêt programmé += 1 ;
}
Si (arrêt programmé > 80)
se réveiller = false ;
Si {(suite)
digitalWrite (TILL_POWER_PIN, élevé) ;
}
else {}
digitalWrite(TILL_POWER_PIN,LOW) ;
}
updateServos() ;
}
void updateServos() {}
analogValue = analogRead(analogPin) ; lire l’entrée analogique
tillerPulse = (analogValue * 19) / 10 + MINPULSE ; convertir la valeur analogique
à une fourchette comprise entre MINPULSE
et MAXPULSE.
Si {(dothrottle)
tillerPulse le servo à nouveau si rhe actualise fois (20 ms) avons passé :
digitalWrite (THROTT_MAIN_PIN, élevé) ;
delayMicroseconds(throttlePulse) ;
digitalWrite (THROTT_MAIN_PIN, basse) ; Allumez le moteur
digitalWrite (THROTT_DIFF_PIN, élevé) ;
delayMicroseconds(throttleDiffPulse) ;
digitalWrite (THROTT_DIFF_PIN, basse) ; Le tsar Motors
delayMicroseconds (5000 - throttlePulse - throttleDiffPulse) ;
}
else {}
delayMicroseconds(5000) ;
}
dothrottle =! dothrottle ;
digitalWrite (TILL_STBD_PIN, élevé) ; Allumez le moteur
digitalWrite (TILL_PORT_PIN, élevé) ; Allumez le moteur
delayMicroseconds(tillerPulse) ; Longueur de l’impulsion définit la position moteur
digitalWrite (TILL_STBD_PIN, basse) ; Allumez le moteur
digitalWrite (TILL_PORT_PIN, basse) ; Allumez le moteur
delayMicroseconds(5000-tillerPulse) ;
}