Gruppe: Anders, Rasmus, Jacob og Julia
Robot: Slave

Den fysiske robot
Robotten er udstyret med to forholdsvis store hjul bagpå og et mindre hjul foran til. Den er som sådan en holder til batterierne samt Arduino boardet. Motorerne er placeret på siden af robotten og forbindes via en ledning til Arduino Boardet. De tre sensorer – to lys og en ultralyd er placeret bag på robotten så tæt på gulvet som muligt.
De to lys sensorer havde hver sin ”holder”, som gør at de kommer til at virke så præcist som muligt. Ultralyden sidder også sammen med lys sensorerne. Der har været problemer med, at holderen skærpede for det signal, som lys sensorerne registrerede. Derfor er holderen ændret, så den blev mere ’åben’.

Der har været ændringer med hensyn til ”undervognen” på robotten. Denne er blevet bygget mere solidt, da det forhenværende ikke kunne holde til batterierne.
De hjul er der bruges til robotten er forholdsvis store. Dette er fordi robotten er forholdsvis tung, og hjulene skal være rimelig robuste. Foran er hjulet ikke så stort – hjulets størrelse her er blevet justeret alt efter robotten vinkel, så den blev så vandret som muligt.

Decoration
Ændrede motor og hjul opsætning for større stabilitet og gear I form af tandhjul. Blev senere ombygget til at benytte mindre tandhjul på grund af problemer med at trække vognen. Holder til sensor udstyr med henblik på at stabilisere det når robotten var I bevægelse. Modificeret efter at det viste sig at holderen skyggede for lys sensorne.

I det hele taget gik vores robot igennem en lang række fysiske ændringer og forsøg, selvom det overordnede udseende forblev det nogenlunde det samme. Største ændring er nok at vores robots kørselsretning blev vendt om. Dette blev gjort for at bringe de motor tilkoplede hjul frem forrest og på den måde lette robottens evne til at dreje.

Problemer med Hardwaren
Med hensyn til lys sensoren CNY 70 var der enkelte problemer. Denne blev sat op og testet via et eksempel fra Arduinoblog.de . Problemet var her, at når der blev målt på data fra komponenten var det forholdsvis små svingninger. Fra Værdi 18-25. Der blev forsøgt med regulering af modstande (fra 75Ω til 150Ω) samt udskiftning af komponenterne. Her testede vi kun én sensor. Derefter blev der forsøgt at tilføje endnu en sensor, så der blev testet to på én gang. Her kunne vi se, at den anden havde meget mere præcise målinger (fra 0-300!).
Derfor forsøgte vi, at prøve nogle nye porte på Arduinoen, hvilket var en succes!

Vi havde også problemer med at vores opsætning til at stabilisere lys sensorene skyggede for dem hvilket ødelagde de tal den fik tilbage og krævede en ombygning af vognen. Derudover havde vi i en kort overgang også en løs forbindelse i vores system som måtte udbedres.

Beregning af modstande til CNY

VF = 1.25V
IF = 50mA
VCC = 5V

Vr = 5V – 1.25V = 3.75V

R = U / I
R = 3.75V / (50mA / 1000) = 75 ohm
Vores R1 er 75 ohm og R2 er 10k Ohm!
(Disse modstande blev senere hen reguleret)

Robottens Opbygning
robot med pile copy2
1. SRF 02 (Denne sidder i en holder i den endelige robot)
2. CNY 70
3. Motor forbundet til hjul via tandhjul, samme på den modsatte side. Strømførende klodser forbinder motorerne til strømførende ledninger.
4. Batterier i holder
5. Arduino sat i holder for bedre stabilitet.

Robottens Opførsel
FlowDiagram

Robottens Kode

//ULTRASOUND LOWEST IS 8!!!
#include <Wire.h>
int reading = 0;
//Setting up the Hardware pins
// First the line following (IR) sensors
const int irLeft = 2; //Left line sensor is on pin A2
const int irRight = 3; //Right line sensor is on pin A3

//Setting up the Arduino Motor Shield
const int leftDIR = 12; 
const int rightDIR = 13;
const int leftPWM = 3;
const int rightPWM = 11;
const int leftBrake = 9;
const int rightBrake = 8;
const char bothSpeed = 40; //sets how fast the motors will spin (0 to 255)

//Here we set up variable that will hold the ADC value representing the line sensor values
int leftSees = 0; //A2 ADC value (0 to 1023)
int rightSees = 0; //A3 ADC value (0 to 1023)

void setup() 
{ 

  //Make sure to set all of our control signal pins as output
  pinMode(leftDIR, OUTPUT); 
  pinMode(rightDIR, OUTPUT); 
  pinMode(leftBrake, OUTPUT); 
  pinMode(rightBrake, OUTPUT); 

  //Next we make sure our brake signals are set LOW
  digitalWrite(leftBrake, LOW);
  digitalWrite(rightBrake, LOW);

  //sensor ultra
  Wire.begin();                // join i2c bus (address optional for master)
  Serial.begin(9600);
} 

