Project 10 Zoetrope blz 103. terug naar de inleiding
De schets maakt gebruik van de H-bridge L293D waarmee de draairichting en de snelheid van een motor kan veranderen.
Bij een spanning van 8 volt trekt de motor 80 mA. Een arduino outputpin kan max 40 mA leveren. De L293D kan max 600 mA leveren
De L239D heeft ingebouwde clamp diodes, vandaar de D
De L293D is een dual H-bridge motordrive. Je kan dus 2 motoren aansluiten.
Aanpassingen van de code en hardware
Een led bijplaatsen die aangeeft of de motor draait
//------De output pinnen----------
//controle pinnen waarmee je de draairichting van de motor verander.
const int controlPin1 = 2; //Pin 7 van de Hbridge
const int controlPin2 = 3; //Pin 2 van de Hbridge
//met de enablePin schakel je de motor aan of uit en bepaal je de draaisnelheid
const int enablePin = 9; //Pin 1 van de Hbridge
//------De input pinnen--------
const int draairichtingknopPin = 4;
const int aanuitknopPin = 5;
const int potPin = A0;
// Variabelen om de aanuit en draairichtingtoestand van de knoppen vast te leggen
int huidigeAanuittoestand;
int vorigeAanuittoestand;
int huidigeDraairichtingtoestand;
int vorigeDraairichtingtoestand;
// Deze variabele veranderen afhankelijk van de veranderde toestand of snelheid
int motoraanuit = 0; // Kan HIGH 0f LOW zijnj
int motordraairichting = 1; // Kan HIGH of LOW zijn
int motorsnelheid = 0; // Bevat de pwm waarde
void setup() {
// De output pinnen initialiseren
pinMode(controlPin1, OUTPUT);
pinMode(controlPin2, OUTPUT);
pinMode(enablePin, OUTPUT);
// De inputpinnen initialiseren .Dit is niet nodig
pinMode(draairichtingknopPin, INPUT);
pinMode(aanuitknopPin, INPUT);
pinMode(potPin,INPUT);
// EnablePin LOW maken dan staat de motor uit
digitalWrite(enablePin, LOW);
}
void loop() {
// Leest de spanning op de arm van de potentiometer zet deze om naar een 10 bit getal
// Delen door 4 --> 8 bit getal dus geschikt voor pwm
motorsnelheid = analogRead(potPin) / 4;
// ---De waarden van de twee knoppen uitlezen--
// De waarde van de aanuit knop uitlezen
huidigeAanuittoestand = digitalRead(aanuitknopPin);
delay(1);
// De waarde van de draairichtingknop uitlezen
huidigeDraairichtingtoestand = digitalRead(draairichtingknopPin);
//----De uitgelezen waarden testen-----
// Als er op de aanuit knop wordt gedrukt kan de aanuit toestand veranderen
if (huidigeAanuittoestand != vorigeAanuittoestand) {
// als de huidigeAanuittoestand HIGHT is wordt de motor ingeschakeld als hij uit stond
// en uitgeschakeld als hij aan stond
if (huidigeAanuittoestand == HIGH) {
motoraanuit = !motoraanuit;
}
}
// Als op de draairichtingknop wordt gedrukt moet de draairichting veranderen
if (huidigeDraairichtingtoestand != vorigeDraairichtingtoestand) {
//als de huidigedraairichtingtoestand HIGHT is wordt de motor ingeschakeld als hij uit stond
//en uitgeschakeld als hij aanstond
if (huidigeDraairichtingtoestand == HIGH) {
motordraairichting = !motordraairichting;
}
}
//--- afhankelijk van de testuitslag de draairichting snelheid veranderen
//----en de motor aan of uitschakelen
// De draairichting van de motor instellen, zie de waarheidstabel
if (motordraairichting == 1) {
digitalWrite(controlPin1, HIGH);
digitalWrite(controlPin2, LOW);
} else {
digitalWrite(controlPin1, LOW);
digitalWrite(controlPin2, HIGH);
}
if (motoraanuit == 1) {
//de PWM waarden in "motorsnelheid" via de enablePin naar de Hbridge sturen
analogWrite(enablePin, motorsnelheid);
} else { //Als motoraanuit LOW is de motor uitschakelen
analogWrite(enablePin, 0);
}
//---de draai en aanuit toestanden onthouden-----
// De huidigeDraairichtingtoestand copieeren naar de vorigeDraairichtingtoestand
vorigeDraairichtingtoestand = huidigeDraairichtingtoestand;
// De huidigeAanuit toestand copieeren naar de vorigeAanuittoestand
vorigeAanuittoestand = huidigeAanuittoestand;
}