INSTRUCTABLES

1. Keuze elektrische componenten

Eerste stap is het bestellen van de elektronische componenten. Lijst van de te bestellen componenten vind je in het technisch dossier: BOM

  • Motoren: 2 x 50:1 Micro Metal Gearmotor HP 6V
  • Batterij: 2 x Lithium-Ion Battery 3.7V – 2900 maH
  • Sensor: 8 x QRE1113GR
  • Communicatie: HC-05 Bluetooth module (SMD)
  • Microcontroller: ATmega32U4
  • H-brug: DRV8833PWP

2. Elektronisch schema en bordschema

De volgende stap is het elektronisch schema voor onze printplaat.

Download Eagle software hier: https://www.snapeda.com/eagle/

Hierbij zullen er ook footprints gedownload moeten worden van de QRE1113GR Sensoren, HC-05 module, Atmega32U4 en DRV8833PWP aangezien deze niet standaard in Eagle zitten. Deze kan je vinden op onderstaande site.

Tutorial voor het importeren van de footprints in Eagle:

Eenmaal gedownload, dan zou je het elektronisch schema en bord schema moeten kunnen openen zonder foutmelding. Eenmaal dit in orde is dan kan de printplaat besteld worden

3. Bestellen van de printplaat

Er bestaan verschillende sites waarop je de printplaat kunt bestellen, je zult hiervoor het Eagle bestand voor het elektronisch schema en bordschema nodig hebben.

Voorbeeld: https://www.mijnprintplaat.nl/

4. Solderen

Eenmaal we de printplaat hebben, moeten de verschillende componenten gesoldeerd worden. Hierbij is het belangrijk dat we voorzichtig te werk gaan zodat we onze printplaat niet beschadigen. Eenmaal we alle componenten gesoldeerd hebben, gaan we onze printplaat fluxen.

4. Programmatie in Arduino

#include <SoftwareSerial.h>
#include "QTRSensors.h"
#include "SerialCommand.h"
#include <EEPROM.h>
#include "EEPROMAnything.h"

#define SerialPort Serial1
#define Baudrate 38400
#define Ain1 9
#define Ain2 6
#define Bin1 5
#define Bin2 3

SerialCommand sCmd(SerialPort);
QTRSensors qtr;
bool debug; 
unsigned long previous, calculationTime;
int BluetoothData;
float powerLeft;
float powerRight;
float output;
float sumError;
float rateError;
float lastError;

struct param_t
{
  unsigned long cycleTime;
  bool aan;
  unsigned int power;
  float kp;
  float diff;
  float ki;
  float kd;

} params;

int positie;
int state;
const uint8_t SensorCount = 6;
uint16_t sensorValues[SensorCount];

void setup()
{

  qtr.setTypeRC();
  qtr.setSensorPins((const uint8_t[]){A5, A4, A3, A2, A1, A0}, SensorCount);
  //qtr.setEmitterPin(2);

  delay(500);
  pinMode(LED_BUILTIN, OUTPUT);
  digitalWrite(LED_BUILTIN, HIGH); // turn on Arduino's LED to indicate we are in calibration mode
  
  for (uint16_t i = 0; i < 400; i++)
  {
    qtr.calibrate();
  }
  digitalWrite(LED_BUILTIN, LOW); // turn off Arduino's LED to indicate we are through with calibration
 
  Serial1.begin(Baudrate);
  sCmd.addCommand("set", onSet);
  sCmd.addCommand("debug", onDebug);
  sCmd.addCommand("start",onStart);
  sCmd.addCommand("stop",onStop);
  sCmd.setDefaultHandler(onUnknownCommand);

  EEPROM_readAnything(0, params);
  // print the calibration minimum values measured when emitters were on
  for (uint8_t i = 0; i < SensorCount; i++)
  {
    Serial.print(qtr.calibrationOn.minimum[i]);
    //Serial.print(' ');
  }
 // Serial.println();

  // print the calibration maximum values measured when emitters were on
  for (uint8_t i = 0; i < SensorCount; i++)
  {
    Serial.print(qtr.calibrationOn.maximum[i]);
   // Serial.print(' ');
  }
 // Serial.println();
 // Serial.println();
  delay(1000);


}

void loop()
{
  sCmd.readSerial();

  
  unsigned long current = micros();
  
  if (current - previous >= params.cycleTime)
  {
     previous = current;
    if (params.aan == true){  
   uint16_t position = qtr.readLineBlack(sensorValues);
    positie = position-2500;
    positie = positie / 100;
    
  //SerialPort.print("position: ");
 // SerialPort.println(positie);

  sumError += positie * params.cycleTime; //integraal
  rateError = (positie - lastError)/params.cycleTime; //afgeleide
  lastError = positie;
  
  output = positie * params.kp + sumError * params.ki + rateError * params.kd;
  output = constrain(output, -510,510);
  if (output  >= 0)
     {
        powerLeft = constrain(params.power + params.diff * output, -255, 255);
        powerRight = constrain(powerLeft - output, -255, 255);
        powerLeft = powerRight + output;
     }
     else
     {
        powerRight = constrain(params.power - params.diff * output, -255, 255);
        powerLeft = constrain(powerRight + output, -255, 255);
        powerRight = powerLeft - output;
     }
   //  SerialPort.println(powerRight);
   //  SerialPort.println(powerLeft);

      //--------H-brug--------
      if (powerRight<0)
      {
        analogWrite(Ain1, 0);
        analogWrite(Ain2, -powerRight);
      }else{
        analogWrite(Ain1, powerRight);
        analogWrite(Ain2, 0);
      }
      if (powerLeft<0)
      {
        analogWrite(Bin1, 0);
        analogWrite(Bin2, -powerLeft);
      }else{
        analogWrite(Bin1, powerLeft);
        analogWrite(Bin2, 0);
      }
       //-----------------------
     
  }
  }
    unsigned long difference = micros() - current;
    if (difference > calculationTime) calculationTime = difference;

}

