/* RC besturing met Arduino * Functies: Kanaal 2 motor, kanaal 3 servo, kanaal 4 richtingaanwijzers, * kanaal 5 groot- dim- en achterlicht. Remlicht met kanaal 2. Motoraansturing met DRV8833. *Door G.J.Volgers/A. Boele/C. Methorst. Datum 11-11-2020 * Beschreven in De Modelbouwer 2020-9 en 2020-10. Zie www.modelbouwers.nl */ //Module 1 ------------------Installeren Dimlicht, grootlicht, remlicht---- const int CH_5 = A3; // RC Kanaal 5 ontvanger op Pin A3 const int DIMLICHT = 10; // Dimlicht LED op Pin D11 const int GROOTLICHT = 11; // Grootlicht LED op Pin D10 const int ACHTERLICHT= 2; // AchterlichtLED op Pin D2 //Module 2 ------------------ Installeren Richtingaanwijzers----------- const int CH_4 = A2; // RC Kanaal 4 ontvanger aan Pin A2 const int LEDlinks = 12; // linker LED aan Pin D12 const int LEDrechts = 13; // rechter LED aan Pin D13 int ledState1 = 0; // Status richtingaanwijzer Li int ledState2 = 0; // Status richtingaanwijzer Re unsigned long currentMillis; // Start de tijd unsigned long previousMillis1 = 0; // Status timer 1 unsigned long previousMillis2 = 0; // Status timer 1 const long interval1 = 400; // Knipperinterval 1 const long interval2 = 400; // Knipperinterval 2 //Module 3 --------------------- Installeren servo motorkap------------ #include // opnemen uit bibliotheek const int CH_3 = A1; //RC Kanaal 3 ontvanger aan Pin A1 Servo MOTORKAP_SERVO; // naam van de servo int posServo1 = 10; // Beginstand int posServo2 = 180; // Eindstand //Module 4 --------------------- Installeren Motordriver DRV8833-------- const int CH_2 = A0; // Kanaal 2 op Pin A0 const int MOT2 = 5; // motor uitgang 1 op Pin D5 const int MOT1 = 6; // motor uitgang 2 op Pin D6 int pwm; // snelheid motor //Module 5 --------------------- Remlicht------------- const int REMLICHT = 4; // Remlicht LED op Pin D4 int ledStateRem = LOW; // Status remlicht int autoRijd = false; // Status snelheid unsigned long remMillis =0; // Slaat de laatste keer remlicht update op const long onTime = 600; // remlicht aan void setup() { //-------------------------Setup Verlichting---------------------- pinMode(CH_5,INPUT); pinMode(DIMLICHT,OUTPUT); pinMode(GROOTLICHT,OUTPUT); pinMode(REMLICHT,OUTPUT); pinMode(ACHTERLICHT,OUTPUT); digitalWrite(DIMLICHT,LOW); //Bij inschakelen Arduino dimlicht uit digitalWrite(GROOTLICHT,LOW); //Bij inschakelen Arduino grootlicht uit digitalWrite(REMLICHT,LOW); //Bij inschakelen Arduino remlicht uit digitalWrite(ACHTERLICHT,LOW); //Bij inschakelen Arduino achterlicht uit //-----------------------Setup Richtingaanwijzers------------------ pinMode(CH_4,INPUT); pinMode(LEDlinks,OUTPUT); pinMode(LEDrechts,OUTPUT); digitalWrite(LEDlinks,LOW); //Bij inschakelen Arduino LEDLinks uit digitalWrite(LEDrechts,LOW); //Bij inschakelen Arduino LEDrechts uit //-------------------------Setup Servo motorkap------------------------------ MOTORKAP_SERVO.attach (3); // Servo aansluiten aan pin D3 pinMode(CH_3,INPUT); MOTORKAP_SERVO.write (10); // Zet beginpositie //-------------------------Setup motordriver------------------------------ pinMode(CH_2, INPUT); pinMode(MOT1,OUTPUT); pinMode(MOT2,OUTPUT); //-------------------------Setup remlicht------------------------------ pinMode(REMLICHT,OUTPUT); //---------------------Serial monitor)-------------------------------- Serial.begin(9600); //Inschakelen seriƫle monitor } //-------------------------- START programma------------- void loop() { //-------------------------- Verlichting-------------------------------- int ch5 = pulseIn(CH_5,HIGH,50000); if (ch5 >1600 && ch5 <1800){ digitalWrite(DIMLICHT,HIGH); //Dimlicht aan digitalWrite(GROOTLICHT,LOW); // Grootlicht uit digitalWrite(ACHTERLICHT,HIGH); // Achterlicht aan } else { if (ch5 > 1800){ digitalWrite(DIMLICHT,HIGH); //Dimlicht aan digitalWrite(GROOTLICHT,HIGH); //Grootlicht aan digitalWrite(ACHTERLICHT,HIGH); //Achterlicht aan } else { digitalWrite(DIMLICHT,LOW); //Dimicht uit digitalWrite(GROOTLICHT,LOW); //Grootlicht uit digitalWrite(ACHTERLICHT,LOW); //Achterlicht uit } } //-------------------------- Richtingaanwijzers --------------------------------- int ch4 = pulseIn ( CH_4, HIGH, 50000 ); //Lees kanaalpuls, 50ms herhaling if ( ch4 >1400 && ch4 <1600 ) { // Neutrale stand digitalWrite( LEDlinks,LOW ); // Led links uit digitalWrite( LEDrechts,LOW ); // Led rechts uit ( ledState1 = 0 ); ( ledState2 = 0 ); } else if ( ch4 >1600 ){ // Inschakelen Led links currentMillis = millis(); // Lees de tijd uit if ( currentMillis - previousMillis1 > interval1 ){ //Vergelijk met de timer 1 previousMillis1 = currentMillis; // Reset de timer tijd ledState1 =!ledState1; //Vergelijk de status van de Led links digitalWrite( LEDlinks, ledState1 ); // Schakel de LED links in of uit } } else if ( ch4 < 1400 ){ if ( currentMillis - previousMillis2 > interval2 ){ // Lees de tijd uit previousMillis2 = currentMillis; // Reset de timer tijd ledState2 =!ledState2; //Vergelijk de status van de Led links digitalWrite( LEDrechts, ledState2 ); // Schakel de LED rechts in of uit } } //-------------------------- Servo------------------------------- int ch3 = pulseIn( CH_3,HIGH, 50000 ); delay (5); if ( ch3 >1600 ) { // Bepaalt beweging servo MOTORKAP_SERVO.write( posServo2 ); // Nieuwe positie servo } else { MOTORKAP_SERVO.write( posServo1 ); // Uitgangspositie servo } //------------------------ Regelen motor---------------- int ch2 = pulseIn(CH_2, HIGH, 50000); //Lees puls in van kanaal 2 pwm = map(ch2, 1045, 1945, -250, 250); //converteer puls naar 0-255 range, if ((pwm > -20) && (pwm < 20)) { // Neutraal positie knuppel digitalWrite(MOT1, LOW); // Motor vooruit stop digitalWrite(MOT2, LOW); // Motor achteruit stop } else if (pwm > 40) { // knuppel naar voren digitalWrite(MOT1,LOW); // Motor vooruit analogWrite (MOT2,abs(pwm)); // Motor vooruit, geregeld } else if (pwm < -40) { // knuppel naar achteren analogWrite (MOT1,abs(pwm)); // Motor achteruit, geregeld digitalWrite(MOT2, LOW); // Motor achteruit } //----------------------- Remlicht schakelen---------------------------------- currentMillis = millis(); // vraag de tijd op if (( ch2 < 1200 )|| (ch2 > 1800 )){ // Bepaal grenzen van oplichten remlicht autoRijd = true; // Controleer status snelheid } if (autoRijd) { if (( ch2 > 1200 ) && (ch2 < 1800 )) { //definieer de voorwaarde voor remlicht remMillis = currentMillis; //Start de timer ledStateRem = HIGH; digitalWrite(REMLICHT, ledStateRem); // Zet remlicht aan autoRijd = false; // Controleer de snelheid } } if (ledStateRem == HIGH) { // Als remlicht brandt if (currentMillis - remMillis >= onTime) { //Vergelijk met de interval tijd remMillis = 0; ledStateRem = LOW; digitalWrite(REMLICHT, ledStateRem); // Zet remlicht uit } } delay(50); Serial.print(ch2); //Printen puls kanaal 2 Serial.print(" PWM "); Serial.print(pwm); //Printen pwm Serial.print (" uitgang4 "); Serial.println (digitalRead(4)); // Printen uitgang 4 } //------------------------------------- EINDE programma