This is an old revision of the document!


Arduino robotplatvorm

Ülevaade

  • Iteaduino UNO
  • 2 standard suurusega servo mootorit (360 kraadi pöörlemisega)
  • mini servo (180 kraadi pöörlemine)
  • Infrapuna kaugusandur GP2Y0A21 10-80cm (analoog)
  • Infrapuna lähedusandur 3-80 cm (digitaal)
  • Ultraheliandur HC-SR04 2-500cm
  • Nupp 8×8 mm ON-(OFF)
  • Potentsiomeeter 10kohm
  • vineerist roboti põhi
  • 6-AA patarei pesa
  • mõõdud: 15,5 x 12 x 10 cm
  • kaal: 425 g

Robotplatvormi kokkupanek

Lisamoodulid

  • Jooneandur QTR-8A

Näiteprogrammid

Mootorite kalibreerimine

Kirjeldus siia Kirjeldus siia

#include <Servo.h>
#include <EEPROM.h>
 
//Servo objektide loomine
Servo leftM, rightM, sensM;
//Roboti osadele viikude määramine
#define LED 13
#define POTPIN A0
#define IRSENS A1
#define SWITCH A2
#define L_SERVO 10
#define R_SERVO 9
#define S_SERVO 8
//EEPROM bytes
#define L_MOTOR_STOP 0
#define R_MOTOR_STOP 1
#define S_MOTOR_CENTR 2
#define L_MOTOR_FWD 3
#define R_MOTOR_FWD 4
 
void setup() {
  //Servo objekti ja viigu sidumine
  leftM.attach(L_SERVO);
  rightM.attach(R_SERVO);
  sensM.attach(S_SERVO);
  //Jadaliidese käivitamine
  Serial.begin(9600);
  //viikude seadistamine
  pinMode(POTPIN, INPUT);
  pinMode(IRSENS, INPUT);
  pinMode(SWITCH, INPUT);
  digitalWrite(SWITCH, HIGH);
  pinMode(LED, OUTPUT);
}
 
void calibMotors() {
  int leftVal, rightVal, sensVal, fwdLeft, fwdRight;
  //Calibration in progress inidicator HIGH
  digitalWrite(LED, HIGH);
  while (digitalRead(SWITCH) == LOW);
  delay(200);
 
  for (int i = 0; i < 3; i++) {
    while (digitalRead(SWITCH) == HIGH) {
      if (i == 0) {
        leftVal = map(analogRead(POTPIN), 0, 1023, 50, 120);
        leftM.write(leftVal);
      }
      if (i == 1) {
        rightVal = map(analogRead(POTPIN), 0, 1023, 50, 120);
        rightM.write(rightVal);
      }
      if (i == 2) {
        sensVal = map(analogRead(POTPIN), 0, 1023, 30, 150);
        sensM.write(sensVal);
      }
    }
    delay(500);
  }
  while (digitalRead(SWITCH) == LOW);
  delay(1000);
  leftM.write(0);
  rightM.write(180);
  while (digitalRead(SWITCH) == HIGH);
  delay(1000);
  if (digitalRead(IRSENS) == 1) {
    while (digitalRead(SWITCH) == HIGH) {
      fwdLeft = 0;
      fwdRight = map(analogRead(POTPIN), 0, 1023, rightVal, 180);
      rightM.write(fwdRight);
    }
  }
  else {
    while (digitalRead(SWITCH) == HIGH) {
      fwdRight = 180;
      fwdLeft = map(analogRead(POTPIN), 0, 1023, leftVal, 0);
      leftM.write(fwdLeft);
    }
  }
  //Stop motors
  leftM.write(leftVal);
  rightM.write(rightVal);
  sensM.write(sensVal);
  delay(1000);
  while (digitalRead(SWITCH) == LOW);
  delay(200);
 
 
  EEPROM.update(L_MOTOR_STOP, leftVal);
  EEPROM.update(R_MOTOR_STOP, rightVal);
  EEPROM.update(S_MOTOR_CENTR, sensVal);
  EEPROM.update(L_MOTOR_FWD, fwdLeft);
  EEPROM.update(R_MOTOR_FWD, fwdRight);
  //Calibration end inidicator LOW
  digitalWrite(LED, LOW);
  //Print out values
  Serial.print("L: ");
  Serial.println(EEPROM.read(L_MOTOR_STOP));
  Serial.print("R: ");
  Serial.println(EEPROM.read(R_MOTOR_STOP));
  Serial.print("S: ");
  Serial.println(EEPROM.read(S_MOTOR_CENTR));
  Serial.print("FWD L: ");
  Serial.println(EEPROM.read(L_MOTOR_FWD));
  Serial.print("FWD R: ");
  Serial.println(EEPROM.read(R_MOTOR_FWD));
}
 
