Daarna begon ik aan verschillende IC'tjes te denken maar uiteindelijk ben ik gevallen voor de Arduino. Een Arduino is een goedkope programmeerbare printplaat met 14 digitale in-/uitgangen en 6 analoge ingangen. Met de Arduino kun je erg eenvoudig een blokgolf, pulse width modulation (PWM) maken, en een mosfet aansturen met de blokgolf. Op die manier is de snelheid van een gelijkstroommotor te regelen.
Door korte pulsjes te geven wordt de effectieve spanning lager en door langere pulsen te geven de effectieve spanning hoger. De mos schakelt de hele tijd met de volledige spanning van de externe bron waardoor lagere toerentallen ook mogelijk zijn.
Maar ook het signaal van de ontsteking oppikken, daar een omrekenfactor bijnemen en daar de toerenteller mee aan sturen is makkelijk.
Als laatste waar ik aan zat te denken is bijvoorbeeld een lambda-sonde en een beeldschermpje in de auto.
Wat wil ik nu doen? Ik wil een gelijkstroommotor gebruiken om de mechanische kabel aan te drijven. Een hallsensor pikt vanaf de kardanas het toerental op, dat toerental wordt omgerekend naar pulslengte. Via een mos wordt de motor aangestuurd. Ik wil er (nog) geen PID-regeling in bouwen omdat ik het toch onder last kalibreer. Met een PID-regeling zou het mogelijk zijn het toerental van het motortje weer op te pikken en dan te compenseren voor de belasting.
Zo ziet de motorsturing er ongeveer uit:
Op de testtafel is het een ongelofelijke bende nu, maar er is een boormachine om het initiele toerental te geven. Een motor reageert daarop. Als ik stop met de boormachine stopt de motor ook. Als ik heel snel met de boormachine ga, gaat het motortje ook snel.
Voorlopig ziet de code er zo uit:
Code: Select all
// this constant won't change:
int sensorPin = 0; // the pin that the sensor is connected to
int motorPin = 5; // motorpin
int factorRPM = 8; // The factor for RPM to KMH calculation
int factorKMH = 10 ; // The factor for KMH to PWM calculation
int looptime = 2000; // Looptime in ms
int lowerControl = 3 ; // Lower control value for shutoff
// Variables will change:
int RPM = 0; // counter for the number of lows on sensor
int sensorState = 0; // current state of the sensor
int lastSensorState = 0; // previous state of the sensor
int starttime = millis(); // Note starttime when Arduino starts
int KMH = 0; // Everything calculated back to KMH
int PWM = 0; // Input to motor
void setup() {
pinMode(motorPin, OUTPUT); // initialize the motorpin as an output
pinMode(sensorPin, INPUT); // initialize the sensor pin as an input:
Serial.begin(9600); // initialize serial communication:
pinMode(LED_BUILTIN, OUTPUT) ; // LED
}
void loop() {
back:
Serial.print("back");
RPM = 0;
starttime=millis();
KMH=0;
PWM=0;
while ((millis() - starttime) <= looptime) // Measure the RPM for a certain amount of time
{
sensorState = digitalRead(sensorPin); // Read the status on input pin:
if (sensorState != lastSensorState) { //Is not equal to
if (sensorState == HIGH) {
RPM++;
}
lastSensorState = sensorState;
}
} //End of RPM measurement block
//Serial.print(RPM);
//delay(100);
KMH = RPM * factorRPM ; // Some formula for calculation towards KMH
PWM = KMH * factorKMH ;
Serial.print(PWM);
if (RPM >= lowerControl && PWM >= 70)
{
analogWrite(motorPin, PWM) ; // Control motor to calculated speed
goto back;
}
else
{
analogWrite(motorPin, 0);
}
}
Ik moet nu een stabiele 9V-voeding bouwen voor de Arduino en een 20V voeding voor de motor. De gelijkstroommotor heeft iets te weinig oempf op 12V maar we zullen het eerst wel eens uitproberen.
Ik heb de Velleman Arduino One gekocht met een VMA411 MOS driving module en een VMA313 Hall sensor. Dat samen was 25 euro. De motor was 7 euro.
Dit moet de APK-oplossing gaan worden, als dat achter de rug is, is het volgende een toerenteller. Daarna wellicht een aantal extra sensoren onder de motorkap en een beeldschermpje.
In theorie is het mogelijk de Megasquirt te kopieren maar de bibliotheken zijn nog veel te experimenteel. Als je een programmeerheld bent, zou het geen probleem zijn.
Aangezien ik geen programmeerheld ben, komt er waarschijnlijk op termijn ook nog een Megasquirt.