void loop() 
{ 
 digitalWrite(leftBrake, LOW);
  digitalWrite(rightBrake, LOW);
    //Start by reading the left sensor on A2
  int leftEye = analogRead(irLeft);

  //delay a little bit
  delay(5);

  //next read the right sensor connected A3
  int rightEye = analogRead(irRight);

  //Next, we run the motors based on the sensor reading

  //If both sensors see black (ADC value greater than 1000), then back up
  if ((leftEye <= 6)&&(rightEye <= 6)) forward();

  //Otherwise, if only the left sensor sees black, then turn off the left motor
  //so the robot veer to the left
  else if ((leftEye <= 6)&&(rightEye > 6)) turnLeft();

  //Otherwise, if only the right sensor sees black, then turn off the right motor
  //so the robot veer to the right
  else if ((leftEye > 6)&&(rightEye <= 6)) turnRight();

  //Otherwise, move forward
  else forward();

  //Sensor ultra

 // step 1: instruct sensor to read echoes
  Wire.beginTransmission(112); // transmit to device #112 (0x70)
                               // the address specified in the datasheet is 224 (0xE0)
                               // but i2c adressing uses the high 7 bits so it's 112
  Wire.write(byte(0x00));      // sets register pointer to the command register (0x00) 
  Wire.write(byte(0x50));      // command sensor to measure in "inches" (0x50)
                               // use 0x51 for centimeters
                               // use 0x52 for ping microseconds
  Wire.endTransmission();      // stop transmitting

  // step 2: wait for readings to happen
  delay(70);                   // datasheet suggests at least 65 milliseconds

  // step 3: instruct sensor to return a particular echo reading
  Wire.beginTransmission(112); // transmit to device #112
  Wire.write(byte(0x02));      // sets register pointer to echo #1 register (0x02)
  Wire.endTransmission();      // stop transmitting

  // step 4: request reading from sensor
  Wire.requestFrom(112, 2);    // request 2 bytes from slave device #112

  // step 5: receive reading from sensor
  if(2 <= Wire.available())    // if two bytes were received
  {
    reading = Wire.read();  // receive high byte (overwrites previous reading)
    reading = reading << 8;    // shift high byte to be high 8 bits
    reading |= Wire.read(); // receive low byte as lower 8 bits
    if ((reading <= 8)&&(reading >= 6)) obstacle();
  }

  delay(50);                  // wait a bit since people have to read the output :)

}

void obstacle(void)
{
  digitalWrite(leftDIR, LOW); 
  digitalWrite(rightDIR, HIGH);
  analogWrite(leftPWM, 150);
  analogWrite(rightPWM, 150);
  delay(750);

  digitalWrite(leftDIR, LOW); 
  digitalWrite(rightDIR, LOW);
  analogWrite(leftPWM, bothSpeed);
  analogWrite(rightPWM, bothSpeed);
  delay(2000);

  digitalWrite(leftDIR, HIGH); 
  digitalWrite(rightDIR, LOW);
  analogWrite(leftPWM, 150);
  analogWrite(rightPWM, 150);
  delay(1000);

  digitalWrite(leftDIR, LOW); 
  digitalWrite(rightDIR, LOW);
  analogWrite(leftPWM, bothSpeed);
  analogWrite(rightPWM, bothSpeed);
  delay(2000);

  digitalWrite(leftDIR, HIGH); 
  digitalWrite(rightDIR, LOW);
  analogWrite(leftPWM, 150);
  analogWrite(rightPWM, 150);
  delay(500);
}

//Turn right by turning off the right motor 
//i.e disable the PWM to that wheel
void turnRight(void)
{
  digitalWrite(leftDIR, LOW); 
  digitalWrite(rightDIR, HIGH);
  analogWrite(leftPWM, 100);
  analogWrite(rightPWM, 100);
  delay(150);
  /*digitalWrite(rightBrake, HIGH);
  digitalWrite(leftBrake, HIGH);
  delay(10000);*/
}

//Turn left by turning off the left motor
//i.e disable the PWM to that wheel
void turnLeft(void)
{
  digitalWrite(leftDIR, HIGH); 
  digitalWrite(rightDIR, LOW);
  analogWrite(leftPWM, 100);
  analogWrite(rightPWM, 100);
  delay(150);
  /*digitalWrite(rightBrake, HIGH);
  digitalWrite(leftBrake, HIGH);
  delay(10000);*/
}

//Move forward by enabling both wheels
void forward(void)
{
  digitalWrite(leftDIR, LOW); 
  digitalWrite(rightDIR, LOW);
  analogWrite(leftPWM, bothSpeed);
  analogWrite(rightPWM, bothSpeed);
}

//Reverse by enabling both wheels 
/*void reverse(void)
{
  digitalWrite(leftDIR, HIGH); 
  digitalWrite(rightDIR, HIGH);
  analogWrite(leftPWM, bothSpeed);
  analogWrite(rightPWM, bothSpeed);
}*/

Konklusion
Robotten kunne køre banen igennem og undgå forhindringen med lav fart. Den er dog meget ustabil i forhold til mængden af lys der i rummet samt tape på selve kørebanen. Ud over det kan den også gå i stå ved de forskellige sving eller ignorere sving på grund af for meget lys!
Der kunne meget muligt forsøges med at udskifte CNY 70’erne, da de måler forholdsvis ustabilt både generelt og i forhold til hinanden.

Demonstration:

Leave a Reply