void onSet()
{
  char* param = sCmd.next();
  char* value = sCmd.next();   
  if (strcmp(param, "cycle") == 0) params.cycleTime = atol(value); // atol -> tekst omzetten naar long
  //if (strcmp(param, "getal") == 0) params.getal = atoi(value); //atoi -> tekst omzetten in integer
  if (strcmp(param, "power") == 0) params.power = atoi(value);
  if (strcmp(param, "diff") == 0) params.diff = atof(value);
  if (strcmp(param, "kp") == 0) params.kp = atof(value);
  if (strcmp(param, "ki") == 0) params.ki = atof(value);
  if (strcmp(param, "kd") == 0) params.kd = atof(value);
  EEPROM_writeAnything(0, params);
}

void onDebug()
{
  
  
  SerialPort.print("cycle time: ");
  SerialPort.println(params.cycleTime);
  
  SerialPort.print("kp: ");
  SerialPort.println(params.kp);
  
  SerialPort.print("ki: ");
  SerialPort.println(params.ki);

  SerialPort.print("kd: ");
  SerialPort.println(params.kd);

  SerialPort.print("power (PWM): ");
  SerialPort.println(params.power);
  
  SerialPort.print("diff: ");
  SerialPort.println(params.diff);

  SerialPort.print("status: ");
  SerialPort.println(params.aan);
  
  SerialPort.print("calculation time: ");
  SerialPort.println(calculationTime);
  calculationTime = 0;

}
void onStart()
{
  params.aan = true;
}
void onStop()
{
  params.aan = false;
  analogWrite(Ain1, 0);
  analogWrite(Ain2, 0);
  analogWrite(Bin1, 0);
  analogWrite(Bin2, 0);
}
void onUnknownCommand(char *command)
{
  SerialPort.print("unknown command: \"");
  SerialPort.print(command);
  SerialPort.println("\"");
}

Download de Arduino software hier:

We hebben ook nog verschillende libraries nodig voor ons Arduino programma.

  • Softwareserial.h

https://www.arduino.cc/en/Reference/softwareSerial

  • QTRSensors.h

https://github.com/pololu/qtr-sensors-arduino

  • SerialCommand.h

https://github.com/kroimon/Arduino-SerialCommand

  • EEPROM.h

https://www.arduino.cc/en/Reference/EEPROM

  • EEPROMAnything.h

https://github.com/collin80/EEPROMAnything/blob/master/EEPROMAnything.h

Eenmaal we deze bibliotheken gedownload hebben moeten we deze importeren in Arduino programma, dit doen we als volgt. Hierna kan je de Arduino code openen, deze kan je vinden in het technisch dossier. Nu zouden we moeten kunnen compileren zonder enige problemen

5. Bootloader branden

Om de bootloader te branden is er een Arduino nodig.

6. Regelen van de robot (parameters)

1. Sluit de batterijen aan van de robot.

2. Maak connectie met de bluetoothmodule (HC-05) en voer de code ‘1234’ in.

3. Eenmaal de verbinding is gemaakt stuur je volgende data door naar de robot.

  • -> debug

Hier zouden we data moeten ontvangen van de robot, met alle parameters en status van de robot. Indien de robot geen data terugstuurt kan het zijn dat de bluetooth verbinding met de robot mislukt is. Probeer opnieuw te verbinden met de bluetooth module.

  • Set Kp = 13
  • Set Ki = 0
  • Set Kd = 10
  • Set power = 230
  • Set diff 0.3

Nu hebben we de gewenste parameters ingesteld en kunnen we de robot gaan testen. Plaats de robot op het parkour. Leg de spanning aan en plaats gedurende 10 seconden de robot op zwart en op wit. In deze fase gaat de robot zich kalibreren, eenmaal het lichtje uitgaat is de robot klaar om te rijden. Het is belangrijk om deze stap niet over te slaan, indien dit wel gebeurt dan zal de robot de lijn niet correct kunnen volgen.

-> Start

De robot zou moeten beginnen rijden en zou het parkour moeten volgen. Indien dit niet zo is dan moeten de bovenstaande parameters worden aangepast.

-> Stop

De robot stopt met rijden en we parameters kunnen aangepast worden indien nodig

Design a site like this with WordPress.com
Get started