Construcció d'un cotxe teledirig amb Arduino i Radio freqüència

IES Port d'Alcúdia

1. Introducció

El següent projecte desenvolupat al departament de Tecnologia de l'IES Port d'Alcúdia té la finalitat didàctica de la construcció un cotxe teledirigit. El comandament manual del cotxe es fa mitjançant un joystick analògic i radio freqüència amb el mòdul de comunicacions APC220.

    2. Components

    Arduino Uno o equivalent
    2 Microcontroladors Arduino Uno o equivalent.
    apc220
    Mòdul de comunicacions per radio APC220
    servo sg90
    Servo motor Tower Pro SG90 per la direcció
    a
    Integrat L298N que combina un driver de potència i un pont en H per invertir el sentit del corrent.
    Motor CC amb reductora
    Motor CC amb reductora per l'eix tractor
    Mini protoboard
    Mini protoboard
    jumpers
    Jumpers de connexió ràpida
    portapilas
    Portapilas AA
    a
    Joystick analògic

    3. Mutatge del xassís i connexió dels components cotxe.

    a

    a


    Connexió de l'alimentació.

    Usarem 4/6 piles AA de 1,5Vper tant la tensió d'alimentació serà de 6V/9V.
    Del portapiles connectarem el positiu (cable vermell) a una filera superior o node positiu i el negre a una filera de la part de baix que serà el node negatiu o terra.
    Del node positiu donarem tensió d'alimentació a l'arduino al pin Vin i del node negatiu connectarem a un dels dos pins GND de l'arduino.
    Conectarem la sortida de 5V de l'arduino a una columna qualsevol de la protoboard per tal de poder alimentar a aquesta tensió el mòdul APC220 i el servo.

    alimentacio
    Connexió del Servo per la direcció.


    Connexió servo
    Connexió del Mòdul Bluetooth

    El pin Rx de l'Arduino s'ha de connectar al Tx  l'APC220 i el Tx de l'Arduino al Rx de l'APC220. Es important que aquests dos cables estiguin desconnectats quan és carrega un programa a l'Arduino. Si no els desconnectam la càrrega no es realitzarà correctament.

    apc220
    Connexió del L298N i el motor DC

    • "Salida al motor B" al motor
    • Connectar Vin (positiu de la bateria) i GND
    • ENB al pin digital 5 (D5)
    • IN3 al pin digital 10
    • IN4 al pin digital 11
    a


    4. Muntatge del control remot.          

    1. Alimentar l'arduino amb 4/6 piles d1,5V. Connectar Vin i GND
    2. Connectar el joystick:
    • GND - GND
    • Vcc - 5v
    • VRx - A0
    • VRy - A1
    • SW -  D6
    a


    5. Programació de la placa Arduino



    Control remot:
    /************************************************************
    * Comandament amb joystick
    * Data: 25/02/2023
    * Autor: Toni Salas (tsalas@iesportdalcudia.org)
    ***********************************************************/

    /*GND - GND
    Vcc - 5v
    VRx - A0
    VRy - A1
    SW - D6
    */


    const int pinLED = 13;
    const int pinJoyX = A0;
    const int pinJoyY = A1;
    const int pinJoyButton = 6;

    String envStr="";

    void setup() {
    pinMode(pinJoyButton , INPUT_PULLUP); //activar resistència pull up
    Serial.begin(9600);
    }

    void loop() {
    int Xvalue = 0;
    int Yvalue = 0;
    bool buttonValue = false;
    envStr="";

    //llegir els valors
    Xvalue = analogRead(pinJoyX);
    delay(50); //petita pausa entre lectures analògiques
    Yvalue = analogRead(pinJoyY);
    buttonValue = digitalRead(pinJoyButton);
    //enviar valors pel serial (APC220) x,y*
    envStr += Xvalue;
    envStr += ",";
    envStr += Yvalue;
    envStr += "*";

    Serial.print(envStr);
    delay(100);
    }
        
    Codi cotxe: 

    /************************************************************
    * Codi per l'arduino del cotxe
    * Data: 25/02/2023
    * Autor: Toni Salas (tsalas@iesportdalcudia.org)
    ***********************************************************/

    #include <Servo.h>

    String readStr="";
    char c;
    String Xval;
    String Yval;

    long intGir;
    long intVel;

    int servoPin = 9;
    Servo servoMotor;

    int avantPin = 10;
    int enreraPin = 11;
    int potenciaPin = 5;

    void setup() {
    pinMode( avantPin, OUTPUT);
    pinMode( enreraPin, OUTPUT);
    pinMode( potenciaPin, OUTPUT );
    Serial.begin(9600);
    servoMotor.attach( servoPin );
    servoMotor.write(90);

    digitalWrite( avantPin, LOW ); //inicialmet el cotxe estarà aturat
    digitalWrite( enreraPin, LOW );
    analogWrite( potenciaPin, 0 );
    }

    void loop() {

    if (Serial.available() > 0) {

    c = char(Serial.read());
    if(c=='*'){
    Xval = readStr.substring(0, readStr.indexOf(','));
    Yval=readStr.substring( readStr.indexOf(',')+1, readStr.length() );
    //Serial.println("Xval="+Xval+"Yval="+Yval);

    intGir = Yval.toInt();
    intGir = map(intGir, 0, 1024, 0, 180); //passam a graus.
    servoMotor.write(intGir);

    intVel = Xval.toInt();

    if( intVel>512 ) { //envant
    digitalWrite(avantPin,HIGH);
    digitalWrite(enreraPin,LOW);
    intVel = map(intVel, 512, 1024, 0, 150); //Es dona una potència de 150/255 ja que a l'exemple està alimentat a 9v
    Serial.println(intVel);
    analogWrite( potenciaPin, intVel );

    } else { //enrera
    digitalWrite(avantPin,LOW);
    digitalWrite(enreraPin,HIGH);
    intVel = map(intVel, 0, 512, 150, 0);
    Serial.println(intVel);
    analogWrite( potenciaPin, intVel );
    }

    readStr="";
    } else {
    readStr += c;
    }

    }
    }