Helaas lukt het ons maar niet om de schakeling naar behoren te laten werken.
Nu heeft iemand op het Volvo forum iets anders bedacht, zouden jullie hier eens naar willen kijken?
effe 'copy-paste'
Benodigdheden:
1x Volvo RTI scherm (Volvo part 9452064)
1x Arduino Nano (+/- 7 euro bij DX.com)
1x Deek-Robot L293D motorcontroller (8 euro bij Raspberrypishop)
4x 10K weerstand
4x 4,7K weerstand
2x 4N25 optocoupler
2x 1N4184 diode
In het hart van het geheel heb ik gekozen voor een Arduino Nano V3.0, omdat deze bijzonder klein (45x18mm) is en makkelijk in de schermbehuizing te verstoppen is. Omdat de Arduino geen 12 volt op de digitale inputs kan verwerken, zal dit verlaagd moeten worden naar 5 volt. Dit gebeurt met behulp van 2 optocouplers (4N25).
De Arduino
De pinbezetting:
D2: Controleert of het contact aan is
D3: Geactiveerd als het scherm omlaag is
D4: Geactiveerd als het scherm omhoog is
D5: Knop om het scherm te activeren
D6: Activeer motor voor scherm omhoog
D7: Activeer motor voor scherm omlaag
Het idee:
Pinnen 3 en 4 controleren of het scherm in de hoogste of laagste stand zitten. Op het moment dat het scherm volledig ingeklapt is, zal de knop (in de code "endbtn_down") ingedrukt zijn en daarvoor zal er op pin 3 5 volt komen te staan. Pin 4 ("endbtn_up") doet hetzelfde, maar dan met het scherm in de hoogste stand.
Op pin 2 staat 5 volt op het moment dat het contact aan is ("engine_running" in de code). Als het contact uit staat, kan het scherm niet geactiveerd worden.
Te slotte zit op pin 5 de knop ("button_up" in de code) aangesloten waarmee de gebruiker het scherm omhoog kan brengen. Zolang er spanning wordt gemeten op pin 5, zal het scherm omhoog blijven. Als de spanning wordt weggenomen en het scherm is nog niet beneden, zal het scherm naar beneden gedraaid worden.
Er zijn dus een paar voorwaarden die voor iedere handeling gecontroleerd worden:
Wat is de positie van het scherm?
Staat het contact aan?
Heeft de gebruiker de knop voor het scherm omhoog geactiveerd?
Als er aan bepaalde combinaties van deze voorwaarden wordt voldaan, zal het Arduino printje een opdracht sturen naar de motorcontroller om zo de motor te besturen welke het scherm omhoog en omlaag brengt.
De motorcontroller?
De Arduino kan de motor niet rechtstreeks aansturen, omdat die het vermogen niet kan leveren. Om schade te voorkomen, gebruik ik een simpele motorcontroller van Deek-Robot op basis van de L293D controller. Op de controller zitten leds op de uitgangen, zodat je kunt zien of ze geactiveerd zijn (handig voor het proof of concept).
De pinbezetting voor de motorcontroller is vrij simpel:
VCC: 5 volt input
GND: Ground
IN1: Aansluiten op Pin 6 van de Arduino
IN2: Aansluiten op Pin 7 van de Arduino
A-: Aansluiten op de ene pool van de motor
A+: Aansluiten op de andere pool van de motor
De code
De Arduino is van zichzelf niet veel meer of minder dan een microcontroller (Atmega 328 in dit geval), welke je vrij kunt programmeren met behulp van de gratis software die je kunt downloaden op www.arduino.com. Zonder programma doet de Arduino niets. Het programmeren is niet gek moeilijk en er is veel over te vinden op de fora van Arduino. Gelukkig maar, want ik heb nog nooit iets geprogrammeerd voor een Atmega microcontroller en ik heb ook weinig ervaring met elektronica.
Na een paar uur aanmodderen en testen kwam het volgende in de Arduino te staan:
[code]
//Volvo RTI motor controller for 1999 RTI system installed on
//the S70, V70 classic and C70 untill 2014.
//Requires Arduino Nano + Motorcontroller + 2 optocouplers
//Installation instructions (in Dutch): http://www.volvo850forum.nl/index.php/topic,75682.msg1608670.html#msg1…
//By P. Janssen, The Netherlands
//Declaration of variables
int motor_forward = 7;
int motor_reverse = 6;
int button_up = 5;
int endbtn_up = 4;
int endbtn_down = 3;
int engine_running = 2;
int engine_value = 0;
int endbtn_upValue = 0;
int endbtn_downValue = 0;
int button_upValue = 0;
// the setup routine runs once when you press reset:
void setup()
{
// initialize serial communication at 9600 bits per second:
Serial.begin(9600);
// initialize the digital pin as an output.
pinMode(motor_forward, OUTPUT);
pinMode(motor_reverse, OUTPUT);
// make the pushbutton's pin an input:
pinMode(button_up, INPUT);
pinMode(endbtn_up, INPUT);
pinMode(endbtn_down, INPUT);
pinMode(engine_running, INPUT);
}
// the loop routine runs over and over again forever:
void loop() {
//Read input pins
engine_value = digitalRead(engine_running);
endbtn_upValue = digitalRead(endbtn_up);
endbtn_downValue = digitalRead(endbtn_down);
button_upValue = digitalRead(button_up);
//Serial Print to USB
//For debug purposes. Disable in production environment.
Serial.print("Engine Running:");Serial.println(engine_value);
Serial.print("\tEnd Button up:");Serial.println(endbtn_upValue);
Serial.print("\tEnd Button down 3:");Serial.println(endbtn_downValue);
Serial.print("\tButton up:");Serial.println(button_upValue);
//Set default: Display motor is off
digitalWrite(motor_forward,LOW); //Pin D6 will be LOW
digitalWrite(motor_reverse,LOW); //Pin D7 will be LOW
//If current state is NOT up and contact is on/engine is running and the switch for the display is ON, bring display up.
if ((engine_value == HIGH) && (button_upValue == HIGH) && (endbtn_upValue == LOW)) {
digitalWrite(motor_forward,HIGH); //Pin D6 will be HIGH
digitalWrite(motor_reverse,LOW); //Pin D7 will be LOW
}
//If current state is up and contact is off/engine is NOT running, bring display down.
else if ((engine_value == LOW) && (button_upValue == HIGH) && (endbtn_downValue == LOW)) {
digitalWrite(motor_forward,LOW); //Pin D6 will be LOW
digitalWrite(motor_reverse,HIGH); //Pin D7 will be HIGH
}
//If current state is NOT down and contact is on/engine is running and the switch for the display is OFF, bring display down.
else if ((engine_value == HIGH) && (button_upValue == LOW) && (endbtn_downValue == LOW)) {
digitalWrite(motor_forward,LOW); //Pin D6 will be HIGH
digitalWrite(motor_reverse,HIGH); //Pin D7 will be LOW
}
//If nothing is true, don't move the screen.
else {
digitalWrite(motor_forward,LOW); //Pin D6 will be LOW
digitalWrite(motor_reverse,LOW); //Pin D7 will be LOW
}
}
[/code]
Tot zo ver.
Hopelijk werkt dit lekker en kan ik binnenkort gaan navigeren