kramann.info
© Guido Kramann

Login: Passwort:










kramann.info
© Guido Kramann

Login: Passwort:




microBot -- Schwarmvehikel auf der Basis eines Arduino Micro

(EN google-translate)

(PL google-translate)

Vorstudien

  1. Minimalaufbau zu Linienverfolgung
  2. Datenübertragung per Infrarot
  3. Skriptverarbeitung

1. Minimalaufbau zu Linienverfolgung


Testlauf Linienverfolgung mit microBot: https://youtu.be/B3-nthpOu_I

  • Verwendung eines Sharp-Infratot-Entfernungsenesors. Ausnutzung eines "Schmutzeffekts": liefert je nach Helligkeit der Reflexionsfläche unterschiedliche Werte.
Aufbau. Verwendung vier verschiedener Ports, um Motore direkt ansteuern zu können.

Bild 0-1: Aufbau. Verwendung vier verschiedener Ports, um Motore direkt ansteuern zu können.

Entwurf Pinlayout.

Bild 0-2: Entwurf Pinlayout.

Verdrahtung der Motore, Vorderansicht.

Bild 0-3: Verdrahtung der Motore, Vorderansicht.

Verdrahtung der Motore, Rückansicht / Sandwichaufbau: Winkel, Gummimatte, Powerbank, Gummimatte, Steckboard.

Bild 0-4: Verdrahtung der Motore, Rückansicht / Sandwichaufbau: Winkel, Gummimatte, Powerbank, Gummimatte, Steckboard.

Fahrt.

Bild 0-5: Fahrt.

void setup() 
{
     DDRB|=(1<<PB4);
     DDRC|=(1<<PC6);
     DDRD|=(1<<PD7);
     DDRE|=(1<<PE6);
     PORTB&=~(1<<PB4);
     PORTC&=~(1<<PC6);
     PORTD&=~(1<<PD7);
     PORTE&=~(1<<PE6);
     
     //Serial.begin(9600);
}
int zaehler=0;
int pwm1 = 0;
int pwm2 = 0;
int wert=25;
void loop() 
{
    int x = analogRead(0); //grün 330...250 schwarz

    if(x<400 && wert<50)
       wert++;
    else if(x>410 && wert>0)
       wert--;
    int y = 405-x;
    if(y<-20) y=-20;
    if(y>20) y=20;
    int pwm1 = 40+(50+wert+y)/2; //15...60
    int pwm2 = 40+(100-wert-y)/2;
    
    if(zaehler<pwm1)
    {
       PORTB|=(1<<PB4);
       PORTC|=(1<<PC6);       
    }
    else
    {
       PORTB&=~(1<<PB4);
       PORTC&=~(1<<PC6);             
    }
    if(zaehler<pwm2)
    {
       PORTD|=(1<<PD7);
       PORTE|=(1<<PE6);
    }
    else
    {
       PORTD&=~(1<<PD7);
       PORTE&=~(1<<PE6);
    }

/*
    if(zaehler%20==0)
    {
       Serial.print(x);
       Serial.print(" ");
       Serial.print(pwm1);
       Serial.print(" ");
       Serial.println(pwm2);
    }
*/    
    delay(1);
    zaehler++;
    zaehler%=100;
}

Code 0-1: swarmvehicle007 -- Testprogramm mit I-Regler.

2. Datenübertragung per Infrarot

Test: https://youtu.be/yoKQ8NnHNHQ
Testaufbau Datenübertragung per Infrarot.

Bild 0-6: Testaufbau Datenübertragung per Infrarot.

Grundaufbau: 76_Mikroprozessoranwendungen/06_Infrarot
void initTimer1()
{
  TCCR1B &= ~(1<<WGM13); //Mode 4
  TCCR1B |= (1<<WGM12);
  TCCR1A &= ~(1<<WGM11);
  TCCR1A &= ~(1<<WGM10);
    
  //Vorteilung 1: 16000000Hz
  TCCR1B &= ~(1<<CS12);
  TCCR1B &= ~(1<<CS11);
  TCCR1B |= (1<<CS10);
    
  //f = fclk/(2*N*(OCR1A+1))
  //OCR1A = (fclk/(f*2*N))-1
  //OCR1A = 8000000/440 - 1 ==  18181
  //KORRIGIERT:
  //********************************
  //OCR1A = 4000000/440 - 1 ==  9091
  //OCR1A = 16000000/(f*4*N) - 1 ==  9091
  //********************************
  //OCR1A=9091;  //0,5Hz == 4 Schläge!
  OCR1A=133;  //30kHz
//  OCR1A=132;  //30kHz
//  OCR1A=131;  //30kHz
//  OCR1A=132/2;  //30kHz
  
  //Toggle auf OC1A:
  TCCR1A &= ~(1<<COM1A1);
  TCCR1A |=  (1<<COM1A0);
  pinMode(9,OUTPUT);      
}

void setup() 
{
    initTimer1();
    Serial1.begin(300);
}

int x=' ';//code 32
void loop() 
{

    Serial1.write(x);
    x++;
    if(x>'z')
       x=' ';
    delay(100);
}

Code 0-2: Sender

void setup() 
{
    Serial.begin(9600);           
    Serial1.begin(300);
}

void loop() 
{
    while(Serial1.available())
    {
        int x = Serial1.read();
        Serial.write(x);
        if(x=='z') 
           Serial.write('
');
    }
}

Code 0-3: Empfänger

3. Skriptverarbeitung


Damit die Library beim Arduino kompiliert...


  • ...ersetze in /home/fhbstud/Arduino/libraries/MathParser/src/MathParser.cpp
  • DAS:
  • static double b_lg2 (double a) {return lg2(a);}
  • DURCH DAS:
  • static double b_lg2 (double a) {return log(a)/log(2.0);}
  • Verwendung der Library MathParser
MathParser: https://github.com/meerzafarnoohani/MathParser/releases
MathParser.zip

Siehe Beispiel aus Library: WithVariables


Code 0-4: Beispielcode mit Variablen.

MathParser_WithVariables_ArdMicro001.zip