void loop() {
  while (digitalRead(SWITCH) == HIGH);
  calibMotors();
  delay(1000);
  while (1) {
    sensM.write(map(analogRead(POTPIN), 0, 1023, 0, 180));
  }
}

Lihtne navigeerimine

Kirjeldus siia Kirjeldus siia

#include <Servo.h>
#include <EEPROM.h>
 
//Servo objektide loomine
Servo leftM, rightM, sensM;
//Roboti osadele viikude määramine
#define LED 13
#define POTPIN A0
#define IRSENS A1
#define SWITCH A2
#define L_SERVO 10
#define R_SERVO 9
#define S_SERVO 8
//EEPROM bytes
#define L_MOTOR_STOP 0
#define R_MOTOR_STOP 1
#define S_MOTOR_CENTR 2
#define L_MOTOR_FWD 3
#define R_MOTOR_FWD 4
 
void setup() {
  //Servo objekti ja viigu sidumine
  leftM.attach(L_SERVO);
  rightM.attach(R_SERVO);
  sensM.attach(S_SERVO);
  //Jadaliidese käivitamine
  Serial.begin(9600);
  //viikude seadistamine
  pinMode(POTPIN, INPUT);
  pinMode(IRSENS, INPUT);
  pinMode(SWITCH, INPUT);
  digitalWrite(SWITCH, HIGH);
  pinMode(LED, OUTPUT);
}
 
//Main program loop
void loop() {
 
  int frontWall;
  int leftStop = EEPROM.read(L_MOTOR_STOP);
  int rightStop = EEPROM.read(R_MOTOR_STOP);
  int sensCentr = EEPROM.read(S_MOTOR_CENTR);
  int leftFwd = EEPROM.read(L_MOTOR_FWD);
  int rightFwd = EEPROM.read(R_MOTOR_FWD);
 
  //Kirjuta servodele algväärtused
  leftM.write(leftStop);
  rightM.write(rightStop);
  sensM.write(sensCentr);
  //Wait for switch press to start
  while (digitalRead(SWITCH) == HIGH) {
    digitalWrite(LED, HIGH);
    delay(200);
    digitalWrite(LED, LOW);
    delay(100);
  }
  //Algorithm main loop
  while (1) {
    frontWall = digitalRead(IRSENS);
 
    //Kui sein ees, siis pööra 1000 millisekundit vasakule
    if (frontWall == 0) {
      leftM.write(180);
      rightM.write(0);
      delay(500);
      leftM.write(180);
      rightM.write(180);
      delay(600);
    }
    else {
      leftM.write(leftFwd);
      rightM.write(rightFwd);
    }
  }
}

Keerukas navigeerimine

Kirjeldus siia Kirjeldus siia

#include <Servo.h>
#include <EEPROM.h>
#include <NewPing.h>
 
//Parameters 
#define SONARDIFF 10 //determines when to do the small turn
#define TURNDLY 800 //90deg turn delay
#define SMIN 40 //distance from which to activate small turns
#define SMAX 200 //distance from which to deactivate small turns
 
//Servo objektide loomine
Servo leftM, rightM, sensM;
//Sonari objekti loomine ja viikude määramine
#define TRIG 12
#define ECHO 11
NewPing sonar(TRIG, ECHO, 200);
//Roboti osadele viikude määramine
#define LED 13
#define POTPIN A0
#define IRSENS A1
#define SWITCH A2
#define L_SERVO 10
#define R_SERVO 9
#define S_SERVO 8
//EEPROM bytes
#define L_MOTOR_STOP 0
#define R_MOTOR_STOP 1
#define S_MOTOR_CENTR 2
#define L_MOTOR_FWD 3
#define R_MOTOR_FWD 4
 
//globaalsed muutujad
const int leftStop = EEPROM.read(L_MOTOR_STOP);
const int rightStop = EEPROM.read(R_MOTOR_STOP);
const int sensCentr = EEPROM.read(S_MOTOR_CENTR);
const int leftFwd = EEPROM.read(L_MOTOR_FWD);
const int rightFwd = EEPROM.read(R_MOTOR_FWD);
int sonarDist[3];
void motorTurn(int dir);
 
//Funktsiooni prototüübid
int sweepRun(int pos ,int moveOnly);
void motorStop(int servo);
void motorFwd(void);
 
