Projekt:
Chevrolet Impala SS 1965

Det här kräver vissa grundkunskaper i elekronik och logikstyrning

Styrning av vindrutetorkare


Den modernare spaken i Camaro IV rattstång går inte att kappla direkt till torkarmotorn. då styrning sker med olka motståndsvärden. Konrollmodulen sitter inbyggd i Camarons torkarmotor, vilken inte passar i Impalan. Istället används en 2-hastighetsmotor från en Chevrolet G20 Van -89. Styrningen måste därefter specialanpassas efter den kombinationen.


Passar perfekt och är bara att skruva dit, helt utan modifikation. Det samma gällde även kupéfläkten.

Originalmotorn har som det mest på bilen, gjort sitt efter 50 år.

 


Med en 200 kronors microkontroller och passande reläkort bygger man en utmärkt kontrollenhet för runt 500kr.
Det här är en Arduino Uno, för mer info: http://www.arduino.cc/, programspråket är C++ och det finns expansionsmoduler för att koppla in sig i CAN-bus, ethernet, wlan, GSM mm vilket kommer väl tillhands senare.


Kortet har 5 analoga ingångar och 16 digitala portar, principen här är att ta ut spänningen mellan ett 100k motstånd och de i rattstångsspaken, sedan skala värdet till lämpliga intervalltider. Se komplett kopplingsschema här: el_wiper-Model.pdf.

Programmeringsprincipen är att efterlikna en modern bil. ingenting som får systemet att halta (delay, while mm) används, en ny inmatning väntar med andra ord inte på föregående. Funktionen har 5 intervallsteg, kontinuerlig lågfart, högfart, spoling med 3 efterdrag och sedan ett til efter 10 sekunder.

Ladda ned komplett källkod (formatet är för Arduinos compiler): wiper_switch_to_ground.ino

// source code by Peter Ek, Wiper control for 2-speed motor from Camaro gen IV steering column
int sensorPin = A0;
int pulsePin = 6;
int washoutPin = 7;
int hspeedoutPin = 8;
int washinPin = 10;
int hspeedinPin = 11;
boolean hspeedState = HIGH;
boolean washState = HIGH;
boolean lastHspeedState = HIGH;
boolean lastWashState = HIGH;
long lastDebounceWashTime = 0;
long lastDebounceHspeedTime = 0;
long debounceDelay = 50;
long prevMillisStart = 0;
long intervalStart = 600;
long prevMillisStop = 0;
long intervalWash = 4000;
long waitClean = 12000;
long prevMillisWash=0;
long sensorValue = 0;
int afterWipe = 0;
int afterClean = 0;
int afterCleanWait = 0;
int resetWipeStart = 1;
int resetWipeStop = 0;
long mistStart = 0;

int serialCount = 0;

void setup() {
pinMode(2, INPUT);
pinMode(pulsePin, OUTPUT);
pinMode(washoutPin, OUTPUT);
pinMode(hspeedoutPin, OUTPUT);
pinMode(washinPin, INPUT);
pinMode(hspeedinPin, INPUT);
digitalWrite(pulsePin, HIGH);
digitalWrite(washoutPin, HIGH);
digitalWrite(hspeedoutPin, HIGH);
Serial.begin(9600);
}

void loop() {

sensorValue = map(analogRead(sensorPin), 0, 1023, 0, 10000);
hspeedState = digitalRead(hspeedinPin);
washState = digitalRead(washinPin);
if(hspeedState == LOW) { digitalWrite(hspeedoutPin, LOW); } else { digitalWrite(hspeedoutPin, HIGH); }

if(washState == LOW) {
digitalWrite(washoutPin, LOW); digitalWrite(pulsePin, LOW); afterWipe = 1; afterClean = 1; afterCleanWait = 0; prevMillisWash = millis(); }
else {
digitalWrite(washoutPin, HIGH);
if(afterWipe == 1) {
if(millis() - prevMillisWash > intervalWash) {
digitalWrite(pulsePin, HIGH);
afterWipe = 0; }
}
if(afterClean == 1) {
if(millis() - prevMillisWash > waitClean) {
digitalWrite(pulsePin, LOW); afterCleanWait = 1; }
if((millis() - prevMillisWash) > (waitClean + 1000)) {
digitalWrite(pulsePin, HIGH); afterClean = 0; afterCleanWait = 0; }
}
}
// activate this code for calibration values:
Serial.print(sensorValue); Serial.print("\t"); serialCount++; if(serialCount > 30) { Serial.println(""); serialCount = 0; }
if(afterWipe == 0 && afterCleanWait == 0) {
if((sensorValue < 10 || sensorValue > 9500) && (millis() - mistStart > intervalStart)) {
digitalWrite(pulsePin, HIGH); resetWipeStart = 1; resetWipeStop = 0; }
else {
if(sensorValue > 10 && sensorValue < 1500) {
digitalWrite(pulsePin, LOW); resetWipeStart=1; resetWipeStop=0; mistStart = millis(); }
else {
if(resetWipeStart == 1 && resetWipeStop == 0) {
digitalWrite(pulsePin, HIGH);
if(millis() - prevMillisStop > sensorValue) {
resetWipeStop=1; resetWipeStart=0; prevMillisStart = millis();
}
}
if(resetWipeStop == 1 && resetWipeStart == 0) {
digitalWrite(pulsePin, LOW);
if(millis() - prevMillisStart > intervalStart) {
resetWipeStart=1; resetWipeStop=0; prevMillisStop = millis();
}
}
}
}
}
}