Lijnvolgrobot met supercondensatoren

Ron wilde een lijnvolgrobot maken met een Arduino en kwam op het idee om deze te voeden met supercondensatoren. Deze supercondensatoren hebben een zeer hoge capaciteit en werken op een lage spanning (100 farad, 3V). De capaciteit van deze supercondensatoren is vele malen lager dan een accu. Dit betekent dat deze lijnvolger niet lang kan rijden op één lading en snel weer op zal moeten laden.
Naast de supercondensatoren wilde ik graag meerdere lijnsensoren gebruiken die analoog ingelezen worden. Ook wilde ik motoren met encoder hebben zodat ik eventueel snelheid kan regelen. Uiteindelijk rijdt de robot ook prima zonder de encoders gebruikt te hebben.

initial charge start 0:03
initial charge end 1:29
drive start 1:33
drive end 4:19
charge start 4:19
charge end 4:49

Zie hieronder het voornamelijk elektrische blokschema.

projects:lijnvolgrobot_supercap_schema.png

Onderdeel Type Link
Microcontroller 1 Arduino Pro Micro
Microcontroller 2 Arduino Pro Micro
Lijnsensor 8x IR Line Tracking Module TinyTronics
Supercondensatoren 3V 50F VINATECH WEC3R0 506QG Reichelt
Motoren + encoder + wiel DC 6V Encoder Motor Gear N20 Aliexpress
LED strip COB Pixel LED Strip 5V 332LEDs/M Aliexpress
Motor driver DRV8833 TinyTronics
Gelijkrichter DB107 - 1A 1000V TinyTronics
DC-DC oplader XL4015 DC-DC buck CV CC Aliexpress
DC-DC boost 5V Mini DC-DC 5V Step-up Boost Converter 480mA TinyTronics
Afstandssensor VL6180 Time-of-Flight TinyTronics
Knoppen
Plaatmateriaal Vederplex 4mm Bauhaus
Potentiometer 10kΩ Cermet Potentiometer - Type 3386P TinyTronics

2 microcontrollers (master en slave) werken samen.

Zie hieronder het stukje code waarmee de positie van de lijn wordt berekend. Hierbij worden 8 analoge waarden van 0 tot 255 ingeladen, en daarmee wordt de gemiddelde lijnpositie berekend.

Bron:http://theultimatelinefollower.blogspot.com/2015/12/interpolation.html?m=1

int calcLinePos(){
  //Source: http://theultimatelinefollower.blogspot.com/2015/12/interpolation.html?m=1
 
  byte values[8];
  for(byte i=0;i<8;i++){
    values[i]=sensorValues[i];
  }
 
  int num = 
  -27*(values[0]-values[7])*2+
  -19*(values[1]-values[6])*2+
  -11*(values[2]-values[4])*2+
   -4*(values[3]-values[3])*2;
 
  int denom = (values[0]+values[1]+values[2]+values[3]+values[4]+values[5]+values[6]+values[7])/2;
 
  if(denom==0){
    return 0;
  }else{
    return num/denom;
  }
}

De lijnvolger heeft 8 lijnsensoren waarvan hij de buitenste sensoren gebruikt om te onthouden aan welke kant het laatst een lijn is gezien. Links of rechts.

Bijvoorbeeld bij een scherpe bocht naar rechts, zal hij aan de rechterkant het laatst een lijn hebben gezien. Als hij daarna de lijn kwijtraakt zal hij naar rechts draaien. Als hij dan de lijn weer vindt, gaat hij verder met lijnvolgen.

Video 27-09-2022 Het nemen van scherpe bochten
  • Scherpe bochten worden zeer betroubaar genomen
  • De robot maakt herhalend scherpe bochten gedurende 4 minuten zonder fouten

Code voor detectie van scherpe en haakse bochten

enum directions{LEFT,RIGHT};
enum directions cornerDir = LEFT;
unsigned long cornerDetectTold=0;
byte cornerDetectTreshold = 180;
 
void cornerDetect(byte sensorValues[]){
  static byte old = 0;
  byte now = 0;
 
  //Convert 8 analog values to an 8 bits
  for(byte i=0; i<8; i++){
    if(sensorValues[i]>cornerDetectTreshold){
      bitSet(now,7-i); //Load and mirror bits
    }
  }
 
  //Sharp corner detection: RIGHT
  if(((now & B00000011) == B00000011) 
  && ((old & B00000011) == B00000001)){
    cornerDir=RIGHT;
    cornerDetectTold=millis();
  }
  //Sharp corner detection: LEFT
  if(((now & B11000000) == B11000000)
  && ((old & B11000000) == B10000000)){
    cornerDir=LEFT;
    cornerDetectTold=millis();
  }
 
  //Square corner and small radius corner detection: RIGHT
  if((now & B00011111) == B00011111 && millis()-cornerDetectTold>750){
    cornerDir=RIGHT;
    cornerDetectTold=millis();
  }
  //Square corner and small radius corner detection: LEFT
  if((now & B11111000) == B11111000 && millis()-cornerDetectTold>750){
    cornerDir=LEFT;
    cornerDetectTold=millis();
  }
  old = now;
}

projects:lijnvolgrobot_supercap_state_diagram.png

  • Lijnvolg regeling nog niet optimaal afgesteld
  • Scherpe bochten worden niet betrouwbaar genomen
  • 1:00 De robot detecteert het oplaadpunt en stopt





  • projects/lijnvolgrobot_supercap.txt
  • Last modified: 17/10/2024 10:26
  • by ron