void setup() {
  //Servo objekti ja viigu sidumine
  leftM.attach(L_SERVO);
  rightM.attach(R_SERVO);
  sensM.attach(S_SERVO);
  //Jadaliidese käivitamine
  Serial.begin(9600);
  //viikude seadistamine
  pinMode(POTPIN, INPUT);
  pinMode(IRSENS, INPUT);
  pinMode(SWITCH, INPUT);
  digitalWrite(SWITCH, HIGH);
  pinMode(LED, OUTPUT);
}
 
//Main program loop
void loop() {
 
  int frontWall;
  int fwdTime = 1000;
  int sweepPos = 0;
  int sweepDir = -1;  // -1 left and 1 right
  unsigned long lastSweep = 0;
  int scanDone = 0;
  int sonarDiff;
  unsigned long lastTurn = 0;
 
  //Kirjuta servodele algväärtused
  leftM.write(leftStop);
  rightM.write(rightStop);
  sensM.write(sensCentr);
  //Wait for switch press to start
  while (digitalRead(SWITCH) == HIGH) {
    digitalWrite(LED, HIGH);
    delay(200);
    digitalWrite(LED, LOW);
    delay(100);
  }
  //Algorithm main loop
  while (1) {
    //check if something is blocking way
    frontWall = digitalRead(IRSENS);
    //Sweeping motion searching most distance direction
    if(millis() - lastSweep > 400){
      sweepRun(sweepPos, 0);
      if(sweepPos == -1 || sweepPos == 1) scanDone = 1;
      // increment or decrement position
      if(sweepDir == 1) sweepPos++;
      else sweepPos--;
      // change direction if edge reached
      if(sweepDir == 1 && sweepPos == 1){ sweepDir = -1;}
      else if(sweepDir == -1 && sweepPos == -1){ sweepDir = 1;}
      sweepRun(sweepPos, 1);
      lastSweep = millis();
    }
 
    if (frontWall == 0) {
      motorStop(0);
      sweepRun(0, 0);
      if(sonarDist[0] >= sonarDist[2]) motorTurn(-1, TURNDLY);
      else motorTurn(1, TURNDLY);
      lastTurn = millis();
    }
    else if(sonarDist[0] > 0 && sonarDist[2] > 0 && scanDone == 1 && sonarDist[1] > SMIN && sonarDist[1] < SMAX && (millis() - lastTurn > 2000))
    {
      //calculate sonar sensors distance difference
      sonarDiff = sonarDist[0] - sonarDist[2];
 
      if (sonarDiff > SONARDIFF) {
        motorStop(0);
        motorTurn(-1, 200);
      }
      else if(sonarDiff < -1*SONARDIFF){ 
        motorStop(0);
        motorTurn(1, 200);
      }
      scanDone = 0;
    }
    else{
      leftM.write(leftFwd);
      rightM.write(rightFwd);
    }
  }
}
 
void motorStop(int wheel){
  if(wheel == 0){
    leftM.write(leftStop);
    rightM.write(rightStop);
  }
  else if(wheel == -1){
    leftM.write(leftStop);
  }
  else if(wheel == 1){
    rightM.write(rightStop);
  }
}
 
void motorFwd(void){
    leftM.write(leftFwd);
    rightM.write(rightFwd);
}
 
void motorTurn(int dir, int dly){
  //left
  if(dir == -1){
    leftM.write(180);
    rightM.write(180);
  }
  //right
  else if(dir == 1){
    leftM.write(0);
    rightM.write(0);
  }
  delay(dly);
}
 
int sweepRun(int pos, int moveOnly){
  if(pos == 2){
    sensM.write(sensCentr);
    delay(400);
    sonarDist[1] = sonar.ping_cm();
    sensM.write(180);
    delay(400);
    sonarDist[0] = sonar.ping_cm();
    sensM.write(0);
    delay(800);
    sonarDist[2] = sonar.ping_cm();
    sensM.write(sensCentr);
  }
  else if(pos == 0){
    sensM.write(sensCentr);
    if(moveOnly) return 0;
    sonarDist[1] = sonar.ping_cm();
    return sonarDist[1];
  }
  else if(pos == -1){
    sensM.write(180);
    if(moveOnly) return 0;
    sonarDist[0] = sonar.ping_cm();
    return sonarDist[0];
  }
  else if(pos == 1){
    sensM.write(0);
    if(moveOnly) return 0;
    sonarDist[2] = sonar.ping_cm();
    return sonarDist[2];
  }
  return 0;
}
et/projects/arduino.1451291948.txt.gz · Last modified: 2020/07/20 09:00 (external edit)
CC Attribution-Share Alike 4.0 International
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0